Dockerfile构建镜像
1、什么是Dockerfile?
Dockerfile把构建镜像的步骤都写出来,然后按顺序执行实现自动构建镜像。就类似于脚本文件,ansible的playbook,saltstack的sls文件等。
2、Dockerfile核心命令
|
命令 |
作用 |
Nginx 典型示例 |
|
|
指定基础镜像 |
|
|
|
设置容器工作目录(非必须,但便于管理) |
|
|
|
复制本地文件到容器(覆盖默认配置或添加静态资源) |
|
|
|
执行命令(安装依赖、修改默认行为) |
|
|
|
声明容器监听端口(需配合 |
|
|
|
挂载数据卷(持久化日志或静态文件) |
|
|
|
启动Nginx(通常不需修改,直接用基础镜像命令) |
|
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测试

更多推荐
所有评论(0)