• Docker使用教程笔记


    Docker

    Docker出现的原因

    环境配置十分的麻烦,每一个机器都要部署环境(eg:集群Redis Es Hadoop) 是非常的麻烦

    为了解决上述的麻烦, 在项目jar包中 将环境也配置在jar包中,进行打包–>简称:镜像,我们将镜像放在 Docker仓库中 (好比是一个商店),我们运行项目直接在商店下载—直接运行即可!

    Docker的思想来源于集装箱

    在这里插入图片描述

    就是打包装箱,每个箱子都是互相隔离的

    Docker和虚拟机的对比

    虚拟机的缺点:

    • 资源占用十分多

    • 沉余步骤多

    • 启动慢

      如下是虚拟就的图,每一个app启动都需要调用Lib ,启动慢

      在这里插入图片描述

    容器化技术

    容器化技术不是你的一个完整的操纵系统

    每一个app + lib 就是一个容器,而且每个箱子都是隔离

    每一个容器直接操纵在系统上充分的利用系统资源

    在这里插入图片描述

    Docker和 虚拟机的不同

    • 传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
    • 容器内的应用直接运行在 宿主机的内容 容器没有自己的内核,也没有虚拟我们的硬件,所以就轻便了
    • 每个容器间是互相隔离的,每个容器内都有一个属于自己的文件系统,互补影响

    Docker的基本组成

    **镜像(image):**docker镜像 就好比有一个模板,可以通过这模板来创建容器服务,比如说我们有个 tomcat镜像 -->(将他运行起来) run----> 就变成了 tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行or 项目运行就是在容器中的)

    容器(container): Docker利用容器技术,独立运行一个 或者 一组应用,通过镜像来创建

    他有 启动 停止 删除 等基本命令

    可以把他看成一个简单的linux的系统

    仓库(repository): 仓库就是存放镜像的地方 仓库分为 公有仓库和私有仓库

    ​ Docker hub (默认是国外的)

    Docker安装

    https://blog.csdn.net/u014644574/article/details/112494541?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165767551216782248536919%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165767551216782248536919&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-112494541-null-null.142v32experiment_2_v1,185v2control&utm_term=centos7&spm=1018.2226.3001.4187

    安装命令

    #1.安装所需的软件包
    yum install -y yum-utils
    
    #2.设置镜像的仓库。   -----阿里云的镜像库
    yum-config-manager \
        --add-repo \
        http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      
    #3.更新yum软件包索引
    yum makecache fast
     
    #4.安装docker的引擎   docker-ce---> 社区版  ee是企业版
    yum install docker-ce docker-ce-cli containerd.io
    
    #5. 启动docker
    systemctl start docker
    
    #6. 查看docker版本号
    systemctl start docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    测试

    在这里插入图片描述
    )]

    查看镜像

    docker images
    
    • 1

    阿里云镜像加速器

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://zto7rr04.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Docker run 的运行流程图

    在这里插入图片描述

    底层原理

    Docker是怎么工作的?

    Docker 是一个Client-Server 结构的系统,Docker的守护进程(Docker daemon)运行在主机上,通过Socket从客户端访问
    Docker-Server 接收到 Docker-Client 的指令,就会执行这个命令

    在这里插入图片描述

    Docker 为什么比虚拟机快?

    Docker 有着比虚拟机更少的抽象层
    Docker 利用的是宿主机的内核,VM 需要的是Guest OS(需要再搭建一个系统环境)

    在这里插入图片描述

    因此,新建一个容器的时候,Docker 不需要像虚拟机那样重新加载一个操作系统的内核,避免一些引导性的操作,虚拟机是加载 Guest OS,是分钟级别的Docker 是利用宿主机的操作系统,省略了这个复杂的过程,所以是秒级的启动

    Docker常用命令

    docker version
    docker info  # docker系统信息
    
    https://docs.docker.com/engine/reference/run/  #docker官网 地址 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    镜像命令

    docker images 查看所有本地主机上的镜像

    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              bf756fb1ae65        7 months ago        13.3kB
     
    # 解释
    REPOSITORY      # 镜像的仓库
    TAG             # 镜像的标签
    IMAGE ID        # 镜像的ID
    CREATED         # 镜像的创建时间
    SIZE            # 镜像的大小
     
    # 可选项
    --all , -a      # 列出所有镜像
    --quiet , -q    # 只显示镜像的id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    docker search 查找镜像

    NAME                              DESCRIPTION                                     STARS               OFFICIAL         AUTOMATED
    mysql                             MySQL is a widely used, open-source relation…   9822                [OK]                
    mariadb                           MariaDB is a community-developed fork of MyS…   3586                [OK]                
    mysql/mysql-server                Optimized MySQL Server Docker images. Create…   719                                     [OK]
     
    # 可选项
    --filter=STARS=3000     # 搜素出来的镜像就是STARS大于3000的
     
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker search mysql --filter=STARS=3000
    NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    mysql               MySQL is a widely used, open-source relation…   9822                [OK]                
    mariadb             MariaDB is a community-developed fork of MyS…   3586                [OK]     
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    docker pull 下拉镜像

    # 下载镜像,docker pull 镜像名[:tag]
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker pull mysql
    Using default tag: latest           # 如果不写tag,默认就是latest
    latest: Pulling from library/mysql
    bf5952930446: Pull complete         # 分层下载,dockerimages的核心,联合文件系统
    8254623a9871: Pull complete 
    938e3e06dac4: Pull complete 
    ea28ebf28884: Pull complete 
    f3cef38785c2: Pull complete 
    894f9792565a: Pull complete 
    1d8a57523420: Pull complete 
    6c676912929f: Pull complete 
    ff39fdb566b4: Pull complete 
    fff872988aba: Pull complete 
    4d34e365ae68: Pull complete 
    7886ee20621e: Pull complete 
    Digest: sha256:c358e72e100ab493a0304bda35e6f239db2ec8c9bb836d8a427ac34307d074ed     # 签名
    Status: Downloaded newer image for mysql:latest
    docker.io/library/mysql:latest      # 真实地址
     
    # 等价于
    docker pull mysql
    docker pull docker.io/library/mysql:latest
     
    # 指定版本下载
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker pull mysql:5.7
    5.7: Pulling from library/mysql
    bf5952930446: Already exists 
    8254623a9871: Already exists 
    938e3e06dac4: Already exists 
    ea28ebf28884: Already exists 
    f3cef38785c2: Already exists 
    894f9792565a: Already exists 
    1d8a57523420: Already exists 
    5f09bf1d31c1: Pull complete 
    1b6ff254abe7: Pull complete 
    74310a0bf42d: Pull complete 
    d398726627fd: Pull complete 
    Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
    Status: Downloaded newer image for mysql:5.7
    docker.io/library/mysql:5.7
     
    # 查看本地镜像
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mysql               5.7                 718a6da099d8        6 days ago          448MB
    mysql               latest              0d64f46acfd1        6 days ago          544MB
    hello-world         latest              bf756fb1ae65        7 months ago        13.3kB
    
    • 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

    docker rmi 删除镜像

    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f IMAGE ID                        # 删除指定镜像
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f IMAGE ID1 IMAGE ID2 IMAGE ID3   # 删除多个镜像
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]#  docker rmi -f $(docker images -aq)           # 删除所有镜像
    
    • 1
    • 2
    • 3

    容器命令

    **新建容器并启动 **

    推出的话直接 exit

    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
    
    • 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

    列出所有的运行的容器

    # docker ps 命令列出当前正在运行的容器
    -a      # 列出正在运行的容器包括历史容器
    -n=?    # 显示最近创建的容器
    -q      # 只显示当前容器的编号
     
    [root@centos01 ~]#  docker ps
    CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
    d698397d8c02   centos    "/bin/bash"   25 seconds ago       Up 24 seconds                 angry_tesla
    0c36bf3210c0   centos    "/bin/bash"   About a minute ago   Up About a minute             zealous_bohr
    11660c546d93   centos    "/bin/bash"   17 hours ago         Up 17 hours                   relaxed_mirzakhani
    fa106b942c56   centos    "/bin/bash"   18 hours ago         Up 18 hours                   pensive_nobel
    
    [root@centos01 ~]# docker ps -qa
    d698397d8c02
    0c36bf3210c0
    01a6c96eafb1
    11660c546d93
    fa106b942c56
    f5a7173e0c09
    93ac52e6f2ca
    528f3dc27cc0
    d1fcb7d7cdc7
    966d18cf3158
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    退出容器

    exit            # 直接退出容器并关闭
    Ctrl + P + Q    # 容器不关闭退出
    
    • 1
    • 2

    删除容器

    docker rm -f 容器id                       # 删除指定容器
    docker rm -f $(docker ps -aq)       # 删除所有容器
    docker ps -a -q|xargs docker rm -f  # 删除所有的容器
    
    • 1
    • 2
    • 3

    启动和停止容器的操作

    docker start 容器id           # 启动容器
    docker restart 容器id         # 重启容器
    docker stop 容器id            # 停止当前正在运行的容器
    docker kill 容器id            # 强制停止当前的容器
    
    • 1
    • 2
    • 3
    • 4

    常用其他命令

    查看日志

    docker logs -tf --tail number 容器id
    
    # 显示日志
    -tf                 # 显示日志
    --tail number       # 显示日志条数
    [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 10 a0d580a21251
     
    [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 1 8d1621e09bff
    2020-08-11T10:53:15.987702897Z [root@8d1621e09bff /]# exit      # 日志输出
     
    # 自己编写一段shell脚本
    [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker run -d centos /bin/sh -c "while true;do echo xiaofan;sleep 1;done"
    a0d580a21251da97bc050763cf2d5692a455c228fa2a711c3609872008e654c2
     
    [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    a0d580a21251        centos              "/bin/sh -c 'while t…"   3 seconds ago       Up 1 second                             lucid_black
     
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    查看容器中进程信息ps

    # 命令 docker top 容器id
    [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker top df358bc06b17
    UID                 PID                 PPID                C                   STIME               TTY     
    root                28498               28482               0                   19:38               ?      
    
    • 1
    • 2
    • 3
    • 4

    查看镜像的元数据 inspect

    # 命令
    docker inspect 容器id
    
    • 1
    • 2

    进入当前正在运行的容器

    # 我们通常容器使用后台方式运行的, 需要进入容器,修改一些配置
     
    # 命令
    docker exec -it 容器id /bin/bash
     
    # 测试
    [root@centos01 ~]# docker exec -it d698397d8c02 /bin/bash
    [root@d698397d8c02 /]# ps -ef
    UID         PID   PPID  C STIME TTY          TIME CMD
    root          1      0  0 01:20 pts/0    00:00:00 /bin/bash
    root         15      0  0 01:27 pts/1    00:00:00 /bin/bash
    root         29     15  0 01:27 pts/1    00:00:00 ps -ef
    [root@d698397d8c02 /]# 
    
     
    # 方式二
    docker attach 容器id
     
    # docker exec       # 进入容器后开启一个新的终端,可以在里面操作
    # docker attach     # 进入容器正在执行的终端,不会启动新的进程
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    从容器中拷贝文件到主机

    docker cp 容器id:容器内路径    目的地主机路径
     
    [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker cp 7af535f807e0:/home/Test.java /home
    
    • 1
    • 2
    • 3

    问题

    • 在 docker run -d centos 发现docker ps, 发现centos停止了

      • 原因是:docker 容器使用后台运行, 就必须要有一个前台进程,docker发现没有应用,就会自动停止centos , 容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了
      • 解决方式 需要通过 -it 的启动
    • 在tomcat中 下载好镜像 是缩减版的 所以它的 webapps 里面是空的 在外部访问 会直接 404

      • 解决方式 : 通过 ls 命令 查询到 webapps.dist , 把 webapps.dist 文件夹里的内容复制到 webapp中 就可以启动
      • ​ *cp -r webapps.dist/ webapps ** (-r 的意思是:递归处理,将指定目录下的文件与子目录一并处理。)
    • 想要删除之前 --name 的名字 需要通过 需要通过 docker ps -a 的命令 才能查询到 --name 的字段, 查看到id后,docker rm -f id名

      • 在下面kibana 中由于run 好几个 而且每个 --name 都不一样 ,在 docker ps 没有查询到, 需要通过 docker ps -a 的命令 才能查询到 --name 的字段
    • es + kibana 启动时,先启动es 在启动kibana 在es启动时 --name 一定要牢记,后面kibana --link (链接是 需要es的 --name )

      • 解决方式:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SoWb8tUO-1659508930665)在这里插入图片描述

    Docker部署

    Docker部署Nginx

    第一步先搜索 nignx (seacher)

    [root@centos01 ~]# docker search nginx
    NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    nginx                                             Official build of Nginx.                        17090     [OK]       
    linuxserver/nginx                                 An Nginx container, brought to you by LinuxS…   169                  
    bitnami/nginx                                     Bitnami nginx Docker Image                      136                  [OK]
    ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   52                   
    bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   19                   [OK]
    rancher/nginx-ingress-controller                                                                  10                   
    ibmcom/nginx-ingress-controller                   Docker Image for IBM Cloud Private-CE (Commu…   4                    
    bitnami/nginx-ldap-auth-daemon                                                                    3                    
    rancher/nginx                                                                                     2                    
    circleci/nginx                                    This image is for internal use                  2                    
    bitnami/nginx-exporter                                                                            2                    
    rancher/nginx-ingress-controller-defaultbackend                                                   2                    
    vmware/nginx                                                                                      2                    
    rapidfort/nginx                                   RapidFort optimized, hardened image for NGINX   2                    
    vmware/nginx-photon                                                                               1                    
    bitnami/nginx-intel                                                                               1                    
    kasmweb/nginx                                     An Nginx image based off nginx:alpine and in…   1                    
    wallarm/nginx-ingress-controller                  Kubernetes Ingress Controller with Wallarm e…   1                    
    rancher/nginx-ssl                                                                                 0                    
    rancher/nginx-conf                                                                                0                    
    continuumio/nginx-ingress-ws                                                                      0                    
    rancher/nginx-ingress-controller-amd64                                                            0                    
    ibmcom/nginx-ingress-controller-ppc64le           Docker Image for IBM Cloud Private-CE (Commu…   0                    
    ibmcom/nginx-ppc64le                              Docker image for nginx-ppc64le                  0                    
    rancher/nginx-proxy                                                                               0                    
    [root@centos01 ~]# 
    
    
    • 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

    第二步:下载镜像 pull

    [root@centos01 ~]# docker pull nginx
    Using default tag: latest
    latest: Pulling from library/nginx
    a2abf6c4d29d: Pull complete 
    a9edb18cadd1: Pull complete 
    589b7251471a: Pull complete 
    186b1aaa4aa6: Pull complete 
    b4df32aa5a72: Pull complete 
    a0bcbecc962e: Pull complete 
    Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
    Status: Downloaded newer image for nginx:latest
    docker.io/library/nginx:latest
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    第三步:查询镜像 是否下载下来

    docker images
    
    • 1

    第四步: 启动 (我这边想挂在后台 所以用 -d, 并命名 --name,在给端口好 -p 3344:80)

    -p 宿主机端口(外部访问):容器内部端口

    # docker run -d --name nginx01 -p 3344:80 nginx
    d2f3d9b925fc076365a564b4bf2b1499ff318b9f8c18605f709dbec920a4853d
    [root@centos01 ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
    d2f3d9b925fc   nginx     "/docker-entrypoint.…"   9 seconds ago   Up 6 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
    d698397d8c02   centos    "/bin/bash"              2 hours ago     Up 2 hours                                             angry_tesla
    0c36bf3210c0   centos    "/bin/bash"              2 hours ago     Up 2 hours                                             zealous_bohr
    11660c546d93   centos    "/bin/bash"              19 hours ago    Up 19 hours                                            relaxed_mirzakhani
    fa106b942c56   centos    "/bin/bash"              20 hours ago    Up 20 hours                                            pensive_nobel
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    第五步:测试 先在本机测试 (发送请求 curl (后面跟端口号 是上面3344) )

    [root@centos01 ~]# curl localhost:3344
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    第六步: 进入容器

    [root@centos01 ~]# docker exec -it nginx01 /bin/bash
    root@d2f3d9b925fc:/# whereis nginx
    nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
    
    root@d2f3d9b925fc:/# cd /etc/nginx
    
    root@d2f3d9b925fc:/etc/nginx# ls           
    conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params
    
    root@d2f3d9b925fc:/etc/nginx# 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Docker部署Tomcat

    第一步: 查询 是否有tomcat

    第二步: 进行下载tomcat 镜像 docker pull tomcat 或者 直接 运行 (也可以下载) docker run -it tomcat /bin/bash

    第三步: 启动tomcat 端口的设置 和 并给命名 **docker run -d -p 3355:8080 --name tomcat01 ** tomcat

    第四步: 测试 测试访问没有问题 但外部访问有问题

    第五步: 进入 容器 docker exec -it tomcat01 /bin/bash

    ​ 查看 ls -al 看目录权限

    ​ 发现问题 :1.linux命令少了,2、没有webapps 阿里云镜像的原因,默认是最小的镜像所有不必要的镜像都删除掉了 ,会导致我们在浏览器访问 出现404

    image-20220714145523983

    第六步: 解决上述问题

    ​ 将webapps.dist 复制到 webapps cp -r webapps.dist/ webapps*

    ​ -r  递归处理,将指定目录下的文件与子目录一并处理。
    在这里插入图片描述

    Docker部署es + kibana

    es:暴露端口特比多

    es 十分耗内存

    es 的数据一般需要放置到安全目录 ! 挂载

    第一步下载 启动 es

    docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
    
    • 1

    由于es非常耗内存 建议!!! 把没用的镜像关闭

    **第二步: ** 测试 curl localhost:9200

    第三步: 查看内存 由于es 耗内存 docker stats 在通过 -e 修改环境内存

    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
    
    • 1

    Kibana

    第一步: 下载镜像 启动

    docker run -it --name="kibana02" -p 5602:5601 --link elasticsearch02:elasticsearch kibana:7.6.2
    
    • 1

    ==注意事项: 在这启动kibana 首先启动ela 查看ela --name 是什么 ==,然后再启动 kibana 中 --link 第一个ela的(–name 要和 ela --name 名字要一致),才能启动,否则会报错

    在这里插入图片描述

    Portainer可视化面板安装

    他是docker图形化界面

    docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    
    • 1

    镜像

    镜像是什么?

    镜像是轻量级、独立运行软件包,用来打包软件的运行环境和运行环境开发的软件,它包含一个软件的:代码、库、环境变量和配置文件,直接打包docker镜像,这种打包叫做:其实镜像实际上是由一层一层的文件系统组成,这个文件系统就是**联合文件系统(UnionFS)**就可以直接运行起来

    咋们在下载的镜像的时候都是一层

    Docker镜像加载原理

    UnionFS(联合文件系统)

    ​ docker的镜像实际上是由**一层一层的文件系统组成,好比盖房子一样 一层一层的变高,**这个层级的文件系统叫UnionFS

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

    docker的镜像实际上由一层一层的文件系统组成,这种层级文件系统就是上述的UnionFS。接着,在内部又分为2部分:

    bootfs(boot file system):docker镜像的最底层是bootfs,主要包含bootloader(加载器)和kernel(内核)。

    bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统。这一层与典型的linux/Unix系统一样,包含bootloader和kernel。当boot加载完成后,整个内核就在内存中了**,此时内存的使用权已由bootfs转交给了内核**,此时系统也会卸载bootfs
    这里的加载,可以理解为,我们windows电脑开机时候,从黑屏到进入操作系统的过程。

    rootfs(root file system):在bootfs之上,包含的就是典型linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。
    rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos等等。

    特性:

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

    这一层就是我们通常函数与董鄂容器曾,容器之下的都叫镜像曾

    运行流程图下:

    run 之后,所有的操作都在容器层进行,而镜像曾tomcat 是不会改变原始的数据,只会在容器层,增加数据

    Commit镜像

    提交自己的镜像

    docker commit 提交容器成为一个新的副本
    
    docker commit -m="提交的描述信息" -a=“作者”  容器id  目标镜像名:[TAG]
    
    • 1
    • 2
    • 3

    测试:由于tommat 不能直接访问 需要将webapps.dist 中的所有文件进行copy到webapps中 完成后,将新的tomcat进行 commit镜像 成为一个新的tomcat 副本

    [root@centos01 ~]# docker commit -a="zhkj" -m="add webapps app" ba44baf4d118 tomcat02:1.0
    sha256:d024ea4659b262a38bbbfdae474d2078473eaffadc50eef761372aac71136d94
    [root@centos01 ~]# docker ps
    CONTAINER ID   IMAGE                 COMMAND             CREATED          STATUS              PORTS                                       NAMES
    ba44baf4d118   tomcat                "catalina.sh run"   14 minutes ago   Up 14 minutes       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   blissful_dubinsky
    1c38bd303c3c   centos                "/bin/bash"         2 hours ago      Up 2 hours                                                      happy_haibt
    f9e77915bccd   portainer/portainer   "/portainer"        43 hours ago     Up About a minute   0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   gracious_poitras
    
    [root@centos01 ~]# docker images
    REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
    tomcat02              1.0       d024ea4659b2   2 minutes ago   684MB
    nginx                 latest    605c77e624dd   6 months ago    141MB
    tomcat                latest    fb5657adc892   6 months ago    680MB
    
    [root@centos01 ~]# 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    容器数据卷

    什么是容器数据卷

    Docker 是应用和环境打包成一个镜像,

    如果数据都在容器中,那我们容器删除,就会丢失数据 (mysql ,容器删除 就等于删库跑路)

    为了解决上述问题:
    容器之间可以有一个数据共享技术,docker容器中生产的数据,同步到本地! —>这既是卷技术,目录的挂载,将我们内容的目录,挂载到linux什上面

    特征:持久化和同步操作,容器间也是可以数据共享

    使用数据卷

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

    docker run -it -v
    
    • 1

    在这里插入图片描述

    #查看挂载 位置
    docker inspect 容器id
    
    • 1
    • 2

    在这里插入图片描述

    测试

    在这里插入图片描述

    在这里插入图片描述

    好处: 以后修改文件内容,直接在本地修改,不需要在容器内修该

    匿名和具名挂载

    # 匿名挂载
    -v 容器内路径
    docker run -d -P --name nginx01 -v /etc/nginx nginx     # -P 随机指定端口
     
    # 查看所有volume的情况
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
    DRIVER              VOLUME NAME
    local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
    local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
     
    # 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!
     
    # 具名挂载
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
    26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
    26da1ec7d499        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:32769->80/tcp   nginx02
    486de1da03cb        nginx               "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        0.0.0.0:32768->80/tcp   nginx01
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
    DRIVER              VOLUME NAME
    local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
    local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
    local               juming-nginx
     
    # 通过-v 卷名:容器内的路径
    # 查看一下这个卷
    # docker volume inspect juming-nginx
     
    [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
    [
      {
          "CreatedAt": "2020-08-12T18:15:21+08:00",
          "Driver": "local",
          "Labels": null,
          "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
          "Name": "juming-nginx",
          "Options": null,
          "Scope": "local"
      }
    ]
    
    • 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

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

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

    ##如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
    -v  容器内路径                   # 匿名挂载
    -v  卷名:容器内路径               # 具名挂载
    -v /主机路径:容器内路径            # 指定路径挂载
    
    • 1
    • 2
    • 3
    • 4
    # 通过 -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就说明这个路径只能通过宿主机来操作,容器内容无法操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Dockerfile

    dockerfile就是用来构建docker镜像的构建文件,通过这个脚本可以生产镜像,镜像是一层一层的,每个命令也是一层一层的

    # 创建一个dockerfile文件, 名字可以随机
    # 文件的内容 指定(大写) 参数
     
    FROM centos
     
    VOLUME ["volume01", "volume02"]
     
    CMD echo "----end----"
    CMD /bin/bash
     
    # 这里的每一个命令都是镜像的一层!
    
    #注意点 : 这里推出 先按esc  咋输入 :wq 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    数据卷容器

    可以同步多个容器中的数据

    # 
    --volumes from 要继承的数据卷
    
    • 1
    • 2

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

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

    DockerFile

    Dockerfile是面向开发的,我们以后发布项目,做镜像,就需要写dockerfile文件,同时dockerfile也逐渐成为企业 交付项目的标准

    是用来构建docker镜像命名

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

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

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

    构建步骤:

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

    查看官网是如何制作镜像

    在这里插入图片描述

    Docker构建过程

    基础知识:

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

    DockerFile的指令

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

    img

    DockerFile实战(自己构建镜像)

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

    创建自己的centos镜像

    首先mkdir 位置

    在 vi docker

    FROM centos
    MAINTAINER wushentian<wushentian@unittec.com>
    
    ENV MYPATH /user/local
    WORKDIR $MYPATH
    
    RUN yum -y install vim
    RUN yum -y install net-tools
    
    EXPOSE 80
    
    CMD echo $MYPATH
    CMD echo "---end---"
    CMD /bin/bash
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. mkdir 创建 自己想要的位置
    2. vi 自己定义的脚本名字
    3. **在 vi 中编写 脚本 **
    4. cat 自己定义的脚本名称
    5. build
      • -f 路径名 要跟 vi 后面的名称一致
      • -t 是指命名当前镜像叫什么 后面也可以跟版本号

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lDTzEN3a-1659508930670)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images!在这里插入图片描述
    )]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6rfnITv-1659508930671)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images!在这里插入图片描述
    )]

    流程

    在这里插入图片描述

    为什么使用Rancher

    它支持集中化认证、权限控制、监控和管理所有Kubernetes集群

    同时给开发者提供了一个可视化的工具

    他能解决什么问题?

    针对多机房、跨区域的容器调度,部署多套集群

    行 ONBUILD 的指令,触发指令
    COPY # 类似ADD, 将我们文件拷贝到镜像中
    ENV # 构建的时候设置环境变量!

    
    
    
    
    
    [外链图片转存中...(img-xBp0ugRj-1659508930670)]
    
    
    
    ### DockerFile实战(自己构建镜像)
    
    > Docker Hub 中99%的镜像都是这个基础镜像过来的FROM scratch,然后配置需要的软件和配置进行构建
    
    
    
    **创建自己的centos镜像**
    
    首先mkdir 位置 
    
    在 vi docker
    
    
    
    ```shell
    FROM centos
    MAINTAINER wushentian
    
    ENV MYPATH /user/local
    WORKDIR $MYPATH
    
    RUN yum -y install vim
    RUN yum -y install net-tools
    
    EXPOSE 80
    
    CMD echo $MYPATH
    CMD echo "---end---"
    CMD /bin/bash
    
    
    
    • 1
    • 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
    1. mkdir 创建 自己想要的位置
    2. vi 自己定义的脚本名字
    3. **在 vi 中编写 脚本 **
    4. cat 自己定义的脚本名称
    5. build
      • -f 路径名 要跟 vi 后面的名称一致
      • -t 是指命名当前镜像叫什么 后面也可以跟版本号

    [外链图片转存中…(img-lDTzEN3a-1659508930670)]

    [外链图片转存中…(img-V6rfnITv-1659508930671)]

    流程

    [外链图片转存中…(img-v15DvK02-1659508930671)]

    为什么使用Rancher

    它支持集中化认证、权限控制、监控和管理所有Kubernetes集群

    同时给开发者提供了一个可视化的工具

    他能解决什么问题?

    针对多机房、跨区域的容器调度,部署多套集群

    在这里插入图片描述

  • 相关阅读:
    #gStore-weekly | SPARQL 解析(下)
    [PowerQuery] PowerAutoMate 刷新PowerBI 数据
    让直播和视频通话更精彩的实时换脸神器: 亲妈都未必认识
    [计算机网网络] 计算机网络挂科小知识
    Python 正则表达式大全,值得收藏
    ASEMI肖特基二极管MBR20200CT参数及代换
    在Ubuntu下安装Redis
    负载均衡(DR)
    用SptingBoot实现拦截器功能
    python毕业设计项目源码选题(4)企业公司网站系统毕业设计毕设作品开题报告开题答辩PPT
  • 原文地址:https://blog.csdn.net/weixin_45185519/article/details/126140133