Docker Compose多容器部署
1. 什么是Docker Compose
- Docker Compose是一个命令行工具;
- 这个工具可以通过一个yml文件定义多容器应用;
- 通过一条命令就可以根据yml文件的定义去创建或管理多个容器;
- docker-compose.yml是默认的yml配置文件名称。
2. docker-compose.yml
docker-compose.yml的三大概念:services、networks、volumes。
一个搭建WordPress的docker-compose.yml实例如下:
version: '3'
services:
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
- 一个service代表一个container,这个container可以从dockerhub的image来创建,或者从本地的Dockerfile build出来的image来创建;
- service的启动类似docker run,我们可以给其指定network和volume,所以可以给service指定network和volume的引用。
- volume关键字持久化挂载的目录或文件;
- networks关键字指定自定义网络。
3. Linux下Docker Compose安装
下载安装
[root@eshop-cache05 example-voting-app]# sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋权
[root@eshop-cache05 example-voting-app]# sudo chmod +x /usr/local/bin/docker-compose
验证安装成功
[root@eshop-cache05 example-voting-app]# docker-compose --version
docker-compose version 1.23.2, build 1110ad01
compose命令详解
- build(构建yml中某个服务的镜像)
- ps(查看已经启动的服务状态)
- kill(停止某个服务)
- logs(可以查看某个服务的log)
- port(打印绑定的public port)
- pull(pull服务镜像)
- up(启动yml定义的所有服务)
- down(停止yml定义的所有服务,并删除创建的容器)
- stop(停止yml中定义的所有服务)
- start(启动被停止的yml中的所有服务)
- kill(强行停止yml中定义的所有服务)
- rm(删除yml中定义的所有服务)
- restart(重启yml中定义的所有服务)
- scale(扩展某个服务的个数,可以向上或向下)
- migrate-to-labels(这个没有实际尝试。根据介绍是将服务从1.2迁移到1.3带labels的版本。docker之前不支持label)
- version(查看compose的版本)
- exec *** bash (登录到某个容器)
举例:
docker-compose exec nginx bash #登录到nginx容器中
docker-compose down #删除所有容器
docker-compose ps #显示所有容器
docker-compose restart nginx #重新启动nginx容器
docker-compose run --no-deps --rm php-fpm php -v #在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose build nginx #构建镜像 。
docker-compose build --no-cache nginx #不带缓存的构建。
docker-compose logs nginx #查看nginx的日志
docker-compose logs -f nginx #查看nginx的实时日志
docker-compose config -q #验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose events --json nginx #以json的形式输出nginx的docker日志
docker-compose pause nginx #暂停nignx容器
docker-compose unpause nginx #恢复ningx容器
docker-compose rm nginx #删除容器(删除前必须关闭容器)
docker-compose stop nginx #停止nignx容器
docker-compose start nginx #启动nignx容器
docker-compose up --scale nginx=3 -d #水平扩展3个nginx服务
4. lb-scale项目案例
使用haproxy做负载均衡。
项目文件如下:
app.py:
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=80, debug=True)
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:
context: .
dockerfile: Dockerfile
environment:
REDIS_HOST: redis
lb:
image: dockercloud/haproxy
links:
- web
ports:
- 8888:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
启动,横向扩展3个web容器:
[root@eshop-cache05 lb-scale]# docker-compose up --scale web=3 -d
实验结果:
[root@eshop-cache05 wordpress]# curl 127.0.0.1:8888
Hello Container World! I have been seen 19 times and my hostname is 593edd419342.
[root@eshop-cache05 wordpress]# curl 127.0.0.1:8888
Hello Container World! I have been seen 20 times and my hostname is 39e93c3b5e42.
[root@eshop-cache05 wordpress]# curl 127.0.0.1:8888
Hello Container World! I have been seen 21 times and my hostname is 7dba85692f1f.
[root@eshop-cache05 wordpress]# curl 127.0.0.1:8888
Hello Container World! I have been seen 22 times and my hostname is 593edd419342.
[root@eshop-cache05 wordpress]# curl 127.0.0.1:8888
Hello Container World! I have been seen 23 times and my hostname is 39e93c3b5e42.
[root@eshop-cache05 wordpress]# curl 127.0.0.1:8888
Hello Container World! I have been seen 24 times and my hostname is 7dba85692f1f.
[root@eshop-cache05 wordpress]# curl 127.0.0.1:8888
Hello Container World! I have been seen 25 times and my hostname is 593edd419342.
[root@eshop-cache05 wordpress]# curl 127.0.0.1:8888
Hello Container World! I have been seen 26 times and my hostname is 39e93c3b5e42.
...
可以发现访问均衡的打到各容器。