linux 学习笔记-103-docker-Dockerfile 格式,Dockerfile 示例(安装 nginx)

发布于 2018-06-06  174 次阅读


Dockerfile 格式

使用 Dockerfile 基于基础镜像快速的创建新镜像,并且能实现在创建镜像的过程中针对这个镜像做一些操作

Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile 从 FROM 命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

01:FROM   //指定基于哪个基础镜像

格式 FROM <image>或者 FROM <image>:<tag>,  比如

FROM centos

FROM centos:latest

02:MAINTAINER  //指定作者信息

格式 MAINTAIN <name> ,比如

MAINTAINER  am  runfali@outlook.com

03:RUN   //镜像操作指令

格式为 RUN <command>  或者 RUN [“executable”, “param1”, “param2”],比如

RUN  yum install  httpd

RUN ["/bin/bash", "-c", "echo hello"]

04:CMD // 三种格式:

CMD ["executable", "param1", "param2"]

CMD command param1 param2

CMD ["param1", "param2"]

RUN 和 CMD 看起来挺像,但是 CMD 用来指定容器启动时用到的命令,只能有一条。比如

CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]

05:EXPOSE

格式为 EXPOSE <port> [<port>...] , 比如

EXPOSE 22 80 8443

这个用来指定要映射出去的端口,比如容器内部我们启动了 sshd 和 nginx,所以我们需要把 22 和 80 端口暴漏出去。这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。

06:ENV

格式 ENV  <key> <value>, 比如

ENV PATH /usr/local/mysql/bin:$PATH

它主要是为后续的 RUN 指令提供一个环境变量,我们也可以定义一些自定义的变量

ENV MYSQL_version 5.6

07:ADD 格式 add <src> <dest>

将本地的一个文件或目录拷贝到容器的某个目录里。 其中 src 为 Dockerfile 所在目录的相对路径,它也可以是一个 url。比如

ADD <conf/vhosts> </usr/local/nginx/conf>

08:COPY

格式同 add

使用方法和 add 一样,不同的是,它不支持 url

09:ENTRYPOINT 格式类似 CMD

容器启动时要执行的命令,它和 CMD 很像,也是只有一条生效,如果写多个只有最后一条有效。和 CMD 不同是:

CMD 是可以被 docker run 指令覆盖的,而 ENTRYPOINT 不能覆盖。比如,容器名字为 am

我们在 Dockerfile 中指定如下 CMD:

CMD ["/bin/echo", "test"]

启动容器的命令是 docker run am 这样会输出 test

假如启动容器的命令是 docker run -it am  /bin/bash 什么都不会输出

ENTRYPOINT 不会被覆盖,而且会比 CMD 或者 docker run 指定的命令要靠前执行

ENTRYPOINT ["echo", "test"]

docker run -it am 123

则会输出 test 123 ,这相当于要执行命令 echo test 123

10:VOLUME

格式 VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点。

11:USER

格式 USER daemon

指定运行容器的用户

12:WORKDIR

格式 WORKDIR  /path/to/workdir

为后续的 RUN、CMD 或者 ENTRYPOINT 指定工作目录

Dockerfile 示例(安装 nginx)

通过实例去了解一下 Dockerfile

编辑 Dockerfile 文件

[root@am-01:~#] vim Dockerfile

FROM centos

#基于哪个镜像

MAINTAINER am runfali@outlook.com

#作者信息

RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel

#使用 RUN 安装一些依赖的包

ADD http://nginx.org/download/nginx-1.8.0.tar.gz .

#使用 ADD 下载 nginx 源码包

RUN tar zxvf nginx-1.8.0.tar.gz

#使用 RUN 安装解包 nginx 源码包

RUN mkdir -p /usr/local/nginx

#RUN 创建 nginx 安装目录,-p 级联创建

RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install

#编译安装 nginx,注意指定 nginx 的安装目录

RUN rm -fv /usr/local/nginx/conf/nginx.conf

#删除原来自带的 nginx.conf

ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf

#ADD 下载配置文件并放到指定位置

EXPOSE 80

#把 80 端口暴露出来

ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd

#容器启动时执行的命令,Dockerfile 有个特殊的地方,在执行完指定命令后会自动停止运行,所以加上"tail -f /etc/passwd"可以让其永远都执行不完,容器就不会停止运行了

使用 Dockderfile

[root@am-01:~#] systemctl restart docker.service

[root@am-01:~#] docker build -t centos_nginx .

#因为之前更改过宿主机的网络配置而没有重启 docker,所以在这之前还得先重启 docker,让 docker 能正常使用网络

#build 能查询 Dockerfile 文件并执行,-t 参数指定新的镜像名称,最后那个点号,指明 Dockerfile 文件所在路径,我的是在当前目录,所以直接使用点号代替

#有可能运行过程中会发生 yum 安装的时候出错一直卡着,这是你有两种方法,第一是等待,第二是"ctrl+c"强制退出并重新运行

#漫长的等待,去喝杯茶再回来吧

测试 Dockerfile 是否运行成功

[root@am-01:~#] docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

centos_nginx                latest              71b529d71c5b        2 minutes ago       373MB

[root@am-01:~#] docker run -itd -p 81:80 centos_nginx bash

635438f8079bd2f550a47cfcc79828fe0b29385d4c971facf7115da21ba7041a

[root@am-01:~#] docker exec -it 635438f80 bash

[root@635438f8079b /]# ps aux | grep nginx

root          1  0.2  0.0  11684  1352 pts/0    Ss+  11:45   0:00 /bin/sh -c /usr/local/nginx/sbin/nginx && tail -f /etc/passwd bash

root          6  0.0  0.0  24884   788 ?        Ss   11:45   0:00 nginx: master process /usr/local/nginx/sbin/nginx

nobody        7  0.0  0.1  27328  3360 ?        S    11:45   0:00 nginx: worker process

nobody        8  0.0  0.1  27328  3360 ?        S    11:45   0:00 nginx: worker process

root         23  0.0  0.0   9092   664 pts/1    S+   11:45   0:00 grep --color=auto nginx

[root@635438f8079b /]# netstat -lntp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6/nginx: master pro

[root@635438f8079b /]# exit

exit

[root@am-01:~#] curl 172.17.1.240:81

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

    body {

        width: 35em;

        margin: 0 auto;

        font-family: Tahoma, Verdana, Arial, sans-serif;

    }

</style>

</head>

<body>

<h1>Welcome to nginx!</h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>



<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>



<p><em>Thank you for using nginx.</em></p>

</body>

</html>

#启动新建的镜像,可以见到,nginx 已经自动启动,记得 run 的时候要使用-p 参数做端口映射

#测试端口映射,无问题