10-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.
...

可以发现访问均衡的打到各容器。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥俊子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值