docker(四)dockerfile及镜像构建
构建docker镜像
[root@test1 ~]# docker run --name nginx-man -it centos
[root@1d969cd92463 /]# yum install -y wget gcc gcc-c++ make openssl-devel
安装nginx略
[root@1d969cd92463 /]#vim /usr/local/nginx/confg/nginx.conf
daemon off; # nginx需要运行在前台

[root@test1 ~]# docker commit -m "my nginx" 1d969cd92463 tanxin/my-nginx:v1
sha256:14c67bf8c0a71970abce395c6bcc1e7bde0caa44cfca7ae9b19aa899b843d4a1
[root@test1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tanxin/my-nginx v1 14c67bf8c0a7 13 seconds ago 408 MB
docker.io/nginx latest dbfc48660aeb 2 weeks ago 109 MB
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
[root@test1 ~]# docker rum -d -p 99:80 tanxin/my-nginx:v2 /usr/local/nginx/sbin/nginx
易于自动化的命令Dockerfile
Dockerfile包含创建镜像所需要的全部指令。基于在Dockerfile中的指令,我们可以使用Docker build命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。
Dockerfile支持支持的语法命令如下:
INSTRUCTION argument
指令不区分大小写。但是,命名约定为全部大写。
1. 所有Dockerfile都必须以FROM命令开始。 FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像(译者注:CentOS和Ubuntu有些命令可是不一样的)。FROM命令可以多次使用,表示会创建多个镜像。具体语法如下:
FROM <image name>
例如:
FROM ubuntu
上面的指定告诉我们,新的镜像将基于Ubuntu的镜像来构建。
继FROM命令,DockefFile还提供了一些其它的命令以实现自动化。在文本文件或Dockerfile文件中这些命令的顺序就是它们被执行的顺序。
让我们了解一下这些有趣的Dockerfile命令吧。
1. MAINTAINER:设置该镜像的作者。语法如下:
MAINTAINER <author name>
2. RUN:在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。语法如下:
RUN 《command》
3. ADD:复制文件指令。它有两个参数<source>和<destination>。destination是容器内的路径。source可以是URL或者是启动配置上下文中的一个文件。语法如下:
ADD 《src》 《destination》
4. CMD:提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD指令。 使用多个CMD会抵消之前所有的指令,只有最后一个指令生效。 CMD有三种形式:
CMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1 param2
5. EXPOSE:指定容器在运行时监听的端口。语法如下:
EXPOSE <port>;
6. ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。语法如下:
ENTRYPOINT ["executable", "param1","param2"] ENTRYPOINT command param1 param2
7. WORKDIR:指定RUN、CMD与ENTRYPOINT命令的工作目录。语法如下:
WORKDIR /path/to/workdir
8. ENV:设置环境变量。它们使用键值对,增加运行程序的灵活性。语法如下:
ENV <key> <value>
9. USER:镜像正在运行时设置一个UID。语法如下:
USER <uid>
10. VOLUME:授权访问从容器内到主机上的目录。语法如下:
VOLUME ["/data"]
Dockerfile最佳实践
与使用的其他任何应用程序一样,总会有可以遵循的最佳实践。你可以阅读更多有关Dockerfile的最佳实践
以下是我们列出的基本的Dockerfile最佳实践:
- 保持常见的指令像
MAINTAINER以及从上至下更新Dockerfile命令; - 当构建镜像时使用可理解的标签,以便更好地管理镜像;
- 避免在Dockerfile中映射公有端口;
CMD与ENTRYPOINT命令请使用数组语法。
Dockerfile 实例


[root@test1 ~]# mkdir /opt/docker-file
[root@test1 ~]# cd /opt/docker-file/
[root@test1 docker-file]# ls
[root@test1 docker-file]# mkdir nginx
[root@test1 docker-file]# cd nginx/
#wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
#wget http://nginx.org/download/nginx-1.8.1.tar.gz
[root@test1 nginx]#vim Dockerfile
[root@test1 docker-file]# cd nginx/
[root@test1 nginx]# pwd
/opt/docker-file/nginx
[root@test1 nginx]# cat Dockerfile
# this is My First Dockerfile # Version 1.0 # Author Tan Xin #Base images FROM centos #MAINTAINER MAINTAINER Tan Xin #ADD ADD pcre-8.38.tar.gz /usr/local/src ADD nginx-1.8.1.tar.gz /usr/local/src #RUN RUN yum update -y && yum install -y wget gcc gcc-c++ make openssl-devel RUN useradd -s /sbin/nologin -M www #WORKDIR WORKDIR /usr/local/src/nginx-1.8.1 RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with=http_ssl-module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.38 && make && make install RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf ENV PATH /usr/local/nginx/sbin/:$PATH EXPOSE 80 CMD ["nginx"]
#

浙公网安备 33010602011771号