Docker镜像的创建方法
基于已有镜像创建
1 | 把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像: |
把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像: docker commit [选项] 容器ID/名称 仓库名称[:标签] |__ -m --说明信息 |__ -a --作者信息 |__ -p --生成过程中停止容器的运行
基于本地模板创建
通过导入操作系统模板文件可以生成镜像, 模板可以从OPENVZ开源项目下载, 下载地址. cat 文件名 | docker import - 生成的仓库名称:标签
基于Dockerfile创建
Dockerfile是由一组指令组成的文件, 其中每条指令对应Linux中的一条命令, Docker程序将读取Dockerfile中的指令生成指定镜像.
Dockerfile结构大致分为四个部分: 基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令.
Dockerfile每行支持一条指令, 每条指令可携带多个参数, 支持使用以”#”号开头的注释.
在编写Dockerfile时, 有严格的格式需要遵循: 官方文档 1.第一行必须使用FROM指令指取所基于的镜像名称; 2.之后使用MAINTAINER指令说明维护该镜像的用户信息; 3.然后是镜像操作相关指令, 每运行一条指令, 都会给基础镜像添加新的一层. 4.最后使用CMD指令, 来指定启动容器时要运行的命令操作.
指令 | 含义 |
FROM 镜像 | 指定新镜像所基于的镜像, 第一条指令必须为FROM指令, 每创建一个镜像就需要一条FROM指令. |
MAINTAINER 名字 | 说明新镜像的维护人信息 |
RUN 命令 | 在所基于的镜像上执行命令, 并提交到新的镜像中. |
CMD ["要运行的程序", "参数1", "参数2"] | 指定启动容器时要运行的命令或者脚本, Dockerfile只能 有一条CMD命令, 如果指定多条则只有最后一条被执行. |
ENTRYPOINT 命令 | 指定启动容器时要运行的命令或者脚本 |
EXPOSE 端口号 | 指定新镜像加载到Docker时要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值 |
ADD 源文件 目标目录 | 将源文件复制到目标目录中, 源文件要与Dockerfile位于相同目录中, 或者是一个URL. |
COPY 源文件/目录 目标文件/目录 | 将本地主机上的源文件/目录复制到目标地点, 源文件/目录要与Dockerfile在相同的目录中. |
VOLUME ["目录"] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器时的用户 |
WORKDIR 路径 | 为后续的RUN、 CMD、ENTRYPOINT指定工作目录 |
ONBUILD 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
使用Dockerfile生成镜像: docker build [选项] 路径 |__ -t 仓库名称[:标签] --指定镜像的标签信息
Dockerfile案例
vim+net-tools
1 | FROM centos:7 |
Docker的数据管理
管理Docker容器中数据主要有两种方式: 数据卷(Data Volumes)和数据卷容器(Data Volumes Containers)
数据卷
1.创建数据卷
docker run --name 自定义容器名 -v 目录 -v 目录2... -dit 仓库名称[:标签]
2.挂载主机目录作为数据卷
docker run --name 自定义容器名 -v 绝对路径的本地目录:目录1 -v 绝对路径的本地目录:目录2,... -dit 仓库名称[:标签]
数据卷容器
docker run --name 自定义容器名 --volumes-from 已挂载数据卷的容器 -it 仓库名称[:标签]
Docker网络通信
端口映射
将宿主机的端口映射到容器中, 使得外部网络访问宿主机的端口便可访问容器的服务: docker run [选项] -d 仓库名称[:标签] |__ -P --实现随机映射 |__ -p 主机端口:容器端口 --指定要映射胡端口
容器互联
创建源容器
docker run --name 自定义容器名1 -dit 仓库名称[:标签]
创建接收容器
docker run --name 自定义容器名2 --link 连接容器名:连接别名 -dit 仓库名称[:标签]
测试容器互联
docker exec -it 自定义容器名2 /bin/bash ping 连接别名
使用link建立的连接通道只是单向的.
即容器2可以ping通容器1, 而容器1无法ping通容器2.