Docker从入门到精通之Docker Compose

Compose是一个用于定义和运行多容器Docker应用程序的工具 。使用Compose,您可以使用YAML文件来配置应用程序的服务 。然后,只需一个命令,就可以从配置中创建并启动所有服务 。
Install Docker Compose

  1. 下载docker compose
$sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 给docker compose设置可执行权限
$ sudo chmod +x /usr/local/bin/docker-compose
  1. 验证
$ docker-compose --versionUninstallation$ sudo rm /usr/local/bin/docker-composeGetting Started用Python构建一个简易网页统计网页点击量,docker-compose进行发布
Step1:创建项目
  1. 创建项目目录
  2. $ mkdir test_web
    $ cd test_web
  3. 在项目目录中创建App.py文件,并把下面代码复制进去
  4. 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)
  5. 创建requirements.txt文件,以下内容复制进去
flaskredisStep2:创建Dockerfile文件
FROM python:3.7-alpineWORKDIR /codeENV FLASK_APP=app.pyENV FLASK_RUN_HOST=0.0.0.0RUN apk add --no-cache gcc musl-dev linux-headersCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtEXPOSE 5000COPY . .CMD ["flask", "run"]Step3:在docker-compose.yml中定义services
version: "3.9"services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"Step4:用Docker compose构建和运行app
  1. 进入项目目录,运行docker-compose up
  2. $ docker-compose up
  3. 在浏览器访问http://localhost:5000/ ,刷新页面看变化
  4. 查看使用compose构建的镜像
  5. $ docker images
Step5:绑定一个数据卷
version: "3.9"services:web:build: .ports:- "5000:5000"volumes:- .:/codeenvironment:FLASK_ENV: developmentredis:image: "redis:alpine"将当前目录与容器的/code目录绑定,这样可以动态修改代码
Step6:重新构建和运行app
先docker-compose down停止服务,在构建
$ docker-compose down$ docker-compose upCompose file用YAML文件定义服务,默认文件是docker-compose.yml,包含4个顶级key,version、services、networks、volumes
参考compose-spec/spec.md at master · compose-spec/compose-spec · GitHub
version指定本 yml 依从的 compose版本
services定义多个应用服务,包含环境配置、镜像构建等
build指定构建镜像的路径
version: "3.9"services:webapp:build: ./appblkio_config定义服务的block IO配置,参考compose-spec/spec.md at master · compose-spec/compose-spec · GitHub
container_name指定自定义容器名称
depends_on定义服务间启动或关闭的依赖关系
services:web:build: .depends_on:- db- redisredis:image: redisdb:image: postgrescommand覆盖容器启动的默认命令
command: [ "bundle", "exec", "thin", "-p", "3000" ]domainnamedomainname declares a custom domain name to use for the service container.
entrypoint覆盖容器默认的entrypoint
env_file【Docker从入门到精通之Docker Compose】从文件中添加环境变量到容器,可以是一个或多个文件
env_file: .envenv_file:- ./a.env- ./b.env文件格式:
# Set Rails/Rack environmentRACK_ENV=developmentVAR="quoted"environment添加环境变量
environment:RACK_ENV: developmentSHOW: "true"USER_INPUT:expose暴露端口,但不映射到宿主机,只被连接的服务访问,仅可以指定内部端口
expose:- "3000"- "8000"


推荐阅读