跳到主要内容
  1. 所有文章/
  2. Docker学习笔记/

Docker06dockerfile

·📄 2022 字·🍵 5 分钟

什么是DockerfIle? #

Dockerfile 就是用来构建 Docker 镜像的构建文件。一种命令脚本。通过这个脚本可以生成镜像,镜像是一层层的,脚本也是一个个的,每个命令都是一层。

创建Dockerfile #

创建一个 dokcerfile 文件,名字建议为 Dockerfile

FROM centos

VOLUME ["volume01","volume02"] #匿名挂载

CMD echo "----end---"

CMD /bin/bash

Dockerfile 文件导入服务器后,执行 build 指令。

# docker build -f Dockerfile文件路径 -t 自己定的镜像名:[tag] .(注意这里有个“ . ”!!!)
#注意一定要切换到  dockerfile 所在的目录再进行构建!!
[root@izwz91mv6i3x6k12jjqh60z /]# cd /home/test

#执行命令
[root@izwz91mv6i3x6k12jjqh60z test]# docker build -f /home/test/Dockerfile -t zhang_new_centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 07ae0ca19fa0
Removing intermediate container 07ae0ca19fa0
 ---> 03b0163200ef
Step 3/4 : CMD echo "----end---"
 ---> Running in b37d23b71e98
Removing intermediate container b37d23b71e98
 ---> c11c71b6fbb8
Step 4/4 : CMD /bin/bash
 ---> Running in 55037d2fbe2e
Removing intermediate container 55037d2fbe2e
 ---> ffc16328649d
Successfully built ffc16328649d
Successfully tagged zhang_new_centos:1.0

#查看构建完成的镜像
[root@izwz91mv6i3x6k12jjqh60z test]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
zhang_new_centos      1.0       ffc16328649d   10 seconds ago   209MB

#启动自己写的容器
[root@izwz91mv6i3x6k12jjqh60z test]# docker run -it ffc16328649d /bin/bash
[root@967d6456ecb1 /]# ls -l
total 56
.........
drwxr-xr-x   2 root root 4096 May 14 08:27 volume01   #这目录就是我们生成镜像时自动挂载的数据卷目录
drwxr-xr-x   2 root root 4096 May 14 08:27 volume02   #这目录就是我们生成镜像时自动挂载的数据卷目录

这两个卷一定和主机有同步目录

[root@izwz91mv6i3x6k12jjqh60z test]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                       NAMES
967d6456ecb1   ffc16328649d   "/bin/bash"              4 minutes ago    Up 4 minutes                                                sharp_goldberg
264b185cbccc   nginx          "/docker-entrypoint.…"   49 minutes ago   Up 49 minutes   0.0.0.0:49154->80/tcp, :::49154->80/tcp     nginx02
0f3e16361a94   nginx          "/docker-entrypoint.…"   50 minutes ago   Up 50 minutes   0.0.0.0:49153->80/tcp, :::49153->80/tcp     nginx01
1309cabd368d   centos         "/bin/bash"              4 hours ago      Up 4 hours                                                  epic_neumann
39f11d68d64d   tomcat         "catalina.sh run"        6 hours ago      Up 6 hours      0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tomcat02
[root@izwz91mv6i3x6k12jjqh60z test]# docker inspect 967d6456ecb1

image-20210514163246336.png

镜像发布步骤 #

注意:很多官方镜像都是基础包,我们通常需要搭建自己的镜像

  1. 编写 Dockerfile
  2. docker build 构建一个镜像
  3. docker run 运行一个镜像
  4. docker push 发布镜像(DockerHub ,阿里云镜像仓库)

Dockerfile编写过程 #

每一个指令都会提交一个新的镜像层,并提交。

我们以后发布项目做镜像,就需要编写 Dockerfile 文件。

Dockerfile指令 #

image-20210221215126162.png

编写Dockerfile文件 #

  1. 对于官方的精简OS,对其进行扩展,添加 vim命令和net-tools
FROM centos
MAINTAINER zhang<[email protected]>

#设置工作目录
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
  1. 导入 Dockerfile文件到服务器之后,到其所在的目录中执行如下指令:
    [root@izwz91mv6i3x6k12jjqh60z test]# docker build -t new_ceontos:1.2 .
    Sending build context to Docker daemon  2.048kB
    Step 1/10 : FROM centos
     ---> 300e315adb2f
    Step 2/10 : MAINTAINER zhang<[email protected]>
     ---> Running in 1eff578beeaa
    Removing intermediate container 1eff578beeaa
     ---> 8b55dbb5776a
    Step 3/10 : ENV MYPATH /usr/local
    .......
    Step 10/10 : CMD /bin/bash
    Successfully built 30e7e21aa1ad
    Successfully tagged new_ceontos:1.2
    
  2. 查看效果:
    [root@izwz91mv6i3x6k12jjqh60z test]# docker run -it new_ceontos:1.2
    #发现工作目录是 /usr/local
    [root@653b95461f2b local]# pwd
    /usr/local
    #一些命令也可以执行
    [root@653b95461f2b local]# ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.18.0.6  netmask 255.255.0.0  broadcast 172.18.255.255
            ether 02:42:ac:12:00:06  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 1  (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@653b95461f2b local]# vim
    
    
    ~                                                                                                                                               
    ~                                                                                           
    
  3. 查看镜像的构建历史:
    [root@izwz91mv6i3x6k12jjqh60z test]# docker history new_ceontos:1.2
    IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
    30e7e21aa1ad   11 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
    76922605002d   11 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
    a700583c8e1f   11 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
    84455e325565   11 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
    549ff08ad87d   11 minutes ago   /bin/sh -c yum -y install net-tools             14.3MB    
    fc67fe1c8167   11 minutes ago   /bin/sh -c yum -y install vim                   58MB      
    4206512d4d06   11 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
    f49aff605737   11 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
    8b55dbb5776a   11 minutes ago   /bin/sh -c #(nop)  MAINTAINER zhang<14046447…   0B        
    300e315adb2f   5 months ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
    <missing>      5 months ago     /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
    <missing>      5 months ago     /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB    
    

制作Tomcat镜像 #

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

  2. 将两个安装和 Dockerfile 文件导入服务器

    image-20210516155027189.png

  3. 编写Dockerfile文件:

    FROM centos
    MAINTAINET zhang<[email protected]>
    COPY readme.txt /usr/local/readme.txt
    
    ADD jdk-8u291-linux-x64.tar.gz /usr/local/
    ADD apache-tomcat-10.0.6.tar.gz /usr/local/
    
    RUN yum -y install vim
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_291
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.6
    ENV CATALINA_BASH /usr/local/apache-tomcat-10.0.6
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:CATALINA_HOME/bin
    
    EXPOSE 8080
    CMD /usr/local/apache-tomcat-10.0.6/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.6/bin/logs/catalina.out
    
  4. 构建镜像

    [root@izwz91mv6i3x6k12jjqh60z test]# ls
    apache-tomcat-10.0.6.tar.gz  dockerfile  jdk-8u291-linux-aarch64.tar.gz
    
    [root@izwz91mv6i3x6k12jjqh60z test]# docker build -t diytomcat:1.0 .
    

    image-20210516155148513.png

    image-20210516155219412.png

  5. 启动镜像,访问测试

    [root@izwz91mv6i3x6k12jjqh60z test]# docker run -d -p 8080:8080 --name test-tomcat -v /home/test/index:/usr/local/apache-tomcat-10.0.6/webapps/test -v /home/test/tomcat-logs/:/usr/local/apache-tomcat-10.0.6/logs diytomcat:1.0
    
    599b8cced9e5026b009a25b993dce1fa51ab2a8523f6604a96202158fb84db16
    

    image-20210516164942941.png

  6. 发布项目(由于做了卷挂载,我们可以直接在本地编写项目就可以发布了): 在主机目录部署一个静态项目测试:

    由于我们之前挂载的是 webapps/test,所以外网访问 ip:8080/test 就可以看到效果了。

    image-20210516170652430.png

    image-20210516170841699.png

发布自己的镜像 #

在DockerHub上发布 #

  1. 注册一个账号。地址:https://hub.docker.com/

  2. 在服务器上登陆 Docker

    [root@izwz91mv6i3x6k12jjqh60z ~]# 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
    
  3. 在我们的服务器上提交自己的镜像( 此时镜像的名字要改成----用户名/镜像名

    #直接推送会导致拒绝
    [root@izwz91mv6i3x6k12jjqh60z ~]# docker push diytomcat:1.0
    The push refers to repository [docker.io/library/diytomcat]
    a060fcb7eeae: Preparing 
    68c5e3b0f4b8: Preparing 
    0593ccf15be8: Preparing 
    31211d2560f3: Preparing 
    2653d992f4ef: Preparing 
    denied: requested access to the resource is denied
    
    #生成一个 用户名/镜像名 的镜像再把这个镜像推上去
    [root@izwz91mv6i3x6k12jjqh60z ~]# docker tag bc8ce317425c zhangruwang/diytomcat
    [root@izwz91mv6i3x6k12jjqh60z ~]# docker images
    REPOSITORY              TAG       IMAGE ID       CREATED          SIZE
    diytomcat               1.0       bc8ce317425c   44 minutes ago   643MB
    diytomcat               latest    bc8ce317425c   44 minutes ago   643MB
    zhangruwang/diytomcat   latest    bc8ce317425c   44 minutes ago   643MB
    centos                  latest    300e315adb2f   5 months ago     209MB
    
    #推送成功
    [root@izwz91mv6i3x6k12jjqh60z ~]# docker push zhangruwang/diytomcat
    Using default tag: latest
    The push refers to repository [docker.io/zhangruwang/diytomcat]
    a060fcb7eeae: Pushed 
    68c5e3b0f4b8: Pushed 
    0593ccf15be8: Pushed 
    31211d2560f3: Pushed 
    2653d992f4ef: Pushed 
    latest: digest: sha256:589e18e8e705f3a743ca7838301ec6b8f83c40f1e9b618315c6f4e584a4baaa7 size: 1374
    

    image-20210516174145349.png

  4. 测试下载镜像:

    [root@izwz91mv6i3x6k12jjqh60z ~]# docker pull zhangruwang/diytomcat
    Using default tag: latest
    latest: Pulling from zhangruwang/diytomcat
    Digest: sha256:589e18e8e705f3a743ca7838301ec6b8f83c40f1e9b618315c6f4e584a4baaa7
    Status: Image is up to date for zhangruwang/diytomcat:latest
    docker.io/zhangruwang/diytomcat:latest
    

在阿里云镜像上发布 #

  1. 登陆阿里云

  2. 找到容器镜像服务

    image-20210516174458107.png

  3. 创建命名空间

    image-20210516174433215.png

    image-20210516174630249.png

  4. 创建容器镜像

    image-20210516174719504.png

    image-20210516174818648.png

  5. #登陆
    [root@izwz91mv6i3x6k12jjqh60z ~]# sudo docker login --username=xxxx registry.cn-beijing.aliyuncs.com
    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
    
    #添加 tag
    [root@izwz91mv6i3x6k12jjqh60z ~]# sudo docker tag bc8ce317425c  registry.cn-beijing.aliyuncs.com/sky23333/diytomcat
    [root@izwz91mv6i3x6k12jjqh60z ~]# docker images
    REPOSITORY                                            TAG       IMAGE ID       CREATED             SIZE
    diytomcat                                             1.0       bc8ce317425c   About an hour ago   643MB
    diytomcat                                             latest    bc8ce317425c   About an hour ago   643MB
    zhangruwang/diytomcat                                 latest    bc8ce317425c   About an hour ago   643MB
    registry.cn-beijing.aliyuncs.com/sky23333/diytomcat   latest    bc8ce317425c   About an hour ago   643MB
    centos                                                latest    300e315adb2f   5 months ago        209MB
    
    #推送
    [root@izwz91mv6i3x6k12jjqh60z ~]# sudo docker push registry.cn-beijing.aliyuncs.com/sky23333/diytomcat
    Using default tag: latest
    The push refers to repository [registry.cn-beijing.aliyuncs.com/sky23333/diytomcat]
    a060fcb7eeae: Pushed 
    68c5e3b0f4b8: Pushed 
    0593ccf15be8: Pushed 
    31211d2560f3: Pushed 
    2653d992f4ef: Pushed 
    latest: digest: sha256:589e18e8e705f3a743ca7838301ec6b8f83c40f1e9b618315c6f4e584a4baaa7 size: 1374
    #拉取
    [root@izwz91mv6i3x6k12jjqh60z ~]# sudo docker pull registry.cn-beijing.aliyuncs.com/sky23333/diytomcat
    Using default tag: latest
    latest: Pulling from sky23333/diytomcat
    Digest: sha256:589e18e8e705f3a743ca7838301ec6b8f83c40f1e9b618315c6f4e584a4baaa7
    Status: Image is up to date for registry.cn-beijing.aliyuncs.com/sky23333/diytomcat:latest
    registry.cn-beijing.aliyuncs.com/sky23333/diytomcat:latest
    

总结 #

image-20210516175542014.png