Docker file

1. Dockerfile介绍

Dockerfile是用来构建Docker镜像的文本文件,也可以说是命令参数脚本。docker build命令用于从Dockerfile构建镜像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

DockerFile            构建文件,定义一切步骤来构建Docker 镜像

DockerImage       通过DockerFile构建生成,最终发布和运行的产品

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

Docker镜像发布的步骤:
1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run 镜像

4、docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库)

示例一个镜像的结构图:
在这里插入图片描述

2. Dockerfile指令说明

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

一个形象的解释各个指令作用的图:

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

关于DockerFile文件的脚本注意点有:

1、每个保留关键字(指令)都必须是大写字母

2、文件中的指令从上到下顺序执行,第一个指令必须是FROM

3、# 号表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交!

关于Dockerfile指令的详细语法解释:Dockerfile文件详解
Dockerfile指令介绍的官方文档:Dockerfile reference | Docker Documentation

3. 制作Centos镜像

下面通过编写Dockerfile文件来制作Centos镜像,并在官方镜像的基础上添加vim和net-tools工具。首先在/home/dockfile 目录下新建文件mydockerfile-centos。然后使用上述指令编写该文件。

创建目录
[root@localhost home]# mkdir dockerfile
[root@localhost home]# ls
ccc  dockerfile  mysql  test
[root@localhost home]# cd dockerfile

编写 mydockerfile-centos 文件
[root@localhost dockerfile]# vim mydockerfile-centos


FROM centos:7                           如果不标版本可能会报错
MAINTAINER CCC<123456@qq.com>           添加作者信息

ENV MYPATH /usr/local                   设置MYPATH变量,使用$+变量名即可引用
WORKDIR $MYPATH

RUN yum -y install vim                  安装vim和net-tools
RUN yum -y install net-tools

EXPOSE 80                               设置端口

CMD echo $MYPATH                        打印信息
CMD echo "---end---"
CMD /bin/bash


逐行解释该Dockerfile文件的指令:

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

下面执行build命令生成image文件,如果执行成功,可以通过docker images来查看新生成的镜像文件。

通过这个dockerfile构建镜像,构建镜像命令:

docker build -f dockerfile文件路径 -t 镜像名[:版本号] .      (这里有个小点.)

上面命令中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。

下面执行build命令生成image文件,如果执行成功,可以通过docker images来查看新生成的镜像文件。

[root@localhost dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .


[root@localhost dockerfile]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mycentos              0.1       5668b7aad021   2 minutes ago   623MB
mytomcat              1.0       c50512723057   19 hours ago    680MB
tomcat                latest    fb5657adc892   8 months ago    680MB
mysql                 8.0.26    9da615fced53   10 months ago   514MB
centos                7         eeb6ee3f44bd   11 months ago   204MB
centos                latest    5d0da3dc9764   11 months ago   231MB
portainer/portainer   latest    580c0e4e98b0   17 months ago   79.1MB


下面生成容器,测试相关命令,查看默认工作目录是否设置成功,vim和net-tools工具是否下载成功。

[root@localhost dockerfile]# docker run -it mycentos:1.0
[root@e548efe82b30 local]# pwd
/usr/local
#net-tools工具提供ifconfig命令
[root@e548efe82b30 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        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

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@e548efe82b30 local]# vi test.txt 
[root@e548efe82b30 local]# cat test.txt
Hello world!

docker history查看镜像的构建步骤

另外,我们通过 docker history 容器id  命令来查看镜像的构建步骤

[root@localhost dockerfile]# docker history 1185a46e3a12
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
1185a46e3a12   13 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
83459c404586   13 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
9b8661c812c4   13 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
2064c1540e8e   13 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
1b15d4a1fd5e   13 minutes ago   /bin/sh -c yum -y install net-tools             23.3MB    
9336c20f0b6d   13 minutes ago   /bin/sh -c yum -y install vim                   58MB      
7d46880ef0fd   14 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
e27a56b5247b   14 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
b2b6851e55fa   14 minutes ago   /bin/sh -c #(nop)  MAINTAINER ethan<12583985…   0B        
300e315adb2f   3 weeks ago      /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      3 weeks ago      /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      3 weeks ago      /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB  

4. RUN,CMD和ENTRYPOINT的区别

RUN命令与CMD命令的区别在哪里?

简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。

CMD和ENTRYPOINT的区别在哪里?

  • CMD :指定容器启动的时候要运行的命令,只有最后一个会生效

  • ENTRYPOINT :指定容器启动的时候要运行的命令,命令可以追加

首先是使用CMD指令

[root@localhost dockerfile]# cat dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]

构建镜像
[root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest:1.0 .

运行镜像
[root@localhost dockerfile]# docker run cmdtest:1.0
.
..
.dockerenv
bin
dev
etc
home
lib
....

#由于使用的是 CMD指令,命令无追加,-l取代了原本的ls -a,而-l命令不存在所以报错。
[root@localhost dockerfile]# docker run cmdtest:1.0 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

可以看到追加命令-l 出现了报错。

下面使用ENTRYPOINT来构建一个镜像

#1.修改dockerfile文件
[root@localhost dockerfile]# cat dockerfile-cmd-test
FROM centos
ENTRYPOINT ["ls","-a"]

#2.构建镜像
[root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest:2.0 .


#3.运行镜像
[root@localhost dockerfile]# docker run cmdtest:2.0
.
..
.dockerenv
bin
dev
etc
home
lib
....

#4.追加镜像再次运行
[root@localhost dockerfile]# docker run cmdtest:2.0 -l
total 56
drwxr-xr-x   1 root root 4096 Jan  1 03:55 .
drwxr-xr-x   1 root root 4096 Jan  1 03:55 ..
-rwxr-xr-x   1 root root    0 Jan  1 03:55 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root  340 Jan  1 03:55 dev
drwxr-xr-x   1 root root 4096 Jan  1 03:55 etc
....

5. 制作Tomcat镜像并发布镜像

5.1 制作Tomcat镜像

1.准备镜像文件tomcat、jdk压缩包

[root@localhost tomcat]# vi readme.txt
[root@localhost tomcat]# ll
total 200700
-rw-r--r-- 1 root root  10371538 Jan  1 16:11 apache-tomcat-8.5.55.tar.gz
-rw-r--r-- 1 root root 195132576 Jan  1 16:13 jdk-8u251-linux-x64.tar.gz
-rw-r--r-- 1 root root        20 Jan  1 16:14 readme.txt

2.编写dockerfile文件

文件名使用官方命名:Dockerfile ,build的时候会默认寻找当前目录下的文件,不需要使用-f参数指定

[root@localhost tomcat]# vim Dockerfile


FROM centos:7
MAINTAINER ccc<123456@qq.com>

COPY readme.txt /usr/local/readme.txt           将readme.txt 拷贝到容器内

ADD jdk-8u251-linux-x64.tar.gz /usr/local/      将压缩包添加进去,(ADD会自动解压)
ADD apache-tomcat-8.5.55.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_251            配置环境变量 JAVA_HOME
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.55
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.55
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.使用该Dockerfile构建镜像

[root@localhost tomcat]# docker build -t diytomcat:1.0 .

4.启动生成的镜像,构建Tomcat容器.

这里设置了数据卷,宿主机的/home/dockerfile/tomcat/test对应该容器的/usr/local/apache-tomcat-8.5.55/webapps/test。这样关于test项目的修复只需要在宿主机上修改就可以了,不需要进入到容器中修改。

[root@localhost tomcat]# docker run -d -p 8088:8080 --name diytomcat -v /home/dockerfile/tomcat/test:/usr/local/apache-tomcat-8.5.55/webapps/test diytomcat:1.0

5.在/home/dockerfile/tomcat/test的目录下,新建index.html 测试Tomcat是否能正常使用。

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

<!DOCTYPE html>
<html>
    <head>
         <meta charset="UTF-8"/>
        <title>这是个标题</title>
    </head>
    <body>
        <h1>这是一个一个简单的HTML</h1>
        <p>Hello World!</p>
    </body>
</html>

6.访问测试,浏览器访问查看是否能正常访问
在这里插入图片描述

如果页面显示乱码,就需要修改tomcat的server.xml文件

  <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" URIEncoding="UTF-8" />

这里是添加了一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。

5.2 发布镜像到DockerHub

1.登录https://hub.docker.com/ DockerHub官网进行注册

2.进行登录,docker login -u 用户名

登录命令

[root@localhost test]# 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   Usernames



[root@localhost /]# docker login -u csxdd
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
[root@localhost /]# 

3.使用docker push命令推送镜像到DockerHub上的仓库

[root@localhost /]# docker tag 5668b7aad021 csx/mycentos:0.1
[root@localhost /]# docker push csx/mycentos:0.1

[root@localhost test]# docker images
REPOSITORY                TAG       IMAGE ID       CREATED             SIZE
diytomcat                 1.0       0975df661526   About an hour ago   688MB
ethanhuang824/diytomcat   1.0       0975df661526   About an hour ago   688MB
cmdtest                   2.0       ac7b7e83ff88   6 hours ago         209MB
cmdtest                   1.0       b6ec5224d2ac   6 hours ago         209MB
ethan/centos              1.0       1df90e6fd790   2 days ago          209MB
mytomcat                  1.0       f189aac861de   3 days ago          653MB
mysql                     5.7       f07dfa83b528   10 days ago         448MB
tomcat                    latest    feba8d001e3f   2 weeks ago         649MB
nginx                     latest    ae2feff98a0c   2 weeks ago         133MB
centos                    latest    300e315adb2f   3 weeks ago         209MB
elasticsearch             7.6.2     f29a1ee41030   9 months ago        791MB
[root@localhost test]# docker push ethanhuang824/diytomcat:1.0

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

5.3 发布镜像到阿里云容器服务

1.登录阿里云,找到容器镜像服务

2.创建命名空间
在这里插入图片描述
4.与上面DockerHub的操作类似,按官方提供的操作指南操作即可。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值