docker compose 是为了定义和运行多容器的复杂docker应用,下面以官网列子演示,稍作修改
1、建立工程
# 创建工程根目录
$ mkdir dockercompose
$ cd dockercompose
# 创建我们应用的目录
$ mkdir count-web
# 创建应用镜像的 Dockerfile
$ touch count-web/Dockerfile
# 应用的源码目录
$ mkdir count-web/src
# 源码目录下存放源文件及python依赖包描述文件
$ touch count-web/src/app.py
$ touch count-web/src/requirements.txt
# 最后就是我们的 docker-compose.yml 文件
$ touch docker-compose.yml
# 目录结构
$ tree
.
├── count-web
│ ├── Dockerfile
│ └── src
│ ├── app.py
│ └── requirements.txt
└── docker-compose.yml
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 'Hi! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
# 默认端口为5000
app.run(host="0.0.0.0", debug=True)
requirements.txt 内容
flask
redis
Dockerfile 内容
# 应用基于python3.5作为基础镜像构建
FROM python:3.5
# 将源文件目录的内容添加到容器的/count-web下面
ADD ./src /count-web
# 应用的工作目录是 /count-web
WORKDIR /count-web
# 安装应用的依赖包
RUN pip install -r requirements.txt
# 运行应用
CMD ["python", "app.py"]
docker-compose.yml 的内容
version: '3'
services:
# 构建的应用
count-web:
build: ./count-web
# 端口映射,flask默认5000端口映射到宿主机
# 的0.0.0.0:5000/tcp
ports:
- "5000:5000"
# 卷映射,保证宿主机源码更改后能影响到容器中的应用
volumes:
- ./count-web/src:/count-web
# 第二个容器,用来运行数据库
redis:
image: "redis"
2、构建
运行下面命令将按照yml文件描述构建容器,我们的应用通过Dockerfile
构建容器,redis
直接使用官方的镜像构建
$ docker-compose up
浏览器测试
3、问题
Dockerfile 中使用 ADD 时,尽量ADD的内容和Dockerfile在同一个目录下面,比如刚开始我的src目录和Dockerfile不在同一个目录下,报了下面的错, 什么意思呢,说是build上下文中不对,我猜意思呢是:Dockerfile在build时所指上下文就是含有Dockerfile的文件夹
ERROR: Service ‘web’ failed to build: ADD failed: Forbidden path outside the build context: ../../count-web ()