• Docker 学习笔记 (续)


    1.Docker 镜像

    1.1 镜像是什么

    ​ 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

    所有的应用,直接打包docker镜像,就可以直接跑起来!

    如何得到镜像

    • 从远程仓库下载
    • 朋友拷贝给你
    • 自己制作一个镜像DockerFile

    1.2 镜像加载原理

    UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

    特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把文件系统及叠加起来,这样最终的文件系统包含所有底层的文件和目录

    Dcoker镜像加载原理

    • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
    • bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们电箱的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
    • rootfs(root file system),在bootfs之上。包含的就是典型Linux 系统中的 /dev,/proc,/bin,/etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

    img

    平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?

    img

    ​ 对于个精简的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs。

    虚拟机是分钟级别,容器是秒级!

    1.3、分层理解

    我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层层的在下载 。

    在这里插入图片描述

    为什么Docker镜像要采用这种分层的结构呢?

    最大的好处,我觉得莫过于资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

    查看镜像分层的方式可以通过docker image inspect 命令

    [root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker image inspect redis:latest
    [
        {
        //.............
            "RootFS": {
                "Type": "layers",
                "Layers": [              "sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7",            "sha256:245c9d23f65373415922e53424032cabe7b282c5cf8f9f8070a7d1830fca6871",          "sha256:ebef6caacb966ed54c0c3facf2288fa5124452f2c0a17faa1941625eab0ceb54",            "sha256:0b7b774038f08ec329e4dd2c0be440c487cfb003a05fce87cd5d1497b602f2c1",          "sha256:a71d36a87572d637aa446110faf8abb4ea74f028d0e0737f2ff2b983ef23abf3",            "sha256:9e1fddfb3a22146392a2d6491e1af2f087da5e6551849a6174fa23051ef8a38f"
                ]
            },
            "Metadata": {
                "LastTagTime": "0001-01-01T00:00:00Z"
            }
        }
    ]
    

    理解:

    所有的docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。

    举一个简单的例子,加入基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上穿件第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。

    该镜像当前已经包含3个镜像层,如下图(这只是一个用于演示的很简单的例子)。

    在这里插入图片描述

    在添加额外的镜像层的同时,镜像始终是保持当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像层包含了来自两镜像层的6个文件。

    img

    上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。

    下图总展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层的文件7是文件5的一个更新版本。

    在这里插入图片描述

    这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新的镜像层添加到镜像当中。

    Docker通过存储引擎(新版本采用快照机制)的方式来实心镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。

    Linux 上可用的存储引擎有AUFS、Overlay2,Device Maper、Btrfs 以及 ZFS。顾名思义,没种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。

    Docker在Windows上仅支持windowsfiler 一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]。

    下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

    在这里插入图片描述

    特点

    Docker镜像都是只读的,当容器启东时,一个新的可写层被加载到镜像的顶部!

    这一层就是我们通常说的容器层,容器之下的都叫镜像层。

    1.4、commit镜像

    docker commit 提交容器成为一个新的副本
    # 命令和git原理类似
    docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
    
    # 1、启动一个默认的tomcatdocker run -d -p 8080:8080 tomcat# 2、发现这个默认的tomcat 是没有webapps应用,官方的镜像默认webapps下面是没有文件的!docker exec -it 容器id# 3、拷贝文件进去# 4、将操作过的容器通过commit**为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像。docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0
    

    image-20211004072728781

    如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比我们我们使用虚拟机的快照。


    2.容器数据卷

    2.1、什么是容器卷?

    将应用和环境打包成一个镜像!

    数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

    MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!

    容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

    这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

    在这里插入图片描述

    总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!

    2.2、使用数据卷

    方式一 :直接使用命令挂载 -v

    -v, --volume list Bind mount a volume
    docker run -it -v 主机目录:容器内目录    
    [root@iZ8vbgc3u6dvwrjyp45lyrZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
    #通过 docker inspect 容器id 查看
    

    2.3、案例:安装MySQL

    # 获取mysql镜像
    ➜ ~ docker pull mysql:5.7
    # 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点!
    # 参考官网hub
    docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
    #启动我们得
    -d 后台运行
    -p 端口映射
    -v 卷挂载
    -e 环境配置
    -- name 容器名字
    ➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql 
    -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
    # 启动成功之后,我们在本地使用sqlyog来测试一下
    # sqlyog-连接到服务器的3306--和容器内的3306映射
    # 在本地测试创建一个数据库,查看一下我们映射的路径是否ok!
    

    image-20211004085747689

    2.4、具名和匿名挂载

    # 匿名挂载
    -v 容器内路径!
    docker run -d -p --name nginx01 -v /etc/nginx nginx
    # 查看所有的volume的情况
    [root@iZ8vbgc3u6dvwrjyp45lyrZ lib]# docker volume ls
    DRIVER    VOLUME NAME
    local     3df3ebf883092323908b31e21c761b56c937ee04ed51d418eedcc10df8d5f20a
    # 这里发现,这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径!
    # 具名挂载
    # 具名挂载
    ➜ ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
    ➜ ~ docker volume ls
    DRIVER         VOLUME NAME
    local         juming-nginx
    # 通过 -v 卷名:容器内路径
    # 查看一下这个卷
    

    image-20211004090032125

    所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx/_data

    我们通过具名挂载可以方便的找到我们的 一个卷,大多数情况使用的是 具名挂载

    # 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
    -v 容器内路径          # 匿名挂载
    -v 卷名:容器内路径      # 具名挂载
    -v /宿主机路径:容器路径  # 指定路径挂载!
    

    拓展:

    # 通过 -v 容器内路径: ro rw 改变读写权限
    ro readonly  # 只读
    rw readwrite # 可读可写
    # 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了!
    docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
    docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
    # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
    

    2.5、初识Dockerfile

    Dockerfile 就是用来构建docker镜像的构建文件!

    1.通过这个脚本可以生成镜像,镜像是一层一层的,脚本就是一个一个的命令

    # 创建一个dockerfile文件,名字可以随机 建议 Dockerfile# 文件中的内容 指令(大写)参数FROM centosVOLUME ["/volume01", "/volume02"]CMD echo  "----end----------"CMD /bin/bash# 这里的每个命令,就是镜像的一层!
    

    2.通过 docker build 命令基于dockerfile 构建自己的镜像

    image-20211004090553765

    3启动镜像

    image-20211004090730470

    可以看到docker文件里写的 挂载 已经生效

    4查看一下卷挂载的路径

    image-20211004091022903

    2.6 数据卷容器

    多个MySQL同步数据!

    命名的容器挂载数据卷!

    在这里插入图片描述

    启动2个容器,通过我们刚才自己写的镜像启动

    image-20211004110405145

    --volumes-from list                Mount volumes from the specified container(s)# 测试,
    
    [root@qiaoba ~]# docker run -it --name docker-04 --volumes-from docker-3 9b05afa5a9cd[root@675e696485b1 /]# cd volumedir01[root@675e696485b1 volumedir01]# lsfangtao.java
    

    多个mysql实现数据共享

    ➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7➜ ~ docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7# 这个时候,可以实现两个容器数据同步!
    

    结论:

    容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

    但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

    3.DockerFile

    3.1、DockerFile介绍

    dockerfile 是用来构建docker镜像的文件!命令参数脚本!

    构建步骤:

    1. 编写一个dockerfile文件
    2. docker build 构建称为一个镜像
    3. docker run运行镜像
    4. docker push发布镜像(DockerHub 、阿里云仓库)

    在这里插入图片描述

    img

    但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

    官方既然可以制作镜像,那我们也可以!

    3.2、DockerFile构建过程

    基础知识:

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

    image-20211004113215280

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

    Docker镜像逐渐成企业交付的标准,必须要掌握!

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

    DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。

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

    3.3、DockerFile常用指令

    FROM            # 基础镜像,一切从这里开始构建MAINTAINER      # 镜像是谁写的, 姓名+邮箱RUN             # 镜像构建的时候需要运行的命令ADD             # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录WORKDIR         # 镜像的工作目录VOLUME          # 挂载的目录EXPOSE          # 保留端口配置CMD             # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。ENTRYPOINT      # 指定这个容器启动的时候要运行的命令,可以追加命令ONBUILD         # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。COPY            # 类似ADD,将我们文件拷贝到镜像中ENV             # 构建的时候设置环境变量!
    

    3.4、实战测试

    Docker Hub中 99% 镜像都是从这个基础镜像过来的FROM scratch , 然后配置需要的软件和配置来进行的构建

    在这里插入图片描述

    创建一个自己的centos

    1、新建dockerfile 文件 并编辑脚本保存

    FROM centos   #指定继承得父镜像MAINTAINER fangtao<fangtao_greate@163.com> #标注作者ENV MYPATH /usr/local #设置环境变量 WORKDIR   $MYPATH     #指定初始工作目录RUN yum -y install vim  #运行一些Linux命令 这里是在安装 vim 和 网络 命令RUN yum -y install net-toolsEXPOSE 80  #指定暴露得端口CMD echo $MYPATH #输出一些信息CMD echo "---finish----"CMD /bin/bash  #指定这个容器启动的时候要运行bash命令
    

    2、通过这个文件构建镜像

    [root@qiaoba docker-test-dockerfile]# docker build -f mycentos -t mycentos:1.0.1 .#下面是构建镜像日志Sending build context to Docker daemon  2.048kBStep 1/10 : FROM centos ---> 5d0da3dc9764Step 2/10 : MAINTAINER fangtao<fangtao_greate@163.com> ---> Running in 835dd7444f92Removing intermediate container 835dd7444f92 ---> 8d8dae0fe87aStep 3/10 : ENV MYPATH /usr/local ---> Running in 14a34c0c09b9Removing intermediate container 14a34c0c09b9 ---> 675a69afbf01Step 4/10 : WORKDIR   $MYPATH ---> Running in a9848f598e66Removing intermediate container a9848f598e66 ---> 67ef2b211da9Step 5/10 : RUN yum -y install vim ---> Running in f23264f1a329CentOS Linux 8 - AppStream                      3.1 MB/s | 9.3 MB     00:03    CentOS Linux 8 - BaseOS                         3.1 MB/s | 7.5 MB     00:02    CentOS Linux 8 - Extras                          10 kB/s |  10 kB     00:01    Dependencies resolved.================================================================================ Package             Arch        Version                   Repository      Size================================================================================Installing: vim-enhanced        x86_64      2:8.0.1763-15.el8         appstream      1.4 MInstalling dependencies: gpm-libs            x86_64      1.20.7-17.el8             appstream       39 k vim-common          x86_64      2:8.0.1763-15.el8         appstream      6.3 M vim-filesystem      noarch      2:8.0.1763-15.el8         appstream       48 k which               x86_64      2.21-12.el8               baseos          49 kTransaction Summary================================================================================Install  5 PackagesTotal download size: 7.8 MInstalled size: 30 MDownloading Packages:(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm        182 kB/s |  39 kB     00:00    (2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 484 kB/s |  48 kB     00:00    (3/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm  1.6 MB/s | 1.4 MB     00:00    (4/5): which-2.21-12.el8.x86_64.rpm              76 kB/s |  49 kB     00:00    (5/5): vim-common-8.0.1763-15.el8.x86_64.rpm    3.1 MB/s | 6.3 MB     00:02    --------------------------------------------------------------------------------Total                                           1.9 MB/s | 7.8 MB     00:04     CentOS Linux 8 - AppStream                      1.6 MB/s | 1.6 kB     00:00    warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEYImporting GPG key 0x8483C65D: Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>" Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficialKey imported successfullyRunning transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction  Preparing        :                                                        1/1   Installing       : which-2.21-12.el8.x86_64                               1/5   Installing       : vim-filesystem-2:8.0.1763-15.el8.noarch                2/5   Installing       : vim-common-2:8.0.1763-15.el8.x86_64                    3/5   Installing       : gpm-libs-1.20.7-17.el8.x86_64                          4/5   Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64                          4/5   Installing       : vim-enhanced-2:8.0.1763-15.el8.x86_64                  5/5   Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64                  5/5   Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64                    5/5   Verifying        : gpm-libs-1.20.7-17.el8.x86_64                          1/5   Verifying        : vim-common-2:8.0.1763-15.el8.x86_64                    2/5   Verifying        : vim-enhanced-2:8.0.1763-15.el8.x86_64                  3/5   Verifying        : vim-filesystem-2:8.0.1763-15.el8.noarch                4/5   Verifying        : which-2.21-12.el8.x86_64                               5/5 Installed:  gpm-libs-1.20.7-17.el8.x86_64         vim-common-2:8.0.1763-15.el8.x86_64      vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch  which-2.21-12.el8.x86_64             Complete!Removing intermediate container f23264f1a329 ---> c0d4413d2b1dStep 6/10 : RUN yum -y install net-tools ---> Running in 8e9461e64a48Last metadata expiration check: 0:00:19 ago on Mon Oct  4 04:17:34 2021.Dependencies resolved.================================================================================ Package         Architecture Version                        Repository    Size================================================================================Installing: net-tools       x86_64       2.0-0.52.20160912git.el8       baseos       322 kTransaction Summary================================================================================Install  1 PackageTotal download size: 322 kInstalled size: 942 kDownloading Packages:net-tools-2.0-0.52.20160912git.el8.x86_64.rpm   444 kB/s | 322 kB     00:00    --------------------------------------------------------------------------------Total                                           238 kB/s | 322 kB     00:01     Running transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction  Preparing        :                                                        1/1   Installing       : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1   Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64              1/1   Verifying        : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 Installed:  net-tools-2.0-0.52.20160912git.el8.x86_64                                     Complete!Removing intermediate container 8e9461e64a48 ---> 3a171cf83932Step 7/10 : EXPOSE 80 ---> Running in 96ff3ce70ee9Removing intermediate container 96ff3ce70ee9 ---> ce150e684a95Step 8/10 : CMD echo $MYPATH ---> Running in 997908f0be1cRemoving intermediate container 997908f0be1c ---> f3465f21cdb7Step 9/10 : CMD echo "---finish----" ---> Running in 77e532514004Removing intermediate container 77e532514004 ---> b3f5317a146bStep 10/10 : CMD /bin/bash ---> Running in b1367e2d0839Removing intermediate container b1367e2d0839 ---> dcadd751b09cSuccessfully built dcadd751b09cSuccessfully tagged mycentos:1.0.1[root@qiaoba docker-test-dockerfile]# 
    

    3.启动镜像

    image-20211004122856368

    发现 进入了之前配置的工作目录, 例如ifconfig这样的网络命令已安装成功

    CMD 和 ENTRYPOINT区别

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

    测试cmd

    # 编写dockerfile文件$ vim dockerfile-test-cmdFROM centosCMD ["ls","-a"]# 构建镜像$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .# 运行镜像$ docker run cmd-test:0.1....dockerenvbindev# 想追加一个命令 -l 成为ls -al$ docker run cmd-test:0.1 -ldocker: Error response from daemon: OCI runtime create failed:container_linux.go:349: starting container process caused "exec: "-l":executable file not found in $PATH": unknown.ERRO[0000] error waiting for container: context canceled# cmd的情况下 -l 替换了CMD["ls","-l"]。 -l 不是命令所有报错
    

    测试ENTRYPOINT

    # 编写dockerfile文件$ vim dockerfile-test-entrypointFROM centosENTRYPOINT ["ls","-a"]$ docker run entrypoint-test:0.1....dockerenvbindevetchomeliblib64lost+found ...# 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的$ docker run entrypoint-test:0.1 -ltotal 56drwxr-xr-x 1 root root 4096 May 16 06:32 .drwxr-xr-x 1 root root 4096 May 16 06:32 ..-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenvlrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bindrwxr-xr-x 5 root root 340 May 16 06:32 devdrwxr-xr-x 1 root root 4096 May 16 06:32 etcdrwxr-xr-x 2 root root 4096 May 11 2019 homelrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/liblrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ....
    

    3.5、实战:Tomcat镜像

    1、准备镜像文件

    准备tomcat 和 jdk到当前目录,编写好README 。

    2、编写dokerfile

    FROM centos #MAINTAINER cheng<1204598429@qq.com>COPY README /usr/local/README                     #复制文件ADD jdk-8u231-linux-x64.tar.gz /usr/local/         #复制解压ADD apache-tomcat-9.0.35.tar.gz /usr/local/     #复制解压RUN yum -y install vim ENV MYPATH /usr/local                             #设置环境变量WORKDIR $MYPATH                                 #设置工作目录ENV JAVA_HOME /usr/local/jdk1.8.0_231             #设置环境变量ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35         #设置环境变量ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib        #设置环境变量 分隔符是:EXPOSE 8080                                     #设置暴露的端口CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out                        # 设置默认命令
    

    3、构建镜像

    # 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件$ docker build -t mytomcat:0.1 .$ docker build -t diytomcat .
    

    4、run镜像

    $ docker run -d -p 8080:8080 --name tomcat01 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logsmytomcat:0.1
    

    5、访问测试

    6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)

    发现:项目部署成功,可以直接访问!

    我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!

    3.6、发布自己的镜像

    1、地址 https://hub.docker.com/

    2、确定这个账号可以登录

    3、登录

    $ docker login --helpUsage: 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
    

    4、提交 push镜像.

    # push自己的镜像到服务器上!$ docker push diytomcat
    

    image-20211004162338011

    # 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library# 解决方法# 第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了$ docker build -t chengcoder/mytomcat:0.1 .# 第二种 使用docker tag #然后再次push$ docker tag 容器id chengcoder/mytomcat:1.0 #然后再次push$ docker push kuangshen/tomcat:1.0
    

    image-20211004162404373

    提交的时候也是按照镜像的层级来提交的!

    阿里云镜像服务上

    1、登录阿里云

    2、找到容器镜像服务

    3、创建命名空间

    4、创建容器镜像

    看官网 很详细https://cr.console.aliyun.com/repository/

    $ sudo docker login --username=zchengx registry.cn-shenzhen.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号]# 修改id 和 版本sudo docker tag a5ef1f32aaae registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:1.0# 修改版本$ sudo docker push registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号]
    

    测试结果:

    1.Docker 镜像

    1.1 镜像是什么

    ​ 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

    所有的应用,直接打包docker镜像,就可以直接跑起来!

    如何得到镜像

    • 从远程仓库下载
    • 朋友拷贝给你
    • 自己制作一个镜像DockerFile

    1.2 镜像加载原理

    UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

    特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把文件系统及叠加起来,这样最终的文件系统包含所有底层的文件和目录

    Dcoker镜像加载原理

    • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
    • bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们电箱的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
    • rootfs(root file system),在bootfs之上。包含的就是典型Linux 系统中的 /dev,/proc,/bin,/etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

    img

    平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?

    img

    ​ 对于个精简的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs。

    虚拟机是分钟级别,容器是秒级!

    1.3、分层理解

    我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层层的在下载 。

    在这里插入图片描述

    为什么Docker镜像要采用这种分层的结构呢?

    最大的好处,我觉得莫过于资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

    查看镜像分层的方式可以通过docker image inspect 命令

    [root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker image inspect redis:latest[    {    //.............        "RootFS": {            "Type": "layers",            "Layers": [              "sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7",            "sha256:245c9d23f65373415922e53424032cabe7b282c5cf8f9f8070a7d1830fca6871",          "sha256:ebef6caacb966ed54c0c3facf2288fa5124452f2c0a17faa1941625eab0ceb54",            "sha256:0b7b774038f08ec329e4dd2c0be440c487cfb003a05fce87cd5d1497b602f2c1",          "sha256:a71d36a87572d637aa446110faf8abb4ea74f028d0e0737f2ff2b983ef23abf3",            "sha256:9e1fddfb3a22146392a2d6491e1af2f087da5e6551849a6174fa23051ef8a38f"            ]        },        "Metadata": {            "LastTagTime": "0001-01-01T00:00:00Z"        }    }]
    

    理解:

    所有的docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。

    举一个简单的例子,加入基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上穿件第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。

    该镜像当前已经包含3个镜像层,如下图(这只是一个用于演示的很简单的例子)。

    在这里插入图片描述

    在添加额外的镜像层的同时,镜像始终是保持当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像层包含了来自两镜像层的6个文件。

    img

    上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。

    下图总展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层的文件7是文件5的一个更新版本。

    在这里插入图片描述

    这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新的镜像层添加到镜像当中。

    Docker通过存储引擎(新版本采用快照机制)的方式来实心镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。

    Linux 上可用的存储引擎有AUFS、Overlay2,Device Maper、Btrfs 以及 ZFS。顾名思义,没种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。

    Docker在Windows上仅支持windowsfiler 一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]。

    下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

    在这里插入图片描述

    特点

    Docker镜像都是只读的,当容器启东时,一个新的可写层被加载到镜像的顶部!

    这一层就是我们通常说的容器层,容器之下的都叫镜像层。

    1.4、commit镜像

    docker commit 提交容器成为一个新的副本# 命令和git原理类似docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
    
    # 1、启动一个默认的tomcatdocker run -d -p 8080:8080 tomcat# 2、发现这个默认的tomcat 是没有webapps应用,官方的镜像默认webapps下面是没有文件的!docker exec -it 容器id# 3、拷贝文件进去# 4、将操作过的容器通过commit**为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像。docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0
    

    image-20211004072728781

    如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比我们我们使用虚拟机的快照。


    2.容器数据卷

    2.1、什么是容器卷?

    将应用和环境打包成一个镜像!

    数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

    MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!

    容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

    这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

    在这里插入图片描述

    总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!

    2.2、使用数据卷

    方式一 :直接使用命令挂载 -v

    -v, --volume list Bind mount a volumedocker run -it -v 主机目录:容器内目录    [root@iZ8vbgc3u6dvwrjyp45lyrZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash#通过 docker inspect 容器id 查看
    

    2.3、案例:安装MySQL

    # 获取mysql镜像➜ ~ docker pull mysql:5.7# 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点!# 参考官网hubdocker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag#启动我们得-d 后台运行-p 端口映射-v 卷挂载-e 环境配置-- name 容器名字➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7# 启动成功之后,我们在本地使用sqlyog来测试一下# sqlyog-连接到服务器的3306--和容器内的3306映射# 在本地测试创建一个数据库,查看一下我们映射的路径是否ok!
    

    image-20211004085747689

    2.4、具名和匿名挂载

    # 匿名挂载-v 容器内路径!docker run -d -p --name nginx01 -v /etc/nginx nginx# 查看所有的volume的情况[root@iZ8vbgc3u6dvwrjyp45lyrZ lib]# docker volume lsDRIVER    VOLUME NAMElocal     3df3ebf883092323908b31e21c761b56c937ee04ed51d418eedcc10df8d5f20a# 这里发现,这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径!# 具名挂载# 具名挂载➜ ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx➜ ~ docker volume lsDRIVER         VOLUME NAMElocal         juming-nginx# 通过 -v 卷名:容器内路径# 查看一下这个卷
    

    image-20211004090032125

    所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx/_data

    我们通过具名挂载可以方便的找到我们的 一个卷,大多数情况使用的是 具名挂载

    # 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!-v 容器内路径          # 匿名挂载-v 卷名:容器内路径      # 具名挂载-v /宿主机路径:容器路径  # 指定路径挂载!
    

    拓展:

    # 通过 -v 容器内路径: ro rw 改变读写权限ro readonly  # 只读rw readwrite # 可读可写# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了!docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginxdocker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
    

    2.5、初识Dockerfile

    Dockerfile 就是用来构建docker镜像的构建文件!

    1.通过这个脚本可以生成镜像,镜像是一层一层的,脚本就是一个一个的命令

    # 创建一个dockerfile文件,名字可以随机 建议 Dockerfile# 文件中的内容 指令(大写)参数FROM centosVOLUME ["/volume01", "/volume02"]CMD echo  "----end----------"CMD /bin/bash# 这里的每个命令,就是镜像的一层!
    

    2.通过 docker build 命令基于dockerfile 构建自己的镜像

    image-20211004090553765

    3启动镜像

    image-20211004090730470

    可以看到docker文件里写的 挂载 已经生效

    4查看一下卷挂载的路径

    image-20211004091022903

    2.6 数据卷容器

    多个MySQL同步数据!

    命名的容器挂载数据卷!

    在这里插入图片描述

    启动2个容器,通过我们刚才自己写的镜像启动

    image-20211004110405145

    --volumes-from list                Mount volumes from the specified container(s)# 测试,
    
    [root@qiaoba ~]# docker run -it --name docker-04 --volumes-from docker-3 9b05afa5a9cd[root@675e696485b1 /]# cd volumedir01[root@675e696485b1 volumedir01]# lsfangtao.java
    

    多个mysql实现数据共享

    ➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7➜ ~ docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7# 这个时候,可以实现两个容器数据同步!
    

    结论:

    容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

    但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

    3.DockerFile

    3.1、DockerFile介绍

    dockerfile 是用来构建docker镜像的文件!命令参数脚本!

    构建步骤:

    1. 编写一个dockerfile文件
    2. docker build 构建称为一个镜像
    3. docker run运行镜像
    4. docker push发布镜像(DockerHub 、阿里云仓库)

    在这里插入图片描述

    img

    但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

    官方既然可以制作镜像,那我们也可以!

    3.2、DockerFile构建过程

    基础知识:

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

    image-20211004113215280

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

    Docker镜像逐渐成企业交付的标准,必须要掌握!

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

    DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。

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

    3.3、DockerFile常用指令

    FROM            # 基础镜像,一切从这里开始构建MAINTAINER      # 镜像是谁写的, 姓名+邮箱RUN             # 镜像构建的时候需要运行的命令ADD             # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录WORKDIR         # 镜像的工作目录VOLUME          # 挂载的目录EXPOSE          # 保留端口配置CMD             # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。ENTRYPOINT      # 指定这个容器启动的时候要运行的命令,可以追加命令ONBUILD         # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。COPY            # 类似ADD,将我们文件拷贝到镜像中ENV             # 构建的时候设置环境变量!
    

    3.4、实战测试

    Docker Hub中 99% 镜像都是从这个基础镜像过来的FROM scratch , 然后配置需要的软件和配置来进行的构建

    在这里插入图片描述

    创建一个自己的centos

    1、新建dockerfile 文件 并编辑脚本保存

    FROM centos   #指定继承得父镜像MAINTAINER fangtao<fangtao_greate@163.com> #标注作者ENV MYPATH /usr/local #设置环境变量 WORKDIR   $MYPATH     #指定初始工作目录RUN yum -y install vim  #运行一些Linux命令 这里是在安装 vim 和 网络 命令RUN yum -y install net-toolsEXPOSE 80  #指定暴露得端口CMD echo $MYPATH #输出一些信息CMD echo "---finish----"CMD /bin/bash  #指定这个容器启动的时候要运行bash命令
    

    2、通过这个文件构建镜像

    [root@qiaoba docker-test-dockerfile]# docker build -f mycentos -t mycentos:1.0.1 .#下面是构建镜像日志Sending build context to Docker daemon  2.048kBStep 1/10 : FROM centos ---> 5d0da3dc9764Step 2/10 : MAINTAINER fangtao<fangtao_greate@163.com> ---> Running in 835dd7444f92Removing intermediate container 835dd7444f92 ---> 8d8dae0fe87aStep 3/10 : ENV MYPATH /usr/local ---> Running in 14a34c0c09b9Removing intermediate container 14a34c0c09b9 ---> 675a69afbf01Step 4/10 : WORKDIR   $MYPATH ---> Running in a9848f598e66Removing intermediate container a9848f598e66 ---> 67ef2b211da9Step 5/10 : RUN yum -y install vim ---> Running in f23264f1a329CentOS Linux 8 - AppStream                      3.1 MB/s | 9.3 MB     00:03    CentOS Linux 8 - BaseOS                         3.1 MB/s | 7.5 MB     00:02    CentOS Linux 8 - Extras                          10 kB/s |  10 kB     00:01    Dependencies resolved.================================================================================ Package             Arch        Version                   Repository      Size================================================================================Installing: vim-enhanced        x86_64      2:8.0.1763-15.el8         appstream      1.4 MInstalling dependencies: gpm-libs            x86_64      1.20.7-17.el8             appstream       39 k vim-common          x86_64      2:8.0.1763-15.el8         appstream      6.3 M vim-filesystem      noarch      2:8.0.1763-15.el8         appstream       48 k which               x86_64      2.21-12.el8               baseos          49 kTransaction Summary================================================================================Install  5 PackagesTotal download size: 7.8 MInstalled size: 30 MDownloading Packages:(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm        182 kB/s |  39 kB     00:00    (2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 484 kB/s |  48 kB     00:00    (3/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm  1.6 MB/s | 1.4 MB     00:00    (4/5): which-2.21-12.el8.x86_64.rpm              76 kB/s |  49 kB     00:00    (5/5): vim-common-8.0.1763-15.el8.x86_64.rpm    3.1 MB/s | 6.3 MB     00:02    --------------------------------------------------------------------------------Total                                           1.9 MB/s | 7.8 MB     00:04     CentOS Linux 8 - AppStream                      1.6 MB/s | 1.6 kB     00:00    warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEYImporting GPG key 0x8483C65D: Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>" Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficialKey imported successfullyRunning transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction  Preparing        :                                                        1/1   Installing       : which-2.21-12.el8.x86_64                               1/5   Installing       : vim-filesystem-2:8.0.1763-15.el8.noarch                2/5   Installing       : vim-common-2:8.0.1763-15.el8.x86_64                    3/5   Installing       : gpm-libs-1.20.7-17.el8.x86_64                          4/5   Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64                          4/5   Installing       : vim-enhanced-2:8.0.1763-15.el8.x86_64                  5/5   Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64                  5/5   Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64                    5/5   Verifying        : gpm-libs-1.20.7-17.el8.x86_64                          1/5   Verifying        : vim-common-2:8.0.1763-15.el8.x86_64                    2/5   Verifying        : vim-enhanced-2:8.0.1763-15.el8.x86_64                  3/5   Verifying        : vim-filesystem-2:8.0.1763-15.el8.noarch                4/5   Verifying        : which-2.21-12.el8.x86_64                               5/5 Installed:  gpm-libs-1.20.7-17.el8.x86_64         vim-common-2:8.0.1763-15.el8.x86_64      vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch  which-2.21-12.el8.x86_64             Complete!Removing intermediate container f23264f1a329 ---> c0d4413d2b1dStep 6/10 : RUN yum -y install net-tools ---> Running in 8e9461e64a48Last metadata expiration check: 0:00:19 ago on Mon Oct  4 04:17:34 2021.Dependencies resolved.================================================================================ Package         Architecture Version                        Repository    Size================================================================================Installing: net-tools       x86_64       2.0-0.52.20160912git.el8       baseos       322 kTransaction Summary================================================================================Install  1 PackageTotal download size: 322 kInstalled size: 942 kDownloading Packages:net-tools-2.0-0.52.20160912git.el8.x86_64.rpm   444 kB/s | 322 kB     00:00    --------------------------------------------------------------------------------Total                                           238 kB/s | 322 kB     00:01     Running transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction  Preparing        :                                                        1/1   Installing       : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1   Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64              1/1   Verifying        : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 Installed:  net-tools-2.0-0.52.20160912git.el8.x86_64                                     Complete!Removing intermediate container 8e9461e64a48 ---> 3a171cf83932Step 7/10 : EXPOSE 80 ---> Running in 96ff3ce70ee9Removing intermediate container 96ff3ce70ee9 ---> ce150e684a95Step 8/10 : CMD echo $MYPATH ---> Running in 997908f0be1cRemoving intermediate container 997908f0be1c ---> f3465f21cdb7Step 9/10 : CMD echo "---finish----" ---> Running in 77e532514004Removing intermediate container 77e532514004 ---> b3f5317a146bStep 10/10 : CMD /bin/bash ---> Running in b1367e2d0839Removing intermediate container b1367e2d0839 ---> dcadd751b09cSuccessfully built dcadd751b09cSuccessfully tagged mycentos:1.0.1[root@qiaoba docker-test-dockerfile]# 
    

    3.启动镜像

    image-20211004122856368

    发现 进入了之前配置的工作目录, 例如ifconfig这样的网络命令已安装成功

    CMD 和 ENTRYPOINT区别

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

    测试cmd

    # 编写dockerfile文件$ vim dockerfile-test-cmdFROM centosCMD ["ls","-a"]# 构建镜像$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .# 运行镜像$ docker run cmd-test:0.1....dockerenvbindev# 想追加一个命令 -l 成为ls -al$ docker run cmd-test:0.1 -ldocker: Error response from daemon: OCI runtime create failed:container_linux.go:349: starting container process caused "exec: "-l":executable file not found in $PATH": unknown.ERRO[0000] error waiting for container: context canceled# cmd的情况下 -l 替换了CMD["ls","-l"]。 -l 不是命令所有报错
    

    测试ENTRYPOINT

    # 编写dockerfile文件$ vim dockerfile-test-entrypointFROM centosENTRYPOINT ["ls","-a"]$ docker run entrypoint-test:0.1....dockerenvbindevetchomeliblib64lost+found ...# 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的$ docker run entrypoint-test:0.1 -ltotal 56drwxr-xr-x 1 root root 4096 May 16 06:32 .drwxr-xr-x 1 root root 4096 May 16 06:32 ..-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenvlrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bindrwxr-xr-x 5 root root 340 May 16 06:32 devdrwxr-xr-x 1 root root 4096 May 16 06:32 etcdrwxr-xr-x 2 root root 4096 May 11 2019 homelrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/liblrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ....
    

    3.5、实战:Tomcat镜像

    1、准备镜像文件

    准备tomcat 和 jdk到当前目录,编写好README 。

    2、编写dokerfile

    FROM centos #MAINTAINER cheng<1204598429@qq.com>COPY README /usr/local/README                     #复制文件ADD jdk-8u231-linux-x64.tar.gz /usr/local/         #复制解压ADD apache-tomcat-9.0.35.tar.gz /usr/local/     #复制解压RUN yum -y install vim ENV MYPATH /usr/local                             #设置环境变量WORKDIR $MYPATH                                 #设置工作目录ENV JAVA_HOME /usr/local/jdk1.8.0_231             #设置环境变量ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35         #设置环境变量ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib        #设置环境变量 分隔符是:EXPOSE 8080                                     #设置暴露的端口CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out                        # 设置默认命令
    

    3、构建镜像

    # 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件$ docker build -t mytomcat:0.1 .$ docker build -t diytomcat .
    

    4、run镜像

    $ docker run -d -p 8080:8080 --name tomcat01 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logsmytomcat:0.1
    

    5、访问测试

    6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)

    发现:项目部署成功,可以直接访问!

    我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!

    3.6、发布自己的镜像

    1、地址 https://hub.docker.com/

    2、确定这个账号可以登录

    3、登录

    $ docker login --helpUsage: 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
    

    4、提交 push镜像.

    # push自己的镜像到服务器上!$ docker push diytomcat
    

    image-20211004162338011

    # 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library# 解决方法# 第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了$ docker build -t chengcoder/mytomcat:0.1 .# 第二种 使用docker tag #然后再次push$ docker tag 容器id chengcoder/mytomcat:1.0 #然后再次push$ docker push kuangshen/tomcat:1.0
    

    image-20211004162404373

    提交的时候也是按照镜像的层级来提交的!

    阿里云镜像服务上

    1、登录阿里云

    2、找到容器镜像服务

    3、创建命名空间

    4、创建容器镜像

    看官网 很详细https://cr.console.aliyun.com/repository/

    $ sudo docker login --username=zchengx registry.cn-shenzhen.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号]# 修改id 和 版本sudo docker tag a5ef1f32aaae registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:1.0# 修改版本$ sudo docker push registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号]
    

    测试结果:

    image-20211004175337553

    3.7 小结

    image-20211004162524168

  • 相关阅读:
    用于展现图表的50种JavaScript库
    EditPlus常用正则表达式
    人工智能生成仿真人脸
    树莓派搭建SVN服务器
    JS三座大山再学习 ---- 异步和单线程
    JS三座大山再学习 ---- 作用域和闭包
    基于C#的MongoDB数据库开发应用(2)--MongoDB数据库的C#开发
    基于C#的MongoDB数据库开发应用(1)--MongoDB数据库的基础知识和使用
    大数据高效复制的处理案例分析总结
    基于DevExpress的Winform程序安装包的制作
  • 原文地址:https://www.cnblogs.com/ft-greate/p/15366633.html
Copyright © 2020-2023  润新知