Docker-compose 简介

image.png
docker compose是什么?为什么需要docker compose?
Docker-Compose 是用来管理容器的,类似用户容器管家,我们有N多台容器或者应用需要启动的时候,如果手动去操作,是非常耗费时间的,如果有了 Docker-Compose 只需要一个配置文件就可以帮我们搞定,但是 Docker-Compose 只能管理当前主机上的 Docker,不能去管理其他服务器上的服务。意思就是单机环境。

Docker-compose 安装

macOS/Windows

macOS/Windows系统使用的Docker Desktop默认已经安装。

Linux

github下载:https://github.com/docker/compose/releases
将下载好的docker compose移动至/usr/bin 并添加可执行权限
提示:用curl下载注意检查包大小

  1. [root@centos Downloads]# ll
  2. total 11940
  3. -rw-r--r-- 1 root root 12218968 Nov 21 11:07 docker-compose-Linux-x86_64
  4. [root@centos Downloads]# ll -rlht
  5. total 12M
  6. -rw-r--r-- 1 root root 12M Nov 21 11:07 docker-compose-Linux-x86_64
  7. [root@centos Downloads]# mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
  8. [root@centos Downloads]# chmod +x /usr/bin/docker-compose
  9. [root@centos Downloads]# docker-compose version
  10. docker-compose version 1.27.4, build 40524192
  11. docker-py version: 4.3.1
  12. CPython version: 3.7.7
  13. OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019

Docker-compose 演示

通过一个python web小实例来演示Docker-compose的功能。

准备代码

进入存放代码目录:

  1. [root@centos flask_dc]# ls
  2. app.py docker-compose.yml Dockerfile
  3. [root@centos flask_dc]# pwd
  4. /tmp/flask_dc

docker-compose config可查看yaml是否解析成功:

  1. [root@centos flask_dc]# docker-compose config
  2. services:
  3. redis:
  4. image: redis:alpine
  5. restart: always
  6. web:
  7. build:
  8. context: /tmp/flask_dc
  9. depends_on:
  10. redis:
  11. condition: service_started
  12. ports:
  13. - published: 5000
  14. target: 5000
  15. version: '3'

docker-compose.yml:

  1. version: '3'
  2. services:
  3. web:
  4. build:
  5. context: .
  6. depends_on:
  7. - redis
  8. ports:
  9. - "5000:5000"
  10. redis:
  11. image: ${REDIS_VERSION}
  12. restart: always

app.py:

  1. import time
  2. import redis
  3. from flask import Flask
  4. app = Flask(__name__)
  5. cache = redis.Redis(host='redis', port=6379)
  6. def get_hit_count():
  7. retries = 5
  8. while True:
  9. try:
  10. return cache.incr('hits')
  11. except redis.exceptions.ConnectionError as exc:
  12. if retries == 0:
  13. raise exc
  14. retries -= 1
  15. time.sleep(0.5)
  16. @app.route('/')
  17. def hello():
  18. count = get_hit_count()
  19. return 'Hello World! I have been seen {} times.\n'.format(count)

Dockerfile:

  1. FROM python:3.7-alpine
  2. LABEL maintainer="Zuan"
  3. # 工作路径设定为/code
  4. WORKDIR /code
  5. # 创建环境变量给Flask使用
  6. ENV FLASK_APP app.py
  7. ENV FLASK_RUN_HOST 0.0.0.0
  8. # 复制app.py到容器/code目录
  9. COPY app.py /code
  10. #安装gcc工具、python的依赖
  11. RUN pip install flask && pip install redis
  12. # 映射端口
  13. EXPOSE 5000
  14. STOPSIGNAL SIGTERM
  15. # 为容器设置默认启动命令
  16. CMD ["flask", "run"]

.env:

  1. REDIS_VERSION=redis:alpine

下载镜像并启动

  1. [root@centos flask_dc]# docker-compose up
  2. Creating network "flask_dc_default" with the default driver
  3. Pulling redis (redis:alpine)...
  4. alpine: Pulling from library/redis
  5. 188c0c94c7c5: Pull complete
  6. fb6015f7c791: Pull complete
  7. f8890a096979: Pull complete
  8. ...
  9. Successfully built 266681e8cc63
  10. Successfully tagged flask_dc_web:latest
  11. WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
  12. Creating flask_dc_redis_1 ... done
  13. Creating flask_dc_web_1 ... done
  14. Attaching to flask_dc_redis_1, flask_dc_web_1
  15. redis_1 | 1:C 21 Nov 2020 04:11:21.036 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  16. redis_1 | 1:C 21 Nov 2020 04:11:21.036 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
  17. redis_1 | 1:C 21 Nov 2020 04:11:21.036 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
  18. redis_1 | 1:M 21 Nov 2020 04:11:21.037 * Running mode=standalone, port=6379.
  19. redis_1 | 1:M 21 Nov 2020 04:11:21.037 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
  20. redis_1 | 1:M 21 Nov 2020 04:11:21.037 # Server initialized
  21. redis_1 | 1:M 21 Nov 2020 04:11:21.037 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
  22. redis_1 | 1:M 21 Nov 2020 04:11:21.037 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to 'madvise' or 'never').
  23. redis_1 | 1:M 21 Nov 2020 04:11:21.037 * Ready to accept connections
  24. web_1 | * Serving Flask app "app.py"
  25. web_1 | * Environment: production
  26. web_1 | WARNING: This is a development server. Do not use it in a production deployment.
  27. web_1 | Use a production WSGI server instead.
  28. web_1 | * Debug mode: off
  29. web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

浏览器访问

image.png

Docker-compose 常用命令

查看配置

  1. docker-compose config

后台启动

  1. docker-compose up -d

构建镜像

只是根据dockerfile构建镜像,不会启动镜像

  1. docker-compose build

下载镜像

  1. docker-compose pull

查看运行状态

  1. docker-compose ps

查看docker-compose启动的进程

  1. docker-compose top

启动

  1. docker-compose start

停止

将容器全部退出

  1. docker-compose stop
  2. [root@centos flask_dc]# docker-compose stop
  3. Stopping flask_dc_web_1 ...
  4. Stopping flask_dc_web_1 ... done
  5. Stopping flask_dc_redis_1 ... done
  6. [root@centos flask_dc]#
  7. [root@centos flask_dc]# docker-compose ps -a
  8. Name Command State Ports
  9. --------------------------------------------------------------------
  10. flask_dc_redis_1 docker-entrypoint.sh redis ... Exit 0
  11. flask_dc_web_1 flask run Exit 137
  12. [root@centos flask_dc]#

暂停

  1. docker-compose pause
  2. docker-compose unpause