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