Dockerfile格式

1、FROM 指定基于哪个基础镜像,如下:

FROM ubuntu:latest

2、MAINTAINER 指定作者信息,如下:

MAINTAINER  aming  aming@aminglinux.com

3、RUN 后面跟具体的命令

RUN apt install -y curl

也可以写成如下内容,相对比较复杂

RUN ["apt","install","-y","curl" ]

4、CMD 用来指定容器启动时用到的命令,只能有一条命令生效(如果写多个只有最后一条有效),格式如下:

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

示例如下:

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

5、EXPOSE 指定要映射的端口,格式如下:

EXPOSE <port1> <port2> <port3>

示例-暴露22,80,8443三个端口,如下:

EXPOSE 22 80 8443

说明:这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。

6、ENV 为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量,如下:

ENV MYSQL_version 5.7

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

ADD conf/vhosts /usr/local/nginx/conf

8、COPY 类似于ADD,将本地文件拷贝到容器里,不过它不支持URL,例如:

COPY 123.txt /data/456.txt

9、ENTRYPOINT 格式类似CMD 容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。

和CMD不同是: CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。

比如,容器名字为aming 我们在Dockerfile中指定如下CMD:

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

假如启动容器的命令是

docker run aming

则会输出 test

假如启动容器的命令是

docker run -it aming  /bin/bash

则什么都不会输出

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

ENTRYPOINT ["echo", "test"]

假如启动容器的命令是

docker run -it aming  123

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

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

VOLUME ["/data"]

11、USER指定RUN、CMD或者ENTRYPOINT运行时使用的用户

USER aming

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

WORKDIR  /tmp/

Dockerfile示例

下面通过使用Dockerfile编译nginx镜像:

1、创建工作目录

$ mkdir dockerfile_test
$ cd dockerfile_test

2、编写Dockerfile文件

$ vim Dockerfile
FROM ubuntu
MAINTAINER zq zq@123456.com
RUN apt update
RUN apt install -y libpcre2-dev  net-tools gcc zlib1g-dev make
ADD http://nginx.org/download/nginx-1.23.2.tar.gz .
RUN tar zxvf nginx-1.23.2.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.23.2 && ./configure --prefix=/usr/local/nginx && make && make install
COPY index.html /usr/local/nginx/html/index.html
EXPOSE 80
ENTRYPOINT /usr/local/nginx/sbin/nginx -g "daemon off;"

3、创建index.html文件

$ cd dockerfile_test
$ echo "test" > index.html

4、编译镜像

$ docker build -t nginx:0.9 .

说明: -t 后面跟镜像名字:tag, 这里的. 表示使用当前目录下的Dockerfile,并且工作目录也为当前目录,如果想使用其它目录下的Dockerfile,还可以使用-f选项来指定,例如

$ docker build -t nginx:1.0 -f  /data/docker/nginx.dkf  /tmp/

上面参数说明如下:

  • /tmp/:工作目录,比如COPY文件的时候,到/tmp/下面去找

5、使用镜像

$ docker run -itd --name nginx01 -P  nginx:0.9

因为是-P,端口随机分配,使用docker ps命令查看,容器80端口映射到49153(指定具体端口要用-p)

$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                     NAMES
ec29e68bfca9   nginx:0.9   "/bin/sh -c '/usr/lo…"   4 seconds ago   Up 3 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp   nginx01

6、验证

$ curl localhost:49153/index.html
test