• docker容器化技术


    1.什么是docker容器化技术

    docker是一种轻量级的虚拟化技术,可以将开发环境同时打包到镜像。跟虚拟机一样,可以虚拟出一个环境,但是虚拟机是虚拟硬件,虚拟出整个操作系统,而docker利用的就是本机的硬件、采用的是进程级别的虚拟环境。所以相对来说,docker会更加轻量级、会更快。

    2.docker出现的原因

    以前我们开发的时候,只需将我们的jar或者war包打包给运维,再给运维一份运行环境的所需配置清单、让运维自己去安装。这个时候就出现很多问题、1.比如我现在又想多布一台机器,那么这些开发环境又要重新搭建 2 .安装的环境版本还必须一致,稍有不慎,就会出现运维那边说“我怎么跑不起来啊,是不是你写的代码有bug啊”,开发又说“怎么可能,我这电脑上跑的好好的,肯定是你的问题啊”,开发运维就互相扯皮,就会延缓整个项目进度。所以这个时候docker就解决了这样的问题,docker可以直接将开发环境结合代码一起打包成一个镜像,开发可以直接将镜像扔给运维,运维只要在linux上安装了docker,就可以直接将镜像跑成容器,就可以直接运行起来,并且再想多布一台机器的时候,也只需要这个镜像就好了。

    3.docker的三大组成要素

    镜像:镜像包括程序代码、资源、配置文件。

    容器:docker把镜像跑起来就是一个容器,一个镜像可以创建多个容器实例。每个容器都是互相隔离的、安全的平台。我们可以把每一个容器看成一个轻量级的linux系统

    镜像仓库:远程集中存放镜像的仓库地址。用户创建完镜像后,可上传到公有仓库或者私有仓库,需要在另一台主机上使用该镜像的时候可以拉取下来。

    4.docker的运行逻辑

    docker采用C/S架构,docker守护进程作为Server端接受Client端的请求,并负责创建、运行、分发docker容器。

    5.帮助启动类命令

    启动docker:

    systemctl start docker
    
    • 1

    关闭docker:

    systemctl stop docker
    
    • 1

    重启docker:

    systemctl restart docker
    
    • 1

    查看docker状态:

    systemctl status docker
    
    • 1

    设置开机启动docker:

    systemctl enable docker
    
    • 1

    查看docker帮助:

    docker --help
    docker 具体命令 --help
    
    • 1
    • 2

    6.镜像命令

    1.docker images
    docker images
    
    • 1

    罗列出本地的所有镜像

    docker images -a
    docker images -q
    
    • 1
    • 2

    options说明:

    -a:罗列出所有镜像,包括历史镜像

    -q:只显示镜像ID

    2.docker search
    docker search mysql:5.7.0
    
    • 1

    从远程仓库搜索mysql版本5.7.0的镜像

    dicker search --limit 5 mysql:5.7.0
    
    • 1

    options说明:

    –limit n:限制搜索结果n条

    3.docker pull
    docker pull redis:6.0.8
    
    • 1

    从远程仓库拉取redis版本是6.0.8的镜像到本地(不加版本默认最新版)

    4.docker system df
    docker system df
    
    • 1

    查看docker镜像、容器、数据卷所占空间

    5.docker rmi
    docker rmi fed7e8sd678
    
    • 1

    本地删除某个镜像

    docker rmi 后面可以是镜像ID,也可以是镜像名称

    docker rmi -f $(docker images -q)
    
    • 1

    docker支持$()传值

    7.容器命令

    1.docker run
    docker run -it centos /bin/bash
    
    • 1

    运行镜像变成容器

    options说明:

    -it:表示以前台方式运行容器,/bin/bash表示启动伪终端

    -d:表示以后台方式运行

    –name:表示为容器起一个名字,不写代表随机名字

    -P:(大写)随机端口映射

    -p:(小写)指定端口映射

    2.docker ps
    docker ps -a
    
    • 1

    罗列出所有的容器

    options说明:

    ​ -a: 罗列出所有的容器(包括停止的容器)

    3.退出容器
    1.exit
    2.ctrl+p+q
    
    • 1
    • 2

    当以前台方式运行容器后,怎么退出容器?1.使用exit退出容器,这种方式容器会立即停止运行 2.快捷键ctrl+p+q退出,容器不会停止运行

    4.docker start
    docker start f6e3ed4sss5
    
    • 1

    启动已经停止的容器

    docker restart 容器ID 重启
    docker stop 容器ID    停止
    docker kill 容器ID	强制停止
    
    • 1
    • 2
    • 3
    5.docker rm
    docker rm 容器ID
    
    • 1

    删除已经停止的容器

    6.以交互式方式进入在后台运行的docker容器
    docker exec -it 容器ID 
    docker attach -it 容器ID
    
    • 1
    • 2

    区别:

    1.docker exec -it 容器ID 会进入容器后重新打开一个cmd新窗口,使用exit退出不会影响容器运行,不会让容器停止。

    2.docker attach -it 容器ID 会进入容器使用原来的cmd窗口,使用exit退出会使容器停止

    7.docker cp 容器ID:容器内路径 主机上路径

    8.docker容器卷

    什么是docker容器卷技术

    docker在运行容器时,容器会产生数据,如果我们一步小心删除了容器,那么数据就不能恢复了,容器卷技术就是防止数据被误删除,容器卷能把容器内的目录挂载到主机内的目录,实现目录里的数据一致性

    运行带容器卷的容器
    docker run -it --privileged=true -v /主机内的目录:/容器内的目录 镜像ID
    
    • 1

    –privileged=true:代表开启最高权限(不然主机内的目录没有权限)

    -v: 挂载目录

    如果要实现容器内目录只读,只能通过主机更改(ro:read only)

    docker run -it --privileged=true -v /主机内的目录:/容器内的目录:ro 镜像ID
    
    • 1
    docker容器卷继承
    docker run -it --privileged=true --volumes-from 容器名称 现在要运行的镜像ID 
    
    • 1

    –volumes-from: 要继承的容器名称

    9.DockerFile文件

    当我们自己制作镜像的时候,会运行一个容器,然后再容器上操作之后,再docker commit 生成一个自己的镜像。但是有些时候我们的操作十分多,比如在linux内核上安装了vim命令,安装了mysql、redis,十分复杂,当我们下次还要制作这个镜像的时候,又会来编写一遍。所以能不能列出一份list清单呢?DockerFile就是这样的清单。

    DockerFile内容基础知识
    1. 每条关键字指令都必须是大写字母且后面至少跟随一个参数
    2. 指令从上到下运行
    3. #表示注释
    4. 每条指令都会创建一个新的镜像层并且提交
    DockerFile关键字

    FROM:基本上都在DockerFile的第一句话,表示基础镜像,父类镜像

    MAINTAINER: 表示作者的著名信息、时间

    EXPOSE:对外暴露的端口号

    WORKDIR:工作目录,就是当镜像以前台方式运行后,默认进去的目录

    ENV:声明一个变量,后面可以用$使用

    VOLUME: 容器卷

    ADD:将主机内的文件拷贝进镜像目录且自动解压

    RUN:容器build的时候要运行的shell命令。

    CMD:容器在启动之后要执行的命令。如果DockerFile中有多个CMD指令,那么只有最后一个生效,而且如果在docker run 后面有参数,那么CMD的指令还会被参数替换。

    ENTRYPOINT: 也是在容器在启动之后要执行的命令。但是ENTRYPOINT的指令不会被参数替换,一般ENTRYPOINT配合CMD来传参。

    编写好DockerFile,如何构建镜像
    docker build -t 新镜像的名称:tag .
    
    • 1

    注意点:最后有一个点。

    10.Docker网络

    docker网络就是每个容器所运行起来的内部的网络。

    docker网络有三种模式

    1. bridge

    2. host

    3. none

      什么意思呢?1.桥接模式,docker在安装之后会虚拟Docker_0网卡,而这个网卡可以与容器内的网络一一配对,相当于交换机一样。

      ​ 2.主机模式,容器会借用宿主机的网卡,实现内外通信、所以如果使用主机模式,就不能指定端口号。

      ​ 3.none,只是有个名字在,内部的网关和ip地址都没有指定。

      查看所有的网络名称

      docker network ls
      
      • 1

      我们启动容器时会默认使用bridge模式,也是使用最多的模式。

      我们启动两个容器互相ping是可以ping通的,但是我们平时不可能写死ip,因为容器在停止后再重新启动ip地址会更换。

      所以我们尝试

      ping 容器名
      
      • 1

      发现ping不通。

      所以我们自定义网络名称

      docker network create 网络名称
      
      • 1

      其实我们自定义网络名称也是使用bridge桥接模式,但是docker内部帮我们维护好了容器名称与ip的对应关系

      在启动容器时,指定网络名称之后就可以通过容器名称互相访问了。

      docker run -it --net 网络名称 镜像ID
      
      • 1

      11.Docker-Compose容器编排

      通过上面,如果当容器很多的时候,比如有20个,20个全部都要启动,并且对启动的顺序有要求时,我们一步步去敲命令太麻烦。

      于是docker-compose出现,

      一键启动所有容器,一键关闭所有容器。

      其实就是一个docker-compose.yml配置文件

      version: "3"
      services:
      
        redis:
          image: redis:alpine
          ports:
            - "6379"
          networks:
            - frontend
          deploy:
            replicas: 2
            update_config:
              parallelism: 2
              delay: 10s
            restart_policy:
              condition: on-failure
      
        db:
          image: postgres:9.4
          volumes:
            - db-data:/var/lib/postgresql/data
          networks:
            - backend
          deploy:
            placement:
              constraints: [node.role == manager]
      
        vote:
          image: dockersamples/examplevotingapp_vote:before
          ports:
            - 5000:80
          networks:
            - frontend
          depends_on:
            - redis
          deploy:
            replicas: 2
            update_config:
              parallelism: 2
            restart_policy:
              condition: on-failure
      
        result:
          image: dockersamples/examplevotingapp_result:before
          ports:
            - 5001:80
          networks:
            - backend
          depends_on:
            - db
          deploy:
            replicas: 1
            update_config:
              parallelism: 2
              delay: 10s
            restart_policy:
              condition: on-failure
      
        worker:
          image: dockersamples/examplevotingapp_worker
          networks:
            - frontend
            - backend
          deploy:
            mode: replicated
            replicas: 1
            labels: [APP=VOTING]
            restart_policy:
              condition: on-failure
              delay: 10s
              max_attempts: 3
              window: 120s
            placement:
              constraints: [node.role == manager]
      
        visualizer:
          image: dockersamples/visualizer:stable
          ports:
            - "8080:8080"
          stop_grace_period: 1m30s
          volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
          deploy:
            placement:
              constraints: [node.role == manager]
      
      networks:
        frontend:
        backend:
      
      volumes:
        db-data:
      
      • 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
      docker-compose up

      用于部署一个 Compose 应用。

      默认情况下该命令会读取名为 docker-compose.yml 或 docker-compose.yaml 的文件。

      当然用户也可以使用 -f 指定其他文件名。通常情况下,会使用 -d 参数令应用在后台启动。

      docker-compose stop

      停止 Compose 应用相关的所有容器,但不会删除它们。

      被停止的应用可以很容易地通过 docker-compose restart 命令重新启动。

      docker-compose rm

      用于删除已停止的 Compose 应用。

      它会删除容器和网络,但是不会删除卷和镜像。

      docker-compose restart

      重启已停止的 Compose 应用。

      如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。

      docker-compose ps

      用于列出 Compose 应用中的各个容器。

      输出内容包括当前状态、容器运行的命令以及网络端口。

      docker-compose down

      停止并删除运行中的 Compose 应用。

      它会删除容器和网络,但是不会删除卷和镜像。

      停止 Compose 应用相关的所有容器,但不会删除它们。

      被停止的应用可以很容易地通过 docker-compose restart 命令重新启动。

      docker-compose rm

      用于删除已停止的 Compose 应用。

      它会删除容器和网络,但是不会删除卷和镜像。

      docker-compose restart

      重启已停止的 Compose 应用。

      如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。

      docker-compose ps

      用于列出 Compose 应用中的各个容器。

      输出内容包括当前状态、容器运行的命令以及网络端口。

      docker-compose down

      停止并删除运行中的 Compose 应用。

      它会删除容器和网络,但是不会删除卷和镜像。

  • 相关阅读:
    Go语言 接口与类型
    【Git】提交代码的完整流程
    Vue学习:实现用户没有登陆时,访问后自动跳转登录页面
    从0开始学汇编第二天:寄存器(CPU工作原理)
    如何快速新建多个不同名称文件夹?
    react hooks useMemo
    Redis系列之什么是布隆过滤器?
    【Linux进程篇】Linux中的等待机制与替换策略
    Redis知识-实战篇(1)
    查看自己显卡支持的最高CUDA版本,和已安装的CUDA版本
  • 原文地址:https://blog.csdn.net/nanci9/article/details/124902206