为什么要有Docker Compose多容器部署
为了多快好省,总结起来就是为了偷懒
在使用 docker Compose之前,我们是怎么部署多个容器的APP应用的呢???
多容器部署的APP太恶心了(每次都这么多步骤)
docker yml 文件有一个默认在名字叫docker-compose.yml,其中有三个重要的概念:
#docker-compose.yml文件内容示例
services:
db: #APP NAME
images:postgres:9.4 #使用的镜像
volumes: #数据卷映射名为db-data
- "db-data:/var/lib/postgresql/data"
networks: #docker network 使用back-tier
- back-tier
以上内容等同于:docker run -d --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4
接下来看一个实际的应用例子
version: '3' #docke compose版本
services:
wordpress: #App name
image: wordpress #使用镜像
ports: #端口映射
- 8080:80
environment: #容器环境变量配置
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks: # docker 网卡
- my-bridge
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes: #数据卷名mysql-data,对应备份容器中/var/lib/mysql所有内容
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes: #声明
mysql-data:
networks: #声明
my-bridge:
driver: bridge # 使用drive为bridge
具体安装过程可以参考:docker docs-安装Docker Compose
docker-compose up -d #以后台方式启动运行
docker-compose ps # 查看启动的服务App
docker-compose up --help
docker-compose down #关闭删除
docker-compose build #
以下面这个docker-compose.yml文件为例:
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000
environment:
REDIS_HOST: redis
scale 可以把一个服务扩展成多个,但是如果以上面这个文件启动的话docker-compose up --scale web=3 -d
,会发现报错:
原因是因为ports: - 8080:5000
重复绑定了,删除即可
我们来看一个负载均衡的例子
#Dockerfile
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]
#docker-compose.yml
version: "3"
services:
redis:
image: redis
web:
build: #指定的镜像需要build
context: . #build的路径
dockerfile: Dockerfile #要build的dockerfile文件名
environment:
REDIS_HOST: redis
lb:
image: dockercloud/haproxy #负载均衡的镜像
links: #连接到上面的service名为web的App
- web
ports:
- 8080:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
结构调用图
Voting App 用于投票,redids Queue用来保存投票结果,Java worker实时获取redis 中的数据插入PG database数据库中,Result app 实时从PG database中获取数据展示到页面。