1、什么是Dockerfile?

Dockerfile把构建镜像的步骤都写出来,然后按顺序执行实现自动构建镜像。就类似于脚本文件,ansible的playbook,saltstack的sls文件等。

2、Dockerfile核心命令

命令

作用

Nginx 典型示例

FROM

指定基础镜像

FROM nginx:1.25-alpine(推荐轻量版)

WORKDIR

设置容器工作目录(非必须,但便于管理)

WORKDIR /etc/nginx

COPY

复制本地文件到容器(覆盖默认配置或添加静态资源)

COPY nginx.conf /etc/nginx/nginx.conf

RUN

执行命令(安装依赖、修改默认行为)

RUN yum install curl

EXPOSE

声明容器监听端口(需配合-p映射到宿主机)

EXPOSE 80 443

VOLUME

挂载数据卷(持久化日志或静态文件)

VOLUME ["/var/log/nginx"]

CMD

启动Nginx(通常不需修改,直接用基础镜像命令)

CMD ["nginx", "-g", "daemon off;"]

1、FROM

FROM指令用于指定其后构建新镜像所使用的基础镜像。

FROM指令必是Dockerfile文件中的首条命令。

FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库,优先本地仓库。

格式:FROM <image>:<tag>
例:FROM centos:latest

2、RUN

RUN指令用于在构建镜像中执行命令

格式:RUN <命令>
例:RUN echo daniel > /var/www/html/index.html

3、CMD

CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

格式有三种:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。

如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令。

# 什么是启动容器时指定运行的命令?
docker run -d -p 80:80 镜像名 运行的命令

4、EXPOSE

EXPOSE指令用于指定容器在运行时监听的端口

格式:EXPOSE <port> [<port>...]
例:EXPOSE 80 3306 8080

上述运行的端口还需要使用docker run运行容器时通过-p参数映射到宿主机的端口.

5、ENV

ENV指令用于指定一个环境变量.

格式:ENV <key> <value> 或者 ENV <key>=<value>
例:ENV JAVA_HOME /usr/local/jdkxxxx/

6、ADD

ADD指令用于把宿主机上的文件拷贝到镜像中

格式:ADD <src> <dest>
<src>可以是一个本地文件或本地压缩文件,还可以是一个url,
如果把<src>写成一个url,那么ADD就类似于wget命令
<dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径

7、COPY

COPY指令与ADD指令类似,但COPY的源文件只能是本地文件(文件或目录)

格式:COPY <src> <dest>

ADD与COPY最佳实践:默认优先使用COPY

仅当需要解压本地压缩包时使用

ADD app.tar.gz /app/
等价于
COPY app.tar.gz /app/ && tar -xzf /app/app.tar.gz -C /app/

8、ENTRYPOINT

ENTRYPOINT与CMD非常类似

相同点: 一个Dockerfile只写一条,如果写了多条,那么只有最后一条生效 都是容器启动时才运行

不同点: 如果用户启动容器时候指定了运行的命令,ENTRYPOINT不会被运行的命令覆盖,而CMD则会被覆盖

格式有两种:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

9、VOLUME

VOLUME指令用于把宿主机里的目录与容器里的目录映射.

只指定挂载点,docker宿主机映射的目录为自动生成的。

格式:VOLUME ["<mountpoint>"]

10、USER

USER指令设置启动容器的用户(像hadoop需要hadoop用户操作,oracle需要oracle用户操作),可以是用户名或UID

USER daemon
USER 1001

步骤:

1、创建一个文件夹(目录)

2、在文件夹(目录)中创建Dockerfile文件(并编写)及其它文件

3、使用docker build命令构建镜像

4、使用构建的镜像启动容器

案例:Dockerfile构建httpd镜像v1

1、准备一个目录(自定义)

[root@localhost ~]# mkdir /dockerfile

2、编写dockerfile

[root@localhost ~]# cd /dockerfile/
[root@localhost dockerfile]# ls
[root@localhost dockerfile]# vim dockerfile_httpd
FROM dokken/centos-stream-9

LABEL maintainer="root <my.com>"

RUN yum install httpd httpd-devel -y \
        && echo "container main page" > /var/www/html/index.html

EXPOSE 80

CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

3、使用docker build构建镜像,注意最后有一个点(代表当前目录)

[root@daniel dockerfile]# docker build -f dockerfile_httpd -t my_httpd:v1 .

-f:file,指定构建dockerfile文件
-t:target,目标镜像名称以及版本号(Tag标签)
.:最后有一个点代表基于当前目录作为构建的上下文环境

4、验证镜像

[root@localhost dockerfile]# docker images
                                                                                                                                                                   
IMAGE          ID             DISK USAGE   CONTENT SIZE   EXTRA
my_httpd:v1    dd189f0a6451        695MB          193MB
mysql:8.0      64756cc92f70       1.08GB          247MB
nginx:1.28.0   552e7481ca93        280MB         75.5MB

5、使用构建好的镜像创建容器

[root@localhost dockerfile]# docker run -d -d -p 8005:80 my_httpd:v1
d48f28109fa9bf0de7f814dae3c916ba56a8e2ec0aa3922e070401ee6176bbbf
[root@localhost dockerfile]# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                     NAMES
d48f28109fa9   my_httpd:v1   "/usr/sbin/httpd -D …"   6 seconds ago   Up 5 seconds   0.0.0.0:8005->80/tcp, [::]:8005->80/tcp   sharp_golick

6、客户端访问http://docker宿主机IP:8005测试

更多推荐