一、docker compose 服务依赖
使用depends_on关键字
version: "3.8"services:flask:build:context: ./flaskdockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOST=redis-server- REDIS_PASS=${REDIS_PASSWORD}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:5000"]interval: 30stimeout: 3sretries: 3start_period: 40sdepends_on:- redis-servernetworks:- backend- frontendredis-server:image: redis:latestcommand: redis-server --requirepass ${REDIS_PASSWORD}networks:- backendnginx:image: nginx:stable-alpineports:- 8000:80depends_on:flask:condition: service_healthyvolumes:- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro- ./var/log/nginx:/var/log/nginxnetworks:- frontendnetworks:backend:frontend:
二、docker compose 健康检查
Dockerfile healthcheck https://docs.docker.com/engine/reference/builder/#healthcheck
docker compose https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck
健康检查是容器运行状态的高级检查,主要是检查容器所运行的进程是否能正常的对外提供“服务”,比如一个数据库容器,我们不光 需要这个容器是up的状态,我们还要求这个容器的数据库进程能够正常对外提供服务,这就是所谓的健康检查。
容器的健康检查
容器本身有一个健康检查的功能,但是需要在Dockerfile里定义,或者在执行docker container run 的时候,通过下面的一些参数指定
--health-cmd string Command to run to check health--health-interval duration Time between running the check(ms|s|m|h) (default 0s)--health-retries int Consecutive failures needed toreport unhealthy--health-start-period duration Start period for the container toinitialize before startinghealth-retries countdown(ms|s|m|h) (default 0s)--health-timeout duration Maximum time to allow one check to
示例源码
我们以下面的这个flask容器为例,相关的代码如下
PS C:\Users\Peng Xiao\code-demo\compose-env\flask> dir目录: C:\Users\Peng Xiao\code-demo\compose-env\flaskMode LastWriteTime Length Name---- ------------- ------ -----a---- 2021/7/13 15:52 448 app.py-a---- 2021/7/14 0:32 471 DockerfilePS C:\Users\Peng Xiao\code-demo\compose-env\flask> more .\app.pyfrom flask import Flaskfrom redis import StrictRedisimport osimport socketapp = Flask(__name__)redis = StrictRedis(host=os.environ.get('REDIS_HOST', '127.0.0.1'),port=6379, password=os.environ.get('REDIS_PASS'))@app.route('/')def hello():redis.incr('hits')return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"PS C:\Users\Peng Xiao\code-demo\compose-env\flask> more .\DockerfileFROM python:3.9.5-slimRUN pip install flask redis && \apt-get update && \apt-get install -y curl && \groupadd -r flask && useradd -r -g flask flask && \mkdir /src && \chown -R flask:flask /srcUSER flaskCOPY app.py /src/app.pyWORKDIR /srcENV FLASK_APP=app.py REDIS_HOST=redisEXPOSE 5000HEALTHCHECK --interval=30s --timeout=3s \CMD curl -f http://localhost:5000/ || exit 1CMD ["flask", "run", "-h", "0.0.0.0"]
上面Dockerfili里的HEALTHCHECK 就是定义了一个健康检查。 会每隔30秒检查一次,如果失败就会退出,退出代码是1
构建镜像和创建容器
构建镜像,创建一个bridge网络,然后启动容器连到bridge网络
$ docker image build -t flask-demo .$ docker network create mybridge$ docker container run -d --network mybridge --env REDIS_PASS=abc123 flask-demo
查看容器状态
$ docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES059c12486019 flask-demo "flask run -h 0.0.0.0" 4 hours ago Up 8 seconds (health: starting) 5000/tcp dazzling_tereshkova
也可以通过docker container inspect 059 查看详情, 其中有有关health的
"Health": {"Status": "starting","FailingStreak": 1,"Log": [{"Start": "2021-07-14T19:04:46.4054004Z","End": "2021-07-14T19:04:49.4055393Z","ExitCode": -1,"Output": "Health check exceeded timeout (3s)"}]}
经过3次检查,一直是不通的,然后health的状态会从starting变为 unhealthy
docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES059c12486019 flask-demo "flask run -h 0.0.0.0" 4 hours ago Up 2 minutes (unhealthy) 5000/tcp dazzling_tereshkova
启动redis服务器
启动redis,连到mybridge上,name=redis, 注意密码
$ docker container run -d --network mybridge --name redis redis:latest redis-server --requirepass abc123
经过几秒钟,我们的flask 变成了healthy
$ docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESbc4e826ee938 redis:latest "docker-entrypoint.s…" 18 seconds ago Up 16 seconds 6379/tcp redis059c12486019 flask-demo "flask run -h 0.0.0.0" 4 hours ago Up 6 minutes (healthy) 5000/tcp dazzling_tereshkova
docker-compose 健康检查
示例代码下载(flask healthcheck) [本节源码](https://dockertips.readthedocs.io/en/latest/_downloads/df3430ebd5e1f962f0c10136565257e1/compose-healthcheck-flask.zip)
示例代码下载(flask + redis healthcheck) [本节源码](https://dockertips.readthedocs.io/en/latest/_downloads/529c888c2faf46a0906548ed7510d12b/compose-healthcheck-redis.zip)
一个healthcheck不错的例子 https://gist.github.com/phuysmans/4f67a7fa1b0c6809a86f014694ac6c3a
