公司开发物联网业务,使用Twisted 基于TCP协议开发的上位机服务,使用Django开发的Web后端,虽然是分别开发的,但两个服务之间有一定的耦合,比如上篇【基于Django & Channels & WebSocket & Twisted的物联网远程控制】就需要Web后端和Twisted共同完成,而Twisted上位机接收到下位机但上传数据后,是异步调用了Web后端进行数据入库的,所以两个服务还是一块启动的,再加上Redis, Postgresql数据库服务等,最终选择使用Docker Compose 一块发布管理。

两个服务是分开开发的,也就要放在不同的目录中。

1
2
3
4
5
6
iot
├── docker-compose.yml
├── tcp
│   └── Dockerfile
└── web
└── Dockerfile

docker-compose.yml文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: '3'
services:
web:
build: ./web
image: web:backend
command: ["sh", "-c", "python3 manage.py runserver 0.0.0.0:8000"]
ports:
- "8000:8000"
depends_on:
- pgdb
- redis
volumes:
- ./web:/code

twisted:
build: ./tcp
ports:
- "21188:21188"
command: ["sh", "-c", "twistd -ny service.tac"]
depends_on:
- redis
volumes:
- ./tcp:/code

redis:
image: redis

pgdb:
image: postgres
environment:
POSTGRES_PASSWORD: postgres
volumes:
- pg-vol:/var/lib/postgresql/data

volumes:
pg-vol:

tcp/Dockerfileweb/Dockerfile的内容都是一样的,所不同的就是各自目录下的代码。

1
2
3
4
5
6
7
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
ADD . /code/

这里讲一下需要注意的两个地方:

  • docker-compose.yml中build后要加上目录,也可以用context参数指定
  • 特别需要注意的,各个服务需要添加自己的volumes,也就是示例中的
    1
    2
    3
    4
    volumes:
    - ./web:/code
    volumes:
    - ./tcp:/code

不然虽然能正常生成container,但运行的时候/code下内容趋势iot目录,不是单个服务下但目录代码,导致不能正常运行。

参考

[1]. Docker Tip #10: Project Structure With Multiple Dockerfiles and Docker Compose