Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

基于docker-compose.yml的多镜像部署

docker-compose

  • 多镜像的启动文件,格式为YAML,内部指定多个容器的开启参数和构建方式
  • 执行该文件,自动完成多个镜像的容器部署

官网demo

  • 新建项目文件夹

    mkdir composetest && cd composetest
    
  • 创建项目入口文件app.py

    vim app.py
    
    • 加入如下内容
      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)
      
  • 创建python依赖文件

    vim requirements.txt
    
    • 加入如下内容
      flask
      redis
      
  • 创建Dockerfile(不要拼写错)

    vim Dockerfile
    
    • 加入如下内容
      # syntax=docker/dockerfile:1
      FROM python:3.7-alpine
      WORKDIR /code
      ENV FLASK_APP=app.py
      ENV FLASK_RUN_HOST=0.0.0.0
      RUN apk add --no-cache gcc musl-dev linux-headers
      COPY requirements.txt requirements.txt
      RUN pip install -r requirements.txt
      EXPOSE 5000
      COPY . .
      CMD ["flask", "run"]
      
      • 这里指定了WORKDIR为/code目录后,COPY的第二个.代表的是容器内的/code,第一个代表的是本地机器的当前目录
  • 创建docker-compose.yml

    vim docker-compose.yml
    
    • 加入如下内容
      version: "3.9"
      services:
        web:
          build: .
          ports:
            - "8000:5000"
          volumes:
            - .:/code
          environment:
            FLASK_ENV: development
        redis:
          image: "redis:alpine"
      
      • volumes配置
        • 会把本地机器的当前目录,挂载到容器内的/code目录
        • 这样本地机器的代码有任何修改,容器无需重建也可生效
      • environment配置
        • 指定flask运行在开发模式,容器无需重启也可自动重载修改后的代码
  • 启动项目

    docker compose up
    
    • 生产环境一般要加参数-d,以守护进程的方式运行
    • 此命令默认调用当前目录下的docker-compose.yml文件
      • 如果yml文件的名字不是默认的,就需要自己用-f参数指定
    • yml文件中的 build:. 会默认调用.目录下的Dockerfile
      • 如果镜像文件的名字不是默认的,就需要用build下面的contextdockerfile选项指定
        build:
          context: ./
          dockerfile: my_Dockerfile
        
  • 再启动一个终端,访问最终输出的局域网ip

    curl http://172.18.0.3:5000
    
    • 如果输出Hello World! I have been seen 1 times.代表部署成功
  • 改变app.py中return的字符串,比如加上from docker

    • 无需重建和重启,再次访问局域网ip,发现输出会变化
  • 如果是守护进程运行,需要如下命令关闭容器,否则直接ctrl-c结束

    docker compose down --volumes
    
    • 参数--volumes的作用是,移除redis容器使用的本地数据卷