zoukankan      html  css  js  c++  java
  • Docker基础学习

    Docker的安装

    查看linux版本

    • uname -r 查看内核版本

    image-20210617091710491

    • cat /etc/os-release 获取linux的详细信息

    image-20210617091755569

    开始安装

    • 要安装 Docker Engine,你需要一个 CentOS 7或8的维护版本。必须启用 centos-extras 存储库。这个存储库默认是启用的,但是如果您已经禁用了它,您需要重新启用它。建议使用 overlay2存储驱动程序。

    • 参考官网

    • 安装之前卸载旧版本

    sudo yum remove docker 
                      docker-client 
                      docker-client-latest 
                      docker-common 
                      docker-latest 
                      docker-latest-logrotate 
                      docker-logrotate 
                      docker-engine
    

    image-20210617092043888

    • 安装存储库
     # 安装安装包
     sudo yum install -y yum-utils
     # 安装docker镜像 国外的
     sudo yum-config-manager 
        --add-repo 
        https://download.docker.com/linux/centos/docker-ce.repo
    # 【建议】 国内阿里云镜像
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    image-20210617092324744

    • 安装docker
    # 安装之前更新索引
    yum makecache fast
    # 安装docker相关的  ce社区版的 ee企业版的
    yum install docker-ce docker-ce-cli containerd.io
    
    • 启动docker
    # 启动docker
    systemctl start docker
    
    • 查看版本
    docker version
    

    image-20210617093321751

    • 运行helloworld 检查是否可用
    docker run hello-world
    
    image-20210617093520819
    • 查看docker镜像
    docker images
    

    image-20210617093631261

    • 卸载docker
    1. 卸载 Docker Engine、 CLI 和 Containerd 软件包:

      $ sudo yum remove docker-ce docker-ce-cli containerd.io
      
    2. 主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有图像、容器和卷:

      $ sudo rm -rf /var/lib/docker
      $ sudo rm -rf /var/lib/containerd
      

    配置阿里云镜像加速

    • 登录阿里云账号

    image-20210617094550038

    image-20210617094609643

    image-20210617094642135

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://nwucfehd.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

    Docker查找镜像流程

    image-20210617093936202

    底层原理

    image-20210617095241884

    常用命令

    官网 https://docs.docker.com/engine/reference/commandline/docker/

    帮助命令

    docker version # 查看docker版本
    docker info # 查看docker的详细信息 
    docker 命令 --help # 查看帮助文档
    

    镜像命令

    [root@ansible-02 ~]# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
    hello-world   latest    d1165f221234   3 months ago   13.3kB
    
    
    REPOSITORY # 镜像源
    TAG #镜像标签
    IMAGE ID  #镜像ID
    CREATED  # 镜像创建时间
    SIZE #镜像大小
    # 可选项
    -a, --all # 查看所有镜像
    -q, --quiet #只显示镜像id
    

    搜索镜像命令

    # 搜索镜像 
    docker search 镜像名
    
    # 参数
    --filter , -f		#基于提供的条件的过滤器输出 可以通过stars过滤
    --format		 #使用 Go 模板进行漂亮印刷的搜索
    --limit	25	    #搜寻结果的最大数目
    --no-trunc		#不要截断输出
    

    也可到官网搜索 https://hub.docker.com/search?q=mysql&type=image

    image-20210617101531195
    • 过滤stars3000以上的 docker search mysql --filter=stars=3000

    image-20210617101949070

    • 过滤stars3000以上的 并且内容描述设置为不可截断 docker search --no-trunc mysql --filter=stars=3000

    image-20210617102057908

    • --limit 是搜索返回的最大结果数。这个值可以在1到100之间。-- limit 的默认值为25。

    • 过滤

      • 过滤标志(- f 或 -- filter)格式是一个 key = value 对。如果有多个过滤器,则传递多个标志(例如 -- filter is-automated = true -- filter stars = 3)

        目前支持的过滤器有:

      • stars (int - number of stars the image has) 收藏数量

      • is-automated (boolean - true or false) - 是否为自动构建的 true、false

      • is-official (boolean - true or false) -是否为正式的(官方版本) true、false

    # 过滤是自动构建的 busybox
    docker search --no-trunc  busybox  --filter is-automated=true
    

    image-20210617102843468

    拉取镜像命令

    [root@ansible-02 ~]# docker pull mysql
    Using default tag: latest # 没有指定标签默认从latest拉取
    latest: Pulling from library/mysql
    69692152171a: Pull complete  # 分层下载,dockerimages的核心,联合文件系统
    1651b0be3df3: Pull complete 
    951da7386bc8: Pull complete 
    0f86c95aa242: Pull complete 
    37ba2d8bd4fe: Pull complete 
    6d278bb05e94: Pull complete 
    497efbd93a3e: Pull complete 
    f7fddf10c2c2: Pull complete 
    16415d159dfb: Pull complete 
    0e530ffc6b73: Pull complete 
    b0a4a1a77178: Pull complete 
    cd90f92aa9ef: Pull complete 
    Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
    Status: Downloaded newer image for mysql:latest
    docker.io/library/mysql:latest # 真实地址
    
    
    # 等价于
    docker pull mysql
    docker pull docker.io/library/mysql:latest
    
    #指定版本下载
    [root@ansible-02 ~]# docker pull mysql:5.7
    5.7: Pulling from library/mysql
    69692152171a: Already exists # 已经存在的图层 不在重复下载
    1651b0be3df3: Already exists 
    951da7386bc8: Already exists 
    0f86c95aa242: Already exists 
    37ba2d8bd4fe: Already exists 
    6d278bb05e94: Already exists 
    497efbd93a3e: Already exists 
    a023ae82eef5: Pull complete 
    e76c35f20ee7: Pull complete 
    e887524d2ef9: Pull complete 
    ccb65627e1c3: Pull complete 
    Digest: sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
    Status: Downloaded newer image for mysql:5.7
    docker.io/library/mysql:5.7
    
    

    Docker 图像可以由多个图层组成。在上面的例子中,图像由12个图层组成

    图层可以通过图像重复使用。例如,mysql:latest 和mysql:5.7共享几个图层。已经存在的图层就不再下载

    • 使用docker images查看所有镜像

    image-20210617104451770

    • Docker 使用内容寻址的图像存储,图像 ID 是一个 SHA256摘要,涵盖了图像的配置和层。

    • 在拉取完成后,Docker 打印图像的摘要。在上面的例子中,图像的摘要是:

      sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
      
    • 可以通过sha256获取镜像

    docker pull mysql@sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
    

    image-20210617104823182

    • docker pull -all-tags images # 拉取所有版本的该镜像
      

    关于更多拉取镜像的操作参考官网 https://docs.docker.com/engine/reference/commandline/pull/

    删除镜像

    • docker rmi [OPTIONS] IMAGE [IMAGE...]
      
    • 描述

      • 从主机节点移除(和取消标记)一个或多个图像。如果一个图像有多个标记,使用此命令并将标记作为参数只删除标记。如果标记是图像的唯一标记,则图像和标记都将被删除。

        这不会从注册表中删除图像。除非使用-f 选项,否则无法删除正在运行的容器的映像。要查看主机上的所有图像,请使用 docker image ls 命令。

        例如使用这个命令,请参考下面的示例部分。

    • 参数

    姓名,速记 违约 描述
    --force , -f 强制删除图像
    --no-prune 不要删除无标签
    • 操作
    [root@ansible-02 ~]# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
    mysql         5.7       2c9028880e58   5 weeks ago    447MB
    mysql         latest    c0cdc95609f1   5 weeks ago    556MB
    hello-world   latest    d1165f221234   3 months ago   13.3kB
    
    # 通过标签删除
    [root@ansible-02 ~]# docker rmi mysql:latest
    Untagged: mysql:latest
    Untagged: mysql@sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
    Deleted: sha256:c0cdc95609f1fc1daf2c7cae05ebd6adcf7b5c614b4f424949554a24012e3c09
    Deleted: sha256:137bebc5ea278e61127e13cc7312fd83874cd19e392ee87252b532f0162fbd56
    Deleted: sha256:7ed0de2ad4e43c97f58fa9e81fba73700167ef9f8a9970685059e0109749a56b
    Deleted: sha256:9375660fbff871cd29c86b8643be60e376bfc96e99a3d7e8f93d74cd61500705
    Deleted: sha256:d8a47065d005ac34d81017677330ce096eb5562eeb971e2db12b0e200fdb1cb6
    Deleted: sha256:ca13c8ad9df5d824d5a259a927eaa6c04a60f022bc2abe8fc7866cf4b2b366f4
    
    # 通过ID删除
    [root@ansible-02 ~]# docker rmi 2c9028880e58
    Untagged: mysql:5.7
    Untagged: mysql@sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
    Deleted: sha256:2c9028880e5814e8923c278d7e2059f9066d56608a21cd3f83a01e3337bacd68
    Deleted: sha256:c49c5c776f1bc87cdfff451ef39ce16a1ef45829e10203f4d9a153a6889ec15e
    Deleted: sha256:8345316eca77700e62470611446529113579712a787d356e5c8656a41c244aee
    Deleted: sha256:8ae51b87111404bd3e3bde4115ea2fe3fd2bb2cf67158460423c361a24df156b
    Deleted: sha256:9d5afda6f6dcf8dd59aef5c02099f1d3b3b0c9ae4f2bb7a61627613e8cdfe562
    Deleted: sha256:7af1865d5c19316c3dc0829a2ee2b3a744ae756f7fec9c213d3afc5f1f6ed306
    Deleted: sha256:f205c8f3c8aaa6376442b34c0c2062738461d37e0aa16ba021cd7e09c67213c2
    Deleted: sha256:d690e8a8242cf13cbe98c5b2faffdd0fc7e6c4c13425b5da31de991aa1f89a76
    Deleted: sha256:24efeee958e9f3d859fe15540e9296d5aaa6d3eb3b5f5494a2e8370608a4cfaa
    Deleted: sha256:654f2ffede3bb536fd62d04c9c7b7826e890828bec92182634e38684959b2498
    Deleted: sha256:de478a06eaa676052e665faa0b07d86a007f4b87cf82eb46a258742dc2d32260
    Deleted: sha256:02c055ef67f5904019f43a41ea5f099996d8e7633749b6e606c400526b2c4b33
    
    # 删除全部容器
    [root@ansible-02 ~]# docker rmi -f $(docker images -aq)
    Untagged: hello-world:latest
    Untagged: hello-world@sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
    Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
    #再次查看镜像
    [root@ansible-02 ~]# docker images
    REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
    
    #也可以使用图像sha256删除 删除注册表localhost:5000/test/busybox上面的busybox镜像
    docker rmi localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf
    

    容器命令

    • 下载镜像
    docker pull centos
    
    • 运行容器
    # 参数
    docker run [可选参数] image
     
    # 参数说明
    --name=“Name”   容器名字    tomcat01    tomcat02    用来区分容器
    -d      后台方式运行
    -it     使用交互方式运行,进入容器查看内容
    -p      指定容器的端口     -p 8080:8080
        -p  ip:主机端口:容器端口
        -p  主机端口:容器端口(常用)
        -p  容器端口
        容器端口
    -p      随机指定端口
     
     
    # 测试,启动并进入容器
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -it centos /bin/bash
    [root@74e82b7980e7 /]# ls   # 查看容器内的centos,基础版本,很多命令是不完善的
    bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
    dev  home  lib64  media       opt  root  sbin  sys  usr
     
    # 从容器中退回主机
    [root@77969f5dcbf9 /]# exit
    exit
    [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# ls
    bin   dev  fanfan  lib    lost+found  mnt  proc  run   srv  tmp  var
    boot  etc  home    lib64  media       opt  root  sbin  sys  usr
    
    • 列出所有正在运行的容器
    # docker ps 命令
            # 列出当前正在运行的容器
    -a      # 列出正在运行的容器包括历史容器
    -n=?    # 显示最近创建的容器
    -q      # 只显示当前容器的编号
     
    [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    77969f5dcbf9        centos              "/bin/bash"         5 minutes ago       Exited (0) 5 minutes ago                       xenodochial_bose
    74e82b7980e7        centos              "/bin/bash"         16 minutes ago      Exited (0) 6 minutes ago                       silly_cori
    a57250395804        bf756fb1ae65        "/hello"            7 hours ago         Exited (0) 7 hours ago                         elated_nash
    392d674f4f18        bf756fb1ae65        "/hello"            8 hours ago         Exited (0) 8 hours ago                         distracted_mcnulty
    571d1bc0e8e8        bf756fb1ae65        "/hello"            23 hours ago        Exited (0) 23 hours ago                        magical_burnell
     
    [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps -qa
    77969f5dcbf9
    74e82b7980e7
    a57250395804
    392d674f4f18
    571d1bc0e8e8
    
    • 退出容器
    exit            # 直接退出容器并关闭
    Ctrl + P + Q    # 容器不关闭退出
    
    #再次进入容器
    docker attach 容器id
    
    • 删除容器
    docker rm -f 容器id                       # 删除指定容器
    docker rm -f $(docker ps -aq)       # 删除所有容器
    docker ps -a -q|xargs docker rm -f  # 删除所有的容器
    
    • 启动和停止容器
    docker start 容器id           # 启动容器
    docker restart 容器id         # 重启容器
    docker stop 容器id            # 停止当前正在运行的容器
    docker kill 容器id            # 强制停止当前的容器
    

    常用的其他命令

    • 后台启动命令
    [root@ansible-02 ~]# docker run -d centos
    7ae90e5c110f83d7933d444cc8e28ce038daa18ba41965f2b476fc5909c64d0e
    
    # 使用docker ps查看  发现docker启动后自动关闭了
    [root@ansible-02 ~]# docker ps 
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    
    # 常见的坑, docker 容器使用后台运行, 就必须要有一个前台进程,docker发现没有应用,就会自动停止
    # nginx, 容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了
    
    • 查看日志
    docker logs -tf --tail number 容器id
    [root@ansible-02 ~]# docker logs -tf --tail 1 c0323115eb62
    2021-06-17T05:05:45.901449914Z [root@c0323115eb62 /]# exit  # 日志输出
    
    #自己编写一个脚本执行
    [root@ansible-02 ~]# docker run -d centos /bin/sh  -c "while true;do echo hello world;sleep 1;done"
    04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200
    
    #查看容器进程 发现已经启动
    [root@ansible-02 ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
    04046d3a81a9   centos    "/bin/sh -c 'while t…"   50 seconds ago   Up 49 seconds             kind_lichterman
    
    #查看日志信息 发现正在打印 hello world
    [root@ansible-02 ~]# docker logs -tf --tail 10 04046d3a81a9
    2021-06-17T05:15:17.936138823Z hello world
    2021-06-17T05:15:18.940434219Z hello world
    2021-06-17T05:15:19.946570935Z hello world
    2021-06-17T05:15:20.973001329Z hello world
    2021-06-17T05:15:21.991633882Z hello world
    2021-06-17T05:15:22.999685978Z hello world
    2021-06-17T05:15:24.004549161Z hello world
    2021-06-17T05:15:25.008258675Z hello world
    2021-06-17T05:15:26.047740981Z hello world
    
    
    • 查看容器中进程信息
    [root@ansible-02 ~]# docker top 04046d3a81a9
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                14872               14851               0                   22:13               ?                   00:00:00            /bin/sh -c while true;do echo hello world;sleep 1;done
    root                15355               14872               0                   22:16               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
    
    • 查看镜像的元数据
    [root@ansible-02 ~]# docker inspect 04046d3a81a9
    [
        {
            "Id": "04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200",
            "Created": "2021-06-17T05:13:12.62892884Z",
            "Path": "/bin/sh",
            "Args": [
                "-c",
                "while true;do echo hello world;sleep 1;done"
            ],
            "State": {
                "Status": "running",
                "Running": true,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": false,
                "Dead": false,
                "Pid": 14872,
                "ExitCode": 0,
                "Error": "",
                "StartedAt": "2021-06-17T05:13:13.000698631Z",
                "FinishedAt": "0001-01-01T00:00:00Z"
            },
            "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
            "ResolvConfPath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/resolv.conf",
            "HostnamePath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/hostname",
            "HostsPath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/hosts",
            "LogPath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200-json.log",
            "Name": "/kind_lichterman",
            "RestartCount": 0,
            "Driver": "overlay2",
    - - -- -- - - -- - - - -
    
    • 进入当前正在运行中的容器
    # 我们通过后台启动容器的方式运行的 需要进入容器 修改一些配置
    
    # 命令
    docker exec -it 容器id /bin/bash
    # 进入docker容器 
    [root@ansible-02 ~]# docker exec -it 04046d3a81a9 /bin/bash
    [root@04046d3a81a9 /]# 
    
    [root@04046d3a81a9 /]# ls
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    
    [root@04046d3a81a9 /]# ps -ef
    UID         PID   PPID  C STIME TTY          TIME CMD
    root          1      0  0 05:13 ?        00:00:00 /bin/sh -c while true;do echo hello world;sleep 1;done
    root        626      0  0 05:23 pts/0    00:00:00 /bin/bash
    root       1106      0  0 05:31 pts/1    00:00:00 /bin/bash
    root       1151      1  0 05:31 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
    root       1152   1106  0 05:31 pts/1    00:00:00 ps -ef
    
    
    
    # 方式二
    docker attach 容器id
     
    # docker exec       # 进入容器后开启一个新的终端,可以在里面操作
    # docker attach     # 进入容器正在执行的终端,不会启动新的进程
    
    • 拷贝文件 从容器到主机
    # 再容器上创建一个文件
    [root@04046d3a81a9 home]# touch test.java
    [root@04046d3a81a9 home]# ls
    test.java
    # 将文件拷贝到当前目录下
    [root@ansible-02 ~]# docker cp 04046d3a81a9:/home/test.java ./
    [root@ansible-02 ~]# ll
    total 12
    -rw-------. 1 root root 2769 May 31 17:16 anaconda-ks.cfg
    -rw-r--r--. 1 root root 2777 May 31 17:22 initial-setup-ks.cfg
    -rw-------. 1 root root 2049 May 31 17:16 original-ks.cfg
    -rw-r--r--  1 root root    0 Jun 16 22:36 test.java
    
    

    小结

    image-20210617160722147

    作业

    安装nginx

    # 直接下再并启动容器 
    # 这里指定本地端口为 3344 而容器中nginx的启动端口为 80 名字为nginx01
    [root@ansible-02 ~]# docker run -d --name nginx01 -p 3344:80 nginx
    Unable to find image 'nginx:latest' locally
    latest: Pulling from library/nginx
    69692152171a: Pull complete 
    30afc0b18f67: Pull complete 
    596b1d696923: Pull complete 
    febe5bd23e98: Pull complete 
    8283eee92e2f: Pull complete 
    351ad75a6cfa: Pull complete 
    Digest: sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750
    Status: Downloaded newer image for nginx:latest
    091bc111846110a9de6ce27a5071e1b757168a7610741b441dcb3b71c35f83a2
    # 查看本地镜像
    [root@ansible-02 ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    nginx        latest    d1a364dc548d   3 weeks ago    133MB
    centos       latest    300e315adb2f   6 months ago   209MB
    # 查看容器是否启动
    [root@ansible-02 ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
    091bc1118461   nginx     "/docker-entrypoint.…"   25 seconds ago   Up 24 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
    04046d3a81a9   centos    "/bin/sh -c 'while t…"   36 minutes ago   Up 36 minutes                                           kind_lichterman
    
    • 打开浏览器访问 3344端口

    image-20210617161408726

    • 进入容器内部 查看nginx安装位置
    root@091bc1118461:/# whereis nginx
    nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
    root@091bc1118461:/# cd /etc/nginx/
    root@091bc1118461:/etc/nginx# ls
    conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params
    
    • 域名映射关系图
    image-20210617161740740

    安装Tomcat

    • 下载镜像并启动容器
    # --rm 参数指 关闭容器后删除容器 
    [root@ansible-02 ~]# docker run -it --rm -p 8888:8080 tomcat:9.0
    
    # 进入tomcat容器中
    [root@ansible-02 ~]# docker ps
    CONTAINER ID   IMAGE        COMMAND                  CREATED             STATUS             PORTS                                       NAMES
    4248714095fd   tomcat:9.0   "catalina.sh run"        2 minutes ago       Up 2 minutes       0.0.0.0:8888->8080/tcp, :::8888->8080/tcp   upbeat_austin
    091bc1118461   nginx        "/docker-entrypoint.…"   25 minutes ago      Up 25 minutes      0.0.0.0:3344->80/tcp, :::3344->80/tcp       nginx01
    04046d3a81a9   centos       "/bin/sh -c 'while t…"   About an hour ago   Up About an hour                      kind_lichterman
    
    # 进入容器中
    [root@ansible-02 ~]# docker exec -it 4248714095fd  /bin/bash
    
    # 查看安装目录
    root@4248714095fd:/usr/local/tomcat# ls
    BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
    root@4248714095fd:/usr/local/tomcat# cd webapps
    root@4248714095fd:/usr/local/tomcat/webapps# ls
    
    # 发现问题:1.linux命令少了, 2. webapps下内容为空,阿里云净吸纳过默认是最小的镜像,所有不必要的都剔除了,保证最小可运行环境即可
    # webapps的原始内容其实是在webapps.dist中 然后将webapps.dist复制到webapps就可以了
    root@4248714095fd:/usr/local/tomcat# cd webapps
    root@4248714095fd:/usr/local/tomcat/webapps# ls
    ROOT  docs  examples  host-manager  manager
    
    • 访问页面

    image-20210617164336129

    安装es+Kibana

    • 安装es
    # es 暴露的端口很多
    # es 十分的耗内存
    # es 的数据一般需要放置到安全目录! 挂载
    # --net somenetwork 网络配置
    
    docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
    
    
    
    # 测试
    [root@ansible-02 ~]# curl localhost:9200
    {
      "name" : "8cba692312bd",
      "cluster_name" : "docker-cluster",
      "cluster_uuid" : "L2XkftBhR9u0wKVmOmgVZQ",
      "version" : {
        "number" : "7.6.2",
        "build_flavor" : "default",
        "build_type" : "docker",
        "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
        "build_date" : "2020-03-26T06:34:37.794943Z",
        "build_snapshot" : false,
        "lucene_version" : "8.4.0",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    
    # 限制大小 
    docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
    
    • 监视状态
    dockter stats
    

    image-20210617185538107

    • 更改内存后重新查看 cpu性能

    image-20210617185752848

    可视化工具

    • portainer(先用这个)
    docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    
    
    
    • 访问浏览器 8088端口

    image-20210617200715638

    Docker镜像讲解

    镜像是什么

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

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

    Docker镜像加载原理

    UnionFS(联合文件系统)

    下载的时候看到的一层层就是这个。
    UnionFS(联合文件系统)∶Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into asinglevirtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
    特性∶一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

    Docker镜像加载原理

    docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

    • bootfs(boot ilesystem)主要包含bootloader和kerne,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由botfs转交给内核,此时系统也会卸载bootfs。[个人理解:bootfs用于开机,rootfs用于命令。]
    • rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/de,/proc,/bin,/etc等标准目录和文件。roots就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

    image-20210618153634859

    为什么虚拟机很大,Docker很小?
    对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
    虚拟机是分钟级别,容器是秒级!

    分层理解

    理解:
    所有的Docker┌镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
    举一个简单的例子,假如基于UbuntuLinux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
    该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)

    image-20210618165721991

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

    image-20210618165748388

    上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
    下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本。

    image-20210618165807557

    这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
    Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
    Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
    Docker在Windows上仅支持windowsfiter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW【1】.
    下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

    image-20210618165908909

    举例

    • 这里我们拉取一个redis镜像
    [root@localhost ~]# docker pull redis
    Using default tag: latest
    latest: Pulling from library/redis
    69692152171a: Pull complete 
    a4a46f2fd7e0: Pull complete 
    bcdf6fddc3bd: Pull complete 
    2902e41faefa: Pull complete 
    df3e1d63cdb1: Pull complete 
    fa57f005a60d: Pull complete 
    Digest: sha256:7e2c6181ad5c425443b56c7c73a9cd6df24a122345847d1ea9bb86a5afc76325
    Status: Downloaded newer image for redis:latest
    docker.io/library/redis:latest
    # 可以看出他是分6层进行下载
    
    • 我们看一下该镜像的详细信息
     [root@localhost ~]# docker inspect redis
     "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:02c055ef67f5904019f43a41ea5f099996d8e7633749b6e606c400526b2c4b33",
                    "sha256:ec5652c3523d96657d66169c0eb71b572ff065711c705a15ec02f60a21c212c3",
                    "sha256:76d3e24d63f60e6a73af70be15959eb4021dd7a5a09da6925037d3b4a1673fca",
                    "sha256:f06719b0aa43029f32c821c8f14f9f5941a8be6d3b61dcd9f3f884b39e9a4f23",
                    "sha256:b896f490f2edc62cc9d190465bbeab871619590d1e9beeffb92e4ca9cc08116d",
                    "sha256:e3f4077f577bf07c0940d6345ddd17014ff824d3f4f7f3effc9a8c4dae3e527b"
                ]
            },
    # 可以看到他是分6层进行下载
    

    特点

    • Docker镜像都是只读的 当启动容器的时候在该镜像上创建一层(容器),所有的操作都是在容器中进行的

    image-20210618155526186

    • 总结

    image-20210618155838651

    Commit镜像

    docker commit 提交容器成为一个新的副本
    
    # 命令和git原理类似
    docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
    

    实例

    # 首先从网上pull一个tomcat 并运行
    [root@localhost ~]# docker run -it -p 8080:80 tomcat /bin/bash
    
    root@c212dc8abb8b:/usr/local/tomcat# cp -r webapps.dist/* webapps/
    root@c212dc8abb8b:/usr/local/tomcat# cd webapps
    root@c212dc8abb8b:/usr/local/tomcat/webapps# ls
    ROOT  docs  examples  host-manager  manager
    
    # 然后将当前已将创建好的镜像重新发布
    [root@localhost ~]# docker commit -a="the" -m="add webapps" tomcat01 tomcat02:1.0
    sha256:839df4265ee7f101b3dce48d332aa7adb7ef45e4c0923b9cdd08a0228face070
    # 查看镜像 发布成功
    [root@localhost ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    tomcat02     1.0       839df4265ee7   14 seconds ago   672MB
    tomcat       latest    5505f7218e4d   28 hours ago     667MB
    redis        latest    fad0ee7e917a   2 weeks ago      105MB
    
    

    容器数据卷

    什么是容器数据卷

    Docker的理念回顾

    将应用和服务打包成一个镜像

    如果数据都在容器中,如果我们删除容器,数据就会永久丢失, 需求:数据持节化

    Mysql,容器删了,删库跑路! 需求: 将数据持节化到本地

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

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

    image-20210618162243127

    总结: 卷技术可以实现容器和本地Linux之间数据的同步化,也可以实现容器之间的数据同步。数据共享

    实例

    # 下载并启动centos 并-v启动卷同步
    [root@localhost ~]# docker run -it --name centos01 -v /home/test:/home centos
    
    # 查看容器信息
    [root@localhost home]# docker inspect de62d0531ee2
      "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/home/test", # 主机linux挂在目录
                    "Destination": "/home", # 容器同步目录
                    "Mode": "",
                    "RW": true,
                    "Propagation": "rprivate"
                }
            ],
    
    
    • 测试创建一个新文件 是一个双向的过程

    image-20210618195014535

    实战

    安装mysql

    # 运行容器,需要做数据挂载,安装启动mysql,需要配置密码
    # 官方测试:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
    
    -d	后台运行
    -p	端口映射
    -v	卷挂载
    -e	环境配置
    --name	容器名称
    
    # 安装启动mysql 并设置密码 
    docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/mysql.cnf -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
    

    image-20210618201955023

    • 测试 创建一个新的数据库 test

    image-20210618202044010

    具名和匿名

    # 匿名挂载
    -v 容器内路径
    docker run -d -P --name nginx01 -v /etc/nginx nginx     # -P 随机指定端口
    
    
    # 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径,也没有指定名!
    
    [root@localhost ~]# docker volume ls
    DRIVER    VOLUME NAME
    local     c1280dd0e57a792d0c74d01c46edea18e92d46415a2d49c026f6fe5efce4808e
    
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
    efb31bfdfc07   nginx       "/docker-entrypoint.…"   42 seconds ago   Up 40 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp                nginx01
    0758f4a25cee   mysql:5.7   "docker-entrypoint.s…"   41 hours ago     Up 41 hours     33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql02
    de62d0531ee2   centos      "/bin/bash"              44 hours ago     Up 44 hours                                                            centos01
    
    # 使用具名的方式创建
    [root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
    f7422866990f04b21635e627e7fdf97781a451a5dfeae43db3ee15c775b679fd
    [root@localhost ~]# docker volume ls
    DRIVER    VOLUME NAME
    local     c1280dd0e57a792d0c74d01c46edea18e92d46415a2d49c026f6fe5efce4808e
    local     juming-nginx
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
    f7422866990f   nginx       "/docker-entrypoint.…"   9 seconds ago   Up 8 seconds   0.0.0.0:49154->80/tcp, :::49154->80/tcp                nginx02
    efb31bfdfc07   nginx       "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   0.0.0.0:49153->80/tcp, :::49153->80/tcp                nginx01
    0758f4a25cee   mysql:5.7   "docker-entrypoint.s…"   41 hours ago    Up 41 hours    33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql02
    de62d0531ee2   centos      "/bin/bash"              44 hours ago    Up 44 hours                                                           centos01
    
    
    • 查看一下这个卷

    image-20210620092339653

    • 查看目录
    [root@localhost _data]# ls
    conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
    

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

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

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

    拓展

    # 通过 -v 容器内容路径 ro rw 改变读写权限
    ro  readonly    # 只读
    rw  readwrite   # 可读可写
     
    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
     
    # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作
    

    初实DockerFile

    DockerFIle就是用来构建与Docker镜像之间同步文件的!命令脚本

    通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!

    # 创建一个dockerfile文件, 名字可以随机
    # 文件的内容 指定(大写) 参数
     
    FROM centos
     
    VOLUME ["/volume01", "/volume02"]
     
    CMD echo "----end----"
    CMD /bin/bash
     
    # 这里的每一个命令都是镜像的一层!
    
    • 构建自己的镜像

    image-20210620093336493

    • 查看镜像

    image-20210620093313209

    • 启动自己的镜像
    [root@localhost test]# docker run -it test/centos:1.4 /bin/bash
    
    • 检查下目录

    image-20210620101641201

    • 这个卷一定在本机有一个对应的目录
      • 查看卷挂载目录 docker inspect 容器id

    image-20210620102418226

    测试一下刚才的文件是否同步到主机上了!

    这种方式我们未来使用的十分多, 因为我们通常会构建自己的镜像!

    假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

    数据卷容器

    • 创建docker01并查看
    docker run -it --name docker01 test/centos:1.4 /bin/bash
    

    image-20210620104532931

    • 创建docker02并指定数据卷来自docker01

      • docker run -it --name docker02  --volumes-from docker01   test/centos:1.4 /bin/bash
        
      • 查看目录

    image-20210620104334133

    • 现在在一中创建一个文件testdocker02中查看 发现存在

    image-20210620104649329

    多个mysql同步

    image-20210620104749767

    多个mysql同步的原理是和上面的相同的

    [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
     
    [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
    

    结论

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

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

    DockerFile

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

    构建步骤

    1. 编写一个dockerFile文件

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

    1. docker run 运行镜像

    2. docker push 发布镜像(DockerHub、阿里云镜像)

    DockerFile的构建过程

    基础知识:

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

    image-20210620152217497

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

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

    步骤:开发,部署, 运维..... 缺一不可!

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

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

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

    DockerFile指令说明

    image-20210620152247024

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

    创建自己的镜像

    [root@localhost dockerfile-test]# cat dockerfile-centos 
    FROM centos
    # 填写作者名 和 邮箱
    MAINTAINER zgrey<1234544@qq.com> 
     
    ENV MYPATH /usr/local
    # 镜像的工作目录
    WORKDIR $MYPATH    
    # 安装vim 
    RUN yum -y install vim
    # 安装 ifconfig
    RUN yum -y install net-tools  
     # 暴露80端口 
    EXPOSE 80 
     
    CMD echo $MYPATH 
    CMD echo "---end---"
    CMD /bin/bash
    
    
    # 安装dockerfile
    [root@localhost dockerfile-test]# docker build -f dockerfile-centos -t mycentos:1.0 .
    
    Successfully built 36f2bc353613
    Successfully tagged mycentos:1.0
    

    image-20210620150945890

    • 启动容器并查看
    [root@localhost dockerfile-test]# docker run --name mycentos01  -it mycentos:1.0 /bin/bash
    [root@0db7ed0f20ee local]# pwd
    /usr/local                      # 镜像开启默认在工作目录
    
    • 可以使用ifconfig

    image-20210620151810704

    • 可以使用vim

    image-20210620151841253

    • 查看本地运行的变更历史
    [root@localhost test]# docker history mycentos:1.0 
    IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
    ee5e440eee89   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
    8bb709dc586a   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
    2d21b0150f3e   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
    73219a337451   3 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
    0dafd1e7d6ae   3 minutes ago   /bin/sh -c yum -y install net-tools             25MB      
    477a50205a00   3 minutes ago   /bin/sh -c yum -y install vim                   60.7MB    
    a07bb528fbb3   4 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
    a921a2bc7168   4 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
    b3dc1e4e20d9   4 minutes ago   /bin/sh -c #(nop)  MAINTAINER zgrey<1234544@…   0B        
    300e315adb2f   6 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
    <missing>      6 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
    <missing>      6 months ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB   
    

    CMD 和ENTRYPOINT区别

    CMD         # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
    ENTRYPOINT      # 指定这个容器启动的时候要运行的命令, 可以追加命令
    
    • 测试CMD
    # 1. 编写dockerfile文件
    [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-cmd-test 
    FROM centos
    CMD ["ls", "-a"]
     
    # 2. 构建镜像
    [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
     
    # 3. run运行, 发现我们的ls -a 命令生效
    [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125
    .
    ..
    .dockerenv
    bin
    dev
    etc
    home
    lib
    lib64
     
    # 想追加一个命令 -l 变成 ls -al
    [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 -l
    docker: 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.
    [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 ls -l
     
    # cmd的情况下 -l替换了CMD["ls", "-a"]命令, -l不是命令,所以报错了
    
    • 测试ENTRYPOINT
    # 1. 编写dockerfile文件
    [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-entrypoint-test 
    FROM centos
    ENTRYPOINT ["ls", "-a"]
     
    # 2. 构建文件
    [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint-test .
     
    # 3. run运行 发现我们的ls -a 命令同样生效
    [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test
    .
    ..
    .dockerenv
    bin
    dev
    etc
    home
    lib
     
    # 4. 我们的追加命令, 是直接拼接到ENTRYPOINT命令的后面的!
    [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test -l
    total 56
    drwxr-xr-x  1 root root 4096 Aug 13 07:52 .
    drwxr-xr-x  1 root root 4096 Aug 13 07:52 ..
    -rwxr-xr-x  1 root root    0 Aug 13 07:52 .dockerenv
    lrwxrwxrwx  1 root root    7 May 11  2019 bin -> usr/bin
    drwxr-xr-x  5 root root  340 Aug 13 07:52 dev
    drwxr-xr-x  1 root root 4096 Aug 13 07:52 etc
    drwxr-xr-x  2 root root 4096 May 11  2019 home
    lrwxrwxrwx  1 root root    7 May 11  2019 lib -> usr/lib
    lrwxrwxrwx  1 root root    9 May 11  2019 lib64 -> usr/lib64
    drwx------  2 root root 4096 Aug  9 21:40 lost+found
     
    

    Docker制作Tomcat镜像

    • 编辑配置文件
    [root@localhost myTomcat]# cat Dockerfile 
    FROM centos
    
    MAINTAINER zgrey<123123@qq.com>
    
    ADD apache-tomcat-7.0.75.tar.gz /usr/local/
    ADD jdk-8u121-linux-x64.tar.gz /usr/local/
    
    RUN yum -y install vim 
    RUN yum -y install net-tools
    
    ENV MYPATH  /usr/local
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_121
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_73
    #ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    #ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
    #ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
    #ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    ENV PATH   $PATH:$JAVA_HOME/bin
    
    EXPOSE 8080
    
    CMD /usr/local/apache-tomcat-7.0.75/bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.75/bin/logs/catalina.out
    
    
    • 构建镜像
    [root@localhost myTomcat]# docker build -t mytomcat:1.0 .
    
    • 启动容器
    docker run -it -p 3344:8080 --name mytomcat -v /home/myTomcat/test:/usr/local/apache-tomcat-7.0.75/webapps/test -v /home/myTomcat/logs:/usr/local/apache-tomcat-7.0.75/logs mytomcat:1.0 /bin/bash
    
    # 查看目录
    [root@148f76894978 local]# ls
    apache-tomcat-7.0.75  bin  etc	games  include	jdk1.8.0_121  lib  lib64  libexec  sbin  share	src
    
    
    • 在主机中进入日志文件中查看

    image-20210620165153001

    • 由于我们将webapps目录同步到了本地所以直接在本地test目录中发布就可以

    发布到DockerHub

    • 登录DockerHub
    [root@localhost test]# docker login -u uikka 
    Password: 
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    
    
    • 发布到远程
    [root@localhost test]# docker push mytomcat:1.0 
    The push refers to repository [docker.io/library/mytomcat]
    9376e126d001: Preparing 
    e778d6435992: Preparing 
    e09ab34b1e6e: Preparing 
    ed8ab35cfeb4: Preparing 
    2653d992f4ef: Preparing 
    denied: requested access to the resource is denied # 拒绝
    
    # 解决  更改一下tag
    [root@localhost test]# docker tag a041614d7458 uikka/mytomcat:1.0
    [root@localhost test]# docker images
    REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
    mytomcat         1.0       a041614d7458   20 minutes ago   679MB
    uikka/mytomcat   1.0       a041614d7458   20 minutes ago   679MB
    mycentos         1.0       ee5e440eee89   2 hours ago      295MB
    test/centos      1.4       200025508191   5 hours ago      209MB
    test/centos      1.0       4cfac7a8a5b6   5 hours ago      209MB
    test/centos      1.2       4cfac7a8a5b6   5 hours ago      209MB
    test/centos      1.3       4cfac7a8a5b6   5 hours ago      209MB
    tomcat02         1.0       839df4265ee7   2 days ago       672MB
    tomcat           latest    5505f7218e4d   3 days ago       667MB
    redis            latest    fad0ee7e917a   2 weeks ago      105MB
    nginx            latest    d1a364dc548d   3 weeks ago      133MB
    mysql            5.7       2c9028880e58   5 weeks ago      447MB
    centos           latest    300e315adb2f   6 months ago     209MB
    
    [root@localhost test]# docker push uikka/mytomcat:1.0
    The push refers to repository [docker.io/uikka/mytomcat]
    9376e126d001: Pushing [===>                                               ]  1.574MB/24.97MB
    e778d6435992: Pushing [=>                                                 ]  2.221MB/60.68MB
    e09ab34b1e6e: Pushing [>                                                  ]  1.598MB/370.1MB
    ed8ab35cfeb4: Pushing [==========>                                        ]   2.83MB/13.71MB
    2653d992f4ef: Pushing [=>                                                 ]  5.471MB/209.3MB
    # 提交的话也是分层来的
    #成功!!!
    

    发布到阿里云镜像服务

    • 登录阿里云 创建一个个人实例

    image-20210620170824059

    • 创建一个命名空间

    image-20210620170948605

    image-20210620171029960

    • 创建一个本地私有仓库

    image-20210620171154427

    • 登录阿里云
    [root@localhost test]# docker login --username=jh0125*** registry.cn-shenzhen.aliyuncs.com
    Password: 
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    
    
    • 从Registry中拉取镜像
    $ docker pull registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:[镜像版本号]
    
    • 推送镜像
    $ docker login --username=jh0125**** registry.cn-shenzhen.aliyuncs.com
    $ docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:[镜像版本号]
    $ docker push registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:[镜像版本号]
    

    测试

    [root@localhost test]#  docker tag a041614d7458  registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:1.0
    [root@localhost test]# docker push registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:1.0
    The push refers to repository [registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey]
    9376e126d001: Pushed 
    e778d6435992: Pushed 
    e09ab34b1e6e: Pushed 
    ed8ab35cfeb4: Pushed 
    2653d992f4ef: Pushed 
    1.0: digest: sha256:f892298ad851cb1234b56a61e2a6fa6b7d7491e47618f3db798b9e3b51431fc9 size: 1377
    
    

    image-20210620172534787

    image-20210620172545885

    小结

    image-20210620174738636

    网络

    https://blog.csdn.net/qq_21197507/article/details/115071715

  • 相关阅读:
    python 操作mysql
    python多线程
    python socket 网络编程
    nginx源码编译安装
    CentOS网卡配置文件
    使用本地yum源
    ping github 请求超时
    ping github 请求超时
    设计模式-装饰器模式
    设计模式-装饰器模式
  • 原文地址:https://www.cnblogs.com/zgrey/p/15406936.html
Copyright © 2011-2022 走看看