配置 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
命令显示:
- 有的容器正在运行,状态为 UP
- 有的容器已经正常停止了,状态是 EXITED(0)
- 有的则发生故障停止了,退出代码为非 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
- 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指定。
- 环境变量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