• 【狂神说Java】Docker概述 | Docker安装 | Docker的常用命令


    ✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆
    🔥系列专栏 :【狂神说Java】
    📃新人博主 :欢迎点赞收藏关注,会回访!
    💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少努力,撑得累不累,摔得痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷。


    前言

    给大家分享《三体》中的一句话,很有感触:弱小和无知不是生存的障碍,傲慢才是。

    • Docker概述
    • Docker安装
    • Docker命令
      • 镜像命令
      • 容器命令
      • 操作命令
    • Docker镜像!
    • 容器数据卷!
    • DockerFile·Docker网络原理
    • IDEA整合Docker
    • Docker Compose
    • Docker Swarm
    • CI\CDJenkins

    一、Docker概述

    1. Docker为什么出现

    一款产品:开发—上线 两套环境(应用环境,应用配置)
    开发—-运维。问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就十分大?
    环境配置是十分的麻烦,每一个机器都要部署环境(集群Redis、ES、Hadoop…)费时费力。
    发布一个项目(jar +(Redis MySQL jdk ES)),项目能不能都带上环境安装打包!
    之前在服务器配置一个应用的环境Redis MySQL jdk ES Hadoop,配置超麻烦了,不能够跨平台。
    Windows开发,最后发布到Linux:

    • 传统:开发jar,运维来做!
    • 现在:开发打包部署上线,一套流程做完!

    java —- apk — 发布(应用商店)—-张三使用apk—-安装即可用!
    java —- jar(环境)—- 打包项目带上环境(镜像)—-(Docker仓库:商店)—-下载我们发布的镜像—直接运行即可!
    Docker给以上的问题,提出了解决方案!
    Docker的思想就来自于集装箱!
    隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。
    本质:所有的技术都是因为出现了一些问题,我们需要去解决,才去学习。

    2. Docker的历史

    2010年,几个搞IT的年轻人,就在美国成立了一家公司dotcloud做一些pass的云计算服务!
    LXC有关的容器技术!他们将自己的技术(容器化技术)命名就是Docker!
    Docker刚刚诞生的时候,没有引起行业的注意!(dotCloud就活不下去)
    开源(开放源代码)
    2013年,Docker开源!
    Docker越来越多的人发现了docker的优点!就火了,Docker每个月都会更新一个版本!
    2014年4月9日,Docker1.0发布!
    Docker为什么这么火?十分的轻巧
    在容器技术出来之前,我们都是使用虚拟机技术!
    虚拟机:在window中装一个Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑!(很笨重)
    虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!

    vm:隔离,需要开启多个虚拟机!linux centos原生镜像(一个电脑!)需要几个G内存空间,开启需要几分钟!
    docker:隔离,镜像(最核心的环境4m内存)十分的小巧,运行镜像就可以了!小巧!几个M或KB的内存空间,秒级启动!
    
    • 1
    • 2

    聊聊Doker
    Docker是基于Go语言开发的!开源项目!
    官网:https://www.docker.com/
    文档地址:https://docs.docker.com/
    Doker镜像仓库地址:https://hub.docker.com/

    3. Docker能做什么

    之前的虚拟机技术
    image.png
    虚拟机技术缺点:
    1、资源占用十分多
    2、冗余步骤多
    3、启动很慢!
    容器化技术
    容器化技术不是模拟的一个完整的操作系统
    image.png
    比较Docker和虚拟机技术的不同:

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

    Devops(开发、运维)
    应用更快速的交付和部署
    传统:一堆帮助文档,安装程序!
    Docker:打包镜像发布测试,一键运行!
    更便捷的升级和扩缩容
    使用了Docker之后,我们部署应用就和搭积木一样!
    项目打包为一个镜像,扩展服务器A!服务器B!
    更简单的系统运维
    在容器化之后,我们的开发,测试环境都是高度一致的。
    更高效的计算资源利用
    Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
    只要学不死,就往死里学!

    二、Docker安装

    1. Docker的基本组成

    image.png
    镜像(image):
    docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run==>tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
    容器(container):
    Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
    启动,停止,删除,基本命令!
    目前就可以把这个容器理解为就是一个简易的linux系统
    仓库(repository):
    仓库就是存放镜像的地方!
    仓库分为公有仓库和私有仓库!
    Docker Hub(默认是国外的)阿里云.…都有容器服务器(配置镜像加速!)

    2. 安装Docker

    环境准备

    1. 需要会一点点的Linux的基础
    2. CentOS7
    3. 我们使用Xshell连接远程服务器进行操作

    环境查看

    # 系统内核是 3.10 以上的
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# uname -r
    3.10.0-1160.66.1.el7.x86_64
    
    • 1
    • 2
    • 3
    # 查看系统版本
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# cat /etc/os-release
    NAME="CentOS Linux"
    VERSION="7 (Core)"
    ID="centos"
    ID_LIKE="rhel fedora"
    VERSION_ID="7"
    PRETTY_NAME="CentOS Linux 7 (Core)"
    ANSI_COLOR="0;31"
    CPE_NAME="cpe:/o:centos:centos:7"
    HOME_URL="https://www.centos.org/"
    BUG_REPORT_URL="https://bugs.centos.org/"
    
    CENTOS_MANTISBT_PROJECT="CentOS-7"
    CENTOS_MANTISBT_PROJECT_VERSION="7"
    REDHAT_SUPPORT_PRODUCT="centos"
    REDHAT_SUPPORT_PRODUCT_VERSION="7"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    安装
    查看文档:https://docs.docker.com/https://docs.docker.com/engine/install/centos/)

    # 1.卸载旧的版本
    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    # 2.需要的安装包
    yum install -y yum-utils
    # 3.设置镜像的仓库
    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 # 推荐使用阿里云的。
    
    
    # 安装容器之前,更新yum软件包索引。
    yum makecache fast
    # 4.安装容器相关的。docker-ce(社区版)docker-ee(企业版)
    yum install docker-ce docker-ce-cli containerd.io
    # 5.启动docker
    systemctl start docker
    # 6.使用docker version查看是否安装成功
    
    • 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

    image.png

    # 7.测试hello-world
    docker run hello-world
    
    • 1
    • 2

    image.png

    # 8.查看一下下载的这个hello-world镜像
    
    • 1

    了解:卸载docker

    # 1.卸载依赖
    yum remove docker-ce docker-ce-cli containerd.io
    # 2.删除资源
    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd
    
    # /var/lib/docker  docker的默认工作路径
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3. 阿里云镜像加速

    1. 登录阿里云,找到容器服务。
    2. 找到镜像加速地址。
    3. 配置使用。
      四个命令,依次执行即可:
    sudo mkdir -p /etc/docker
    
    • 1

    4. 回顾hello-world流程

    image.png

    5. 底层原理

    Docker是怎么工作的?
    Docker 是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
    DockerServer 接收到Docker-Client的指令,就会执行这个命令!
    image.png
    Docker为什么比VM快?
    1、Docker有着比虚拟机更少的抽象层。
    2、docker利用的是宿主机的内核,vm需要是Guest OS。
    image.png
    所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。
    虚拟机是加载GuestOS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级!

    三、Docker的常用命令

    1. 帮助命令

    docker version        # 显示docker的版本信息
    docker info              # 显示docker的系统信息,包括镜像和容器的数量
    docker 命令 --help         # 帮助命令
    
    • 1
    • 2
    • 3

    帮助文档的地址:https://docs.docker.com/reference/

    2. 镜像命令

    dokcer images

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

    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    hello-world   latest    feb5d9fea6a5   10 months ago   13.3kB
    # 解释
    REPOSITORY    镜像的仓库源
    TAG            镜像的标签
    IMAGE ID    镜像的id
    CREATED        镜像的创建时间
    SIZE        镜像的大小
    # 命令参数可选项
     -a, --all         # 显示所有镜像 (docker images -a)
     -q, --quiet       # 仅显示镜像id (docker images -q)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    docker search

    搜索镜像

    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker search mysql
    NAME                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    mysql                          MySQL is a widely used, open-source relation…   12940     [OK]
    mariadb                        MariaDB Server is a high performing open sou…   4957      [OK]
    phpmyadmin                     phpMyAdmin - A web interface for MySQL and M…   587       [OK]
    percona                        Percona Server is a fork of the MySQL relati…   582       [OK]
    # 解释
    # 命令参数可选项 (通过搜索来过滤)
    --filter=STARS=3000     # 搜索出来的镜像就是stars大于3000的
    
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker search mysql --filter=STARS=3000
    NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    mysql     MySQL is a widely used, open-source relation…   12941     [OK]
    mariadb   MariaDB Server is a high performing open sou…   4957      [OK]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    docker pull

    下载镜像

    # 下载镜像:docker pull 镜像名[:tag]
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker pull mysql
    Using default tag: latest            # 如果不写tag,默认就是latest,最新的版本
    latest: Pulling from library/mysql
    72a69066d2fe: Pull complete            # 分层下载,docker image的核心,联合文件下载
    93619dbc5b36: Pull complete
    99da31dd6142: Pull complete
    626033c43d70: Pull complete
    37d5d7efb64e: Pull complete
    ac563158d721: Pull complete
    d2ba16033dad: Pull complete
    688ba7d5c01a: Pull complete
    00e060b6d11d: Pull complete
    1c04857f594f: Pull complete
    4d7cfa90e6ea: Pull complete
    e0431212d27d: Pull complete
    Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 #签名
    Status: Downloaded newer image for mysql:latest
    docker.io/library/mysql:latest        # 真实地址
    
    # 两个命令是等价的
    docker pull mysql
    docker pull docker.io/library/mysql:latest
    # 指定版本下载
    
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker pull mysql:5.7
    5.7: Pulling from library/mysql
    72a69066d2fe: Already exists        # 联合文件下载,已经存在的资源可以共用
    93619dbc5b36: Already exists
    99da31dd6142: Already exists
    626033c43d70: Already exists
    37d5d7efb64e: Already exists
    ac563158d721: Already exists
    d2ba16033dad: Already exists
    0ceb82207cd7: Pull complete
    37f2405cae96: Pull complete
    e2482e017e53: Pull complete
    70deed891d42: Pull complete
    Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
    Status: Downloaded newer image for mysql:5.7
    docker.io/library/mysql:5.7
    
    • 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 rmi

    删除镜像

    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker rmi -f 镜像id                    # 删除指定的镜像
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker rmi -f 镜像id 镜像id 镜像id    # 删除多个镜像(空格分隔)
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker rmi -f $(docker images -aq)    # 删除全部的镜像
    
    • 1
    • 2
    • 3

    3. 容器命令

    说明:我们有了镜像才可以创建容器,linux,下载一个centos 镜像来测试学习。

    docker pull centos
    
    • 1

    新建容器并启动

    docker run [可选参数] image
    # 参数说明
    --name="name"        容器名字:用来区分容器
    -d                    后台方式运行:相当于nohup
    -it                    使用交互式运行:进入容器查看内容
    -p                    指定容器的端口(四种方式)小写字母p
        -p ip:主机端口:容器端口
        -p 主机端口:容器端口
        -p 容器端口
        容器端口
    -P                     随机指定端口(大写字母P)
    # 测试:启动并进入容器
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker run -it centos /bin/bash
    [root@526c31d2c298 /]# ls        # 查看容器内的centos(基础版本,很多命令都是不完善的)
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    
    # 从容器中退回到主机
    [root@526c31d2c298 /]# exit
    exit
    [root@iZbp13qr3mm4ucsjumrlgqZ /]# ls
    bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  www
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    列出所有运行的容器

    docker ps    # 列出当前正在运行的容器
    # 命令参数可选项
    -a        # 列出当前正在运行的容器+历史运行过的容器
    -n=?    # 显示最近创建的容器(可以指定显示几条,比如-n=1)
    -q        # 只显示容器的编号
    
    [root@iZbp13qr3mm4ucsjumrlgqZ /]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    [root@iZbp13qr3mm4ucsjumrlgqZ /]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
    526c31d2c298   centos         "/bin/bash"   4 minutes ago   Exited (0) 2 minutes ago             optimistic_allen
    ce0eb11fbf8a   feb5d9fea6a5   "/hello"      4 hours ago     Exited (0) 4 hours ago               keen_ellis
    [root@iZbp13qr3mm4ucsjumrlgqZ /]# docker ps -a -n=1
    CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
    526c31d2c298   centos    "/bin/bash"   5 minutes ago   Exited (0) 3 minutes ago             optimistic_allen
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    退出容器

    exit        # 容器直接停止,并退出
    ctrl+P+Q    # 容器不停止,退出
    
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker run -it centos /bin/bash
    [root@c5d61aa9d7df /]# [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
    c5d61aa9d7df   centos    "/bin/bash"   56 seconds ago   Up 55 seconds             kind_clarke
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    删除容器

    docker rm 容器id                    # 删除容器(不能删除正在运行的容器)如果要强制删除:docker rm -f 容器id
    docker rm -f $(docker ps -aq)        # 删除全部容器
    docker ps -a -q|xargs docker rm        # 删除所有容器
    
    • 1
    • 2
    • 3

    启动和停止容器的操作

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

    4. 常用其他命令

    后台启动容器

    # 命令docker run -d 镜像名
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker run -d centos
    # 问题:docker ps发现centos停止了
    
    # 常见的坑:docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止。
    # 比如:nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    查看日志

    docker logs -tf --tail 容器id
    # 自己编写一段shell脚本
    docker run -d centos /bin/sh -c "while true;do echo kuangshen;sleep 1;done"
    
    
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker logs -tf  容器id
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker logs -tf --tail 10  容器id
    
    # 显示日志
    -tf                        # 显示日志
    --tail number    # 要显示的日志条数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    查看容器中进程的信息

    # 命令 docker top 容器id 
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker top 88d23bcbe1f2
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                21212               21193               0                   16:23               ?                   00:00:00            
    root                21600               21212               0                   16:29               ?                   00:00:00
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看镜像的元数据

    # 命令docker inspect 容器id
    [
        {
            "Id": "88d23bcbe1f28e1f8ae5d2b63fa8d57d2abcbdacf193db05852f4f74a95b9ffe",
            "Created": "2022-07-29T08:23:56.862239223Z",
            "Path": "/bin/sh",
            "Args": [
                "-c",
                "while true;do echo kuangshen;sleep 1;done"
            ],
            "State": {
                "Status": "running",
                "Running": true,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": false,
                "Dead": false,
                "Pid": 21212,
                "ExitCode": 0,
                "Error": "",
                "StartedAt": "2022-07-29T08:23:57.109766809Z",
                "FinishedAt": "0001-01-01T00:00:00Z"
            },
            "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
            "ResolvConfPath": "/var/lib/docker/containers/88d23bcbe1f28e1f8ae5d2b63fa8d57d2abcbdacf193db05852f4f74a95b9ffe/resolv.conf",
            "HostnamePath": "/var/lib/docker/containers/88d23bcbe1f28e1f8ae5d2b63fa8d57d2abcbdacf193db05852f4f74a95b9ffe/hostname",
            "HostsPath": "/var/lib/docker/containers/88d23bcbe1f28e1f8ae5d2b63fa8d57d2abcbdacf193db05852f4f74a95b9ffe/hosts",
            "LogPath": "/var/lib/docker/containers/88d23bcbe1f28e1f8ae5d2b63fa8d57d2abcbdacf193db05852f4f74a95b9ffe/88d23bcbe1f28e1f8ae5d2b63fa8d57d2abcbdacf193db05852f4f74a95b9ffe-json.log",
            "Name": "/silly_lichterman",
            "RestartCount": 0,
            "Driver": "overlay2",
            "Platform": "linux",
            "MountLabel": "",
            "ProcessLabel": "",
            "AppArmorProfile": "",
            "ExecIDs": null,
            "HostConfig": {
                "Binds": null,
                "ContainerIDFile": "",
                "LogConfig": {
                    "Type": "json-file",
                    "Config": {}
                },
                "NetworkMode": "default",
                "PortBindings": {},
                "RestartPolicy": {
                    "Name": "no",
                    "MaximumRetryCount": 0
                },
                "AutoRemove": false,
                "VolumeDriver": "",
                "VolumesFrom": null,
                "CapAdd": null,
                "CapDrop": null,
                "CgroupnsMode": "host",
                "Dns": [],
                "DnsOptions": [],
                "DnsSearch": [],
                "ExtraHosts": null,
                "GroupAdd": null,
                "IpcMode": "private",
                "Cgroup": "",
                "Links": null,
                "OomScoreAdj": 0,
                "PidMode": "",
                "Privileged": false,
                "PublishAllPorts": false,
                "ReadonlyRootfs": false,
                "SecurityOpt": null,
                "UTSMode": "",
                "UsernsMode": "",
                "ShmSize": 67108864,
                "Runtime": "runc",
                "ConsoleSize": [
                    0,
                    0
                ],
                "Isolation": "",
                "CpuShares": 0,
                "Memory": 0,
                "NanoCpus": 0,
                "CgroupParent": "",
                "BlkioWeight": 0,
                "BlkioWeightDevice": [],
                "BlkioDeviceReadBps": null,
                "BlkioDeviceWriteBps": null,
                "BlkioDeviceReadIOps": null,
                "BlkioDeviceWriteIOps": null,
                "CpuPeriod": 0,
                "CpuQuota": 0,
                "CpuRealtimePeriod": 0,
                "CpuRealtimeRuntime": 0,
                "CpusetCpus": "",
                "CpusetMems": "",
                "Devices": [],
                "DeviceCgroupRules": null,
                "DeviceRequests": null,
                "KernelMemory": 0,
                "KernelMemoryTCP": 0,
                "MemoryReservation": 0,
                "MemorySwap": 0,
                "MemorySwappiness": null,
                "OomKillDisable": false,
                "PidsLimit": null,
                "Ulimits": null,
                "CpuCount": 0,
                "CpuPercent": 0,
                "IOMaximumIOps": 0,
                "IOMaximumBandwidth": 0,
                "MaskedPaths": [
                    "/proc/asound",
                    "/proc/acpi",
                    "/proc/kcore",
                    "/proc/keys",
                    "/proc/latency_stats",
                    "/proc/timer_list",
                    "/proc/timer_stats",
                    "/proc/sched_debug",
                    "/proc/scsi",
                    "/sys/firmware"
                ],
                "ReadonlyPaths": [
                    "/proc/bus",
                    "/proc/fs",
                    "/proc/irq",
                    "/proc/sys",
                    "/proc/sysrq-trigger"
                ]
            },
            "GraphDriver": {
                "Data": {
                    "LowerDir": "/var/lib/docker/overlay2/59b088d44f6e67f4ed336de44d19a5784c1a13fa856760bd2b166c4a4d421e2b-init/diff:/var/lib/docker/overlay2/7fc43e24b63e4656ab7e7718d3e4ef5297fe82509452be305a01605a7cdc3b97/diff",
                    "MergedDir": "/var/lib/docker/overlay2/59b088d44f6e67f4ed336de44d19a5784c1a13fa856760bd2b166c4a4d421e2b/merged",
                    "UpperDir": "/var/lib/docker/overlay2/59b088d44f6e67f4ed336de44d19a5784c1a13fa856760bd2b166c4a4d421e2b/diff",
                    "WorkDir": "/var/lib/docker/overlay2/59b088d44f6e67f4ed336de44d19a5784c1a13fa856760bd2b166c4a4d421e2b/work"
                },
                "Name": "overlay2"
            },
            "Mounts": [],
            "Config": {
                "Hostname": "88d23bcbe1f2",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                ],
                "Cmd": [
                    "/bin/sh",
                    "-c",
                    "while true;do echo kuangshen;sleep 1;done"
                ],
                "Image": "centos",
                "Volumes": null,
                "WorkingDir": "",
                "Entrypoint": null,
                "OnBuild": null,
                "Labels": {
                    "org.label-schema.build-date": "20210915",
                    "org.label-schema.license": "GPLv2",
                    "org.label-schema.name": "CentOS Base Image",
                    "org.label-schema.schema-version": "1.0",
                    "org.label-schema.vendor": "CentOS"
                }
            },
            "NetworkSettings": {
                "Bridge": "",
                "SandboxID": "bfc28d2ba671adfe5c93325173b93c335d50d8b017eed4fdce2ab75410d6ac2e",
                "HairpinMode": false,
                "LinkLocalIPv6Address": "",
                "LinkLocalIPv6PrefixLen": 0,
                "Ports": {},
                "SandboxKey": "/var/run/docker/netns/bfc28d2ba671",
                "SecondaryIPAddresses": null,
                "SecondaryIPv6Addresses": null,
                "EndpointID": "ad0252d454e751e2c5ecef24e64c32b0884c53242925bd66e9e5dbf5542af179",
                "Gateway": "172.17.0.1",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "IPAddress": "172.17.0.2",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "MacAddress": "02:42:ac:11:00:02",
                "Networks": {
                    "bridge": {
                        "IPAMConfig": null,
                        "Links": null,
                        "Aliases": null,
                        "NetworkID": "7254ffccbdf53e0c72c1d19252980f04fa65153ea3c7ca72af55cfac504cbe3f",
                        "EndpointID": "ad0252d454e751e2c5ecef24e64c32b0884c53242925bd66e9e5dbf5542af179",
                        "Gateway": "172.17.0.1",
                        "IPAddress": "172.17.0.2",
                        "IPPrefixLen": 16,
                        "IPv6Gateway": "",
                        "GlobalIPv6Address": "",
                        "GlobalIPv6PrefixLen": 0,
                        "MacAddress": "02:42:ac:11:00:02",
                        "DriverOpts": null
                    }
                }
            }
        }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208

    进入当前正在运行的容器

    # 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
    # 命令
    docker exec -it 容器id /bin/bash
    
    # 测试
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
    88d23bcbe1f2   centos    "/bin/sh -c 'while t…"   13 minutes ago   Up 13 minutes             silly_lichterman
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker exec -it 88d23bcbe1f2 /bin/bash
    [root@88d23bcbe1f2 /]# ps -ef
    UID        PID  PPID  C STIME TTY          TIME CMD
    root         1     0  0 08:23 ?        00:00:00 /bin/sh -c while true;do echo kuangshen;sleep 1;done
    root       841     0  0 08:37 pts/0    00:00:00 /bin/bash
    root       858     1  0 08:37 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
    root       859   841  0 08:37 pts/0    00:00:00 ps -ef
    
    # 方式二
    docker attach 容器id
    # 测试
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker attach 88d23bcbe1f2
    正在执行当前的代码...
    
    # docker exec        # 进入容器后开启一个新的终端,可以再里面操作(常用)
    # docker attach        # 进入容器正在执行的终端,不会启动新的进程。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    从容器内拷贝文件到主机上

    docker cp 容器id:容器内路径 目的主机的路径
    
    [root@iZbp13qr3mm4ucsjumrlgqZ home]# ll
    total 0
    [root@iZbp13qr3mm4ucsjumrlgqZ home]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    [root@iZbp13qr3mm4ucsjumrlgqZ home]# docker run -it centos /bin/bash
    [root@6eda31ad7987 /]# [root@iZbp13qr3mm4ucsjumrlgqZ home]# docker ps
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
    6eda31ad7987   centos    "/bin/bash"   17 seconds ago   Up 16 seconds             stoic_kepler
    # 进入到容器内部
    [root@iZbp13qr3mm4ucsjumrlgqZ home]# docker attach 6eda31ad7987
    [root@6eda31ad7987 /]# ls
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@6eda31ad7987 /]# cd /home/
    [root@6eda31ad7987 home]# ls
    # 在容器的/home路径下创建test.java文件
    [root@6eda31ad7987 home]# touch test.java
    [root@6eda31ad7987 home]# ls
    test.java
    [root@6eda31ad7987 home]# exit
    exit
    [root@iZbp13qr3mm4ucsjumrlgqZ home]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    [root@iZbp13qr3mm4ucsjumrlgqZ home]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS                      PORTS     NAMES
    6eda31ad7987   centos    "/bin/bash"   About a minute ago   Exited (0) 28 seconds ago             stoic_kepler
    # 将文件拷贝出来到主机上(在主机上执行该命令)
    [root@iZbp13qr3mm4ucsjumrlgqZ home]# docker cp 6eda31ad7987:/home/test.java /home
    [root@iZbp13qr3mm4ucsjumrlgqZ home]# ls
    test.java
    
    # 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现,自动同步(容器内的/home路径和主机上的/home路径打通)
    
    • 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

    5. 小结

    image.png

    6. 作业练习

    docker安装nginx

    1. 搜索镜像:docker search nginx (建议去dockerHub上去搜索)
    2. 下载镜像:docker pull nginx
    3. 启动nginx:
    4. 本机测试
    # -d 后台运行
     # --name="nginx01"    给容器命名
     # -p 宿主机端口:容器内部端口
     [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker run -d --name="nginx-1" -p 3344:80 nginx
     6e02190a50bc8d79653ffa88f6b5c143d79c5ac3257d5d5ed6a01247980fb48a
     [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker ps
     CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
     6e02190a50bc   nginx     "/docker-entrypoint.…"   18 seconds ago   Up 17 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx-1
    
     # 进入容器
     [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker exec -it a1e130aa184d /bin/bash
     root@a1e130aa184d:/# whereis nginx
     nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
     root@a1e130aa184d:/# cd /etc/nginx/
     root@a1e130aa184d:/etc/nginx# ls
     conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# curl localhost:3344
     
     
     
     Welcome to nginx!
     
     
     
     

    Welcome to nginx!

    If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

    For online documentation and support please refer to nginx.org.
    Commercial support is available at nginx.com.

    Thank you for using nginx.

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    端口暴露的概念
    image.png
    思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分的麻烦,我要是可以在容器外部提供一个映射路径,达到在容器外修改文件名,容器内部就可以自动修改?-v 数据卷

    docker安装tomcat

    # 官方的使用
    docker run -it --rm tomcat
    
    # 我们之前的启动都是后台,停止了容器之后,容器还是可以查到docker run -it --rm,一般用来测试,用完就删除。
    
    # 下载
    docker pull tomcat
    
    # 启动运行
    docker run -d --name="tomcat01" -p 3355:8080 tomcat
    
    # 测试访问没有问题,但是找不到资源
    # 进入容器,有一个webapps文件夹和webapps.dist文件夹
    docker exec -it tomcat01 /bin/bash
    # webapps文件夹下没有资源,资源都在webapp.dist文件夹下
    root@35eb825661e0:/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
    
    # 发现问题:(阿里云镜像的原因:默认是最小的镜像,所有不必要的都剔除掉)保证最小可运行的环境
    # 1、Linux命令少了。
    # 2、没有webapps文件夹。
    
    # 没有webapps文件夹,发现有一个webapps.dist文件夹,资源在webapps.dist文件夹下;
    # 把webapps.dist文件夹下的文件复制到webapps文件夹下,就可以访问成功。
    root@35eb825661e0:/usr/local/tomcat# cp -r webapps.dist/* webapps
    
    • 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

    思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了!

    部署ES+kibana

    # es暴露的端口很多!
    # es十分的耗内存!
    # es的数据一般需要放置到安全目录!挂载
    
    # 下载启动elasticsearch
    docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
    
    # 启动了linux就卡住了,es是十分耗内存的(1核2G)
    # 查看cpu的状态
    docker stats 
    # 测试一下es是成功的
    [root@iZbp13qr3mm4ucsjumrlgqZ ~]# curl localhost:9200
    {
      "name" : "7ed338b2a87c",
      "cluster_name" : "docker-cluster",
      "cluster_uuid" : "enAVpI1oQoW4tLmafuWcnw",
      "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"
    }
    # 赶紧关闭,增加内存的限制,修改配置文件-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
    # 可以访问成功;查看cpu状态
    
    • 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

    作业:使用kibana连接es?思考网络如何才能连接过去!
    image.png

    7. 可视化

    • portainer(先用这个)
    docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    
    • 1
    • Rancher(CI/CD时再用这个)

    什么是portainer ?

    Docker图形化界面管理工具!提供一个后台面板供我们操作!

    # 启动运行
    docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    
    • 1
    • 2

    访问测试:http://ip:8088
    image.png
    选择本地的:Local
    image.png
    进入之后的面板
    image.png
    r镜像

  • 相关阅读:
    vue若依前端项目搭建
    代码随想录二刷|滑动窗口
    6、双足机器人mpc构建
    开源计算机视觉库OpenCV详解
    《深度学习500问》外链笔记
    如何使用python将数据从hadoop保存到数据库
    十四天学会C++之第六天:异常处理
    【集训DAY N】函数【数学】
    解决谷歌浏览器会http网站自动变成https的问题
    数据仓库与ETL
  • 原文地址:https://blog.csdn.net/qq_53517370/article/details/134487037