我们对一些固定的docker设置如何保存呢? 如何保存我们的一系列docker操作呢?由此便有了Dockerfile来构建镜像,便于更好保存我们的操作,dockerfile本质上是一个存储多行命令的文件。接下来简单的介绍下Dockerfile。
1. Dockerfile的简单实例
[root@docker docker_demo]# cat Dockerfile
# base image
FROM centos
# MAINTAINER
MAINTAINER json_hc@163.com
# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx
# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2
# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
EXPOSE 80
以上就是构建了一个简单的nginx服务,上面很多命令有的似曾相识,有的是刚认识的,没关系看下去你就会了解更多了。
2. Dockerfile构建镜像
写好了我们的Dockerfile文件,接着我们要怎么构建我们的镜像呢?
首先,特别注意我们的目录结构
[root@docker docker_demo]# ll
total 964
-rw-r--r--. 1 root root 1112 Nov 1 04:58 Dockerfile
-rw-r--r--. 1 root root 981687 Oct 17 09:20 nginx-1.12.2.tar.gz
在这个dcoker_demo的目录下,存在一个Dockerfile文件(名字一定是个)和一个我们需要的nginx安装源文件压缩格式(放心docker会帮我们自动解压)
然后我们就可以运行构建命令了 docker build -t centos_nginx:v1 .
来解释下吧:docker build 是构建镜像的命令 加上 -t 参数 后面跟上 镜像名:版本号 然后 加上一个点(默认寻找Dockerfile名字的文件 进行逐行构建)
然后docker iamges
查询一下构建的镜像
[root@docker docker_demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_nginx v1 78d18f16e757 4 hours ago 464MB
wadeson/centos_nginx v1 210a202d37b8 7 hours ago 464MB
nginx latest c59f17fe53b0 4 days ago 108MB
ubuntu latest 747cb2d60bbe 3 weeks ago 122MB
centos latest 196e0ce0c9fb 6 weeks ago 197MB
到此,自己通过Dockerfile构建镜像就完成了。接下里解释解释Dockerfile的文件内部指令的含义。
3. Dockerfile文件指令等介绍
#
注释
FROM 基于哪个镜像的基础开发
# 基于centos7开发
FROM centos:7
LABEL
添加标签来帮助组织镜像、记录许可信息、辅助自动化构建等。每个标签一行,由 LABEL 开头加上一个或多个标签对。
# Set one or more individual labels
LABEL com.example.version="0.0.1-beta"
LABEL vendor="ACME Incorporated"
LABEL com.example.release-date="2015-02-12"
LABEL com.example.version.is-production=""
RUN
通俗来讲就是相当于你进入centos服务器后运行的服务器命令
RUN apt-get update
RUN apt-get install -y curl
CMD
用于执行目标镜像中包含的软件和任何参数。CMD 几乎都是以CMD ["executable", "param1", "param2"...]
的形式使用。因此,如果创建镜像的目的是为了部署某个服务(比如 Apache),你可能会执行类似于CMD ["apache2", "-DFOREGROUND"]
形式的命令。
EXPOSE
用于指定容器将要监听的端口。因此,你应该为你的应用程序使用常见的端口。
提供 nginx 服务的镜像应该使用 EXPOSE 80
ENV
来为容器中安装的程序更新 PATH 环境变量。例如使用ENV PATH /usr/local/nginx/bin:$PATH
来确保CMD ["nginx"]能正确运行。
WORKDIR
为了清晰性和可靠性,你应该总是在WORKDIR中使用绝对路径。另外,你应该使用 WORKDIR 来替代类似于 RUN cd … && do-something
的指令,后者难以阅读、排错和维护。
VOLUME
用于暴露任何数据库存储文件,配置文件,或容器创建的文件和目录。强烈建议使用 VOLUME来管理镜像中的可变部分和用户可以改变的部分。