Docker Compose 是什么?
docker-compose 是用来定义和运行多个Docker容器应用的工具。
为什么要使用 Docker Compose?
Dockerfile重现一个容器,Compose重现容器的配置和集群。使用docker-compose, 你只需要使用一个YAML文件去配置你应用的服务. 然后,运行一个命令,你就可以根据你的配置去创建并启动所有的service。
Docker Compose做了什么?
- 编排
定义被部署的对象的各组成部分之间的耦合关系,部署流程中各个动作的执行顺序,部署过程所需要依赖文件和被部署文件的存储位置和获取方式,以及如何验证部署成功。这些信息都会在编排工具中以指定的格式来要求运维人员自主定义并保存起来,从而保证这个流程能够随时在全新的环境中有序的重现出来。
- 部署
按照编排所指定的内容和流程,在目标机器上执行编排指定环境初始化,存放指定的依赖和文件,运行指定的部署动作,最终按照编排中的规则来部署。
乐队和指挥家
编排是一个指挥家,他的大脑里存储了整个乐曲此起彼伏的演奏流程。
部署就是整个乐队,他们严格按照指挥的意图用乐器来完成乐谱的执行。
编排和部署组合
在Compose的世界里,编排和部署的组合结果,就是一朵“容器云”。
仅仅使用Compose,能构建自己的容器云吗?
答案是否定的。docker-compose面向单主机部署。docker-compose解决的问题局限在“编排”二字,甚至连“部署”范畴都涉足很少,而在一个能够服务于大众的云平台中,编排与部署也仅仅是其中的一个组成部分而已。
如何在Linux系统里安装docker-compose?
- Run this command to download the latest version of Docker Compose:
$ sudo curl \
-L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) \
-o /usr/local/bin/docker-compose
- Apply executable permissions to the binary:
$ sudo chmod +x /usr/local/bin/docker-compose
- Test the installation
$ docker-compose --version
如何使用docker-compose?
- 编写你的应用的Dockerfile。
- 在docker-compose.yml中定义你的应用所依赖的所有服务,这样它们可以在一个隔离的环境中运行.
- 运行
docker-compose build & docker-compose up
来启动和运行你的整个应用.
Docker Compose初体验(Wordpress应用实例)
- 使用docker-compose
version: '3.3'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
- 使用docker cli启动
sudo docker run --name db \
-d \
--restart always \
-e MYSQL_ROOT_PASSWORD=somewordpress \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wordpress \
-e MYSQL_PASSWORD=wordpress \
mysql:5.7
sudo docker run --name wordpress \
--restart always \
--link db \
-e WORDPRESS_DB_HOST=db:3306 \
-e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD=wordpress \
-p 8000:80 \
wordpress:latest
从表面上看,好像使用docker cli手动操作也是可以接受的,不外乎多打几行命令,不妨想象一下,如果管理上百个容器的场景该如何应付。
Docker Compose(HAProxy+Django+Redis应用实例)
应用架构
对应的应用目录结构:
.
├── README.md
├── app
│ ├── Dockerfile
│ └── src
│ └── redisweb
│ ├── db.sqlite3
│ ├── helloworld
│ │ ├── __init__.py
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── migrations
│ │ │ └── __init__.py
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── manage.py
│ └── redisweb
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── docker-compose.yml
├── haproxy
│ ├── Dockerfile
│ └── haproxy.cfg
└── redis
├── master
│ ├── Dockerfile
│ └── redis.conf
└── slave
├── Dockerfile
└── redis.conf
Redis
首先,我们来看如何使用docker-compose启动redis cluster。
- 编写redis/master/Dockerfile
FROM redis
ADD redis.conf /redis-config/redis.conf
ENTRYPOINT ["/usr/local/bin/redis-server", "/redis-config/redis.conf"]
- 编写redis/slave/Dockerfile
FROM redis
ADD redis.conf /redis-config/redis.conf
ENTRYPOINT ["/usr/local/bin/redis-server", "/redis-config/redis.conf"]
- 编写docker-compose.yml,添加3个service:
redis-master
、redis-slave1
和redis-slave2
version: '3'
services:
redis-master:
build:
context: redis/master/.
redis-slave1:
build:
context: redis/slave/.
depends_on:
- redis-master
redis-slave2:
build:
context: redis/slave/.
depends_on:
- redis-master
通过docker-compose build && docker-compose up
启动redis cluster。
APP
redis cluster完成后,就可以开始以来它的APP部分了。
- 编写app/Dockerfile
FROM django
RUN pip install --upgrade pip && pip install redis
ADD src /app
WORKDIR /app/redisweb
EXPOSE 8001
ENTRYPOINT ["python", "manage.py", "runserver", "0.0.0.0:8001"]
编写docker-compose.yml,添加3个service:app1和app2
version: '3'
services:
redis-master:
build:
context: redis/master/.
redis-slave1:
build:
context: redis/slave/.
depends_on:
- redis-master
redis-slave2:
build:
context: redis/slave/.
depends_on:
- redis-master
app1:
build:
context: app/.
depends_on:
- redis-master
app2:
build:
context: app/.
depends_on:
- redis-master
HAProxy
- 编写haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /usr/local/sbin
pidfile /usr/local/sbin/haproxy.pid
maxconn 4000
nbproc 4
daemon
defaults
mode http
timeout connect 10000 # default 10 second time out if a backend is not found
timeout client 300000
timeout server 300000
frontend http-in
bind 0.0.0.0:8001
default_backend servers
backend servers
bind-process 2
server app1 app1:8001 check inter 2000 rise 2 fall 5
server app2 app2:8001 check inter 2000 rise 2 fall 5
- 编写haproxy/Dockerfile
FROM haproxy
ADD haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
- 编写docker-compose.yml,添加1个service:haproxy
version: '3'
services:
redis-master:
build:
context: redis/master/.
redis-slave1:
build:
context: redis/slave/.
depends_on:
- redis-master
redis-slave2:
build:
context: redis/slave/.
depends_on:
- redis-master
app1:
build:
context: app/.
depends_on:
- redis-master
app2:
build:
context: app/.
depends_on:
- redis-master
haproxy:
build:
context: haproxy/.
ports:
- 8001:8001
depends_on:
- app1
- app2
通过docker-compose build && docker-compose up haproxy
启动整个应用。通过localhost:8001访问应用。
代码>>