• docker---dockerfile相关知识


    第 3 章 Docker 高级实践

    在这里插入图片描述
    在这一部分我们主要来介绍一些Docker的高级内容: Dockerfile 和 Docker compose

    3.1 Dockerfile

    Dockerfile我们从下面的几个方面来介绍: Dockerfile简介 Dockerfile快速入门 Dockerfile详解 Dockerfile简单
    实践
    3.1.1 Dockerfile简介
    什么是Dockerfile Dockerfile类似于我们学习过的脚本,将我们在上面学到的docker镜像,使用自动化的方式实
    现出来。
    Dockerfile的作用
    1、找一个镜像: ubuntu
    2、创建一个容器: docker run ubuntu
    3、进入容器: docker exec -it 容器 命令
    4、操作: 各种应用配置 …
    5、构造新镜像: docker commit
    Dockerfile 使用准则
    1、大: 首字母必须大写D
    2、空: 尽量将Dockerfile放在空目录中。
    3、单: 每个容器尽量只有一个功能。
    4、少: 执行的命令越少越好。
    Dockerfile 分为四部分:
    基础镜像信息 从哪来?
    维护者信息 我是谁?
    镜像操作指令 怎么干?
    容器启动时执行 指令 嗨!!!
    Dockerfile文件内容:
    首行注释信息
    指令(大写) 参数
    Dockerfile使用命令:

    #构建镜像命令格式:
    docker build -t [镜像名]:[版本号][Dockerfile所在目录]
    #构建样例:
    docker build -t nginx:v0.2 /opt/dockerfile/nginx/
    #参数详解:
    -t 指定构建后的镜像信息,
    /opt/dockerfile/nginx/ 则代表Dockerfile存放位置,如果是当前目录,则用 .()表示
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.1.2 Dockerfile快速入门

    接下来我们快速的使用Dockerfile来基于ubuntu创建一个定制化的镜像:nginx。

    #创建Dockerfile专用目录
    :~$ mkdir ./docker/images/nginx -p
    :~$ cd docker/images/nginx/
    #创建Dockerfile文件
    :~/docker/images/nginx$ vim Dockerfile
    
    • 1
    • 2
    • 3
    • 4
    • 5

    测试

    #创建Dockerfile专用目录--创建Dockerfile文件
    chengpeng@chengpeng:~$ mkdir docker-file/dockerfile/nginx -p
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx$ vim Dockerfile-->拷贝dockerfile内容
    
    • 1
    • 2
    • 3

    dockerfile内容

    # 构建一个基于ubuntu的docker定制镜像
    # 基础镜像
    FROM ubuntu
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 执行命令
    RUN mkdir hello
    RUN mkdir world
    RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN apt-get update
    RUN apt-get install nginx -y
    # 对外端口
    EXPOSE 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    进行构建操作

    #构建镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx$ docker build -t ubuntu-nginx:v1.0 .
    [+] Building 18.4s (11/11) FINISHED                                                                                                                                                                                
     => [internal] load build definition from Dockerfile                                                                                                                                                          0.2s
     => => transferring dockerfile: 441B                                                                                                                                                                          0.0s
     => [internal] load .dockerignore                                                                                                                                                                             0.2s
     => => transferring context: 2B                                                                                                                                                                               0.0s
     => [internal] load metadata for docker.io/library/ubuntu:latest                                                                                                                                              0.0s
     => [1/7] FROM docker.io/library/ubuntu                                                                                                                                                                       0.0s
     => [2/7] RUN mkdir hello                                                                                                                                                                                     0.5s
     => [3/7] RUN mkdir world                                                                                                                                                                                     0.6s
     => [4/7] RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list                                                                                                                       0.6s
     => [5/7] RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list                                                                                                                      0.6s
     => [6/7] RUN apt-get update                                                                                                                                                                                  4.7s
     => [7/7] RUN apt-get install nginx -y                                                                                                                                                                       10.7s
     => exporting to image                                                                                                                                                                                        0.3s 
     => => exporting layers                                                                                                                                                                                       0.3s 
     => => writing image sha256:d94bf0f823d0921ffd6474bfe813af5fe526744df6e471cfa70ed9cef5ffdc90                                                                                                                  0.0s 
     => => naming to docker.io/library/ubuntu-nginx:v1.0 
    #查看新生成镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx$ docker images                                                                                                                                                        
    REPOSITORY        TAG       IMAGE ID       CREATED              SIZE                                                                                                                                               
    ubuntu-nginx      v1.0      d94bf0f823d0   About a minute ago   179MB
    
    #查看构建历史
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx$ docker history d94bf0f823d0
    IMAGE          CREATED         CREATED BY                                       SIZE      COMMENT
    d94bf0f823d0   5 minutes ago   EXPOSE map[80/tcp:{}]                            0B        buildkit.dockerfile.v0
    <missing>      5 minutes ago   RUN /bin/sh -c apt-get install nginx -y # bu…   55.6MB    buildkit.dockerfile.v0
    <missing>      5 minutes ago   RUN /bin/sh -c apt-get update # buildkit         45.7MB    buildkit.dockerfile.v0
    <missing>      5 minutes ago   RUN /bin/sh -c sed -i 's/security.ubuntu.com…   2.42kB    buildkit.dockerfile.v0
          5 minutes ago   RUN /bin/sh -c sed -i 's/archive.ubuntu.com/…   2.42kB    buildkit.dockerfile.v0
    <missing>      5 minutes ago   RUN /bin/sh -c mkdir world # buildkit            0B        buildkit.dockerfile.v0
    <missing>      5 minutes ago   RUN /bin/sh -c mkdir hello # buildkit            0B        buildkit.dockerfile.v0
    <missing>      5 minutes ago   MAINTAINER panda kstwoak47@163.com               0B        buildkit.dockerfile.v0
    <missing>      4 weeks ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]             0B        
    <missing>      4 weeks ago     /bin/sh -c #(nop) ADD file:63d5ab3ef0aab308c…   77.8MB    
    <missing>      4 weeks ago     /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B        
    <missing>      4 weeks ago     /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B        
    <missing>      4 weeks ago     /bin/sh -c #(nop)  ARG LAUNCHPAD_BUILD_ARCH      0B        
    <missing>      4 weeks ago     /bin/sh -c #(nop)  ARG RELEASE                   0B    
    #注意:
    因为容器没有启动命令,所以肯定访问不了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    优化刚刚的Dockerfile文件

    # 构建一个基于ubuntu的docker定制镜像
    # 基础镜像
    FROM ubuntu
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 执行命令
    RUN mkdir hello && mkdir world
    RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list && sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN apt-get update && apt-get install nginx -y
    # 对外端口
    EXPOSE 80
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行修改好的Dockerfile进行构建

    :~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.2 .
    :~/docker/images/nginx$ docker history ubuntu-nginx:v0.2
    #对比两个镜像的大小
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-2$ docker images -a
    REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
    ubuntu-nginx      v2.0      04e3d2ae1f41   52 seconds ago   179MB
    ubuntu-nginx      v1.0      d94bf0f823d0   59 minutes ago   179MB
    
    #深度对比连个镜像的大小
    :~/docker/images/nginx$ docker inspect 04e3d2ae1f41
     "Size": 179147395,
      "VirtualSize": 179147395,
    :~/docker/images/nginx$ docker inspect d94bf0f823d0
    "Size": 179149812,
     "VirtualSize": 179149812,
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    Dockerfile构建过程:
    从基础镜像1运行一个容器A 遇到一条Dockerfile指令,都对容器A做一次修改操作
    执行完毕一条命令,提交生成一个新镜像
    2 再基于新的镜像2运行一个容器B 遇到一条Dockerfile指令,都对容器B做一次
    修改操作 执行完毕一条命令,提交生成一个新镜像3 …
    构建过程镜像介绍 构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器
    效果,从侧面能看到我们每次构建的效果。提供了镜像调试的能力–>构建越少,大小越小

    3.1.3 基础指令详解

    FROM

    FROM
    #格式:
    FROM <image>
    FROM <image>:<tag>
    #解释:
    #FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
    #可以有多个FROM语句,来创建多个image-->不建议使用
    #FROM 后面是有效的镜像名称,如果该镜像没有在你的本地仓库,那么就会从远程仓库Pull取,如果远程也没有,就报错失败
    #下面所有的 系统可执行指令 在 FROM 的镜像中执行。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    MAINTAINER

    MAINTAINER
    #格式:
    MAINTAINER <name>
    #解释:
    #指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
    
    • 1
    • 2
    • 3
    • 4
    • 5

    RUN

    RUN
    #格式:
    RUN <command> (shell模式)
    RUN["executable", "param1", "param2"] (exec 模式)
    #解释:
    #表示当前镜像构建时候运行的命令,如果有确认输入的话,一定要在命令中添加 -y
    #如果命令较长,那么可以在命令结尾使用 \ 来换行
    #生产中,推荐使用上面数组的格式
    #注释:
    #shell模式:类似于 /bin/bash -c command
    #举例: RUN echo hello
    #exec模式:类似于 RUN["/bin/bash", "-c", "command"]
    #举例: RUN["echo", "hello"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    EXPOSE

    EXPOSE
    #格式:
    EXPOSE <port> [<port>...]
    #解释:
    设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,
    还需要启动容器时增加-p或者-P参数对容器的端口进行分配。
    EXPOSE 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.1.4 运行时指令详解

    CMD

    CMD
    #格式:
    CMD ["executable","param1","param2"] (exec 模式)推荐
    CMD command param1 param2 (shell模式)
    CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数;
    #解释:
    #CMD指定容器启动时默认执行的命令
    #每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行
    #如果你在启动容器的时候使用docker run 指定的运行命令,那么会覆盖CMD命令。
    #举例: CMD ["/usr/sbin/nginx","-g","daemon off;"]
    "/usr/sbin/nginx" nginx命令
    "-g" 设置配置文件外的全局指令
    "daemon off;" 后台守护程序开启方式 关闭
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    #CMD指令实践:
    #修改Dockerfile文件内容:
    #在上一个Dockerfile文件内容基础上,末尾增加下面一句话:
    CMD ["/usr/sbin/nginx","-g","daemon off;"]
    #构建镜像
    :~/docker/images/nginx$ docker build -t ubuntu-nginx:v3.0 .
    #根据镜像创建容器,创建时候,不添加执行命令
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-3$ docker run -itd --name unginx-1 ubuntu-nginx:v3.0
    #根据镜像创建容器,创建时候,添加执行命令/bin/bash
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-3$ docker run -itd --name unginx-2 ubuntu-nginx:v3.0 /bin/bash
    #发现两个容器的命令行是不一样的
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-3$ docker ps -a
    CONTAINER ID   IMAGE               COMMAND                   CREATED         STATUS         PORTS     NAMES
    e1a0dd1003ab   ubuntu-nginx:v3.0   "/bin/bash"               6 seconds ago   Up 5 seconds   80/tcp    unginx-2
    7cbb79a2acf0   ubuntu-nginx:v3.0   "/usr/sbin/nginx -g …"   4 minutes ago   Up 4 minutes   80/tcp    unginx-1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    ENTRYPOINT

    ENTRYPOINT
    #格式:
    ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
    ENTRYPOINT command param1 param2 (shell 模式)
    #解释:
    #和CMD 类似都是配置容器启动后执行的命令,并且不会被docker run 提供的参数覆盖。
    #每个Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。
    #生产中我们可以同时使用ENTRYPOINT 和CMD,
    #想要在docker run 时被覆盖,可以使用"docker run --entrypoint"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    #ENTRYPOINT指令实践:
    #修改Dockerfile文件内容:
    #在上一个Dockerfile 文件内容基础上,修改末尾的CMD 为ENTRYPOINT:
    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
    #构建镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker build -t ubuntu-nginx:v4.0 .
    #根据镜像创建容器,创建时候,不添加执行命令
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker run -itd --name unginx-3 ubuntu-nginx:v4.0
    #根据镜像创建容器,创建时候,添加执行命令/bin/bash-->ENTRYPOINT启动失效了
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker run -itd --name unginx-4 ubuntu-nginx:v4.0 /bin/bash
    #查看ENTRYPOINT是否被覆盖
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker ps -a
    CONTAINER ID   IMAGE               COMMAND                   CREATED              STATUS                      PORTS     NAMES
    74be4034e4ad   ubuntu-nginx:v4.0   "/usr/sbin/nginx -g …"   46 seconds ago       Exited (1) 45 seconds ago             unginx-4
    2b39d1d5475c   ubuntu-nginx:v4.0   "/usr/sbin/nginx -g …"   About a minute ago   Up About a minute           80/tcp    unginx-3
    #根据镜像创建容器,创建时候,使用--entrypoint参数,添加执行命令/bin/bash
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker run --entrypoint "/bin/bash" --name nginx-5 -itd ubuntu-nginx:v4.0
    #查看ENTRYPOINT是否被覆盖
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-4$ docker ps -a
    CONTAINER ID   IMAGE               COMMAND                   CREATED          STATUS                      PORTS     NAMES
    2b28c789c5ec   ubuntu-nginx:v4.0   "/bin/bash"               3 seconds ago    Up 2 seconds                80/tcp    nginx-5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    CMD ENTRYPOINT 综合使用实践–>相当于组合拼接

    #修改Dockerfile文件内容:
    # 在上一个Dockerfile文件内容基础上,修改末尾的ENTRYPOINT
    :~/docker/images/nginx$ vim Dockerfile
    ENTRYPOINT ["/usr/sbin/nginx"]
    CMD ["-g"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #构建镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-5$ docker build -t ubuntu-nginx:v5.0 .
    #根据镜像创建容器,创建时候,不添加执行命令
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-5$ docker run -itd --name unginx-6 ubuntu-nginx:v5.0
    #查看效果
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-5$ docker ps -a
    CONTAINER ID   IMAGE               COMMAND                   CREATED             STATUS                      PORTS     NAMES
    b0a7e6b32642   ubuntu-nginx:v5.0   "/usr/sbin/nginx -g"      28 seconds ago      Exited (1) 27 seconds ago             unginx-6--->由于没有写全命令,所以启动不起来
    #根据镜像创建容器,创建时候,不添加执行命令,覆盖cmd的参数 -g "daemon off;"
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-5$ docker run -itd --name unginx-7 ubuntu-nginx:v5.0 -g "daemon off;"
    #查看效果
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-5$ docker ps -a
    CONTAINER ID   IMAGE               COMMAND                   CREATED             STATUS                      PORTS     NAMES
    f13303834e49   ubuntu-nginx:v5.0   "/usr/sbin/nginx -g …"   3 seconds ago       Up 2 seconds                80/tcp    unginx-7
    #注释:
    #任何docker run设置的命令参数或者CMD指令的命令,都将作为ENTRYPOINT 指令的命令参数,追加到
    ENTRYPOINT指令之后
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3.1.5 文件编辑指令详解

    ADD

    #ADD
    #格式:
    ADD <src>... <dest>
    ADD ["",... ""]
    
    • 1
    • 2
    • 3
    • 4
    #解释:
    #将指定的 文件复制到容器文件系统中的
    #src 指的是宿主机,dest 指的是容器
    #所有拷贝到container 中的文件和文件夹权限为0755,uid 和gid 为0
    #如果文件是可识别的压缩格式,则docker 会帮忙解压缩--->tar可以zip不可以 
    #注意:
    #1、如果源路径是个文件,且目标路径是以/ 结尾, 则docker 会把目标路径当作一个目录,会把源文件拷贝到该目录下;
    #如果目标路径不存在,则会自动创建目标路径。
    #2、如果源路径是个文件,且目标路径不是以/ 结尾,则docker 会把目标路径当作一个文件。
    #如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
    #如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
    #如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。注意,这种情况下,最好显示的以/ 结尾,以避免混淆。
    #3、如果源路径是个目录,且目标路径不存在,则docker 会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。
    #如果目标路径是个已经存在的目录,则docker 会把源路径目录下的文件拷贝到该目录下。
    #4、如果源文件是个压缩文件,则docker 会自动帮解压到指定的容器目录中。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    #ADD实践:
    #拷贝普通文件
    :~/docker/images/nginx$ vim Dockerfile
    #Dockerfile文件内容
    # 构建一个基于ubuntu的docker定制镜像
    # 基础镜像
    FROM ubuntu:16.04
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 执行命令
    ADD ["sources.list","/etc/apt/sources.list"]
    RUN apt-get clean
    RUN apt-get update
    RUN apt-get install nginx -y
    # 对外端口
    EXPOSE 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ cp /etc/apt/sources.list ./
    #构建镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ docker build -t ubuntu-nginx:v6.0 .
    #根据镜像创建容器,创建时候,不添加执行命令进入容器查看效果
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ docker run -it --name unginx-8 ubuntu-nginx:v6.0-->就进入了
    #拷贝压缩文件
    tar zcvf this.tar.gz ./*
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ ls
    Dockerfile  sources.list  this.tar.gz
    #编辑Dockerfile文件内容
    ...
    # 执行命令
    ...
    # 增加文件
    # 构建一个基于ubuntu的docker定制镜像
    # 基础镜像
    FROM ubuntu:16.04
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 执行命令
    ADD ["this.tar.gz","/nihao/"]
    #ADD ["sources.list","/etc/apt/sources.list"]
    #RUN apt-get clean
    #RUN apt-get update
    #RUN apt-get install nginx -y
    # 对外端口
    EXPOSE 80
    
    ...
    #构建镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ docker build -t ubuntu-nginx:v6.0 .
    #根据镜像创建容器,创建时候,不添加执行命令进入容器查看效果
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-6$ docker run -it --name unginx-9 ubuntu-nginx:v6.0
    root@d19bd1f56270:/# ls
    bin  boot  dev  etc  home  lib  lib64  media  mnt  nihao  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@d19bd1f56270:/# cd nihao/
    root@d19bd1f56270:/nihao# ls
    Dockerfile  sources.list
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    COPY

    #COPY
    #格式:
    COPY <src>... <dest>
    COPY ["",... ""]
    #解释:
    #COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作。
    #单纯复制文件场景,Docker 推荐使用COPY
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    #COPY实践
    #修改Dockerfile文件内容:
    # 构建一个基于ubuntu的docker定制镜像
    # 基础镜像
    FROM ubuntu
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 执行命令
    ADD ["sources.list","/etc/apt/sources.list"]
    RUN apt-get clean
    RUN apt-get update
    RUN apt-get install nginx -y
    COPY ["index.html","/var/www/html/"]--->不清楚为什么index目录是在这里
    # 对外端口
    EXPOSE 80
    #运行时默认命令
    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
    index.html 文件内容:
    <h1>hello world </h1>
    <h1>hello docker </h1>
    <h1>hello nginx</h1>
    #构建镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-7$ docker build -t ubuntu-nginx:v7.0 .
    #根据镜像创建容器,创建时候,不添加执行命令
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-7$ docker run -itd --name unginx-10 ubuntu-nginx:v7.0
    #查看nginx-10信息
    chengpeng@chengpeng: docker inspect unginx-10
    #浏览器访问nginx查看效果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    VOLUME

    #VOLUME
    #格式:
    VOLUME ["/data"]
    #解释:
    #VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
    #通过VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
    #举例:
    VOLUME ["/var/lib/tomcat7/webapps/"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    VOLUME实践–>用它创建的镜像,可以用其他容器挂载

    #VOLUME实践
    #修改Dockerfile文件内容:
    #将COPY替换成为VOLUME
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ vim Dockerfile 
    # 构建一个基于ubuntu的docker定制镜像
    # 基础镜像
    FROM ubuntu:16.04
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 执行命令
    ADD ["sources.list","/etc/apt/sources.list"]
    RUN apt-get clean
    RUN apt-get update
    RUN apt-get install nginx -y
    # 对外端口
    EXPOSE 80
    
    VOLUME ["/helloworld/"]
    #运行时默认命令
    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
    
    ...
    #构建镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker build -t ubuntu-nginx:v8.0 .
    #创建数据卷容器
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker run -itd --name unginx-11 ubuntu-nginx:v8.0 
    #查看镜像信息
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker inspect unginx-11
    "Volumes": {
                    "/helloworld/": {}
                },
    
    #验证操作
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker run -itd --name v-1 --volumes-from unginx-11 nginx
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker run -itd --name v-2 --volumes-from unginx-11 nginx
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker ps -a
    CONTAINER ID   IMAGE               COMMAND                   CREATED          STATUS                    PORTS     NAMES
    e47d4c74e2e9   nginx               "/docker-entrypoint.…"   3 seconds ago    Up 3 seconds              80/tcp    v-2
    6939a6610676   nginx               "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds              80/tcp    v-1
    #进入容器1
    itcast@itcast:~/docker-file/dockerfile/nginx-8$ docker exec -it v-1 /bin/bash
    root@6939a6610676:/# ls
    bin   docker-entrypoint.d   helloworld	lib32	media  proc  sbin  tmp
    boot  docker-entrypoint.sh  home	lib64	mnt    root  srv   usr
    dev   etc		    lib		libx32	opt    run   sys   var
    root@6939a6610676:/# cd helloworld/
    root@6939a6610676:/helloworld# ls
    root@6939a6610676:/helloworld# ls
    helloworld
    root@6939a6610676:/helloworld# rm helloworld/
    rm: cannot remove 'helloworld/': Is a directory
    root@6939a6610676:/helloworld# rm -rf helloworld/
    root@6939a6610676:/helloworld# ls
    root@6939a6610676:/helloworld# 
    #进入容器2
    itcast@itcast:~/docker-file/dockerfile/nginx-8$ docker exec -it v-2 /bin/bash
    root@e47d4c74e2e9:/# ls
    bin   docker-entrypoint.d   helloworld	lib32	media  proc  sbin  tmp
    boot  docker-entrypoint.sh  home	lib64	mnt    root  srv   usr
    dev   etc		    lib		libx32	opt    run   sys   var
    root@e47d4c74e2e9:/# cd helloworld/
    root@e47d4c74e2e9:/helloworld# ls
    root@e47d4c74e2e9:/helloworld# mkdir helloworld
    root@e47d4c74e2e9:/helloworld# ls
    helloworld
    root@e47d4c74e2e9:/helloworld# ls
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    3.1.6 环境指令详解

    ENV

    #ENV
    #格式:
    ENV <key> <value> (一次设置一个环节变量)
    ENV <key>=<value> ... (一次设置一个或多个环节变量)
    #解释:
    #设置环境变量,可以在RUN 之前使用,然后RUN 命令时调用,容器启动时这些环境变量都会被指定
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ENV实践

    #ENV实践:
    #命令行创建ENV的容器
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker run -e NIHAO="helloworld" -itd --name ubuntu-111 ubuntu /bin/bash
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker ps -a
    CONTAINER ID   IMAGE               COMMAND                   CREATED          STATUS                    PORTS     NAMES
    e68dba85564d   ubuntu              "/bin/bash"               7 seconds ago    Up 6 seconds                        ubuntu-111
    
    #进入容器ubuntu-111
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-8$ docker exec -it ubuntu-111 /bin/bash
    root@e68dba85564d:/# ls
    bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@e68dba85564d:/# echo $NIHAO
    helloworld
    #修改Dockerfile文件内容:
    #在上一个Dockerfile 文件内容基础上,在RUN 下面增加一个ENV
    ENV NIHAO=helloworld
    ...
    #构建镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-9$ docker build -t ubuntu-nginx:v9.0 .
    #根据镜像创建容器,创建时候,不添加执行命令
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-9$ docker run -itd --name unginx-12 ubuntu-nginx:v9.0
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-9$ docker exec -it unginx-12 /bin/bash
    root@6af995b1eda0:/# echo $NIHAO
    helloworld
    root@6af995b1eda0:/# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    WORKDIR

    #WORKDIR
    #格式:
    WORKDIR /path/to/workdir (shell 模式)
    #解释:
    #切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。相当于cd
    #可以多次切换(相当于cd 命令),
    #也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
    #举例:
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
    #则最终路径为/a/b/c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    WORKDIR实践

    #WORKDIR实践:
    #修改Dockerfile文件内容:
    # 在上一个Dockerfile 文件内容基础上,在RUN 下面增加一个WORKDIR
    # 构建一个基于ubuntu的docker定制镜像
    # 基础镜像
    FROM ubuntu:16.04
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 执行命令
    ADD ["sources.list","/etc/apt/sources.list"]
    RUN apt-get clean
    RUN apt-get update
    RUN apt-get install nginx -y
    
    WORKDIR /nihao/chengpeng/
    RUN ["touch","chengpeng1.txt"]
    WORKDIR /nihao
    RUN ["touch","chengpeng2.txt"]
    WORKDIR chengpeng
    RUN ["touch","chengpeng3.txt"]
    # 对外端口
    EXPOSE 80
    
    #运行时默认命令
    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
    
    ...
    #构建镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-10$ docker build -t ubuntu-nginx:v11.0 .
    #根据镜像创建容器,创建时候,不添加执行命令
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-10$ docker run -itd --name unginx-13 ubuntu-nginx:v11.0 
    #进入镜像
    docker exec -it nginx-13 /bin/bash
    root@c6c06e640a87:/nihao/chengpeng# ls
    chengpeng1.txt  chengpeng3.txt
    root@c6c06e640a87:/nihao/chengpeng# pwd
    /nihao/chengpeng
    root@c6c06e640a87:/nihao/chengpeng# cd ..
    root@c6c06e640a87:/nihao# ls
    chengpeng chengpeng2.txt
    root@c6c06e640a87:/nihao# cd ..
    root@c6c06e640a87:/# ls
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    USER与ARG

    #USER
    #格式:
    USER daemon
    #解释:
    #指定运行容器时的用户名和UID,后续的RUN 指令也会使用这里指定的用户。
    #如果不输入任何信息,表示默认使用root 用户
    #ARG
    #格式:
    ARG <name>[=<default value>]
    #解释:
    #ARG 指定了一个变量在docker build 的时候使用,可以使用--build-arg =来指定参数的值,不过
    #如果构建的时候不指定就会报错。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.1.7 触发器指令详解

    触发器指令

    ONBUILD
    #格式:
    ONBUILD [command]
    #解释:
    #当一个镜像A被作为其他镜像B的基础镜像时,这个触发器才会被执行,
    #新镜像B在构建的时候,会插入触发器中的指令。
    #使用场景对于版本控制和方便传输,适用于其他用户。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    触发器实践

    #编辑Dockerfile
    :~/docker/images/nginx$ vim Dockerfile
    #内容如下:
    # 构建一个基于ubuntu的docker定制镜像
    # 基础镜像
    FROM ubuntu
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 执行命令
    ADD ["sources.list","/etc/apt/sources.list"]
    RUN apt-get clean
    RUN apt-get update
    RUN apt-get install nginx -y
    #触发器
    ONBUILD COPY ["index.html","/var/www/html/"]
    # 对外端口
    EXPOSE 80
    #运行时默认命令
    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
    #构建镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ docker build -t ubuntu-nginx:v11.0 .
    #根据镜像创建容器,
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ docker run -itd --name unginx-14 ubuntu-nginx:v11.0 
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$$docker ps
    #查看镜像信息
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ docker inspect ubuntu-nginx:v11.0 
    "OnBuild": [
                    "COPY [\"index.html\",\"/var/www/html/\"]"
                ],
    #访问容器页面,是否被更改
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ docker inspect unginx-14 //查看ip
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ curl 172.17.0.15(docker内部的ip) --->发现我修改的index.html并没有修改
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    #构建子镜像Dockerfile文件
    FROM ubuntu-nginx:v11.0
    MAINTAINER panda kstwoak47@163.com
    EXPOSE 80
    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
    #构建子镜像
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-12$ docker build -t ubuntu-nginx:v12.0 .
    #根据镜像创建容器,
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-12$ docker run -itd --name unginx-15 ubuntu-nginx:v12.0 
    #查看镜像信息
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-12$ docker inspect ubuntu-nginx:v12.0 
    "OnBuild": null,
    docker ps
    #访问容器页面,是否被更改
    #访问容器页面,是否被更改
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ docker inspect unginx-15 //查看ip
    chengpeng@chengpeng:~/docker-file/dockerfile/nginx-11$ curl 172.17.0.16(docker内部的ip) --->发现我修改的index.html修改了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3.1.8 Dockerfile构建缓存

    我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。

    #取消缓存:
    docker build --no-cache -t [镜像名]:[镜像版本][Dockerfile位置]
    
    • 1
    • 2

    3.2 Dockerfile构建go环境

    接下来我们就来做一个工作实践,搭建一个go环境,然后尝试使用Dockerfile的方式,构造一个镜像。
    3.2.1 项目描述
    beego官方网站:https://beego.me/
    我们借助于beego的简介,部署一个go项目,然后运行起来。
    3.2.2 手工部署go语言环境
    需求:
    基于docker镜像,手工部署go项目环境
    方案分析
    1、docker环境部署
    2、go环境部署
    3、go项目部署
    4、测试
    技术关键点:
    1、docker环境部署
    使用docker镜像启动一个容器即可
    2、go环境部署
    go软件的依赖环境
    go软件的基本环境配置
    3、go项目部署
    beego框架的下载
    项目文件配置
    启动go项目
    4、测试
    宿主机测试
    解决方案:
    1、docker环境配置
    1.1 获取docker镜像
    1.2 启动docker容器
    2、go环境部署
    2.1 基础环境配置
    2.2 go环境配置
    3、go项目部署
    3.1 获取beego代码
    3.2 项目文件配置
    3.3 项目启动
    4、测试
    4.1 宿主机测试
    实施方案:

    #1、docker环境配置
    #1.1 获取docker镜像
    #获取一个ubuntu的模板文件
    cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu-nimi
    ubuntu-mini       latest    44117582c84e   4 days ago       505MB
    #1.2 启动docker容器
    #启动容器,容器名称叫panda-go
    chengpeng@chengpeng:~$ docker run -itd --name panda-go ubuntu-mini /bin/bash
    #进入容器
    docker exec -it go-test /bin/bash
    #2、go环境部署
    #2.1 基础环境配置
    #配置国内源
    vim /etc/apt/sources.list-->这一步不一定需要可以直接跳到sed
    #文件内容如下
    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe
    multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
    #如果由于网络环境原因不能进行软件源更新可以使用如下内容
    sudo sed -i 's/cn.archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    #更新软件源,安装基本软件
    apt-get update
    apt-get install gcc libc6-dev git vim lrzsz -y
    #2.2 go环境配置
    #安装go语言软件
    //apt-get install golang -y-->这一个暂时没成功-->跳到将go1.10.linux-amd64.tar.gz拷贝到容器中进行解压包可以找我要QQ:921190764
    由于软件源问题改使用新版本go
    将go1.10.linux-amd64.tar.gz拷贝到容器中进行解压
    tar -C /usr/local -zxf go1.10.linux-amd64.tar.gz
    #配置go基本环境变量
    export GOROOT=/usr/local/go
    export PATH=$PATH:/usr/local/go/bin
    export GOPATH=/root/go
    export PATH=$GOPATH/bin/:$PATH
    #3、go项目部署
    #3.1 获取beego代码
    #下载项目beego
    mkdir /root/go/github.com
    go get github.com/astaxie/beego-->这一步没有成功,直接解压把
    #暂时没有下载
    Cloning into '/root/go/src/github.com/astaxie/beego'...
    fatal: unable to access 'https://github.com/astaxie/beego/': gnutls_handshake() failed: Error in the pull function.
    #然后把所需的压缩包astaxie.zip拖进来-->可以找我要QQ:921190764
    #3.2 项目文件配置
    #创建项目目录
    mkdir /root/go/src/myTest
    cd /root/go/src/myTest
    #编辑go项目测试文件test.go
    package main
    import (
    "github.com/astaxie/beego"
    )
    type MainController struct {
    beego.Controller
    }
    func (this *MainController) Get() {
    this.Ctx.WriteString("hello world\n")
    }
    func main() {
    beego.Router("/", &MainController{})
    beego.Run()
    }
    #3.3 项目启动
    #运行该文件
    go run test.go
    #可以看到:
    #这个go项目运行起来后,开放的端口是8080
    #4、测试
    #4.1宿主机测试
    #查看容器的ip地址
    docker inspect panda-go 
    #浏览器查看效果:
    curl 172.17.0.2:8080-->panda-go ip地址
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    3.2.3 Dockerfile案例分析

    环境分析:
    1、软件源文件,使用国外源,速度太慢,所以我们可以自己使用国内的软件源。
    因为我们在手工部署的时候,使用的是官方(国外)的源,所以为了部署快一点呢,我使用国内的阿里云的源。 源内
    容:

    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe
    multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    由于阿里云的源出现问题所有更换为中科大的源 详情见3.1.1
    2、软件安装,涉及到了各种软件
    3、涉及到了go的环境变量设置
    4、软件运行涉及到了软件的运行目录
    5、项目访问,涉及到端口
    关键点分析:
    1、增加文件,使用 ADD 或者 COPY 指令
    2、安装软件,使用 RUN 指令
    3、环境变量,使用 ENV 指令
    4、命令运行,使用 WORKDIR 指令
    5、项目端口,使用 EXPOSE 指令
    定制方案:
    1、基于ubuntu基础镜像进行操作
    2、增加国内源文件
    3、安装环境基本软件
    4、定制命令工作目录
    5、执行项目
    6、开放端口

    3.2.4 Dockerfile实践

    创建目录

    #创建目录
    #进入标准目录
    chengpeng@chengpeng:~/docker-file$ mkdir beego
    chengpeng@chengpeng:~/docker-file/beego$ 
    
    • 1
    • 2
    • 3
    • 4

    Dockerfile内容

    # 构建一个基于ubuntu 的docker 定制镜像
    # 基础镜像
    FROM ubuntu:16.04
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 增加国内源
    #COPY sources.list /etc/apt/
    RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    # 执行命令
    RUN apt-get update
    RUN apt-get install gcc libc6-dev git lrzsz -y
    #将go复制解压到容器中
    ADD go1.10.linux-amd64.tar.gz /usr/local/
    # 定制环境变量
    ENV GOROOT=/usr/local/go
    ENV PATH=$PATH:/usr/local/go/bin
    ENV GOPATH=/root/go
    ENV PATH=$GOPATH/bin/:$PATH
    # 下载项目
    #RUN go get github.com/astaxie/beego-->暂时下载不了
    ADD astaxie.tar.xz /root/go/src/github.com/
    # 增加文件
    COPY test.go /root/go/src/myTest/
    # 定制工作目录
    WORKDIR /root/go/src/myTest/
    # 对外端口
    EXPOSE 8080
    # 运行项目
    ENTRYPOINT ["go","run","test.go"]
    #把sources.list和test.go文件放到这个目录中
    #构建镜像
    chengpeng@chengpeng:~/docker-file/beego$ docker build -t beego-test:v1.0 .
    chengpeng@chengpeng:~/docker-file/beego$ docker images
    REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
    beego-test        v1.0      a202e1014dc8   47 seconds ago   708MB
    #运行镜像
    chengpeng@chengpeng:~/docker-file/beego$ docker run -itd --name beego-1 beego-test:v1.0
    chengpeng@chengpeng:~/docker-file/beego$ docker ps -a
    CONTAINER ID   IMAGE                COMMAND                   CREATED          STATUS                    PORTS      NAMES
    52937386f836   beego-test:v1.0      "go run test.go"          7 seconds ago    Up 6 seconds              8080/tcp   beego-1
    #查看ip
    chengpeng@chengpeng:~/docker-file/beego$ docker inspect beego-1
    #编辑go项目测试文件test.go
    package main
    import (
    "github.com/astaxie/beego"
    )
    type MainController struct {
    beego.Controller
    }
    func (this *MainController) Get() {
    this.Ctx.WriteString("hello world\n")
    }
    func main() {
    beego.Router("/", &MainController{})
    beego.Run()
    }
    #访问镜像,查看效果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    3.3 Docker compose

    Docker compose是一种docker容器的任务编排工具
    官方地址:https://docs.docker.com/compose/
    3.3.1 compose简介
    任务编排介绍
    场景:
    我们在工作中为了完成业务目标,首先把业务拆分成多个子任务,然后对这些子任务进行顺序组合,当子任务按照
    方案执行完毕后,就完成了业务目标。
    任务编排,就是对多个子任务执行顺序进行确定的过程。
    常见的任务编排工具:
    单机版: docker compose
    集群版:
    Docker swarm Docker
    Mesos Apache
    Kubernetes(k8s) Google
    docker compose是什么
    译文: compose是定义和运行多容器Docker应用程序的工具。通过编写,您可以使用YAML文件来配置应用程序
    的服务。然后,使用单个命令创建并启动配置中的所有服务。要了解更多有关组合的所有特性,请参见特性列表。
    docker compose的特点; 本质:docker 工具
    对象:应用服务
    配置:YAML 格式配置文件
    命令:简单
    执行:定义和运行容器
    docker compose的配置文件
    docker-compose.yml
    文件后缀是yml
    文件内容遵循 ymal格式

    docker 和 Docker compose

    在这里插入图片描述
    官方地址:https://docs.docker.com/compose/overview/

    3.3.2 compose 快速入门

    docker compose 安装
    #安装依赖工具
    sudo apt-get install python-pip -y
    #安装编排工具
    sudo pip install docker-compose
    #查看编排工具版本
    sudo docker-compose version
    #查看命令帮助
    docker-compose --help
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    PIP 源问题

    #用pip安装依赖包时默认访问https://pypi.python.org/simple/,
    #但是经常出现不稳定以及访问速度非常慢的情况,国内厂商提供的pipy镜像目前可用的有:
    
    #在当前用户目录下创建.pip文件夹
    mkdir ~/.pip
    #然后在该目录下创建pip.conf文件填写:
    [global]
    trusted-host=mirrors.aliyun.com
    index-url=http://mirrors.aliyun.com/pypi/simple/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    compose简单配置文件

    #创建compose文件夹
    :~$ mkdir -p ./docker/compose
    #进入到文件夹
    :~$ cd ./docker/compose
    #创建yml文件
    :~$ vim docker-compose.yml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    docker-compose.yml 文件内容

    version: '2'
    services:
      web1:
        image: nginx
        ports:
          - "9999:80"
        container_name: nginx-web1
      web2:
        image: nginx
        ports:
          - "8888:80"
        container_name: nginx-web2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行一个容器

    #后台启动:
    docker-compose up -d
    #注意:
    #如果不加-d,那么界面就会卡在前台
    #查看运行效果
    docker-compose ps
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.3.3 compose命令详解

    注意:
    所有命令尽量都在docker compose项目目录下面进行操作
    项目目录:docker-compose.yml所在目录
    compose服务启动、关闭、查看

    #后台启动:
    docker-compose up -d
    chengpeng@chengpeng:~/docker-file/compose$ docker-compose up -d
    Creating network "compose_default" with the default driver
    Creating nginx-web1 ... done
    Creating nginx-web2 ... done
    chengpeng@chengpeng:~/docker-file/compose$ docker ps -a
    CONTAINER ID   IMAGE                COMMAND                   CREATED         STATUS                    PORTS                                   NAMES
    151957dd4eaa   nginx                "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes              0.0.0.0:9999->80/tcp, :::9999->80/tcp   nginx-web1
    6d8cbd26f77d   nginx                "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes              0.0.0.0:8888->80/tcp, :::8888->80/tcp   nginx-web2
    #删除服务
    docker-compose down
    chengpeng@chengpeng:~/docker-file/compose$ docker-compose down
    Stopping nginx-web1 ... done
    Stopping nginx-web2 ... done
    Removing nginx-web1 ... done
    Removing nginx-web2 ... done
    Removing network compose_default
    #查看正在运行的服务
    docker-compose ps
    chengpeng@chengpeng:~/docker-file/compose$ docker-compose ps
       Name                 Command               State                  Ports                
    ------------------------------------------------------------------------------------------
    nginx-web1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:9999->80/tcp,:::9999->80/tcp
    nginx-web2   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8888->80/tcp,:::8888->80/tcp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    容器开启、关闭、删除

    #启动一个服务
    docker-compose start <服务名>--->docker-compose start web1
    #注意:
    #如果后面不加服务名,会停止所有的服务
    #停止一个服务
    docker-compose stop <服务名>--->docker-compose stop web1
    #注意:
    #如果后面不加服务名,会停止所有的服务
    #删除服务
    docker-compose rm
    #注意:
    #这个docker-compose rm不会删除应用的网络和数据卷。工作中尽量不要用rm进行删除
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    其他信息查看

    #查看运行的服务
    docker-compose ps
    #查看服务运行的日志
    docker-compose logs -f
    #注意:
    #加上-f 选项,可以持续跟踪服务产生的日志
    #查看服务依赖的镜像
    docke-compose images
    chengpeng@chengpeng:~/docker-file/compose$ docker-compose images
    Container    Repository    Tag       Image Id       Size  
    ----------------------------------------------------------
    nginx-web1   nginx        latest   593aee2afb64   186.8 MB
    nginx-web2   nginx        latest   593aee2afb64   186.8 MB
    
    #进入服务容器
    docker-compose exec <服务名> <执行命令>
    docker-compose exec web1 /bin/bash
    #查看服务网络
    docker network ls
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.3.4 compose文件详解

    官方参考资料: https://docs.docker.com/compose/overview/
    文件命名:
    后缀是 .yml
    **YMAL介绍
    YMAL文件格式:

    在这里插入图片描述

    compose文件样例:
    在这里插入图片描述
    格式详解:

    compose版本号、服务标识符必须顶格写
    属性名和属性值是以': '(冒号+空格) 隔开
    层级使用' '(两个空格)表示
    服务属性使用' - '(空格空格-空格)来表示
    
    • 1
    • 2
    • 3
    • 4

    compose属性介绍

    #镜像:
    格式:
    image: 镜像名称:版本号
    举例:
    image: nginx:latest
    #容器命名:
    格式:
    container_name: 自定义容器命名
    举例:
    container_name: nginx-web1
    #数据卷:
    格式:
    volumes:
    - 宿主机文件:容器文件
    举例:
    volumes:
    - ./linshi.conf:/nihao/haha.sh
    #端口:
    格式:
    ports:
    - "宿主机端口:容器端口"
    举例:
    ports:
    - "9999:80"
    #镜像构建:
    格式:
    build: Dockerfile 的路径
    举例:
    build: .
    build: ./dockerfile_dir/
    build: /root/dockerfile_dir/
    #镜像依赖:
    格式:
    depends_on:
    - 本镜像依赖于哪个服务
    举例:
    depends_on:
    - web1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    3.3.5 go项目实践

    项目分析
    在这里插入图片描述
    需求:
    自动部署一个集群,使用nginx代理两个go项目----负载均衡
    流程分析:
    1、go项目部署
    2、nginx代理部署
    3、docker 环境
    4、docker compose任务编排
    技术点分析:
    1、go项目部署
    go项目基础环境
    go项目配置
    2、nginx代理部署
    nginx的配置文件
    3、docker 环境
    docker基础镜像
    go镜像
    nginx镜像
    4、docker compose任务编排
    4个任务:1个镜像构建任务、2个go任务、1个nginx任务
    任务依赖关系:go任务执行依赖于nginx任务
    镜像依赖:go镜像依赖于nginx镜像完毕
    实施方案:
    1、基础环境
    1.1 compose基础目录
    1.2 环境依赖文件:
    sources.list、test.go、test1.go、test2.go、nginx-beego.conf
    1.3 dockerfile文件
    go项目环境的Dockerfile文件
    2、任务编排文件
    2.1 nginx任务
    基于nginx镜像,增加一个nginx的代理配置即可
    2.2 go基础镜像任务
    基于ubuntu镜像,构建go基础环境镜像,参考3.2.4内容
    该任务依赖于2.1 nginx任务
    2.3 go项目任务
    基于go基础镜像,增加测试文件即可
    该任务依赖于2.2 go基础镜像任务
    3、测试
    3.1 集群测试
    方案实施
    1、基础环境
    1.1 compose基础目录
    创建compose基础目录
    1.2 环境依赖文件:
    nginx配置文件

    创建nginx专用目录
    :~$ mkdir nginx
    :~$ cd nginx
    创建nginx负载均衡配置nginx-beego.conf
    :~$ vim nginx-beego.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5

    文件内容

    upstream beegos {
    #upstream模块
    	server 192.168.8.14:10086;
    	server 192.168.8.14:10087;
    }
    server {
    	listen 80;
    	#提供服务的端口
    	server_name _;
    	#服务名称
    	location / {
    		proxy_pass http://beegos;
    		#反选代理 upstream模块 beegos
    		index index.html index.htm;
    		#默认首页
    		}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    go基础镜像依赖文件

    #创建go基础镜像目录:
    :~$ mkdir go-base
    :~$ cd go-base
    #创建source.lise
    :~$ vim sources.list
    
    • 1
    • 2
    • 3
    • 4
    • 5

    文件内容

    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe
    multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    或者

    RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    
    • 1
    • 2

    test.go配置文件

    package main
    import (
    "github.com/astaxie/beego"
    )
    type MainController struct {
    beego.Controller
    }
    func (this *MainController) Get(){
    this.Ctx.WriteString("hello world\n")
    }
    func main() {
    beego.Router("/", &MainController{})
    beego.Run()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    go任务依赖文件: beego1/test.go配置文件

    package main
    import (
    "github.com/astaxie/beego"
    )
    type MainController struct {
    beego.Controller
    }
    func (this *MainController) Get(){
    this.Ctx.WriteString("

    hello beego1

    \n"
    ) } func main() { beego.Router("/", &MainController{}) beego.Run() }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Beego2/test.go配置文件

    package main
    import (
    "github.com/astaxie/beego"
    )
    type MainController struct {
    beego.Controller
    }
    func (this *MainController) Get(){
    this.Ctx.WriteString("

    hello beego2

    \n"
    ) } func main() { beego.Router("/", &MainController{}) beego.Run() }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1.3 dockerfile文件
    go项目环境的Dockerfile文件
    创建Dockerfile文件

    :~$ vim dockerfile
    
    • 1

    文件内容

    # 构建一个基于ubuntu 的docker 定制镜像
    # 基础镜像
    FROM ubuntu
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 增加国内源
    #COPY sources.list /etc/apt/
    RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    # 执行命令
    RUN apt-get update
    RUN apt-get install gcc libc6-dev git lrzsz -y
    #将go复制解压到容器中
    ADD go1.10.linux-amd64.tar.gz /usr/local/
    # 定制环境变量
    ENV GOROOT=/usr/local/go
    ENV PATH=$PATH:/usr/local/go/bin
    ENV GOPATH=/root/go
    ENV PATH=$GOPATH/bin/:$PATH
    # 下载项目
    #RUN go get github.com/astaxie/beego
    ADD astaxie.tar.xz /root/go/src/github.com
    # 增加文件
    COPY test.go /root/go/src/myTest/
    # 定制工作目录
    WORKDIR /root/go/src/myTest/
    # 对外端口
    EXPOSE 8080
    # 运行项目
    ENTRYPOINT ["go","run","test.go"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    最终的文件目录结构

    :~# tree /docker/compose/
    /docker/compose/beego/
    ├── beego1
    │ └── test.go
    ├── beego2
    │ └── test.go
    ├── docker-compose.yml
    ├── beego
    │ ├── astaxie.tar.xz
    │ ├── Dockerfile
    │ ├── go1.10.linux-amd64.tar.gz
    │ └── test.go
    └── nginx
    └── nginx-beego.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2、任务编排文件
    docker-compose.yml文件内容

    version: '2'
    services:
      web1:
        image: nginx
        ports:
          - "39999:80"
        volumes:
          - ./nginx/beego-nginx.conf:/etc/nginx/conf.d/default.conf
        container_name: nginx-web1
      go-base:--->可以改
        build: ./beego/
        image: go-base:v0.1
      beego-web1:
        image: go-base:v0.1
        volumes:
          - ./beego-1/test1.go:/root/go/src/myTest/test.go
        ports:
          - "10086:8080"
        container_name: beego-web1
        depends_on:
          - go-base
      beego-web2:
       image: go-base:v0.1
       volumes:
         - ./beego-2/test2.go:/root/go/src/myTest/test.go
       ports:
         - "10087:8080"
       container_name: beego-web2
       depends_on:
         - go-base
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    3、 最后测试

    #构建镜像
    $docker-compose build
    #启动任务
    $docker-compose up -d
    #查看效果
    $docker-compose ps
    #浏览器访问
    192.168.110.5:39999
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    新版TCGA表达矩阵1行代码提取2.0版
    【数据分享】北京市共享单车数据(300余万条数据)
    Redux和@reduxjs/toolkit的使用
    【CC3200AI 实验教程11】疯壳·AI语音人脸识别(会议记录仪/人脸打卡机)-AI语音系统架构
    【学习笔记之Linux】云服务器搭建
    电影推荐 - 亲密
    SSM+人才交流平台 毕业设计-附源码221022
    聊聊GLM基座模型的理论知识
    31年前的Beyond演唱会,是如何超清修复的?
    web自动化测试-webdriver
  • 原文地址:https://blog.csdn.net/qq_40432598/article/details/134195114