基于docker-compose.yml的多镜像部署
docker-compose
- 多镜像的启动文件,格式为YAML,内部指定
多个容器的开启参数和构建方式 - 执行该文件,自动完成多个镜像的容器部署
官网demo
-
新建项目文件夹
mkdir composetest && cd composetest -
创建项目入口文件
app.pyvim 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,第一个代表的是本地机器的当前目录
- 这里指定了WORKDIR为
- 加入如下内容
-
创建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运行在开发模式,容器
无需重启也可自动重载修改后的代码
- 指定flask运行在开发模式,容器
- volumes配置
- 加入如下内容
-
启动项目
docker compose up- 生产环境一般要加参数
-d,以守护进程的方式运行 - 此命令默认调用
当前目录下的docker-compose.yml文件- 如果yml文件的名字不是默认的,就需要自己用
-f参数指定
- 如果yml文件的名字不是默认的,就需要自己用
- yml文件中的
build:.会默认调用.目录下的Dockerfile- 如果镜像文件的名字不是默认的,就需要用
build下面的context和dockerfile选项指定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容器使用的本地数据卷
- 参数