Docker进阶

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: Docker进阶

Docker Compose

  • 用处:定义、运行多个容器的程序,批量容器编排。
  • YAML配置文件
  • single command指令学习
  • 使用Compose三个步骤:
  1. 定义Dockerfile
  2. 编写docker-compose.yaml
  3. 运行compose,docker-cmpose up启动
  • 安装docker-compose
  • Linux
  • Docker Compose存放在Git Hub,高速安装Docker Compose如下:
curl -L <https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname> -s`-`uname -m` > /usr/local/bin/docker-compose
  • 给compose指令赋予可执行的权利
chmod +x /usr/local/bin/docker-compose
  • 检测是否安装成功,不成功的话就需要重启服务器
[root@Contos7 ~]# docker-compose version
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
  • Mac
  • mac其实不需要安装,因为Docker Desktop中就自带compose。
  • compose初体验 📦
  • 创建项目结构:
mkdir composetest && cd composetest
  • 创建app.py文件,也就是项目文件:
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\\n'.format(count)
  • 建立requirements.txt文件
flask
redis
  • 编写Dockerfile
#将python:3.7-alpine作为基础镜像
FROM python:3.7-alpine   
#设置工作目录    
WORKDIR /code    
#设置环境变量     
ENV FLASK_APP=app.py     
#设置主机匹配所有地址,即所有主机可访问
ENV FLASK_RUN_HOST=0.0.0.0 
#安装包的时候不安装到全局
#使员工gcc来编译程序,但是一旦程序被编译,我就不再需要gcc了,并且可以加快编译速度
RUN apk add --no-cache gcc musl-dev linux-headers 
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
  • 编写docker-compose.yml
#docker-compose版本号
version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
  • 在docker-compose.yml所在目录使用docker-compose up启动(定义、运行多个容器),docker-compose down停止
  • Tips⚠️ :这样创建出的容器的名字是当前docker-compose.yaml所在目录的目录名加上yml中的服务名,尾部的num表示该容器的副本数量,这些副本可以发送到其他机器上运行,compose会构建一个默认的网络(不使用docker0),所有容器默认在一个网络中
  • 使用idea用docker-compose打包发布image.pngimage.png
  • 复制jar包pom配置
<!--复制jar包到指定目录-->
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>gen-webadmin</id>
                        <phase>package</phase>
                        <configuration>
                            <tasks>
                                <copy todir="docker" file="target/${project.artifactId}-${project.version}.${project.packaging}" />
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
#三层
#compops版本号
version: "xxx"
#服务配置
services:
   server1:
      configuration1:
      configuration2:
      configuration3:
      configuration4
      #启动顺序控制,先启动数组中的服务项,最后再启动本服务
      depends_on:
      ....
  server2:
      configuration1
      ....
#全局配置
netowkr
volume
  • 使用docker-compose.yml构建wordpress博客园
  • docker-compose.yml
version: "3.8"
services:
  db:
    image: mysql:5.7
    volumes:
      - db_datas:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "5000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_datas: {}
  • 使用docker-compose up -d可以让其在后台启动,不加-d表示在前台启动

Docker Swarm

  • Swarm是Docker公司推出的用来管理docker集群的平台.
  • Swarm集成在Docker中无需安装
  • 工作原理
    image.png
  • 常用命令
  • 作为集群的管理docker swarm
  • 初始化一个
    swarmdocker swarm init
  • 指定初始化ip地址节点
    docker swarm init --advertise-addr 管理端IP地址
  • 去除本地之外的所有管理器身份
    docker swarm init --force-new-cluster
  • 将节点加入swarm集群,两种加入模式manager与worker
    docker swarm join
  • 工作节点加入管理节点需要通过join-token认证
    docker swarm join-token
  • 重新获取docker获取初始化命令
    docker swarm join-token worker
  • 离开swarm
    docker swarm leave
  • 对swarm集群更新配置
    docker swarm update
  • 管理swarm节点docker node
  • 查看集群中的节点
    docker node ls
  • 将manager角色降级为worker
    docker node demote 主机名
  • 将worker角色升级为manager
    docker node promote 主机名
  • 查看节点的详细信息,默认json格式
    docker node inspect 主机名
  • 查看节点信息平铺格式
    docker node inspect --pretty 主机名
  • 查看运行的一个或多个及节点任务数,默认当前节点
    docker node ps
  • 从swarm中删除一个节点
    docker node rm 主机名
  • 更新一个节点
    docker node update
  • 对节点设置状态(“active”正常|“pause”暂停|“drain”排除自身work任务)
    docker node update --availability
  • 服务管理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 暴露端口:容器端口 服务名
  • 搭建Docker集群[双主双从]
  • manager节点和Leader节点是可以触达的
  • docker swarm init -advertise-addr [初始化集群,节点为主节点发起集群,公网/内网ip]
  • docker swarm join-token worker/manager 获取令牌,该令牌将未加入集群的节点变成w/m
  • docker node ls 查看加入集群的节点
  • Raft协议
  • 双主双从:假设一个节点挂了!其他节点是否可用
  • Raft协议:保证大多数节点存活才能用!主节点至少要>3台!
  • 实验:
  • 原本的双主双从配置如下分布
    image.png
  • 将swarm1停掉,在swarm4为上使用docker node ls查看集群状态,会发现卡住[验证双主双从的缺点]
  • 启动swarm1会发现原本为管理节点的swarm4变成主节点leader,现在启动的swarm1变成管理节点Reachable
    image.png
  • 让swarm3 leave集群,节点列表不会删除会显示STATUS=Down
    image.png
  • 当swarm3重新加入集群之后,原本的那条STATUS还是会存在,只不过会有一个新的集群id,可以用docker node rm id将其记录删除image.png
  • Tips ⚠️ :如果是某一个节点短暂的时间因为故障停掉了,然后又回来了,那么原本Down的那条记录就会变回Ready,效果不是和leave一样!切记!

  • 将双主双从转变成准守Raft协议,实验如下:
  • 在swarm2上使用docker swarm leave先让其离开集群
  • 在有权限的manager或者leader上获得manager的令牌docker swarm join-token manager
  • 将令牌给swarm2,则swarm2变成Reachable节点
    image.png
  • 停掉swarm2,不会让集群停止,会显示不可达。这就是保证高可用。遵守Raft协议
    image.png
  • Swarm创建弹性服务
  • 弹性!扩缩容!集群!
  • 容器、副本、服务。
  • docker-compose up !启动单个项目,单机。
  • 集群swarm:docker service...
  • 灰度发布/金丝雀发布
灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度,而我们平常所说的金丝雀部署也就是灰度发布的一种方式
  • Tips ⚠️ :
    docker run 启动容器,不具备扩缩容的功能!
    docker service 服务启动,具有扩缩容的功能,滚动更新!
  • 实例操作:
  • 在基于Raft协议的基础上操作。
  • docker service create -p 5000:80 —name=menginx nginx 创建nginx服务
  • docker service inspect menginx 查看menginx服务的元数据
  • docker  service  update —replicas 3 menginx 扩展多个副本数量,也就是启动多个nginx服务
  • Tips ⚠️ :访问的时候地址是init初始化docker集群时的地址,不管这台主机是否正常只要有两台台以上的MR存活,集群就会向外提供服务。docker node ls查看到某个ID后面有星号说明当前正处于该服务器下。
  • docker service scale menginx=5 scale的作用和update效果一样的扩缩容
  • 概念总结
  • Swarm:集群的管理和编号
  • Node:就是一个docker节点
  • Service:任务,可以管理节点或者工作节点来运行
  • Task:容器内的命令
  • image.png
  • 不变逻辑
    命令→ 管理→api →调度→工作节点(创建Task容器维护创建)
  • 调整service以什么方式运行
#每个工作节点上运行一个任务
docker service --mode global
#按照一定规则在各个工作节点上运行指定个数的任务。
docker service --mode replicated
  • 拓展:网络模式 "PublishMode": "ingress"
  • Swarm:
  • Overlay:将几台不同的服务器上的,ip是不同的,使用Overlay将集群变成一个整体,加入一个共同的网络。
  • "ingress":特殊的Overlay网络!负载均衡!IPVS VIP

Docker Stack

  • docker-compose 单机部署
  • docker stack 集群部署
[root@Swarm004 ~]# docker secret --help
Usage:  docker secret COMMAND
Manage Docker secrets
Commands:
  create      Create a secret from a file or STDIN as content
  inspect     Display detailed information on one or more secrets
  ls          List secrets
  rm          Remove one or more secrets
Run 'docker secret COMMAND --help' for more information on a command.
[root@Swarm004 ~]# docker stack  --help
Usage:  docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
      --orchestrator string   Orchestrator to use (swarm|kubernetes|all)
Commands:
  deploy      Deploy a new stack or update an existing stack
  ls          List stacks
  ps          List the tasks in the stack
  rm          Remove one or more stacks
  services    List the services in the stack
Run 'docker stack COMMAND --help' for more information on a command.
  • 例如:使用Docker stack集群部署wordpress,compose还是👆的compose
docker stack deploy example --compose-file=docker-compose.yml

Docker Secret

安全!配置密码,证书。

[root@Swarm004 ~]# docker secret --help
Usage:  docker secret COMMAND
Manage Docker secrets
Commands:
  create      Create a secret from a file or STDIN as content
  inspect     Display detailed information on one or more secrets
  ls          List secrets
  rm          Remove one or more secrets
Run 'docker secret COMMAND --help' for more information on a command.

Docker Config

配置

[root@Swarm004 ~]# docker config --help
Usage:  docker config COMMAND
Manage Docker configs
Commands:
  create      Create a config from a file or STDIN
  inspect     Display detailed information on one or more configs
  ls          List configs
  rm          Remove one or more configs
Run 'docker config COMMAND --help' for more information on a command.


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
存储 关系型数据库 MySQL
Docker(五)进阶:Docker卷(volumes)
数据卷:设计用来持久化数据的,它的生命周期独立于容器,不会因为容器被删除后自动删除,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。
617 0
Docker(五)进阶:Docker卷(volumes)
|
安全 关系型数据库 MySQL
Docker 进阶 发布自己的Docker镜像 将镜像上传到阿里云和Docker Hub
上传自己制作的docker镜像的方法,将docker镜像上传到Docker Hub,阿里云的两种方法,以及上传镜像时可能遇见的问题和解决办法,每一步的详解和上传镜像时的规范。
3787 0
Docker 进阶 发布自己的Docker镜像 将镜像上传到阿里云和Docker Hub
|
数据可视化 网络安全 数据安全/隐私保护
Dokcer进阶 Docker配置可视化面板 Portainer可视化面板安装
容器可视化界面安装配置,以及可视化界面的一些基础操作,以及命令详解
1444 0
Dokcer进阶 Docker配置可视化面板 Portainer可视化面板安装
|
4月前
|
关系型数据库 MySQL 应用服务中间件
docker的使用与进阶
docker的使用与进阶
78 0
|
缓存 网络协议 Linux
Docker(六)进阶:Dockerfile概述与用法(两万字入门到精通)
EXPOSE指令告诉Docker容器在运行时监听指定的网口。可以指定端口侦听的协议类型是TCP还是UDP,如果不指定协议类型,默认为TCP。
294 0
Docker(六)进阶:Dockerfile概述与用法(两万字入门到精通)
|
存储 Ubuntu Linux
Docker(四)进阶:Docker镜像概述和分层原理
镜像是一个只读模板,带有创建Docker容器的说明。通常,一个镜像基于另一个镜像,并带有一些额外的定制。例如,您可以构建一个基于ubuntu镜像的镜像,但是要安装Apache web服务器和您的应用程序,以及运行应用程序所需的配置细节。
675 0
Docker(四)进阶:Docker镜像概述和分层原理
|
存储 Ubuntu 关系型数据库
Docker进阶-Dockerfile建立一个自定义的镜像执行自定义进程
Docker进阶-Dockerfile建立一个自定义的镜像执行自定义进程
240 0
Docker进阶-Dockerfile建立一个自定义的镜像执行自定义进程
|
Shell Linux 网络安全
【靶机】xss盗取cookie-sqlmap进阶-通配符提权-docker逃逸-The Marketplace
靶机难度中等,对小白不太友好,建议边打边看,学习一下思路。
258 0
|
Kubernetes Cloud Native 算法
【Docker】企业进阶实战【Docker-Compose/Stack/Secret/Swarm/Config】
【Docker】企业进阶实战【Docker-Compose/Stack/Secret/Swarm/Config】
155 0
【Docker】企业进阶实战【Docker-Compose/Stack/Secret/Swarm/Config】
|
网络协议 安全 应用服务中间件
【Docker】企业进阶实战Docker网络【太神奇啦】
【Docker】企业进阶实战Docker网络【太神奇啦】
88 0
【Docker】企业进阶实战Docker网络【太神奇啦】