您现在的位置是:首页 > 编程 > 

【Docker】008

2025-07-23 23:02:37
【Docker】008 八、Dockerfile制作镜像1、概述Dockerfile是用来构建镜像的文件;构建步骤 编写dockerfile文件; docker build 构建成为一个镜像; docker run 运行镜像; docker push 发布镜像(DockerHub,阿里云镜像仓库); Centos的Dockerfile很多官方镜像都是基础包,仅包含基础功能,我们通常会

【Docker】008

八、Dockerfile制作镜像

1、概述

Dockerfile是用来构建镜像的文件;

构建步骤
  1. 编写dockerfile文件;
  2. docker build 构建成为一个镜像;
  3. docker run 运行镜像;
  4. docker push 发布镜像(DockerHub,阿里云镜像仓库);
Centos的Dockerfile

很多官方镜像都是基础包,仅包含基础功能,我们通常会搭建自己的镜像;

下面的90%是99%!

2、Dockerfile构建过程

基础知识
  1. 每一个保留关键字(指令)都必须大写;
  2. 指令按从上到下的顺序执行;
  3. #表示注释;
  4. 每一行命令都会创建并提交一个新的镜像层;

dockerfile是面向开发的,我们以后要发布项目,做镜像,需要编写dockerfile文件,这很简单!

Dockerfile逐渐成为企业交付的标准,必须要掌握!

步骤:开发、部署、运维,缺一不可!

Dockerfile:构建文件,定义了一切的步骤,源代码;

DockerImages:通过Dockerfile文件生成的镜像,最终要发布和运行的产品;

Docker容器:容器就是镜像运行起来提供服务的;

、Dockerfile的指令

参考
补充
代码语言:javascript代码运行次数:0运行复制
CMD # 指定容器启动的时候要运行的命令,多个CMD,只有最后一个会生效
ETRYPOIT # 指定容器启动的时候要运行的命令,可以追加命令
OBUILD # 当构建一个被继承 Dockerfile 的时候,这个时候会运行 OBUILD 指令
COPY # 类似ADD,将我们的文件拷贝到镜像中
EV # 构建的时候设置环境变量

以前我们都是使用别人的,现在我们自己构建镜像!

4、实战:构建自己的centos

DockerHub99%的镜像都是从scratch开始的;

代码语言:javascript代码运行次数:0运行复制
# 1、编写dockerfile文件
[root@zibo dockerfile]# vim df-centos # 编写文件,ESC -> :wq保存
[root@zibo dockerfile]# cat df-centos  # 查看文件
FROM centos
MAITAIER zibo<709570094@qq>

EV MYPATH /usr/local
WORKDIR $MYPATH

RU yum -y install vim
RU yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

# 2、构建镜像

# 构建镜像,别忘了点(.)代表当前目录
docker build -f df-centos -t zb-centos .

# 构建成功
……
Successfully built 65e7968fdd4
Successfully tagged zb-centos:latest
[root@zibo dockerfile]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
zb-centos                latest    65e7968fdd4   28 seconds ago   291MB
……

# 、测试运行
docker run -it zb-centos

# 控制台
[root@zibo ~]# docker run -it zb-centos
[root@cfa5896b5eb local]# pwd  
/usr/local # 直接到了我们的工作目录
[root@cfa5896b5eb local]# ifconfig  # 更多的命令也可以用了!!!
eth0: flags=416<UP,BROADCAST,RUIG,MULTICAST>  mtu 1500
        inet 172.17.0.8  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:08  txqueuelen 0  (Ethernet)
        RX packets 15  bytes 1248 (1.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisi 0

lo: flags=7<UP,LOOPBACK,RUIG>  mtu 6556
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisi 0

# 查看docker镜像生成历史
docker history 镜像id

# 控制台
[root@zibo ~]# docker history 65e7968fdd4 # zb-centos
IMAGE          CREATED          CREATED BY                                      SIZE      COMMET
65e7968fdd4   9 minutes ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
ae5b285264f7   9 minutes ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
011dce051915   9 minutes ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
bbb461175bbc   9 minutes ago    /bin/sh -c #(nop)  EXPOSE 80                    0B        
2d919e6d4e0   9 minutes ago    /bin/sh -c yum -y install net-tools             2.MB    
9acb8f704d25   9 minutes ago    /bin/sh -c yum -y install vim                   58MB      
8c67894dcfa   12 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
0b1fe9bca817   12 minutes ago   /bin/sh -c #(nop)  EV MYPATH=/usr/local        0B        
a7b614b9a9df   12 minutes ago   /bin/sh -c #(nop)  MAITAIER zibo<709570094…   0B        
00e15adb2f    months ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>       months ago     /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>       months ago     /bin/sh -c #(nop) ADD file:bd7a2aed6ede42b7…   209MB

5、CMD和ETRYPOIT区别

命令说明
代码语言:javascript代码运行次数:0运行复制
CMD # 指定容器启动的时候要运行的命令,多个CMD,只有最后一个会生效
ETRYPOIT # 指定容器启动的时候要运行的命令,可以追加命令
CMD代码实践
代码语言:javascript代码运行次数:0运行复制
# 1、测试CMD

# 1.1 编写一个新的dockerfile文件
vim df-cmd

# 文件内容
FROM centos
CMD ["ls","-a"]

# 1.2 构建镜像
docker build -f df-cmd -t cmd-centos .

# 控制台
[root@zibo dockerfile]# docker build -f df-cmd -t cmd-centos .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 00e15adb2f
Step 2/2 : CMD ["ls","-a"]
 ---> Running in f988fc7c89
Removing intermediate container f988fc7c89
 ---> aad1a58526c
Successfully built aad1a58526c
Successfully tagged cmd-centos:latest

# 1. 根据镜像创建并运行容器
docker run aad1a58526c

# 控制台:运行之后执行了ls -a
[root@zibo dockerfile]# docker run aad1a58526c
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 想追加一个命令 -l		ls -al
[root@zibo dockerfile]# docker run aad1a58526c -l
docker: Error respe from daemon: OCI runtime create failed: container_linux.go:67: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

# CMD情况下,-l【替换】了CMD["ls","-a"]命令,-l部署命令,因此报错!
# 那我们该怎么做?
docker run aad1a58526c ls -al # 

# 控制台
[root@zibo dockerfile]# docker run aad1a58526c ls -al # 需要写完整的命令
total 0
drwxr-xr-x   1 root root   6 Apr  5 01:5 .
drwxr-xr-x   1 root root   6 Apr  5 01:5 ..
-rwxr-xr-x   1 root root   0 Apr  5 01:5 .dockerenv
lrwxrwxrwx   1 root root   7 ov   15:22 bin -> usr/bin
drwxr-xr-x   5 root root 40 Apr  5 01:5 dev
drwxr-xr-x   1 root root  66 Apr  5 01:5 etc
drwxr-xr-x   2 root root   6 ov   15:22 home
lrwxrwxrwx   1 root root   7 ov   15:22 lib -> usr/lib
lrwxrwxrwx   1 root root   9 ov   15:22 lib64 -> usr/lib64
drwx------   2 root root   6 Dec  4 17:7 lost+found
drwxr-xr-x   2 root root   6 ov   15:22 media
drwxr-xr-x   2 root root   6 ov   15:22 mnt
drwxr-xr-x   2 root root   6 ov   15:22 opt
dr-xr-xr-x 177 root root   0 Apr  5 01:5 proc
dr-xr-x---   2 root root 162 Dec  4 17:7 root
drwxr-xr-x  11 root root 16 Dec  4 17:7 run
lrwxrwxrwx   1 root root   8 ov   15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 ov   15:22 srv
dr-xr-xr-x  1 root root   0 Apr  5 01:5 sys
drwxrwxrwt   7 root root 145 Dec  4 17:7 tmp
drwxr-xr-x  12 root root 144 Dec  4 17:7 usr
drwxr-xr-x  20 root root 262 Dec  4 17:7 var
ETRYPOIT代码实践
代码语言:javascript代码运行次数:0运行复制
# 2、测试ETRYPOIT

# 2.1 编写一个新的dockerfile文件
vim df-entrypoint

# 文件内容
FROM centos
ETRYPOIT ["ls","-a"]

# 2.2 构建镜像
[root@zibo dockerfile]# docker build -f df-entrypoint -t df-ep .
Sending build context to Docker daemon   5.12kB
Step 1/2 : FROM centos
 ---> 00e15adb2f
Step 2/2 : ETRYPOIT ["ls","-a"]
 ---> Running in 62914ea6fc8f
Removing intermediate container 62914ea6fc8f
 ---> 6d49aa176415
Successfully built 6d49aa176415
Successfully tagged df-ep:latest

# 2. 根据镜像创建并允许容器
[root@zibo dockerfile]# docker run 6d49aa176415
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 2.4 想追加一个命令 -l		ls -al
[root@zibo dockerfile]# docker run 6d49aa176415 -l
total 0
drwxr-xr-x   1 root root   6 Apr  5 01:45 .
drwxr-xr-x   1 root root   6 Apr  5 01:45 ..
-rwxr-xr-x   1 root root   0 Apr  5 01:45 .dockerenv
lrwxrwxrwx   1 root root   7 ov   15:22 bin -> usr/bin
drwxr-xr-x   5 root root 40 Apr  5 01:45 dev
drwxr-xr-x   1 root root  66 Apr  5 01:45 etc
drwxr-xr-x   2 root root   6 ov   15:22 home
lrwxrwxrwx   1 root root   7 ov   15:22 lib -> usr/lib
lrwxrwxrwx   1 root root   9 ov   15:22 lib64 -> usr/lib64
drwx------   2 root root   6 Dec  4 17:7 lost+found
drwxr-xr-x   2 root root   6 ov   15:22 media
drwxr-xr-x   2 root root   6 ov   15:22 mnt
drwxr-xr-x   2 root root   6 ov   15:22 opt
dr-xr-xr-x 178 root root   0 Apr  5 01:45 proc
dr-xr-x---   2 root root 162 Dec  4 17:7 root
drwxr-xr-x  11 root root 16 Dec  4 17:7 run
lrwxrwxrwx   1 root root   8 ov   15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 ov   15:22 srv
dr-xr-xr-x  1 root root   0 Apr  5 01:45 sys
drwxrwxrwt   7 root root 145 Dec  4 17:7 tmp
drwxr-xr-x  12 root root 144 Dec  4 17:7 usr
drwxr-xr-x  20 root root 262 Dec  4 17:7 var

# 区别是什么?entrypoint 可以对命令在原有基础上进行【追加】,而CMD是【替换】!

# Dockerfile中很多命令都非常相似,我们需要了解他们的区别,并对比测试!

6、实战:Tomcat镜像

步骤
代码语言:javascript代码运行次数:0运行复制
# 1、准备镜像文件 tomcat 压缩包,jdk压缩包;
[root@zibo softs]# ls # 搞了一会儿,终于搞过来了
apache-tomcat-9.0.gz  gz

# 2、编写dockerfile,官方命名是Dockerfile,构建镜像的时候会自动寻此文件,不需要-f指定了
[root@zibo softs]# vim Dockerfile

FROM centos

MAITAIER zibo<709570094@qq>

COPY  /usr/local/

ADD gz /usr/local/
ADD apache-tomcat-9.0.gz /usr/local/

RU yum -y install vim

EY MYPATH /usr/local
WORKDIR $MYPATH

EV JAVA_HOME /usr/local/jdk1.8.0_281
EV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EV CATALIA_HOME /usr/local/apache-tomcat-9.0.44
EV CATALIA_BASE /usr/local/apache-tomcat-9.0.44
EV PATH $PATH:$JAVA_HOME/bin:$CATALIA_HOME/lib:$CATALIA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.44/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.44/bin/logs/

# 、构建镜像
docker build -t zb-tomcat .

# 4、启动镜像
docker run -d -p 8004:8080 --name zbtomcat -v /home/zibo/tomcat/webapps/test:/usr/local/apache-tomcat-9.0.44/webapps/test -v /home/zibo/tomcat/logs:/usr/local/apache-tomcat-9.0.44/logs zb-tomcat

# 5、访问测试[见图:访问测试]
http://公网ip:8004/
# 别忘记开阿里云安全组端口,如果不行就开宝塔面板的端口,还有Dockerfile文件别写错!

# 6、发布项目,上面我们挂载了test目录,只需要在test目录下部署即可
[root@ZiBo test]# mkdir WEB-IF # 创建WEB-IF文件夹
[root@ZiBo WEB-IF]# vim web.xml # 编写web.xml文件[见代码web.xml]
[root@ZiBo WEB-IF]# cd ..
[root@ZiBo test]# ls
WEB-IF
[root@ZiBo test]# vim index.jsp # 编写index.jsp文件[见代码index.jsp]

# 7、访问测试[见图:访问项目测试]
http://公网ip:8004/test

# 8、查看日志
[root@ZiBo test]# ls
index.jsp  WEB-IF
[root@ZiBo test]# cd ..
[root@ZiBo webapps]# ls
test
[root@ZiBo webapps]# cd ..
[root@ZiBo tomcat]# ls
logs  webapps
[root@ZiBo tomcat]# cd logs/
[root@ZiBo logs]# ls
catalina.2021-04-10.log    host-manager.2021-04-10.log  localhost.2021-04-10.log  localhost_access_log.  manager.2021-04-10.log
[root@ZiBo logs]# cat  
……
10-Apr-2021 07:22:49.875 IFO [Catalina-utility-1] org.startup.HostConfig.reload Reloading context [/test]
10-Apr-2021 07:22:49.876 IFO [Catalina-utility-1] org.core.StandardContext.reload Reloading Context with name [/test] has started
10-Apr-2021 07:22:49.895 IFO [Catalina-utility-1] org.core.StandardContext.reload Reloading Context with name [/test] is completed
Hello World!
Hello World!
Hello World!
访问测试
web.xml
代码语言:javascript代码运行次数:0运行复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="; 
    xmlns="; 
    xmlns:web=".xsd" 
    xsi:schemaLocation=" 
    .xsd" 
    id="WebApp_ID" version="2.5">

</web-app>
index.jsp
代码语言:javascript代码运行次数:0运行复制
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>訾博正在学Docker</title>
</head>
<body>
	Hello This World!<br/>
<%
	println("Hello World!");
%>
</body>
</html>
访问项目测试

7、发布自己的镜像

发布到DockerHub
代码语言:javascript代码运行次数:0运行复制
# 1、注册;
# 2、在自己的服务器上登录并提交自己的镜像

# 控制台登录
[root@ZiBo logs]# docker login -u zibo1996 
Password: 
WARIG! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See


Login Succeeded

# 、push镜像
[root@ZiBo logs]# docker push zb-tomcat
Using default tag: latest
The push refers to repository [docker.io/library/zb-tomcat]
074e6a04bb: Preparing 
b5dc79d2441: Preparing 
54710f6e0a8b: Preparing 
bdc9057c74: Preparing 
265d992f4ef: Preparing 
denied: requested access to the resource is denied # 被拒绝

# 4、docker push镜像的格式
docker push 注册用户名/镜像名

# 自己的镜像名字要是:注册用户名/镜像名,因此需要规范镜像名字,要不然不到
# tag命令修改为规范的镜像:
docker tag 镜像名 注册用户名/镜像名

# 然后再push
[root@ZiBo ~]# docker tag zb-tomcat zibo1996/zb-tomcat
[root@ZiBo ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
zb-tomcat                latest    2029e892c6b2   2 hours ago    640MB
zibo1996/zb-tomcat       latest    2029e892c6b2   2 hours ago    640MB
[root@ZiBo ~]# docker push zibo1996/zb-tomcat # 这个时候就可以push了,速度比较慢
# push中……,速度慢!
Using default tag: latest
The push refers to repository [docker.io/zibo1996/zb-tomcat]
074e6a04bb: Pushing [========================>                          ]  28.11MB/58.0MB
b5dc79d2441: Pushing [================================>                  ]  10.18MB/15.9MB
54710f6e0a8b: Pushing [=>                                                 ]  14.2MB/56.6MB
bdc9057c74: Pushed 
265d992f4ef: Pushing [=====>                                             ]  22.8MB/209.MB
# 提交的时候也是分层提交的!
发布到阿里云镜像仓库
代码语言:javascript代码运行次数:0运行复制
# 1、登录阿里云——容器镜像服务——创建个人实例——设置密码——创建命名空间——创建镜像仓库——根据提示填写相关信息——本地仓库;

# 2、进入镜像仓库,就可以看到操作指南,根据操作指南执行即可!

# 、速度慢的话注意看第4条和第5条说明!

# 4、推送结果[见图:推送结果]
阿里云推送结果

8、小结

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2022-06-16,如有侵权请联系 cloudcommunity@tencent 删除容器dockerfileroot测试镜像

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1199446.html

相关标签:无
上传时间: 2025-07-23 15:29:24

上一篇:【Docker】009

下一篇:【Docker】007

留言与评论(共有 7 条评论)
本站网友 海棠花有毒吗
30分钟前 发表
就可以看到操作指南
本站网友 香河别墅
6分钟前 发表
7 lost+found drwxr-xr-x 2 root root 6 ov 15
本站网友 火星娃学汉字
2分钟前 发表
ETRYPOIT ["ls"
本站网友 医药市场
26分钟前 发表
实战:构建自己的centos DockerHub99%的镜像都是从scratch开始的; 代码语言:javascript代码运行次数:0运行复制# 1
本站网友 任盈盈
2分钟前 发表
这很简单!Dockerfile逐渐成为企业交付的标准
本站网友 我看吧
11分钟前 发表
FROM centos ---> 00e15adb2f Step 2/2