【七、 Dockerfile详解】

🎉作者简介:👓 博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢 c + + , g o , p y t h o n , 目前熟悉 c + + , g o 语言,数据库,网络编程,了解分布式等相关内容 \textcolor{orange}{博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容} 博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++go语言,数据库,网络编程,了解分布式等相关内容
📃 个人主页: \textcolor{gray}{个人主页:} 个人主页: 小呆鸟_coding
🔎 支持 : \textcolor{gray}{支持:} 支持: 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦 \textcolor{green}{如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦} 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦👍 就是给予我最大的支持! \textcolor{green}{就是给予我最大的支持!} 就是给予我最大的支持!🎁
💛本文摘要💛

本专栏将非常细致的讲解docker原理、安装、用docker部署相关服务器以及使用docker部署自己的镜像,非常简单易懂。 本文主要讲解dockerfile概念以及通过dockerfile构建自己的镜像,并发布到dockerhub或者阿里云等相关理论知识。

Docker系列文章:
一、Docker概述
二、Docker安装大全
三、Docker 命令大全
四、Docker容器部署
五、Docker镜像详解
六、Docker容器卷详解
七、 Dockerfile详解
八、Docker网路模式详解
笔记总结:https://www.bilibili.com/video/BV1og4y1q7M4
可面试可复习

❄️1.Dockerfile介绍

Dockerfile是用来构建Docker镜像的文本文件,它包含了一条条的指令,每一条指令都会创建一个新的镜像层,因此每一条指令的内容,用来描述该镜像应当如何建立。很多官方镜像
都是一些基础包,很多功能没有,这就需要我们自己制造自己的镜像

Docker镜像发布的步骤:

  • 编写dockerfile文件
  • 用docker buile命令来构建一个镜像
  • 通过docker run来运行一个镜像
  • docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库)

dockerfile是面向开发,以后发布项目,做镜像,就要编写dockerfile文件

  • dockerfile:构建文件,定义一切步骤,源代码 。-----------------(自己作镜像)
  • dockerimages:t通过dockerfile构建生成的镜像,最终发布和运行产品。—(使用别人镜像)
  • docker容器:容器就是镜像运行起来提供服务器。-------------------------(使用别人镜像)
    在这里插入图片描述

❄️2.DockerFile注意事项

  • 每一个保留关键字(指令)都必须是大写字母
  • 执行从上到下顺序执行
  • #表示注释
  • 每一个指令都会创建提交一个新的镜像层,并提交!

❄️3.Dockerfile指令

指令指定基础镜像
FROM基础镜像,从这里开始构建
MAINTAINER镜像是谁写的,姓名+邮箱
RUN镜像构建的时候需要运行的命令
ADD 将本地文件添加到容器中,类似于在centos中追加tomcat
WORKDIR镜像的工作目录
VOLUME 挂载的目录
EXPOSE保留端口配置(这样就不需要再命令行输入端口了)
CMD指定这个容器启动的时候要运行的命令(只有最后一个会生效)
EMTRYPOINT指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令,触发指令
COPY 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
ENV构建的时候设置环境变量

在这里插入图片描述

❄️4.构建自己的Centos镜像

Docker Hub中大部分镜像都是从这个基础的镜像过来的 FROM scratch,然后配置自己所需要的软件(例如MySQL,Redis等)进行构建自己的镜像。
在这里插入图片描述

☔️1.编写自己的配置文件

因为我宿主机是centos7,所以我在编写dockerfile文件时也是拉取的7,不然容易导致错误

#编写Dockerfile的文件

[root@VM-16-15-centos dockerfile]# pwd
/home/dockerfile
[root@VM-16-15-centos dockerfile]# vim mydockerfile-centos
[root@VM-16-15-centos dockerfile]# cat mydockerfile-centos 
FROM centos:7
MAINTAINER xiaodainiao<2911727134@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
Run yum -y install net-tools

EXPOSE 80

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

Dockerfile文件的指令解释:

  • FROM centos:该image文件继承官方的centos,后面加冒号如centos:7,用于指定镜像的版本,该文章用的是cnetos:7版本
  • ENV MYPATH /usr/local:设置环境变量MYPATH ,后面有用到
  • WORKDIR $MYPATH:直接使用上面设置的环境变量,指定/usr/local为工作目录
  • RUN yum -y install vim:在/usr/local目录下,运行yum -y install vim
  • RUN yum -y install net-tools:在/usr/local目录下,运行yum -y install net-tools命令安装工具,注意安装后的所有依赖和工具都会打包到image文件中
  • EXPOSE 80:将容器80端口暴露出来,允许外部连接这个端口,不需要在命令行输入-P 来指定端口
  • CMD:指定容器启动的时候运行命令

☔️2.通过文件构建镜像

#命令 docker build -f dockerfile 文件路径 -t 镜像名:[tag]

[root@VM-16-15-centos dockerfile]# docker build -f mydockerfile-centos -t mycentos:1.0 .
Successfully built 3d5c59bb5a89
Successfully tagged mycentos:1.0

☔️3.测试运行

  • 发现pwd路径正是之前设置的路径
  • ifconfig命令可以使用
  • vim命令可以使用
[root@bfe3f0c24f25 local]# pwd
/usr/local
[root@bfe3f0c24f25 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.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  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        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  collisions 0

[root@bfe3f0c24f25 local]# vim test

与最基础的centos镜像相比
在这里插入图片描述
使用docker history 容器id来查看自己镜像构建的过程

[root@VM-16-15-centos ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mycentos     1.0       3d5c59bb5a89   10 hours ago   601MB
centos       7         eeb6ee3f44bd   9 months ago   204MB
centos       latest    5d0da3dc9764   9 months ago   231MB

[root@VM-16-15-centos ~]# docker history mycentos:1.0
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
3d5c59bb5a89   10 hours ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
994937b1f6ba   10 hours ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
129cba49597f   10 hours ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
2f9014e82bc5   10 hours ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
643513ca38b3   10 hours ago   /bin/sh -c yum -y install net-tools             171MB     
98ef123cfe7f   10 hours ago   /bin/sh -c yum -y install vim                   226MB     
ff284a516406   10 hours ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
a520b864b437   10 hours ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
a7b11c22351e   10 hours ago   /bin/sh -c #(nop)  MAINTAINER xiaodainiao<12…   0B        
eeb6ee3f44bd   9 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      9 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      9 months ago   /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB  

❄️5.CMD和ENTRYPOINT区别

CMD                    #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被代替
ENTRYPOINT    #指定这个容器启动的时候要运行的命令,可以追加命令

☔️测试CMD

(1)在/home/dockerfile目录下进行创建


[root@VM-16-15-centos dockerfile]# pwd
/home/dockerfile


(2)编写dockerfile文件

[root@VM-16-15-centos dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]

(3)构建镜像

[root@VM-16-15-centos dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos
 ---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"]
 ---> Running in 7a84f0227170
Removing intermediate container 7a84f0227170
 ---> 0c88993723dd
Successfully built 0c88993723dd
Successfully tagged cmdtest:latest

(4)run运行,发现之前设置的 la -a命令生效

[root@VM-16-15-centos dockerfile]# docker run 0c88993723dd
.
..
.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@VM-16-15-centos dockerfile]# docker run 0c88993723dd -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled 

#CMD情况下 -l 替换CMD ["ls","-a"]命令,-l不是命令所以报错

[root@VM-16-15-centos dockerfile]# docker run 0c88993723dd ls -al
total 56
drwxr-xr-x   1 root root 4096 Jun 15 01:06 .
drwxr-xr-x   1 root root 4096 Jun 15 01:06 ..
-rwxr-xr-x   1 root root    0 Jun 15 01:06 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 Jun 15 01:06 dev
drwxr-xr-x   1 root root 4096 Jun 15 01:06 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 110 root root    0 Jun 15 01:06 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Jun 15 01:06 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var

☔️测试ENTRYPOINT

(1)编辑dockerfile文件

[root@VM-16-15-centos dockerfile]# vim dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]

(2)构建镜像

[root@VM-16-15-centos dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entorypoint-test .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in d6aa653e81b4
Removing intermediate container d6aa653e81b4
 ---> 198da24abd1d
Successfully built 198da24abd1d
Successfully tagged entorypoint-test:latest

(3)运行镜像

[root@VM-16-15-centos dockerfile]# docker run 198da24abd1d
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

(4)追加 -命令发现成功

#我们的追加命令,是直接拼接在我们的 ENTRYPOINT 命令的后面!

[root@VM-16-15-centos dockerfile]# docker run 198da24abd1d -l
total 56
drwxr-xr-x   1 root root 4096 Jun 15 01:11 .
drwxr-xr-x   1 root root 4096 Jun 15 01:11 ..
-rwxr-xr-x   1 root root    0 Jun 15 01:11 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 Jun 15 01:11 dev
drwxr-xr-x   1 root root 4096 Jun 15 01:11 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 111 root root    0 Jun 15 01:11 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Jun 15 01:06 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var

❄️6.实战 Tomcat镜像

(1)准备镜像文件,tomcat压缩吧,jdk压缩包


[root@VM-16-15-centos xiaodainiao]# pwd
/home/xiaodainiao
[root@VM-16-15-centos xiaodainiao]# ll
total 155844
-rw-r--r-- 1 root root  11579290 Jun 15 09:55 apache-tomcat-9.0.64.tar.gz
-rw-r--r-- 1 root root 148003421 Jun 15 10:00 jdk-8u333-linux-x64.tar.gz

(2)编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要 -f 指定了!

FROM centos
MAINTAINET xiaodainiao<1234567890@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u333-linux-x64.tar.gz /usr/local/

ADD apache-tomcat-9.0.64.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_333
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.64
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.64
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-8.5.55/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.55/bin/logs/catalina.out

(3)构建镜像

[root@VM-16-15-centos xiaodainiao]# docker build -t diytomcat .

(4)启动镜像,构建Tomcat容器

[root@VM-16-15-centos xiaodainiao]#  docker run -d -p 9090:8080 --name xiaodainiaodiytomcat -v /home/xiaodainiao/test:/usr/local/apache-tomcat-9.0.64/webapps/test -v /home/xiaodainiao/tomcatlogs/:/url/local/apache-tomcat-9.0.64/logs diytomcat

  • 设置了数据卷,宿主机的/home/dockerfile/tomcat/test对应该容器的/usr/local/apache-tomcat-9.0.64/webapps/test
  • 宿主机上的日志对应tomcat上面的logs /home/xiaodainiao/tomcatlogs/:/url/local/apache-tomcat-9.0.64/logs
  • 只要修改宿主机上的文件,就能实现在tomcat里面同步修改,即使容器删掉,则宿主机上仍然有数据

(5)访问测试
在/home/xiaodainiao/test的目录下,新建index.html 测试Tomcat是否能正常使用。

因为设置了卷挂载所以可以直接在宿主机中进行操作。

[root@VM-16-15-centos test]# pwd
/home/xiaodainiao/test
 
[root@VM-16-15-centos test]# vim index.html
 
[root@VM-16-15-centos WEB-INF]# cat index.html 
<!DOCTYPE html>
<html>
    <head>
         <meta charset="UTF-8"/>
        <title>小呆鸟</title>
    </head>
    <body>
        <h1>访问测试自己做的镜像</h1>
        <p>xiaodainiaotomcat</p>
    </body>
</html>

在这里插入图片描述

❄️7.发布自己的镜像到DockerHub

  1. 注册自己的账号在DockerHub上
    https://www.docker.com/products/docker-hub/
  2. 进行登录,docker login -u 用户名
  3. 在我们的服务器上提交自己的镜像
[root@VM-16-15-centos xiaodainiao]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

[root@VM-16-15-centos xiaodainiao]# docker login -u xiaodainiao
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

  1. 登录完成就可以提交镜像,使用docker push
#push 到自己的镜像到服务器 上!!!
[root@VM-16-15-centos xiaodainiao]# docker push xiaodainiao/diytomcat:1.1
The push refers to repository [docker.io/xiaodainiao/diytomcat]
An image does not exist locally with the tag: xiaodainiao/diytomcat


#push镜像的问题??为了解决这个问题,需要加上一个 tag标签

[root@VM-16-15-centos xiaodainiao]# docker tag 7c491555cb7b xiaodianiao/tomcat:1.0
[root@VM-16-15-centos xiaodainiao]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED        SIZE
diytomcat            latest    7c491555cb7b   2 hours ago    815MB
xiaodianiao/tomcat   1.0       7c491555cb7b   2 hours ago    815MB
entorypoint-test     latest    198da24abd1d   8 hours ago    231MB
cmdtest              latest    0c88993723dd   8 hours ago    231MB
mycentos             1.0       3d5c59bb5a89   19 hours ago   601MB
centos               7         eeb6ee3f44bd   9 months ago   204MB
centos               latest    5d0da3dc9764   9 months ago   231MB



#再次验证就可以了
[root@VM-16-15-centos xiaodainiao]# docker push xiaodianiao/tomcat:1.0
The push refers to repository [docker.io/xiaodianiao/tomcat]
5eea7b95ca95: Preparing 
6b3433abaf63: Preparing 
bb2d2170c64d: Preparing 
420d50c2cf59: Preparing 
174f56854903: Preparing 

因为push的时候,镜像名前面需要加上用户名(xiaodainiao是我的用户名。如果用户名不是当前登录用户则会拒绝push请求),所以需要使用命令docker tag 镜像名 新的镜像名 docker tag 7c491555cb7b xiaodianiao/tomcat:1.0复制出一份镜像重新打个Tag。

❄️8.将镜像发布到阿里云

  1. 登录阿里云
  2. 找到容器镜像服务
  3. 创建命名空间

在这里插入图片描述
4. 创建容器镜像
在这里插入图片描述
在这里插入图片描述

❄️9.小结

在这里插入图片描述

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小呆鸟_coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值