Docker镜像制作和管理
docker 镜像生命周期
通过docker commit手动构建镜像
基于容器手动制作镜像步骤具体如下:
1.下载一个系统的官方基础镜像,如: CentOS 或 Ubuntu
2.基于基础镜像启动一个容器,并进入到容器
3.在容器里面做配置操作
安装基础命令
配置运行环境
安装服务和配置服务
放业务程序代码
4.提交为一个新镜像 docker commit
5.基于自己的的镜像创建容器并测试访问
格式一:
[root@ubuntu1804 ~]#docker commit -a "wei<root@weirui.com>" -c 'CMD /bin/httpd -f -h /data/html' -c "EXPOSE 80" b1 httpd-busybox:v1.0
格式二:
[root@ubuntu1804 ~]#docker commit -a "wei<root@weirui.com>" -c 'CMD ["/bin/httpd", "-f", "-h", "/data/html"]' -c "EXPOSE 80" b1 httpd-busybox:v1.0
利用Dockerfile文件执行docker build自行构建镜像
DockerFile是一种被Docker程序解释执行的脚本,由一条条命令组成,每条命令对应linux下面的一条命令,DOcker程序将这些Dockerfile指令再翻译成真正的linux命令,其有自己的书写方式和支持的命令,Docker程序读取Dockerfile并根据指令生成Docker镜像。相比手动制作镜像方式,Dockerfile更能直观的展示镜像是怎么产生的,有了Dockerfile,当后期有额外的需求时,只要在之前的Dockerfile添加或修改响应的命令即可重新生成新的Docker镜像,避免了重复手动制作镜像的麻烦,类似与shell脚本一样,可以方便高效的制作镜像
Docker守护程序Dockerfile逐一运行指令,如有必要,将每个指令的结果提交到新镜像,然后最终输出新镜像ID。Docker守护程序将自动清理发送的上下文
注:每条指令 都是独立运行的,并会导致创建新镜像。比如RUN , cd /tmp 对下一条指令不会有任何影响
Docker将尽可能重用中间映像(缓存),以显著加速docker build命令的执行过程,这由Using cache控制台输出中的消息指示
Dockerfile镜像制作和使用流程
Dockerfile文件的制作镜像的分层结构
Dockerfile文件说明:
- 每一行以Dockerfile的指令开头,指令不区分大小写,但是惯例使用大写
- 使用#开始作为注释
- 每一行只支持一条指令,每条指令可以携带多个参数
- 指令按文件的顺序从上至下进行执行
- 每个指令的执行会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条指令
- 制作镜像一般可能需要反复多次,每次执行dockerfile都按顺序执行,从头开始,已经执行过的指令已经缓存,不需要再执行,如果后续有一行新的指令没执行过,其往后的指令将会重新执行过,所以为加速镜像制作,将最常变化的内容放下dockerfile的文件后面
Dockerfile常见相关指令: ADD COPY ENV EXPOSE FROM LABEL STOPSIGNAL USER VOLUME WORKDIR
Dockerdfile 构建过程和指令总结
Dockerfile构建(docker build)过程
- 从基础镜像运行一个容器
- 执行一条指令,对容器做出修改
- 执行类似docker commit的操作,提交一个新的中间镜像层(可以利用中间层镜像创建容器进行调试和排错)
- 再基于刚提交的镜像运行一个新容器
- 执行Dockerfile中的下一条指令,直至所有指令执行完毕
查看镜像的构建历史: docker history 镜像ID
Docker直接制作Nginx镜像的Dockerfile文件:
[root@ubuntu1804 ~]#mkdir /data/dockerfile/web/nginx/1.18.0
[root@ubuntu1804 ~]#cd /data/dockerfile/web/nginx/1.18.0
[root@ubuntu1804 1.18.0]#vim nginx.conf
user nginx;
worker_processes 1;
#daemon off;
[root@ubuntu1804 1.18.0]#wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@ubuntu1804 1.18.0]#pwd
/data/dockerfile/web/nginx/1.18.0
[root@ubuntu1804 1.18.0]# ls
Dockerfile nginx.conf index.html
[root@ubuntu1804 1.18.0]#cat Dockerfile
#Nginx Dockerfile
FROM centos:centos7.7.1908
MAINTAINER wei <root@weirui.vip>
RUN yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl
openssl-devel \
&& useradd -r -s /sbin/nologin nginx \
&& yum clean all
ADD nginx-1.18.0.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.18.0 \
&& ./configure --prefix=/apps/nginx \
&& make \
&& make install \
&& rm -rf /usr/local/src/nginx*
ADD nginx.conf /apps/nginx/conf/nginx.conf
COPY index.html /apps/nginx/html/
RUN ln -s /apps/nginx/sbin/nginx /usr/sbin/nginx
EXPOSE 80 443
CMD ["/apps/nginx/sbin/nginx"]