解散Docker Image为Dockerfile

生产环境中,对于运维来说,可能不需要亲自去编写Dockerfile来构建镜像,大多数是研发部门来做这个事情,但我认为运维岗位有必要清楚Dockerfile的构建过程,再不济也应该知道运行这个image时,最后的进程是怎么样的,这会更有利于测试维护。

在我的公司来说,底层运维和研发是搭不上话的,更别说了解Dockerfile了,这就需要自己来研究。

Dockerfile语法及构建---分层构建

偶然的一次机会,解决项目故障的分析过程中,看到项目中有研发团队写好的Dockerfile,居然出现了两个FORM,吸引了我的眼球。和我自己之前写过的文章 Dockerfile构建简单镜像 有所不同,决定一探究竟。

Dockerfile构建LNMP镜像

Dockerfile构建LNMP镜像

要求,构建完成后,进入容器可以直接访问到index.php

编写Dockerfile,为了方便看,将LNMP分为来写

准备本地环境

先将以下包,nginx/mysql/php所需的tar包拖入物理机

nginx-1.11.1.tar.gz
cmake-3.15.1.tar.gz
mysql-5.6.33.tar.gz
php-5.3.28.tar.gz

编写index.php页面,用于最后验证

Dockerfile构建Nginx镜像

Dockerfile构建nginx镜像

要求:dockerfile做nginx源码镜像。并且启动后容器后可以直接启动。

首先拖入nginx的tar包到物理机路径,与Dockerfile文件放在同一目录

编写Dockerfile

[root@localhost ~]# vim Dockerfile 
FROM centos  # 调用docker中已下载的centos镜像
MAINTAINER FeiYi  # 作者名为FeiYi
# 安装环境所需包
RUN yum -y install net-tools iproute pcre-devel openssl-devel gcc gcc-c++ make zlib-devel elinks
ADD nginx-1.11.1.tar.gz /usr/src  # 解压本地host中的nginx包到容器中的/usr/src目录
ENV NGINX_DIR /usr/src/nginx-1.11.1 # 定义环境变量
WORKDIR $NGINX_DIR  # 进入容器中的解压目录
# 编译安装
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
# 回到根目录
WORKDIR /
# 创建程序用户
RUN useradd nginx
# 优化命令环境
RUN ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
# 监听端口80
EXPOSE 80
# 后台启动nginx服务
CMD ["nginx", "-g", "daemon off;"]

使用Dockerfile构建镜像

Dockerfile语法及构建简单镜像

Dockerfile语法及构建简单镜像

前面使用过docker commit去构建镜像

Docker并不建议用户通过这种方式构建镜像。原因如下:

  1. 这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在 debian base 镜像中也加入 vi,还得重复前面的所有步骤。
  2. 更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。

既然 docker commit 不是推荐的方法,我们干嘛还要花时间学习呢?

原因是:即便是用 Dockerfile(推荐方法)构建镜像,底层也 docker commit 一层一层构建新镜像的。学习 docker commit 能够帮助我们更加深入地理解构建过程和镜像的分层结构。




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0