Docker架构原理及使用


Docker安装与配置

从2017年3月开始,docker分裂为两个分支版本docker CE与docker EE。

Docker CE即社区免费版;

Docker EE即企业版,强调安全,但需付费使用;

Docker采用Linux内核技术,所以docker只能运行在Linux系统上,官网说明要求Linux kernel至少3.8以上版本;

# 移除自带旧版本docker
yum remove docker docker-client  docker-client-latest docker-common  docker-latest docker-latest-logrotate  docker-logrotate docker-selinux  docker-engine-selinux docker-engine

# 安装yum工具包
yum install -y yum-utils

# 配置aliyun yum源地址后通过yum安装docker
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 添加centos原生源信息
[centos-extras]
name=Centos extras - $basearch
baseurl=http://mirror.centos.org/centos/7/extras/x86_64
enabled=1
gpgcheck=1
gpgkey=http://centos.org/keys/RPM-GPG-KEY-CentOS-7

yum makecache fast

# 安装指定版本docker-ce
yum install docker-ce

docker默认安装路径为/var/lib/docker,如果/var没有单独挂载至数据盘,容器出现磁盘空间问题,可将/var/lib/docker目录软链至数据盘规避磁盘空间问题;

常见问题

错误1:安装时提示 Error: Package: docker-ce-rootless-extras-20.10.17-3.el7.x86_64 (docker-ce-stable) Requires: fuse-overlayfs >= 0.7;
解决方案:添加centos原生源地址

Docker网络

Docker默认支持四中网络模式

网络模式 说明
host 容器和宿主机共享Network namespace。
container 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。
bridge (默认为该模式)此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信

默认网络

当安装Docker时,它会自动创建三个网络,即bridge、host和none,通过docker network ls可以查看;docker运行容器时,可以通过—net标志来指定容器网络模式,默认模式为bridge;

Host模式

Host模式相当于vmware虚拟机中的桥接模式,容器与宿主机在同一个网络中,但容器没有独立的IP地址;容器与宿主机共用同一个Network Namespace。容器内部不会虚拟网卡,而是直接使用宿主机的IP和端口。

Host模式可以直接使用宿主机的IP地址与外界进行通信,容器内部服务端口也可以直接使用宿主机端口,不需要进行NAT转发,host网络模式的最大优势是网络性能较好,但网络隔离性较差;

Container模式

Container网络模式指定一个新创建的容器与一个已有容器进行Network Namespace进行共享,而不是与宿主机共享。新创建的容器不会创建自己的网卡,而是与一个已存在的容器进行共享,两个容器的进程可以通过lo网卡设备进行通信;

None模式

None模式下,容器拥有自己的Network Namespace,但是并不会对容器进行任何网络 配置,即容器没有网卡、IP、路由等信息。用户可自行为容器添加网卡、配置IP路由等;

None网络模式下容器仅具有lo回环网络,容器无法联网,但是封闭的网络环境能够很好的保证容器的安全性;

Bridge模式

Bridge模式相当于vmware虚拟机中的nat模式,容器使用独立的Network Namespace,并链接到docker0虚拟网桥上;虚拟网桥的工作模式与物理交换机类似,相当于Bridge模式的容器通过bridge0链接在一个二层网络中。

Bridge网络模式下,容器启动后会在宿主机上创建一堆虚拟网卡veth pair设备,veth pair设配一端位于容器中,作为容器的网卡设备,一般命名为eth0;另一端位于宿主机中,作为网卡设备加入到docker0网桥中,一般以vethxxxx形式命名;

Docker镜像管理

docker官方镜像库地址:https://hub.docker.com/

可在官方镜像仓库按照需要拉取对应仓库基础镜像,启动docker加载镜像后,在官方基础镜像基础上安装所需依赖软件;所有基础环境安装完毕后,可重新保存为新的镜像进行分享或个人存档;

镜像加载

docker默认从hub.docker拉取镜像,如主机环境不通公网,也可自定搭建私有镜像库或直接使用离线文件加载镜像至本地;

  • 官方镜像
docker image pull ubuntu:v1
# ubuntu为仓库名
# v1为标签名,当标签名为latest时可省略
  • 本地镜像

docker import:加载镜像文件时,可自定义镜像名称及标签;

docker load:无法自定义镜像名称及标签;

docker import - ubuntu:20.0.4 < alibaba-ubuntu-20.0.4.tar.gz
# ubuntu为导入后自定义的镜像名
# 20.0.4为导入后的自定义标签名

docker load < alibaba-ubuntu-20.0.4.tar.gz

镜像文件必须为tar.gz格式

镜像保存

docker支持基于容器创建新的镜像,用于备份或分享;

docker commit -a "semon" -m "remark"  ubuntu_vm ubuntu_dev:v2
# ubuntu_vm为容器名 
# ubuntu_dev为镜像名
# v2为标签名

镜像导出

docker支持用户将容器导出或保存为镜像,也支持将镜像导出为本地镜像文件;

  • 容器导出
docker export ubuntu_vm > ubuntu_vm.tar.gz
# ubuntu_vm为容器名,支持容器名或容器ID
# 仅导出当前容器的文件目录

docker save -o docker_con.tar.gz ubuntu_vm
# -o 指定导出本地镜像文件名
# ubuntu_vm为容器名

docker save 保存容器实际上保存的是容器所加载的镜像,与直接保存镜像结果一致;

  • 镜像导出
docker save -o docker_img.tar.gz ubuntu:latest 6fc15b302f3a
# -o指定导出本地镜像文件名
# 支持通过镜像ID或镜像仓库:标签名指定要导出的镜像
# 支持一次性导出多个镜像至同一个文件,多个镜像通过空格分隔

镜像删除

docker rmi

镜像查看

docker images

注意事项

  • docker exportdocker import配套使用,docker savedocker load配套使用;
  • docker export将容器导出为本地文件,实际为linux系统的文件目录,故文件较小,无法回滚历史操作,常用于制作通用环境镜像;
  • docker import仅支持将docker export导出的文件加载为镜像,加载时可自定义镜像名称及标签,如指定的镜像名及标签与已有镜像冲突,则抢占镜像名与标签,已有镜像被抹除镜像名及标签,但镜像仍然存在,可通过镜像ID进行操作;
  • docker save将镜像或指定容器所加载的镜像导出为本地文件,导出的本地文件实际为一个多层文件目录,重新加载后,可回滚历史操作,故文件较大;
  • docker load仅支持将docker save导出的文件加载为镜像,加载后镜像名称与导出镜像保持一致;

Docker常用操作

容器相当于一个小型的虚拟机,而镜像就相当于这个虚拟机的操作系统;

启停容器

启动容器有两种情况,一种是基于镜像新建一个容器并启动,另一种是将终止状态的容器重新启动;

  • 新建容器并启动
docker run --name ubuntu-dev -it -p 8000:8000 -v /opt/wks/versions/app:/opt/wks/app --restart=always --privileged=true  --net net-udf --ip 172.10.0.10 ubuntu:latest /bin/bash
# --name指定启动的容器名称
# -i 打开标准输入,用于控制台交互
# -t 分配tty,支持命令行登陆
# -p 用于指定本地端口与容器端口映射,可用多个-p指定多个端口映射
# -v 指定本地与容器目录映射
# --privileged 指定容器内root真正拥有root权限,否则容器内root仅相当于本地系统的普通用于,无法完整拥有映射目录权限;
# --restart 指定容器终止后的重启策略 always-总是重启 on-failure-故障退出重启  no-不重启
# ubuntu:latest 指定容器加载的镜像
# /bin/bash 指定以/bin/bash登陆容器
# 容器启动后无法再更改宿主机与容器的映射关系

-d, –detach=false, 指定容器运行于前台还是后台,默认为false
-i, –interactive=false, 打开STDIN,用于控制台交互
-t, –tty=false, 分配tty设备,该可以支持终端登录,默认为false
-u, –user=””, 指定容器的用户
-a, –attach=[], 登录容器(必须是以docker run -d启动的容器)
-w, –workdir=””, 指定容器的工作目录
-c, –cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
-e, –env=[], 指定环境变量,容器中可以使用该环境变量
-m, –memory=””, 指定容器的内存上限
-P, –publish-all=false, 指定容器暴露的端口
-p, –publish=[], 指定容器暴露的端口
-h, –hostname=””, 指定容器的主机名
-v, –volume=[], 给容器挂载存储卷,挂载到容器的某个目录
–volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录
–cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
–cap-drop=[], 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
–cidfile=””, 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
–cpuset=””, 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
–device=[], 添加主机设备给容器,相当于设备直通
–dns=[], 指定容器的dns服务器
–dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
–entrypoint=””, 覆盖image的入口点
–env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
–expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
–link=[], 指定容器间的关联,使用其他容器的IP、env等信息
–lxc-conf=[], 指定容器的配置文件,只有在指定–exec-driver=lxc时使用
–name=””, 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
–net=“bridge”,指定容器网络设置:

​ bridge 使用docker daemon指定的网桥

​ host //容器使用主机的网络

​ container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源

​ none 容器使用自己的网络(类似–net=bridge),但是不进行配置

–rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
–sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

  • 启动已有容器
docker start ubuntu-dev
# ubuntu-dev为容器名,也可指定容器ID来启动容器
  • 停止容器
docker stop ubuntu-dev
# ubuntu-dev为容器名,也可指定容器ID来启动容器

登陆容器

  • attach
docker attach ubuntu-dev
# ubuntu-dev为容器名
  • exec
docker exec -it ubuntu-dev

以上两种方式均可登陆容器,但通过attach登陆容器,通过exit退出登陆时,会导致容器停止,建议使用exec进行容器登陆

查看容器

# 查看当前运行中容器
docker ps

# 查看所有状态容器
docker ps -a

# 仅查看容器id
docker ps -a -q

# 查看容器或镜像元数据
docker inspect ubuntu-dev
# 可指定容器名/容器ID/镜像名/镜像ID

删除容器

docker rm ubuntu-dev
# 指定容器名或容器ID均可

小技巧

#批量停止容器
docker stop ${docker ps -a -q}
# 批量删除容器
docker rm ${docker ps -a -q}

创建网络

# 不指定类型默认为bridge模式网络;
docker network create  --subnet=172.10.0.0/16  net_udf;

Docker Compose

Compose是定义和运行多容器Docker应用程序的工具。 使用Compose,您可以使用YAML文件来配置应用程序的服务。 然后,使用单个命令,您可以创建并启动配置中的所有服务。

使用Compose 基本上分为三步:

  1. Dockerfile 定义应用的运行环境
  2. docker-compose.yml 定义组成应用的各服务
  3. docker-compose up 启动整个应用

Docker有很多优势,但对于运维或开发者来说,Docker最大的有点在于它提供了一种全新的发布机制。这种发布机制,指的是我们使用Docker镜像作为统一的软件制品载体,使用Docker容器提供独立的软件运行上下文环境,使用Docker Hub提供镜像统一协作,最重要的是该机制使用Dockerfile定义容器内部行为和容器关键属性来支撑软件运行。

 Dockerfile作为整个机制的核心。这是一个非常了不起的创新,因为在Dockerfile中,不但能够定义使用者在容器中需要进行的操作,而且能够定义容器中运行软件需要的配置,于是软件开发和运维终于能够在一个配置文件上达成统一。运维人员使用同一个Dockerfile能在不同的场合下“重现”与开发者环境中一模一样的运行单元(Docker容器)出来。

安装docker-compose

直接从github下载即可,需依赖docker 1.9.1以上;

# 安装
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# 验证
docker-compose --version

Docker-compose用法

Usage:
docker-compose [-f …] [options] [COMMAND] [ARGS…]

docker-compose常用命令:
build  构建或重建服务
kill   杀掉容器
logs  显示容器的输出内容
port  打印绑定的开放端口
ps   显示容器
pull  拉取服务镜像
restart 重启服务
rm  删除停止的容器
run  运行一个一次性命令
scale 设置服务的容器数目
exec 在容器里搪行命令
start 开启服务
stop 停止服务
up  创建并启动容器

其实这些常用命令用docker的命令功能是一样的。

Docker-compose配置

Compose允许用户通过一个docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。
Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分。

举例说明:

version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
      args:
      	- password=secret
    depends_on:
    	- mysql
    ports:
      - 80:80
    networks:
      - front
    volumes:
      - ./wwwroot:/usr/local/nginx/html
    container_name: "nginx"
    links:
    	- mysql
    external_links:
    	- mysql1
    extra_hosts:
    	- "nginx 10.0.0.2"
    	- "mysql 10.0.0.3"
    dns:
    	- 8.8.8.8
    	- 9.9.9.9

  mysql:
    hostname: mysql
    image: mysql:5.6
    ports:
      - 3306:3306
    networks:
      - back
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    command: --character-set-server=utf8
    env_file:
    	- ./common.env
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: bookstack
      MYSQL_USER: bookstack
      MYSQL_PASSWORD: passWD
 
networks:
  front:
    driver: bridge
  back:
    driver: bridge

可以看到一份标准配置文件应该包含 version、services、networks 三大部分,共有三级标签,每一级都是缩进两个空格。下面来详细说明一下里面的内容:

version

定义compose的版本号为version 3,可以参考官方文档详细了解具体有哪些版本 https://docs.docker.com/compose/compose-file/

services

  • nginx:这是services下面的二级标签,名字用户自己定义,它将是服务运行后的名称;

    • hostname: 这是定义容器的主机名,将写入到/etc/hostname中;
    • image:指定容器启动加载镜像;
    • build:指定基于dockerfile自动构建镜像并使用该镜像启动容器
      • context:指定基于当前命令执行时的相对路径;
      • dockerfile:指定通过上面指定路径中的Dockerilfe来构建;context拼接dockerfile后可定位dockerfile文件;
      • args:指定构建过程中的环境变量,构建成功后销毁;等价于dockerfile中ARG指定
    • depends_on:指定当前容器需要依赖与其他容器间的依赖关系;
    • environment:指定容器加载环境变量;
    • command:指定命令覆盖容器启动后默认指定的命令;
    • ports:指定宿主机与容器端口映射;
    • networks:指定容器加入网络,与一级标签networks配合使用;
    • volumes:指定宿主机与容器目录映射;
    • container_name:指定容器名称;
    • links:指定链接容器,相当于``docker client –link并将自动将关联容器主机名映射添加至当前容器的/etc/hosts`中;
    • external_links:指定链接非当前Docker-compose编排的容器;
    • extra_hosts:指定容器内/etc/hosts追加主机名映射;
    • dns: 指定容器内域名解析DNS地址;
    • env_file:指定环境变量配置文件(可配置多个文件),与environment冲突时,以environment为准;

    networks

    • front:networks下面的二级标签,由用户自定义,宿主机会根据Docker-compose运行目录名及标签名拼接生成对应的网络名称,拼接格式为:目录名__标签名
      • driver:指定网络模式,如host、none、bridge等;

Docker swarm集群

 Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker

Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。

  Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

  Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。

Docker Swarm架构

Docker Swarm架构

Swarm是典型的master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持;

Docker API:用于管理镜像的生命周期;

Swarm Cli:提供用户进行Swarm集群管理入口;

LeaderShip:提供集群Manager角色HA,防止单点故障;

Discovery Service:Swarm集群的发现服务,它会在所有的Node上注册Agent,通过Agent将Node信息上报给Manager;发现服务的常用实现方式有以下集中:

  1. Hosted Discovery with Docker Hub

    通过Docker Hub提供发现服务,需联通公网环境;

    docker run -d -p <manager_port>:2375 token://<cluster_id>
    # token在创建Swarm集群时生成,全球唯一
  2. 基于KV分布式存储系统

    支持的分布式系统有etcd、consul、zookeeper等;

    swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>
  3. 静态描述文件

    swarm manage -H tcp://<Swarm_ip:swarm_port> file:///opt/mycluster
  4. 静态IP列表

    swarm manage -H <swarm_ip:swarm_port> nodes://<node_ip1:2375>,<node_ip2:2375>

Schedule:用于容器调度时选择最优节点:

  1. Filter(过滤)

    当创建或运行容器时,filter会告诉调度器哪些节点是符合要求的。按照类型可分为节点过滤与容器过滤

    • 节点过滤
      • Constraints:约束过滤器,可根据当前操作系统、内核版本、存储类型等条件进行过滤,当然也可以自定义约束,在启动Daemon的时候,通过Label来指定当前主机所具有的特点;
      • Health filter:根据节点状态进行过滤,移除故障节点;
    • 容器过滤
      • Affnity:亲和性过滤器,支持容器亲和性和镜像亲和性,如部署应用时,想将前端容器和数据库容器放在一起,即可通过亲和性过滤器实现;
      • Dependency:依赖过滤器,如创建容器时指定了目录映射、链接某个容器时,则创建的容器或和依赖的容器部署在同一个节点上;
      • Ports filter:根据端口使用情况进行过滤;
  2. Strategy(策略)

    Swarm在scheduler节点(Leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread,binpack及random;

    • Spread:选择运行容器最少的的宿主机来创建新的容器,Spread策略会使容器均衡的分布在集群的各个节点上,节点宕机损失较小;
    • Binpack:尽可能的在当前容器比较集中且资源足够的节点上创建新的容器,最大可能避免容器碎片化,但一旦该节点宕机随时可能比较大;
    • Random:顾名思义,就是随机选择一个节点来创建新的容器,一般用于调试;

Swarm关键概念

  • Swarm

集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm;

  • Node(节点)

Node是加入到swarm集群的Docker引擎实例;按照功能可分为Manager(管理节点)与Worker(工作节点):

  1. Manager:接收客户端服务定义,将任务发送到worker节点;维护集群期望状态和集群管理功能及Leader选举。默认情况下manager节点也会运行任务,也可以配置只做管理任务。提供对外的接口,部署我们的应用;Manager是整个Swarm集群的大脑,为避免单点故障,Manager至少有两个节点,通过raft协议进行状态同步;
  2. Worker:接收并执行从管理节点分配的任务,并报告任务当前状态,以便管理节点维护每个服务期望状态。
  • Service(服务)

Service是要在Worker上执行的Task的定义,它运行于Worker上;Service在创建时,需为对应Worker指定镜像;

  • Task(任务)

Task是Service的执行实体,一个Task包含了一个容器及其运行的命令;Manager根据指定数量的Task副本分配至对应Worker上;

Swarm Cluster特性

  1. Dcoker Engine集成集群管理

    使用Docker Engine CLI创建一个Docker Engine的Swarm模式,在集群中部署应用程序服务;

  2. 去中心化设计

    Swarm按角色分为Manager与Worker,Manager故障不影响应用使用;

  3. 动态扩容缩容

    可以声明每个服务运行的容器数量,通过添加或删除容器数量自动调整期望的状态;

  4. 期望状态协调

    Swarm Manager监控集群状态,并调整当前状态与期望状态之间的差异。例如,配置一个服务运行副本为5,当某个副本所在服务器宕机后,Manager将自动创建1个新的副本,并根据调度策略分配至可用的Worker;

  5. 多主机网络

    可以为服务制定overlay网络。当初始化或更新应用程序时,Swarm Manager会自动为overlay网络上的容器分配IP地址;

  6. 服务发现

    Swarm Manager节点为集群中的每个服务分配唯一的DNS记录和负载均衡VIP。可以通过Swarm内置的DNS服务器查询集群中每个运行的容器;

  7. 负载均衡

    实现服务副本间负载均衡,提供入口访问。也可将服务入口暴露给外部负载均衡器再次进行负载均衡;

  8. 安全传输

    Swarm中每个节点使用TLS相互验证和加密,确保安全的节点间通信;

  9. 滚动更新

    集群容器内应用进行更新/升级时,可逐步将应用服务更新至节点,出现问题回滚至历史版本即可;

Swarm Cluster管理

集群管理

# 创建swarm集群
docker swarm init --advertise-addr 10.0.0.10

# 加入集群
docker swarm join --token "token_id" 10.0.0.10:2377

# 离开集群
docker swarm leave

# 更新集群配置
docker swarm update

堆栈管理

创建编排文件

# helloworld.yml
version: '3'
services:

  mynginx:
    image: hub.test.com:5000/almi/nginx:0.1
    ports:
     - "8081:80"
    deploy:
      replicas: 3

  busybox:
    image: hub.test.com:5000/busybox:latest
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 2
# 部署堆栈并创建任务
docker stack -c helloworld.yml helloworld

# 查看堆栈中的任务
docker stack ps helloworld

# 查看现有堆栈
docker stack ls

# 删除堆栈
docker stack rm helloworld

# 查看堆栈中服务
docker stack services helloworld

服务管理

# 创建服务 
docker service
  # 创建一个服务
  - docker service create
    # 创建的副本数
    - docker service create --replicas 副本数
    # 指定容器名称
    - docker service create --name 名字
    # 每次容器与容器之间的更新时间间隔。
    - docker service create --update-delay s秒
    # 更新时同时并行更新数量,默认1
    - docker service create --update-parallelism 个数
    # 任务容器更新失败时的模式,(“pause”停止|”continue“继续),默认pause。
    - docker service create --update-failure-action 类型
    # 每次容器与容器之间的回滚时间间隔。
    - docker service create --rollback-monitor 20s
    # 回滚故障率如果小于百分比允许运行
    - docker service create --rollback-max-failure-ratio .数值(列“.2”为%20)
    # 添加网络
    - docker service create --network 网络名
    # 创建volume类型数据卷
    - docker service create --mount type=volume,src=volume名称,dst=容器目录
    # 创建bind读写目录挂载
    - docker service create --mount type=bind,src=宿主目录,dst=容器目录
    # 创建bind只读目录挂载
    - docker service create --mount type=bind,src=宿主目录,dst=容器目录,readonly
    # 创建dnsrr负载均衡模式
    - docker service create --endpoint-mode dnsrr 服务名
    # 创建docker配置文件到容器本地目录
    - docker service create --config source=docker配置文件,target=配置文件路径
    # 创建添加端口
    - docker service create --publish 暴露端口:容器端口 服务名
  # 查看服务详细信息,默认json格式
  - docker service inspect
      # 查看服务信息平铺形式
      - docker service inspect --pretty 服务名
  # 查看服务内输出
  - docker service logs
  # 列出服务
  - docker service ls
  # 列出服务任务信息
  - docker service ps    
      # 查看服务启动信息
      - docker service ps 服务名
      # 过滤只运行的任务信息
      - docker service ps -f "desired-state=running" 服务名
  # 删除服务
  - docker service rm
  # 缩容扩容服务
  - docker service scale
      # 扩展服务容器副本数量
      - docker service scale 服务名=副本数
  # 更新服务相关配置
  - docker service update
      # 容器加入指令
      - docker service update --args “指令” 服务名
      # 更新服务容器版本
      - docker service update --image 更新版本 服务名         
       回滚服务容器版本
       docker service update --rollback 回滚服务名
      # 添加容器网络
      - docker service update --network-add 网络名 服务名
      # 删除容器网络
      - docker service update --network-rm 网络名 服务名
      # 服务添加暴露端口
      - docker service update --publish-add 暴露端口:容器端口 服务名
      # 移除暴露端口
      - docker service update --publish-rm 暴露端口:容器端口 服务名
      # 修改负载均衡模式为dnsrr
      - docker service update --endpoint-mode dnsrr 服务名
			# 更新服务动态命令设置
      docker service update --env-add
      docker service update --env-rm  
      docker service update --host-add 
      docker service update --host-rm
      docker service update --hostname
      docker service update --mount-add type=volume,source=/data,target=/data
      docker service update --mount-rm  type=volume,source=/data,target=/data
      docker service update --network-add name=my-network,alias=web1   # Add a network
      docker service update --network-rm  name=my-network,alias=web1
      docker service update --publish-add published=8080,target=80 # Add or update a published port
      docker service update --publish-rm  published=8080,target=80  # Remove a published port by its target port


# 查看swarm集群中服务对应IP
docker service inspect --format '{{ .Endpoint.VirtualIPs }}'  服务名

节点管理

# 查看集群所有节点
docker node ls

# 删除节点
docker node rm <node_id>

# 查看节点详情,[--pretty]显示格式化后信息
docker node inspect <node_id> [--pretty]

# 节点降级,由管理节点降级为工作节点
docker node demote <node_id>

# 节点升级,由工作节点升级为管理节点,
docker node premote <node_id> [node_id2]

# 查看节点中task
docker node ps <node_id>

# 节点更新 可用状态有 active pause drain
## 排除节点node01
docker node update --availability drain node01
## 恢复排除的节点node01
docker node update --availability active node01

文章作者: semon
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 semon !
评论
  目录