3.1.7创建镜像
3.1.7.1基于已有容器创建镜像
docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a/--author:作者信息
-m,--message:提交一个信息
-p:创建时暂停容器运行
CONTAINER:容器ID
实验一:基于已有容器myhttpd:1.0,创建一个新的镜像
step 1 启动容器:docker run myhttpd:1.0 bash
step 2 在容器中新增一个文件
touch 1
step 3 退出容器
exit
step4 创建一个新镜像myhttpd:2.0
docker container commit -a "muyi" -m "add a new image" e5eedc31d230 myhttpd:2.0
3.1.7.2基于本地模板导入创建镜像
step 1 下载模版
Download/template/precreated - OpenVZ Virtuozzo Containers Wiki
wgethttp://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz
step 2 从模版创建镜像
cat centos-7-x86_64.tar.gz | docker import - centos:1.0
3.1.7.3基于dockerfile创建镜像
dockerfile指令集
分类 | 指令 | 说明 |
配置指令 | AGR | 定义创建过程中使用的变量 |
FROM | 指定所创建镜像的基础镜像 | |
LABEL | 为生成的镜像添加元数据标签信息 | |
EXPOSE | 声明镜像内服务监听的端口 | |
ENV | 指定环境变量 | |
ENTRYPOINT | 指定镜像的默认入口命令 | |
VOLUME | 创建一个数据卷挂载点 | |
USER | 指定容器运行时的用户名或UID | |
WORKDIR | 配置工作目录 | |
ONBUILD | 创建子镜像时指定自动执行的操作指令 | |
STOPSIGNAL | 指定退出的信号值 | |
HEALTHCHECK | 配置所启动容器如何进行健康检查 | |
SHELL | 指定默认shell类型 | |
操作指令 | RUN | 运行指定命令 |
CMD | 启动容器时默认执行的命令 | |
ADD | 添加内容到镜像 | |
COPY | 复制内容到镜像 |
通过docker buile命令创建镜像
docker build [OPTIONS] PATH | URL | -
options:
选项 | 说明 |
--add-host HOST:IP | 添加一个自定义的主机到IP的映射 |
--build-arg list | 添加创建时的变量 |
--cache-from strings | 使用指定镜像做为缓存源 |
--cgroup-parent string | 继承的上层cgroup |
--compress | 使用gzip压缩创建时的上下文数据 |
--cpu-period int | CFS调度器时长限制 |
--cpu-quota int | CFS调度器份额限制 |
-c, --cpu-shares int | CPU权重 |
--cpuset-cpus string | CPU数量(0-3, 0,1) |
--cpuset-mems string | 多CPU允许使用的内存数量 |
--disable-content-trust | 忽略镜像验证,默认为需要验证 |
-f, --file string | Dockerfile文件路径和名称,默认为当前目录下的./dockerfile |
--force-rm | 总是删除中间过程的容器 |
--iidfile string | 将镜像ID写入到文件 |
--isolation string | 容器隔离机制 |
--label list | 镜像元数据 |
-m, --memory bytes | 内存使用限制 |
--memory-swap bytes | 内存和交换区总限制 |
--network string | 指定使用run命令启动容器时的网络模式,默认为default |
--no-cache | 创建镜像时不使用缓存 |
--pull | 总试尝试获取镜像的最新版本 |
-q, --quiet | 不打印创建过程中的日志信息 |
--rm | 创建成功后删除中间容器,默认为true |
--security-opt strings | 安全选项 |
--shm-size bytes | /dev/shm的大小 |
-t, --tag list | 指定镜像的标签列表,name:tag |
--target string | 指定创建的目标阶段 |
--ulimit ulimit | Ulimit操作 |
实验一:使用dockerfile创建一个运行httpd的容器
step 1 创建dockerfile
vim dockerfile-httpd #在当前目录下创建一个文本文件,命名为dockerfile-httpd
以下是文件的内容
FROM centos:1.0 #指定一个基础镜像:centos:1.0
LABEL httpd-base v 1.0 #这边可以自定义一些版本信息,作者信息等
EXPOSE 80 #说明容器开放的端口号
VOLUME [“/root/data”]#创建一个数据卷挂载点
WORKDIR /root #指定容器的工作目录
RUN yum install -y httpd \ #安装httpd
&& rm -rf /var/cache/yum/* #删除yum缓存
CMD "httpd -DFOREGROUND" #启动httpd
step 2 使用刚刚创建的dockerfile来创建镜像
docker build -t yangjiqing/httpd:1.0 -f ./dockerfile-httpd .
创建成功
镜像文件已经生成
step 3 在后台启动容器,并将宿主机的/var/www/html做为一个数据卷,挂载到容器的/var/www/html。
docker run -d --name=httpd --hostname=httpd -v /var/www/html:/var/www/html yangjiqing/httpd:1.0
查看容器信息:
docker inspect httpd
成功启动,并且数据卷也已经挂载上了。
进入容器看一下
docker exec -it httpd bash
httpd服务已经进来了。
这里的/var/www/html/index.html文件,是我宿主机上的,说明数据卷也挂载成功。
容器的IP地址是172.17.0.2,这是由宿主机自动分配的。
在宿主机上看看能否打开网页
curl http://172.17.0.2
是可以打开的,这样这个镜像就算是创建成功了。
2.1.7.4 dockerfile中ENTRYPONT 和 CMD命令的区别
ENTRYPONT:
指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数。
支持两种格式:
·ENTRYPOINT["executable","param1","param2"]:exec调用执行;
·ENTRYPOINT command param1 param2:shell中执行。
每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。
在运行时,可以被--entrypoint参数覆盖掉,如docker run --entrypoint。
实验1:
这里指定了entrypoint 的命令是echo hello world
Build一下
我们用这个镜像创建一个容器看看效果
这里会显示hello world,说明entrypoint指令运行正常.
我们再看一下另一种格式
发现效果是一样的.
CMD命令
CMD指令用来指定启动容器时默认执行的命令。
支持三种格式:
·CMD["executable","param1","param2"]:相当于执行executable param1 param2,推荐方式;
·CMD command param1 param2:在默认的Shell中执行,提供给需要交互的应用;
·CMD["param1","param2"]:提供给ENTRYPOINT的默认参数。
每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候手动指定了运行的命令(作为run命令的参数),则会覆盖掉CMD指定的命令。
第一和第二种格式效果是一样的,我们就用第二种格式来做实验:
实验2:
这个效果跟entrypoint是一样的
实验3:ENTRYPOINT和CMD命令同时存在
再看看效果
这里发现只执行了ENTRYPOINT指令,CMD指令不会被执行.
实验4:将CMD指令的参数提供给ENTRYPOINT使用
这里CMD的参数”hello world”会被传递给ENTRYPOINT.
这个效果跟实验1是样的.