zoukankan      html  css  js  c++  java
  • knowledge_docker

    1 Docker概览

    1.1 Docker 简介

    什么是Docker

    Docker是开发,运行和部署应用程序的开放管理平台。

    • 开发人员能利用docker 开发和运行应用程序

    • 运维人员能利用docker 部署和管理应用程序

      Docker平台介绍 (The Docker platform)

    • Docker提供了在一个完全隔离的环境中打包和运行应用程序的能力,这个隔离的环境被称为容器。

    • 由于容器的隔离性和安全性,因此可以在一个主机(宿主机)上同时运行多个相互隔离的容器,互不干预。

    • Docker已经提供工具和组件(Docker Client、Docker Daemon等)来管理容器的生命周期:

      • 使用容器来开发应用程序及其支持组件。
      • 容器成为分发和测试你的应用程序的单元。
      • 准备好后,将您的应用程序部署到生产环境中,作为容器或协调服务。无论您的生产环境是本地数据中心,云提供商还是两者的混合,这都是一样的。

    为什么使用Docker?

    • Docker使您能够将应用程序与基础架构分开,以便您可以快速交付软件。
    • 借助Docker,您可以像管理应用程序一样管理基础架构。
    • 通过利用Docker的方法快速进行运输,测试和部署代码,您可以显着缩短编写代码和在生产环境中运行代码之间的延迟。
    • 如:
      • 开发人员在本地编写代码,可以使用Docker同事进行共享,实现协同工作。
      • 使用Docker开发完成程序,可以直接对应用程序执行自动和手动测试。
      • 当开发人员发现错误或BUG时,可以直接在开发环境中修复后,并迅速将它们重新部署到测试环境进行测试和验证。
      • 利用Docker开发完成后,交付时,直接交付Docker,也就意味着交付完成。后续如果有提供修补程序或更新,需要推送到生成环境运行起来,也是一样的简单。
    • Docker主要解决的问题:
      • 保证程序运行环境的一致性;
      • 降低配置开发环境、生产环境的复杂度和成本;
      • 实现程序的快速部署和分发。

    1.2 Docker 整体结构了解

    Docker引擎介绍 (Docker Engine)

    • Docker Engine是一个包含以下组件的客户端-服务端(C/S)应用程序
      • 服务端 --- 一个长时间运行的守护进程(Docker Daemon)
      • REST API --- 一套用于与Docker Daemon通信并指示其执行操作的接口
      • 客户端 --- 命令行接口CLI( Command Line Interface)
    • CLI利用Docker命令通过REST API直接操控Docker Daemon执行操作
    • Docker Daemon负责创建并管理Docker的对象(镜像、容器、网络、数据卷)

    Docker结构概览图

    Docker结构简介

    • Docker客户端(Docker Client)
      • Docker客户端(Docker Client)是用户与Docker进行交互的最主要方式。当在终端输入docker命令时,对应的就会在服务端产生对应的作用,并把结果返回给客户端。Docker Client除了连接本地服务端,通过更改或指定DOCKER_HOST连接进程服务端。
    • Docker服务端(Docker Server)
      • Docker Daemon其实就是Docker 的服务端。它负责监听Docker API请求(如Docker Client)并管理Docker对象(Docker
        Objects),如镜像、容器、网络、数据卷等
    • Docker Registries
      • 俗称Docker仓库,与门用于存储镜像的于服务环境.
      • Docker Hub就是一个公有的存放镜像的地方,类似Github存储代码文件。同样的也可以类似Github那样搭建私有的仓库。
    • Docker 对象(Docker Objects)
      • 镜像:一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。
      • 容器:镜像被运行起来后的实例。
      • 网络:外部或者容器间如何互相访问的网络方式,如host模式、bridge模式。
      • 数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。

    1.3 Docker 底层技术了解

    Docker底层使用的技术介绍(一)

    • Docker使用Go语言实现。
    • Docker利用linux内核的几个特性来实现功能:
      • 利用linux的命名空间(Namespaces)
      • 利用linux控制组(Control Groups)
      • 利用linux的联合文件系统(Union File Systems)
        这也就意味着Docker只能在linux上运行。
        在windows、MacOS上运行Docker,其实本质上是借助了虚拟化技术,然后在linux虚拟机上运行的Docker程序。
    • 容器格式(Container Format):
      • Docker Engine将namespace、cgroups、UnionFS进行组合后的一个package,就是一个容器格式(Container Format)。
        Docker通过对这个package中的namespace、cgroups、UnionFS进行管理控制实现容器的创建和生命周期管理。
      • 容器格式(Container Format)有多种,其中Docker目前使用的容器格式被称为libcontainer

    Docker底层使用的技术介绍(二)

    • Namespaces(命名空间):为Docker容器提供操作系统层面的隔离
      • 进程号隔离:每一个容器内运行的第一个进程,进程号总是从1开始起算
      • 网络隔离:容器的网络与宿主机或其他容器的网络是隔离的、分开的,也就是相当于两个网络
      • 进程间通隔离:容器中的进程与宿主机或其他容器中的进程是互相不可见的,通信需要借助网络
      • 文件系统挂载隔离: 容器拥有自己单独的工作目录
      • 内核以及系统版本号隔离:容器查看内核版本号或者系统版本号时,查看的是容器的,而非宿主机的
    • Control Groups(控制组-cgroups):为Docker容器提供硬件层面的隔离
      • 控制组能控制应用程序所使用的硬件资源。
      • 基于该性质,控制组帮助docker引擎将硬件资源共享给容器使用,并且加以约束和限制。如控制容器所使用的内存大小。
    • Union Systems(联合文件系统--UnionFS):利用分层(layer)思想管理镜像和容器

    1.4 总结

    重点掌握Docker以下组件或对象直接的关系

    • Docker Client CLI
    • Docker Daemon(Docker server)
    • Docker Objects
    • Registry

    了解以下列出的Docker使用的底层技术

    • Namespaces
    • Control Groups
    • Union File Systems
    • Container Format

    2 Docker版本与安装介绍

    2.1 Docker-CE 和 Docker-EE

    • Docker-CE指Docker社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用。
    • Docker-EE指Docker企业版,为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和IT团队而设计。 相比Docker-CE,增加一些额外功能,更重要的是提供了更安全的保障。
    • 此外,Docker的发布版本分为Stable版和Edge版,区别在于前者是按季度发布的稳定版(发布慢),后者是按月发布的边缘版(发布快)。
    • 通常情况下,Docker-CE足以满足我们的需求。后面学习主要针对Docker-CE进行学习。

    2.2 Centos 上安装 Docker-CE

    2.3 Ubuntu 上安装 Docker-CE

    2.4 Windows /MacOS 上安装 Docker-CE

    加速器配置

    • 为什么使用加速器:
      • 配置Docker加速器,将会提升在国内获取Docker官方镜像的速度,否则后面下载镜像的过程会很慢,甚至有可能无法下载镜像
    • 配置阿里云加速器

    2.5 总结


    3 Docker核心技术之镜像

    3.1 镜像简介

    • 镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。
    • 通过镜像可以创建一个或多个容器。

    3.2 镜像管理

    镜像搜索 - docker search

    • 作用:
      搜索Docker Hub(镜像仓库)上的镜像
    • 命令格式:
      docker search [OPTIONS] TERM
    • 命令参数(OPTIONS):
      -f, --filter filter 根据提供的栺式筛选结果
      --format string 利用Go语言的format栺式化输出结果
      --limit int 展示最大的结果数,默认25个
      --no-trunc 内容全部显示
    • 命令演示:

    镜像查看 - docker images/docker image ls

    • 作用:
      列出本地镜像
    • 命令格式:
      docker images [OPTIONS] [REPOSITORY[:TAG]]
      或者 docker image ls [OPTIONS] [REPOSITORY[:TAG]]
    • 命令参数(OPTIONS):
      -a, --all 展示所有镜像 (默认隐藏底层的镜像)
      --no-trunc 不缩略显示
      -q, --quiet 只显示镜像ID
    • 命令演示:

    镜像下载 - docker pull

    • 作用:
      下载远程仓库(如Docker Hub)中的镜像
    • 命令格式:
      docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    • 命令参数(OPTIONS):
      -a, --all-tags 下载所有符合给定tag的镜像
    • 命令演示:

    镜像删除 - docker rmi/docker image rm

    • 作用:
      将本地的一个或多个镜像删除
    • 命令格式:
      docker rmi [OPTIONS] IMAGE [IMAGE...]
      或者 docker image rm [OPTIONS] IMAGE [IMAGE...]
    • 命令参数(OPTIONS):
      -f, --force 强制删除
    • 命令演示:

    镜像保存备份 – docker save

    • 作用:
      将本地的一个或多个镜像打包保存成本地tar文件(输出到STDOUT)
    • 命令格式:
      docker save [OPTIONS] IMAGE [IMAGE...]
    • 命令参数(OPTIONS):
      -o, --output string 指定写入的文件名和路径
    • 命令演示:

    镜像备份导入 - docker load

    • 作用:
      将save命令打包的镜像导入本地镜像库中
    • 命令格式:
      docker load [OPTIONS]
    • 命令参数(OPTIONS):
      -i, --input string 指定要打入的文件,如没有指定,默认是STDIN
      -q, --quiet 不打印导入过程信息
    • 命令演示:

    镜像重命名 – docker tag

    • 作用:
      对本地镜像的NAME、TAG进行重命名,并新产生一个命名后镜像
    • 命令格式:
      docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
    • 命令参数(OPTIONS):
    • 命令演示:

    镜像详细信息 – docker image inspect/docker inspect

    • 作用:
      查看本地一个或多个镜像的详细信息
    • 命令格式:
      docker image inspect [OPTIONS] IMAGE [IMAGE...]
      或者 docker inspect [OPTIONS] IMAGE [IMAGE...]
    • 命令参数(OPTIONS):
      -f, --format string 利用特定Go语言的format栺式输出结果
    • 命令演示:

    镜像历史信息 – docker history

    • 作用:
      查看本地一个镜像的历史(历史分层)信息
    • 命令格式:
      docker history [OPTIONS] IMAGE
    • 命令参数(OPTIONS):
      -H, --human 将创建时间、大小进行优化打印(默认为true)
      -q, --quiet 只显示镜像ID
      --no-trunc 不缩略显示
    • 命令演示:

    3.3 总结

    4 Docker核心技术之容器

    4.1 容器简介

    什么是容器

    容器(Container):容器是一种轻量级、可移植、并将应用程序进行的打包的技术,使应用程序可以在几乎任何地方以相同的方式运行

    • Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。
    • 容器具备一定的生命周期。
    • 另外,可以借助docker ps命令查看运行的容器,如同在linux上利用ps命令查看运行着的进程那样。

    4.2 容器与虚拟机

    Docker容器与虚拟机相同点

    • 容器和虚拟机一样,都会对物理硬件资源进行共享使用。
    • 容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)。
    • 容器中或虚拟机中都可以安装各种应用,如redis、mysql、nginx等。也就是说,在容器中的操作,如同在一个虚拟机(操作系统)中操作一样。
    • 同虚拟机一样,容器创建后,会存储在宿主机上:linux上位于/var/lib/docker/containers下

    Docker容器与虚拟机不同点

    注意:容器并不是虚拟机,但它们有很多相似的地方

    • 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运行在宿主机的内核上,其本质上以一系列进程的结合。
    • 容器是轻量级的,虚拟机是重量级的。首先容器不需要额外的资源来管理(不需要Hypervisor、Guest OS),虚拟机额外更多的性能消耗;其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么方便了。
    • 也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把Docker运行在虚拟机上。

    4.3 容器生命周期

    虚拟机的生命周期

    容器的生命周期

    4.4 容器生命周期管理

    容器创建 – docker create

    • 作用:
      利用镜像创建出一个Created 状态的待启动容器
    • 命令格式:
      docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
    • 命令参数(OPTIONS):查看更多
      -t, --tty 分配一个伪TTY,也就是分配虚拟终端
      -i, --interactive 即使没有连接,也要保持STDIN打开
      --name 为容器起名,如果没有指定将会随机产生一个名称
    • 命令参数(COMMANDARG):
      COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
      ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
    • 命令演示:

    容器启动 – docker start

    • 作用:
      将一个或多个处于创建状态或关闭状态的容器启动起来
    • 命令格式:
      docker start [OPTIONS] CONTAINER [CONTAINER...]
    • 命令参数(OPTIONS):
      -a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上
      -i, --interactive 将当前shell的 STDIN连接到容器上
    • 命令演示:

    容器创建并启动 – docker run

    • 作用:
      利用镜像创建并启动一个容器
    • 命令格式:
      docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    • 命令参数(OPTIONS):查看更多
      -t, --tty 分配一个伪TTY,也就是分配虚拟终端
      -i, --interactive 即使没有连接,也要保持STDIN打开
      --name 为容器起名,如果没有指定将会随机产生一个名称
      -d, --detach 在后台运行容器并打印出容器ID
      --rm 当容器退出运行后,自动删除容器
    • 命令参数(COMMANDARG):
      COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
      ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
    • 命令演示:

    docker run 与 docker create + docker start

    • docker run 相当于 docker create + docker start –a 前台模式
    • docker run -d 相当于 docker create + docker start 后台模式

    容器暂停 – docker pause

    • 作用:
      暂停一个或多个处于运行状态的容器
    • 命令格式:
      docker pause CONTAINER [CONTAINER...]
    • 命令参数(OPTIONS):
    • 命令演示:

    容器取消暂停 – docker unpause

    • 作用:
      取消一个或多个处于暂停状态的容器,恢复运行
    • 命令格式:
      docker unpause CONTAINER [CONTAINER...]
    • 命令参数(OPTIONS):
    • 命令演示:

    容器关闭 – docker stop

    • 作用:
      关闭一个或多个处于暂停状态或者运行状态的容器
    • 命令格式:
      docker stop [OPTIONS] CONTAINER [CONTAINER...]
    • 命令参数(OPTIONS):
      -t, --time int 关闭前,等待的时间,单位秒(默认 10s)
    • 命令演示:

    容器终止 – docker kill

    • 作用:
      强制并立即关闭一个或多个处于暂停状态或者运行状态的容器
    • 命令格式:
      docker kill [OPTIONS] CONTAINER [CONTAINER...]
    • 命令参数(OPTIONS):
      -s, --signal string 指定发送给容器的关闭信号 (默认“KILL”信号)
    • 命令演示:

    docker stop和docker kill的区别

    • 前提知识点:
      • Linux其中两种终止进程的信号是:SIGTERM和SIGKILL
      • SIGKILL信号:无条件终止进程信号。进程接收到该信号会立即终止,不进行清理和暂存工作。该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法。
      • SIGTERM信号:程序终结信号,可以由kill命令产生。与SIGKILL不同的是,SIGTERM信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等。
    • docker stop 会先发出SIGTERM信号给进程,告诉进程即将会被关闭。在-t指定的等待时间过了之后,将会立即发出SIGKILL信号,直接关闭容器。
    • docker kill 直接发出SIGKILL信号关闭容器。但也可以通过-s参数修改发出的信号。
      因此会发现在docker stop的等过过程中,如果终止docker stop的执行,容器最终没有被关闭。而docker
      kill几乎是立刻发生,无法撤销。(??? 视频中的实际测试,不是这样的,docker stop,尽管提前ctrl + c 终止了,但是容器还是在10秒后关闭了)
    • 此外还有些异常原因也会导致容器被关闭,比如docker daemon重启、容器内部进程运行发生错误等等“异常原因”。

    容器重启 – docker restart

    • 作用:
      重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器
      该命令相当于stop和start命令的结合
    • 命令格式:
      docker restart [OPTIONS] CONTAINER [CONTAINER...]
    • 命令参数(OPTIONS):
      -t, --time int 重启前,等待的时间,单位秒(默认 10s)
      实则是关闭前等待的时间

    容器删除 – docker container rm

    • 作用:
      删除一个或多个容器
    • 命令格式:
      docker container rm [OPTIONS] CONTAINER [CONTAINER...]
      或者 docker rm [OPTIONS] CONTAINER [CONTAINER...]
    • 命令参数(OPTIONS):
      -f, --force 强行删除容器(会使用 SIGKILL信号)
      -v, --volumes 同时删除绑定在容器上的数据卷
    • 命令演示:

    4.5 容器信息查看

    容器详细信息 – docker container inspect

    • 作用:
      查看本地一个或多个容器的详细信息

    • 命令格式:
      docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
      或者 docker inspect [OPTIONS] CONTAINER [CONTAINER...]

    • 命令参数(OPTIONS):
      -f, --format string 利用特定Go诧言的format格式输出结果
      -s, --size 显示总大小
      eg1. root@asus:~# docker container inspect -f "{{.NetworkSettings.Networks.bridge}}"
      centos-bash
      eg2. root@asus:~# docker container inspect -f "{{json .NetworkSettings.Networks.bridge}}" centos-bash

    • 命令演示:

    容器日志信息 – docker logs

    • 作用:
      查看容器的日志信息
    • 命令格式:
      docker logs [OPTIONS] CONTAINER
    • 命令参数(OPTIONS):
      --details 显示日志的额外信息
      -f, --follow 动态跟踪显示日志信息
      --since string 只显示某事时间节点之后的
      --tail string 显示倒数的行数(默认全部)
      -t, --timestamps 显示timestamps时间
      --until string 只显示某事时间节点之前的
    • 注意:
      容器日志中记录的是容器主进程的输出STDOUTSTDERR

    容器重命名 – docker rename

    • 作用:
      修改容器的名称
    • 命令格式:
      docker rename CONTAINER NEW_NAME
    • 命令参数(OPTIONS):

    4.6 容器运行时操作

    容器连接 – docker attach

    • 作用:
      将当前终端的STDIN、STDOUT、STDERR绑定到正在运行的容器的主进程上实现连接
    • 命令格式:
      docker attach [OPTIONS] CONTAINER
    • 命令参数(OPTIONS):
      --no-stdin 不绑定STDIN

    容器中执行新命令 – docker exec

    • 作用:
      在容器中运行一个命令
    • 命令格式:
      docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    • 命令参数(OPTIONS):
      -d, --detach 后台运行命令
      -i, --interactive 即使没连接容器,也将当前的STDIN绑定上
      -t, --tty 分配一个虚拟终端
      -w, --workdir string 指定在容器中的工作目录
      -e, --env list 设置容器中运行时的环境变量

    4.7 容器总结

    5 Docker核心技术之容器与镜像

    5.1 Docker的容器与镜像

    Docker容器与镜像的关系

    容器提交 – docker commit

    • 作用:
      根据容器生成一个新的镜像
    • 命令格式:
      docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    • 命令参数(OPTIONS):
      -a, --author string 作者
      -c, --change list 为创建的镜像加入Dockerfile命令
      -m, --message string 提交信息,类似git commit -m
      -p, --pause 提交时暂停容器 (default true)
    • 命令演示:

    容器导出 – docker export

    • 作用:
      将容器当前的文件系统导出成一个tar文件
    • 命令格式:
      docker export [OPTIONS] CONTAINER
    • 命令参数(OPTIONS):
      -o, --output string 指定写入的文件,默认是STDOUT

    容器打包的导入 – docker import

    • 作用:
      从一个tar文件中导入内容创建一个镜像
    • 命令格式:
      docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
    • 命令参数(OPTIONS):
      -c, --change list 为创建的镜像加入Dockerfile命令
      -m, --message string 导入时,添加提交信息
      eg. docker import test-container2.backup centos-test-container2:v1
      注:后缀名不一定要是.tar

    5.2 深入理解Docker的容器与镜像

    镜像的Layer

    镜像的视角

    容器的Layer

    容器的视角

    容器与镜像的底层关系

    容器的运行

    5.3 总结

    6 Docker核心技术之网络管理

    6.1 Docker 网络管理简介

    为什么需要Docker网络管理

    容器的网络默认与宿主机、与其他容器都是相互隔离。

    • 容器中可以运行一些网络应用(如nginx、web应用、数据库等),如果要让外部也可以访问这些容器内运行的网络应
      用,那么就需要配置网络来实现。
    • 有可能有的需求下,容器不想让它的网络与宿主机、与其他容器隔离。
    • 有可能有的需求下,容器根本不需要网络。
    • 有可能有的需求下,容器需要更高的定制化网络(如定制特殊的集群网络、定制容器间的局域网)。
    • 有可能有的需求下, 容器数量特别多,体量很大的一系列容器的网络管理如何
    • ……
      因此容器的网络管理是非常重要的

    Docker中有哪些网络驱动模式

    Docker有五种网络驱动模式

    • bridge network 模式(网桥):默认的网络模式。类似虚拟机的nat模式
    • host network 模式(主机):容器与宿主机之间的网络无隔离,即容器直接使用宿主机网络
    • None network 模式:容器禁用所有网络。
    • Overlay network 模式(覆盖网络): 利用VXLAN实现的bridge模式
    • Macvlan network 模式:容器具备Mac地址,使其显示为网络上的物理设备

    6.2 Docker 网络管理命令

    查看网络 – docker network ls

    • 作用:
      查看已经建立的网络对象
    • 命令格式:
      docker network ls [OPTIONS]
    • 命令参数(OPTIONS):
      -f, --filter filter 过滤条件(如 'driver=bridge’)
      --format string 栺式化打印结果
      --no-trunc 不缩略显示
      -q, --quiet 只显示网络对象的ID
    • 注意:
      默认情况下,docker安装完成后,会自动创建bridge、host、none三种网络驱动
    • 命令演示:

    创建网络 – docker network create

    • 作用:
      创建新的网络对象
    • 命令格式:
      docker network create [OPTIONS] NETWORK
    • 命令参数(OPTIONS):
      -d, --driver string 指定网络的驱动(默认 "bridge")
      --subnet strings 指定子网网段(如192.168.0.0/16、172.88.0.0/24)
      --ip-range strings 执行容器的IP范围,栺式同subnet参数
      --gateway strings 子网的IPv4 or IPv6网关,如(192.168.0.1)
    • 注意:
      host和none模式网络只能存在一个
      docker自带的overlay网络创建依赖于docker swarm(集群负载均衡)服务
      192.168.0.0/16 等于 192.168.0.0~192.168.255.255 192.168.8.0/24
      172.88.0.0/24 等于 172.88.0.0~172.88.0.255
    • 命令演示:

    网络删除 – docker network rm

    • 作用:
      删除一个或多个网络
    • 命令格式:
      docker network rm NETWORK [NETWORK...]
    • 命令参数(OPTIONS):

    查看网络详细信息 – docker network inspect

    • 作用:
      查看一个或多个网络的详细信息
    • 命令格式:
      docker network inspect [OPTIONS] NETWORK [NETWORK...]
      或者 docker inspect [OPTIONS] NETWORK [NETWORK...]
    • 命令参数(OPTIONS):
      -f, --format string 根据format输出结果

    使用网络 – docker run --network

    • 作用:
      为启动的容器指定网络模式
    • 命令格式:
      docker run/create --network NETWORK
    • 命令参数(OPTIONS):
    • 注意:
      默认情况下,docker创建或启动容器时,会默认使用名为bridge的网络

    网络连接与断开 – docker network connect/disconnect

    • 作用:
      将指定容器与指定网络进行连接或者断开连接
    • 命令格式:
      docker network connect [OPTIONS] NETWORK CONTAINER
      docker network disconnect [OPTIONS] NETWORK CONTAINER
    • 命令参数(OPTIONS):
      -f, --force 强制断开连接(用于disconnect)

    6.3 Docker 网络模式简介

    bridge 网络模式(一)

    特点:

    • 宿主机上需要单独的bridge网卡,如默认docker默认创建的docker0。
    • 容器之间、容器与主机之间的网络通信,是借助为每一个容器生成的一对veth pair虚拟网络设备对,进行通信的。一个在容器上,另一个在宿主机上。
    • 每创建一个基于bridge网络的容器,都会自动在宿主机上创建一个veth**虚拟网络设备。
    • 外部无法直接访问容器。需要建立端口映射才能访问。
    • 容器借由veth虚拟设备通过如docker0这种bridge网络设备进行通信。
    • 每一容器具有单独的IP

    bridge 网络模式(二) – 端口映射

    • 作用:
      启动的容器时,为容器进行端口映射
    • 命令格式:
      docker run/create -P …
      或者 docker run/create –p …
    • 命令参数(OPTIONS):
      -P, --publish-all 将容器内部所有暴露端口进行随机映射
      -p, --publish list 手动指定端口映射
    • 注意:
      -p [HOST_IP]:[HOST_PORT]:CONTAINER_PORT
      如:-p ::80 将容器的80端口随机(端口)映射到宿主机任意IP
      -p :8000:6379 将容器的6379端口映射到宿主机任意IP的8000端口
      -p 192.168.5.1::3306将容器的3306端口随机(端口)映射到宿主机的192.168.5.1 IP上

    host 网络模式

    特点:

    • 容器完全共享宿主机的网络。网络没有隔离。宿主机的网络就是容器的网络。
    • 容器、主机上的应用所使用的端口不能重复。
      例如:如果宿主机已经占用了8090端口,那么任何一个host模式的容器都不可以使用8090端口了;反之同理。
    • 外部可以直接访问容器,不需要端口映射。
    • 容器的IP就是宿主机的IP

    特殊host 网络模式(Container网络模式)

    • Container网络模式,其实就是容器共享其他容器的网络。
    • 相当于该容器,,在网络层面上,将其他容器作为“主机”。它们之间的网络没有隔离。
    • 这些容器之间的特性同host模式。
      使用方法:
      Docker run/create --network container:CONTAINER …

    none 网络模式

    特点:

    • 容器上没有网络,也无任何网络设备。
    • 如果需要使用网络,需要用户自行安装不配置。
      应用场景
    • 该模式适合需要高度定制网络的用户使用。

    overlay 网络模式(一)

    • Overlay 网络,也称为覆盖网络。
    • Overlay 网络的实现方式和方案有多种。Docker自身集成了一种,基于VXLAN隧道技术实现。
    • Overlay 网络主要用于实现跨主机容器之间的通信。
      应用场景:需要管理成百上千个跨主机的容器集群的网络时。

    overlay 网络模式(二)- 了解TCP/IP协议栈

    overlay 网络模式(三)- 实现原理
    IP隧道网络原理

    macvlan 网络模式

    • macvlan网络模式,最主要的特征就是他们的通信会直接基于mac地址进行转发。
    • 这时宿主机其实充当一个二层交换机。Docker会维护着一个MAC地址表,当宿主机网络收到一个数据包后,直接根据mac地址找到对应的容器,再把数据交给对应的容器。
    • 容器之间可以直接通过IP互通,通过宿主机上内建的虚拟网络设备(创建macvlan网络时自动创建),但与主机无法直接利用IP互通。
      应用场景:由于每个外来的数据包的目的mac地址就是容器的mac地址,这时每个容器对于外面网络来说就相当于一个真实的物理网络设备。因此当需要让容器来的网络看起来是一个真实的物理机时,使用macvlan模式

    6.4 总结

    重点掌握:

    • bridge网络、host网络、Container网络模式的原理和使用(应用得较多,且host网络性能最优)。
    • docker network命令的使用

    了解:

    • none网络的效果
    • overlay网络、macvlan网络的原理。(使用起来难度较大)

    7 Docker核心技术之数据管理

    7.1 Docker 数据卷简介

    为什么用数据卷

    • 宿主机无法直接访问容器中的文件
    • 容器中的文件没有持久化,导致容器删除后,文件数据也随之消失
    • 容器之间也无法直接访问互相的文件

    为解决这些问题,docker加入了数据卷(volumes)机制,能很好解决上面问题,以实现:

    • 容器与主机之间、容器与容器之间共享文件
    • 容器中数据的持久化
    • 将容器中的数据备份、迁移、恢复等

    数据卷的特点

    • 数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的。
    • 数据卷可以是目录也可以是文件,容器可以利用数据卷和宿主机进行数据共享,实现了容器间的数据共享和交换。
    • 容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中。
    • 容器对数据卷的修改是实时进行的。
    • 数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。

    7.2 Docker 数据卷管理

    Docker挂载容器数据卷的三种方式

    • bind mounts:将宿主机上的一个文件或目录被挂载到容器上。
    • volumes:由Docker创建和管理。使用docker volume命令管理
    • tmpfs mounts:tmpfs 是一种基于内存的临时文件系统。tmpfs mounts 数据不会存储在磁盘上。

    bind mounts方式挂载数据卷

    • 利用docker run/create的参数为容器挂载数据卷
    • 用法:
      方式一: -v, --volume参数
      -v 宿主机文件或文件夹路径:容器中的文件或者文件夹路径
      方式二:--mount参数
      --mount type=bind, src=宿主机文件或文件夹路径, dst=容器中的文件或者文件夹路径
      注意:1、src指定的文件和路径必须提前创建或存在;2、-v中的宿主机文件或文件夹路径可以省略,--mount中的src参数可以省略,表示创建一个随机字符串名称的volume
    • 命令演示:

    volumes方式挂载数据卷

    • 利用docker run/create为容器挂载数据卷
    • 用法:
      方式一: -v, --volume参数
      -v VOLUME-NAME:容器中的文件或者文件夹路径
      方式二:--mount 参数
      --mount type=volume, src=VOLUME-NAME, dst=容器中的文件或者文件夹路径
    • volume对象管理:
      docker volume 命令管理volume数据卷对象
      docker volume create 创建数据卷对象
      docker volume inspect 查看数据卷详细信息
      docker volume ls 查看已创建的数据卷对象
      docker volume prune 删除未被使用的数据卷对象
      docker volume rm 删除一个或多个数据卷对象

    tmpfs mount方式挂载数据卷

    • 利用docker run/create为容器挂载数据卷
    • 用法:
      --mount type=tmpfs, dst=PATH

    共享其他容器的数据卷-数据卷容器

    • 利用docker run/create 的--volumes-from参数指定数据卷容器
    • 用法:
      docker run/create --volumes-from CONTAINER

    7.3 Docker 数据卷注意事项

    数据卷使用注意

    Docker的数据卷更多会是使用volumes方式来进行使用。使用时需注意:

    • 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。
    • 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。

    这两个规则都非常重要,灵活利用第一个规则可以帮助我们初始化数据卷中的内容。掌握第二个规则可以保证挂载数据卷后的数据总是你期望的结果。

    7.4 总结

    重点掌握

    • 数据卷特征和简介
    • mount方式绑定数据卷
    • 数据卷挂载的三种形式
    • 数据卷使用的注意事项

    8 Docker核心技术之仓库

    8.1 Docker 仓库简介

    什么是Docker仓库

    • Docker仓库就是存放docker镜像并有docker pull方法下载的云环境
    • Docker仓库分为公有仓库和私有仓库。
      • 公有仓库指Docker Hub(官方)等开放给用户使用、允许用户管理镜像。
      • 私有仓库指由用户自行搭建的存放镜像的云环境。

    8.2 Docker 私有仓库搭建

    搭建无认证私有仓库

    • 第一步:在需要搭建仓库的服务器上安装docker。
    • 第二步:在服务器上,从docker hub下载registry仓库
      docker pull registry
    • 第三步:在服务器上,启动仓库
    docker run -d -ti --restart always
                      --name my-registry
                      -p 8000:5000
                      -v /my-registry/registry:/var/lib/registry
    registry
    

    注意:

    • registry内部对外开放端口是5000。默认情况下,镜像存放于容器内的
      /var/lib/registry(官网Dockerfile中查看)目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失。
    • 本地利用curl 服务器IP:8000/v2/_catalog 查看当前仓库中的存放的镜像列表。(注意打开8000端口访问)
    • -v /my-registry/registry:/var/lib/registry 其中,/my-registry/registry可变可以自主决定,/var/lib/registry不能变。

    私有仓库--上传、下载镜像

    • 第一步:docker tag重命名需要上传的镜像
      docker tag IMAGE 服务器IP:端口/IMAGE_NAME
      eg. docker tag docker.elastic.co/elasticsearch/elasticsearch lenovo:8000/docker.elastic.co/elasticsearch/elasticsearch
    • 第二步:docker push上传刚刚重命名的镜像
      docker push 服务器IP:端口/centos
      eg. docker push lenovo:8000/docker.elastic.co/elasticsearch/elasticsearch
    • 第三步:查看私有仓库中的镜像信息
      • 查看镜像列表
        1.命令行方式:curl [-u] root lenovo:8000/v2/_catalog
        2.直接在浏览器中输入:lenovo:8000/v2/_catalog
      • 查看某个镜像的tags列表(注意,url中的特殊字符可以转义表示,如 /%2F 表示)
    root@asus:~# curl -u root lenovo:8000/v2/docker.elastic.co%2Felasticsearch%2Felasticsearch/tags/list
    Enter host password for user 'root':
    {"name":"docker.elastic.co/elasticsearch/elasticsearch","tags":["7.5.2"]}
    
    • 第四步:docker pull下载私有仓库中的镜像
      docker pull lenovo:8000/docker.elastic.co/elasticsearch/elasticsearch:7.5.2

    注意:

    • 必须重命名为服务器IP:端口/IMAGE_NAME
    • 如果push出现了类似https的错误那么需要往配置文件/etc/docker/daemon.json里添加:"insecure-registries":["服务器IP:端口"] , 然后重启docker。
    • docker pull时,默认tag名称为latest,但是如果私有仓库中的镜像的tag不是latest,则需要带上tag名称。

    搭建带认证的私有仓库(一)

    在服务器上:

    • 第一步:删除先前创建的无认证的仓库容器
      docker rm -f my-registry
    • 第二步:创建存放认证用户名和密码的文件:
      mkdir /my-registry/auth -p
    • 第三步:创建密码验证文件。注意将将USERNAME和PASSWORD替换为设置的用户名和密码
      docker run --entrypoint htpasswd registry -Bbn USERNAME PASSWORD > /my-registry/auth/htpasswd
    • 第四步:重新启动仓库镜像
    docker run -d -p 8000:5000 --restart=always --name docker-registry 
    -v /my-registry/registry:/var/lib/registry 
    -v /my-registry/auth:/auth 
    -e "REGISTRY_AUTH=htpasswd" 
    -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" 
    -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" 
    registry
    

    带认证的私有仓库 -上传、下载镜像

    在本地机器上:

    • 第一步:首先登录到服务器
      docker login -u username -p password 47.94.153.230:8000
    • 第二步:然后执行pull或者push命令
    • 第三步:操作完毕后,可以退出登录
      docker logout 47.94.153.230:8000

    这是如果想查看仓库中已有的镜像,那么需要进行http验证才可以。可以直接借助浏览器访问 47.94.153.230:8000/v2/_catalog就可以访问了。

    注意这里:47.94.153.230指服务器IP

    8.3 总结

    重点掌握:

    • 私有仓库搭建(安全)

    9 Docker核心技术之Dockerfile

    9.1 Dockerfile 简介

    什么是Dockerfile

    • Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件
    • 利用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个新的镜像(定制镜像)

    9.2 Dockerfile 示例与使用

    Dockerfile参考示例

    Dockerfile使用演示 – docker build

    Dockerfile使用命令 – docker build

    • 作用:
      根据dockerfile创建镜像
    • 命令格式:
      docker build [OPTIONS] PATH | URL | -
    • 命令参数:
      PATH Dockerfile所在路径(文件夹路径),文件名必须是Dockerfile
      URL Dockerfile所在URL地址
      OPTIONS:
      -t, --tag list 为镜像设置名称和tag
      -f, --file string 指定Dockerfile的路径(这是可以使用其他名称命名
      Dockerfile)

    9.3 Dockerfile 特征

    Dockerfile 构建特征(一)

    Dockerfile 构建特征(二)

    • Dockerfile必须具备一个FROM命令来进行构建
    • 每一个Dockerfile命令都会构建一层镜像(本质上是每一层都会启动一个容器,执行完命令后,将容器进行提交后,产生新的镜像层)
    • 通过查看下载下来的镜像,发现历史层信息的层ID是missing,其实是因为原本的层id只存在于构建镜像的宿主机上,一旦转移镜像后,历史层消息中将只保留最新一层的ID

    9.4 Dockerfile 命令概述

    Dockerfile 命令概述(一) 查看完整介绍

    • FROM: 指定基础镜像
    • RUN: 构建镜像过程中需要执行的命令。可以有多条。
    • CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改。
    • ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。
    • LABEL:为镜像添加对应的数据。
    • MAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。
    • EXPOSE:设置对外暴露的端口。
    • ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效
    • ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失
    • ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件
    • COPY:将本地文件或目录拷贝到镜像的文件系统中。
    • VOLUME:添加数据卷
    • USER:指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
    • WORKDIR:设置工作目录

    Dockerfile 命令概述(二)

    • ONBUILD:如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令
    • STOPSIGNAL:设置容器退出时发出的关闭信号。
    • HEALTHCHECK:设置容器状态检查。
    • SHELL:更改执行shell命令的程序。Linux的默认shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。

    9.5 总结

    重点掌握:

    • Docker 容器与镜像之间的关系(尤其commit命令的作用和效果)
    • Dockerfile 的书写规则和使用规则

    10 Docker核心技术之Docker compose

    10.1 Docker Compose 简介

    Docker Compose是什么?

    • Docker Compose是一个能一次性定义和管理多个Docker容器的工具。
    • 详细地说:
      Compose中定义和启动的每一个容器都相当于一个服务(service)
      Compose中能定义和启动多个服务,且它们之间通常具有协同关系
    • 管理方式:
      使用YAML文件来配置我们应用程序的服务。
      使用单个命令(docker-compose up),就可以创建并启动配置文件中配置的所有服务。

    Docker Compose 工作原理

    Docker Compose安装

    • Docker for Mac与Docker for Windows自带docker-compose
    • Linux下需要单独安装:
      • 第一步:sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
        (-C - 实现断点续传:curl -C - -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose)

      • 第二步:sudo chmod +x /usr/local/bin/docker-compose
        终端中使用docker-compose --version查看安装的版本
        这里示例安装版本是1.25.3,很可能您看到这里时,已经出现更新的版本,因此建议换成最新版本。查看最新版本

      • 第三步:只要下载,不用安装,即可运行。 确认是否下载成功,同时也是查看其版本的命令:docker-compose --version

    • 官网的详细安装方法查看

    Docker Compose CLI

    • 利用docker-compose --help查看 或者 查看官方文档
    • 对比后会发现:Docker Compose CLI的很多命令的功能和Docker Client CLI是相似的。最主要的区别,就是前者能一次性运行管理多个容器,后者只能一次管理一个。

    10.2 了解 Docker Compose File

    Docker Compose File版本

    • Docker Compose File 有多个版本,基本是向后兼容的,但也有极个别配置项高版本中没有。
    • 在docker-compose.yml一开始就需要利用version关键词标明当前file使用的版本

    Docker Compose File TOP配置参数概览

    Docker Compose File 顶级配置项:

    • version:指定Docker Compose File版本号
    • services:定义多个服务并配置启动参数
    • volumes:声明戒创建在多个服务中共同使用的数据卷对象
    • networks:定义在多个服务中共同使用的网络对象
    • configs:声明将在本服务中要使用的一些配置文件
    • secrets:声明将在本服务中要使用的一些秘钥、密码文件
    • x-***:自定义配置。主要用于复用相同的配置。

    更多详细配置

    Docker Compose File 参考示例

    10.3 Docker Compose 应用

    Docker Compose 案例一 小型web服务项目搭建

    步骤:

    • 搭建一个flask的小型web项目
    • 根据项目环境,利用Dockerfile构建镜像
    • 撰写docker-compose.yaml配置文件,启动项目

    Docker Compose 案例二 单机环境ELK系统搭建(一)

    • ELK工作原理介绍

    Docker Compose 案例二 单机环境ELK系统搭建(二)

    步骤:

    vim docker-compose.yaml
    
    version: '2.2'
    services:
      es01:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
        container_name: es01
        environment:
          - node.name=es01
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es02,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data01:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
        networks:
          - elastic
      es02:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
        container_name: es02
        environment:
          - node.name=es02
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
       ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data02:/usr/share/elasticsearch/data
        networks:
          - elastic
      es03:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
        container_name: es03
        environment:
          - node.name=es03
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es02
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data03:/usr/share/elasticsearch/data
        networks:
          - elastic
      ls01:
        image: docker.elastic.co/logstash/logstash:7.5.2
        container_name: ls01
        environment:
          - XPACK_MONITORING_ELASTICSEARCH_HOSTS=http://es01:9200
          - "LS_JAVA_OPTS=-Xms256m -Xmx256m"
        networks:
          - elastic
        depends_on:
          - es01
          - es02
          - es03
      ls02:
        image: docker.elastic.co/logstash/logstash:7.5.2
        container_name: ls02
        environment:
          - XPACK_MONITORING_ELASTICSEARCH_HOSTS=http://es01:9200
          - "LS_JAVA_OPTS=-Xms256m -Xmx256m"
        networks:
          - elastic
        depends_on:
          - es01
          - es02
          - es03
      kibana:
        image: docker.elastic.co/kibana/kibana:7.5.2
        container_name: kibana
        environment:
          SERVER_NAME: kibana
          SERVER_HOST: 0.0.0.0
          ELASTICSEARCH_HOSTS: http://es01:9200
        ports:
          - "5601:5601"
        networks:
          - elastic
        depends_on:
          - es01
          - es02
          - es03
    volumes:
      data01:
        driver: local
      data02:
        driver: local
      data03:
        driver: local
    
    networks:
      elastic:
        driver: bridge
    
    • 2、注意每次启动ES之前都要调大虚拟内存,执行:
      sudo sysctl -w vm.max_map_count=262144
    • 3、利用 docker-compose up -d 启动环境
    • 4、如何确认是否启动成功:
      • 执行命令 docker ps -a
      • 查看日志 docker-comopose logs -f (注意,一定要先切换到docker-compose.yaml所在目录下,否则无法查看到日志)

    Docker Compose 案例三 多主机环境ELK系统搭建(一)

    • Swarm 介绍
      1. 在当前节点开启/初始化 swarm 服务,并成为leader角色:
    root@asus:~# docker swarm init --advertise-addr 192.168.6.6
    Swarm initialized: current node (l4nd6chop6lbzleuz0kzpye3u) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-0ba9bs9keqa4nkp1q70ehzz59sg5ukvz69gf2cczzcbt5joq56-0utr1sdgobv67jgj69f0g3cxs 192.168.6.6:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    
      1. 加入其他节点的warm,并成为worker角色:
    [root@lenovo ~]# docker swarm join --token SWMTKN-1-0ba9bs9keqa4nkp1q70ehzz59sg5ukvz69gf2cczzcbt5joq56-0utr1sdgobv67jgj69f0g3cxs 192.168.6.6:2377
    This node joined a swarm as a worker.
    
      1. 查看开启swarm的节点(只有leader角色能查看):
    root@asus:~# docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    l4nd6chop6lbzleuz0kzpye3u *   asus                Ready               Active              Leader              19.03.5
    n261xlw3yx1xaic3a8so02dpc     lenovo              Ready               Active                                  19.03.5
    

    Docker Compose 案例三 多主机环境ELK系统搭建(二)

    • 集群版Docker Compose工作原理

    Docker Compose 案例三 多主机环境ELK系统搭建(三)

    步骤

    • 使用docker swarm配置多个docker node集群节点(略,上面已经说明)
    • 配置集群版ELK的docker-compose.yaml文件
    version: '3.6'
    services:
      elasticsearch:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
        environment:
          - node.name=elasticsearch
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=elasticsearch2
          - cluster.initial_master_nodes=elasticsearch,elasticsearch2
          - bootstrap.memory_lock=false
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        volumes:
          - data01:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
        networks:
          - elastic
        deploy:
          placement:
            constraints:
              - node.role == manager
      elasticsearch2:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
        environment:
          - node.name=elasticsearch2
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=elasticsearch
          - cluster.initial_master_nodes=elasticsearch,elasticsearch2
          - bootstrap.memory_lock=false
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        volumes:
          - data02:/usr/share/elasticsearch/data
    networks:
          - elastic
        deploy:
          placement:
            constraints:
              - node.role == worker
      logstash:
        image: docker.elastic.co/logstash/logstash:7.5.2
        environment:
          - LS_JAVA_OPTS=-Xms256m -Xmx256m
        networks:
          - elastic
        deploy:
          replicas: 2
      logstash2:
        image: docker.elastic.co/logstash/logstash:7.5.2
        environment:
          - LS_JAVA_OPTS=-Xms256m -Xmx256m
        networks:
          - elastic
        deploy:
          replicas: 2
      kibana:
        image: docker.elastic.co/kibana/kibana:7.5.2
        ports:
          - "5601:5601"
        networks:
          - elastic
        deploy:
          placement:
          constraints:
              - node.role == manager
    volumes:
      data01:
        driver: local
      data02:
        driver: local
    
    networks:
      elastic:
        driver: overlay
    
    • 注意每次启动ES之前都要调大虚拟内存,执行:
      sudo sysctl -w vm.max_map_count=262144
    • 利用docker stack deploy部署集群版ELK环境
      root@asus:/usr/develop/ideaWs/case3-cluster-elk# docker stack deploy -c docker-compose.yml elk
    • 查看swarm中启动的容器(leader角色才能使用):docker service ls
    • 查看日志(leader角色才能使用): docker service logs elk_elasticsearch -f
    • 删除swarm中的容器:docker stack rm elk

    10.4 总结

  • 相关阅读:
    ebs R12 支持IE11
    reloc: Permission denied
    3.23考试小记
    3.21考试小记
    3.20考试小记
    3.17考试小记
    3.15考试小记
    3.13考试小记
    3.12考试小记
    3.10考试小记
  • 原文地址:https://www.cnblogs.com/mediocreWorld/p/15186171.html
Copyright © 2011-2022 走看看