Docker-swarm配置 Health,Secret 与 stack

30 篇文章 0 订阅
18 篇文章 0 订阅

配置 Health Check

[root@node2 ~]# docker run -dit --name test --health-cmd "curl -f http://localhost/ ||exit 1" --health-timeout 5s --health-interval 8s -p 80 nginx
dc5b1f1cc71a33d8919e5f66430bb1d3badade27a39892459ad13bf5a80bda3b

通过 curl 检查 HTTP 状态码
1.- - timeout 命令超时的时间,默认 30s。
2. - -interval 命令执行的间隔时间,默认30s。
3. - -retries 命令失败重试的次数,默认为3,如果3次都失败了则将容器标记为 ubhealthy,swarm会销毁并重建 unhealthy 的副本。

通过 docker ps 可以查看:

[root@node2 ~]# docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                    PORTS                   NAMES
dc5b1f1cc71a        nginx                        "/docker-entrypoint.…"   22 seconds ago      Up 20 seconds (healthy)   0.0.0.0:32768->80/tcp   test

命令显示:

  1. 有的容器正在运行,状态为 UP
  2. 有的容器已经正常停止了,状态是 EXITED(0)
  3. 有的则发生故障停止了,退出代码为非 0,例如 EXITED(1)等

测试curl指定一个不存在的url:

[root@node2 ~]# docker run -dit --name test1 --health-cmd "curl -f http://localhost/aa ||exit 1" --health-timeout 5s --health-interval 8s -p 80 nginx
01768900c93bb740e255c33be9a587dc292767d6db5a2121834f4fc290e8b5a1

通过 docker ps 查看:

[root@node2 ~]# docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                      PORTS                   NAMES
01768900c93b        nginx                        "/docker-entrypoint.…"   37 seconds ago      Up 37 seconds (unhealthy)   0.0.0.0:32769->80/tcp   test1

用 swarm 指定一个不存在的url:

[root@node2 ~]# docker service  create  --name test2 --health-cmd  "curl -f http://localhost/aa || exit 1 " --health-timeout  5s --health-interval  10s --health-retries 3 nginx
l1vzwxxtkjpijco2foayc0dj4
overall progress: 0 out of 1 tasks 
1/1: starting  

它只会取消构建,接着再次重新构建,但是一直也不会成功

使用 Secret

在启动MYSQL容器时通过环境变量 设置 MYSQL的密码,会有潜在的安全隐患,所以使用secret机制,将敏感信息加密保存在 secret 中,用户可以指定哪些容器使用此 secret。

[root@node2 ~]# echo  "123.com" | docker secret create my_secret -
m6xznwn35cwe0sgfa4stfzqi7
[root@node2 ~]# docker secret ls
ID                          NAME                DRIVER              CREATED             UPDATED
m6xznwn35cwe0sgfa4stfzqi7   my_secret                               6 seconds ago       6 seconds ago
[root@node2 ~]# docker secret inspect  my_secret 
[
    {
        "ID": "m6xznwn35cwe0sgfa4stfzqi7",
        "Version": {
            "Index": 743
        },
        "CreatedAt": "2020-07-07T06:25:46.314086952Z",
        "UpdatedAt": "2020-07-07T06:25:46.314086952Z",
        "Spec": {
            "Name": "my_secret",
            "Labels": {}
        }
    }
]

启动 MYSQL,并指定 my_secret

[root@node2 ~]# docker service create --name mysql --secret  source=my_secret,target=mysql_root_password -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password"  mysql:5.7
rdvtmumhsna4tx49tnlnzkd9p
  1. source指定容器使用secret 后,secret 会被解密并存放到容器的文件系统中,默认位置为 /run/secrets/。- secret source=my_secret ,target=mysql_root_password的作用就是指定使用secret my_ secret, 然后把器解密后的内容保存到容器/run/secrets/mysql _root_password 文件中,文件名称mysql root password 由target指定。
  2. 环境变量MYSQL_ROOT_PASSWORD_FILE 指定从/run/secrets/mysql_ root_password中读取并设置MySQL的管理员密码

登录验证:

[root@node2 ~]# docker exec  -it mysql.1.i44hw8cu8h6srnpgy5v9w7avt bash
root@23c6d020c93f:/# mysql -uroot -p123.com
root@23c6d020c93f:/run# cd /run/secrets/
root@23c6d020c93f:/run/secrets# ls
mysql_root_password
root@23c6d020c93f:/run/secrets# cat mysql_root_password 
123.com

Secret 的使用场景:

1.用户名和密码
2.TLS证书
3.SSH秘钥
4.其他小于 500KB 的数据

Secret 配置实例

创建 secret:

[root@node2 ~]# openssl rand -base64 20 | docker secret  create  my_secret2 -
ioqzlhag3erc8dihbfoe2ojaw

my_secret2 作为root密码

[root@node2 ~]# openssl rand -base64 20 | docker secret  create  my_secret5 -
q9c36i9a5n9b4sdua2fw0awzd

my_secret5 作为一会创建的新用户密码

创建 overlay 网络:

[root@node2 ~]# docker network create  -d  overlay my_net1

创建 MYSQL service:

[root@node2 ~]# docker service create  --name wpmysql  \ 
--network my_net1 --secret source=my_secret2,target=mysql_root_password \
--secret source=my_secret5,target=mysql_user_password   \
-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \
-e MYSQL_PASSWORD_FILE="/run/secrets/mysql_user_password" \
-e MYSQL_USER="wordpress" -e MYSQL_DATABASE="wordpress" mysql:5.7
q9pizxjxxecb3j2s7nsa6ch5i

MYSQL_DATABASE 指名创建数据库 wordpress
MYSQL_USER 和 MYSQL_PASSWORD_FILE 指名创建用户 wordpress,密码从my_secret5读取。

进入容器验证:

[root@node2 ~]# docker exec -it wpmysql.1.xhxqoof4hh1ue527vxro4djw4  bash
root@3fcc34bf41fc:/# cd /run/secrets/
root@3fcc34bf41fc:/run/secrets# ls
mysql_root_password  mysql_user_password
root@3fcc34bf41fc:/run/secrets# cat mysql_root_password 
pXCQ1wG7h/FZTU/I0gmN1j0xkpY=
root@3fcc34bf41fc:/run/secrets# cat mysql_user_password 
ONO+5Di7V9hsJKPoIrUTtUToOBQ=

依次用 root 和 wordpress 和对应的密码连接数据库验证:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
mysql> select host,user from mysql.user\G
*************************** 1. row ***************************
host: %
user: root
*************************** 2. row ***************************
host: %
user: wordpress
*************************** 3. row ***************************

创建 WordPress service

[root@node2 ~]# docker service create  \
--name wrodpress \ 
--network my_net1 \
 --publish  8080:80 \
  --secret  source=my_secret5,target=wp_db_password \
  -e WORDPRESS_DB_HOST="wpmysql:3306" \
  -e WORDPRESS_DB_NAME="wordpress" \
  -e WORDPRESS_DB_USER="wordpress"  \
  -e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password" \
  wordpress
l0xmk7cuhhbajx8v7xy7s3fpb
  • WORDPRESS_DB_ HOST指明MySQL service地址mysql:3306,这里用到了DNS。
  • WORDPRESS_DB_NAME指明WordPress的数据库为wordpress,与前面MYSQL_ DATABASE一致。
  • WORDPRESS_ DB_ USER指明连接WordPress数据库的用户为wordpress,与前面MYSQL_USER一致。
  • WORDPRESS_ DB_ PASSWORD_FILE 指明数据库的用户wordpress的密码,从my_secret5中获取。

有关wordpress镜像环境变量更详细的使用方法可参考https://hub.docker.com/_ /wordpress/

访问 http://ip:8080
在这里插入图片描述

安装之后填写用户名密码进入

在这里插入图片描述

stack

单机模式下,我们可以使用 Docker Compose 来编排多个服务,而 Docker Swarm 只能实现对单个服务的简单部署。本文的主角 Docker Stack ,通过 Docker Stack 我们只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。

docker stack ls列出所有stack
docker stack ps列出stack中所有任务
docker stack rm删除stack
docker stack services stack-name列出stack中所有服务
docker stack deploy部署新的或更新现有
stack部署wordpress

创建目录

[root@node2 ~]# mkdir wordpress
[root@node2 ~]# cd wordpress

创建secret

[root@node2 wordpress ~]# openssl rand -base64 20 > db_root_password.txt
[root@node2 wordpress ~]# openssl rand -base64 20 > db_password.txt

创建.yml文件

[root@node2 wordpress ~]# cat docker-compose.yml
version: "3.1"	##必须3版本以上
services:
  db:
    image: mysql:5.7 
    volumes:
      - db_data:/var/lib/mysql
    environment:  					
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
      MYSQL_PASSWORD_FILE: /run/secrets/db_password
      MYSQL_DATABASE: wordpress            ##使用的数据库
      MYSQL_USER: wordpress                ##使用的用户
    secrets:						       ##使用的secret
      - db_root_password
      - db_password

  wordpress:
    depends_on:
      - db
    image: wordpress
    ports:							
      - "9999:80"
    environment:					
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
    secrets:						
      - db_password
    deploy:					
      mode: replicated
      replicas: 3

secrets:						##定义secrets路径
  db_root_password:
    file: db_root_password.txt
  db_password:
    file: db_password.txt
volumes:
  db_data:

开始部署:

[root@node2 wordpress ~]# docker stack deploy -c docker-compose.yml test
Creating network test_default
Creating secret test_db_root_password
Creating secret test_db_password
Creating service test_wordpress
Creating service test_db

查看:

docker stack ls 
NAME                SERVICES            ORCHESTRATOR
test                2                   Swarm

docker stack services test 
ID                  NAME                MODE                REPLICAS            IMAGE              PORTS
2xk05892oibh        test_wordpress      replicated          3/3                 wordpress:latest   *:9999->80/tcp
7e685a7e317b        test_db             replicated          1/1                 mysql:5.7
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值