使用Docker Compose管理多个容器

Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。

github地址 - github.com/docker/compose

安装Docker Compose

Linux系统安装步骤如下图:

这里写图片描述

$(uname -s)输出的是Linux,$(uname -m)输出的是x86_64。上面的地址http://github.com/docker/compose/releases/download/1.18.0/docker-compose-Linux-x86_64。然后通过管道将文件写到本机的docker-compose文件中。

赋予权限
chmod +x /usr/local/bin/docker-compose

配置文件

1.Compose的配置文件是docker-compose.yml。在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器。让我们看看下面这个文件:

version: '3'
networks:
        blog:
services:
        ghost-app:
                build: ghost
                restart: always
                networks:
                        - blog
                depends_on:
                        - db
                ports:
                        - "2368:2368"
        nginx:
                build: nginx
                networks:
                        - blog
                depends_on:
                        - ghost-app
                ports:
                        - "80:80"
        db:
                image: "mysql:5.7.15"
                networks:
                        - blog
                environment:
                        MYSQL_ROOT_PASSWORD: mysqlroot
                        MYSQL_USER: ghost
                        MYSQL_PASSWORD: 12345
                volumes:
                        - $PWD/data:/var/lib/mysql
                ports:
                        - "3306:3306"

可以看到一份标准配置文件应该包含 version、services、networks 三大部分,其中最关键的就是 services 和 networks 两个部分,

version关键字指明Compose file Format的版本,目前官方所给出的版本:

这里写图片描述

networks关键字

配置文件中顶级networks关键字,可以用来创建更加复杂的网络拓扑,指定自定义网络驱动和选项, 也可以用它来连接外部创建(非Compose创建)的网络。 每个Service可通过service内部的networks关键字来指定它要使用的顶级网络。 给Service指定networks的好处是,实现网络隔离或连接。

services声明应用所需要的服务,下面先来看 services 的书写规则。

  • image

标明镜像名称或镜像 ID,这个image ID可以是本地也可以是远程的,如果本地不存在,Compose会尝试去pull下来。

  • build

服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。

  • depends_on

在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。depends_on这个标签解决了容器的依赖、启动先后的问题。

  • links

链接到其它服务中的容器,使一个容器可以主动的去和另外一个容器通讯。默认情况下,docker-compose下的Servcie之间是可通过服务名称(容器名称,也即hostname相互访问的。 links只不过为Service提供了以别名访问其它Service的一种方式。

  • ports

ports暴露容器端口到主机的任意端口或指定端口,用法:

ports:
  - "80:80"         # 绑定容器的80端口到主机的80端口
  - "443"           # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号
  • expose

expose暴露容器给link到当前容器的容器,用法:

expose:
  - "3000"         #将当前容器的端口3000暴露给link到本容器的容器

ports和expose两种方式都可以暴露容器的端口,区别是,expose不会将端口暴露给主机,只被连接的服务访问。

  • environment

设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。

Docker Compose将所管理的容器分为三层,工程(project),服务(service)以及容器(contaienr)。Docker Compose运行的目录下的所有文件(docker-compose.yml, extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker Compose并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡。

使用实例

这里我们使用ghost/nginx/mysql搭建一个博客系统。用户通过nginx来访问ghost博客系统,整体流程如下:

这里写图片描述
所有我们需要创建三个服务,在docker目录下创建ghost,然后我们操作都在ghost目录下进行。在ghost目录下又分别创建data、ghost、nginx三个目录
这里写图片描述

  • 配置ghost服务

首先进入ghost目录下创建Dockerfile文件,编写如下内容:

FROM ghost:1-alpine
COPY ./config.js /var/lib/ghost/config.js
EXPOSE 2368
#CMD ["npm", "start","--production"]

然后创建一个config.js文件,用于ghost的配置:

var path = require('path'),
    config;

config = {

        production: {
                url: 'http://my-ghost-blog.com',
                mail: {},
                database: {
                        client: 'mysql',
                        connection: {
                                host: 'db',
                                user: 'ghost',
                                password: '12345',
                                database: 'ghost',
                                port: '3306',
                                charset: 'utf8'
                        },
                        debug: false
                },
                paths: {
                        contentPath: path.join(process.env.GHOST_CONTENT, '/')
                },
                server: {
                      host: '0.0.0.0',
                      port: '2368'
                },
       }
}
// Export config
module.exports = config;

ghost目录下完成这些可以了。

  • 配置nginx服务

进入nginx目录,编写Dockerfile文件

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

编写nginx的配置文件nginx.conf:

worker_processes 4;
events {worker_connections 1024;}
http {
        server {
                listen 80;
                location / {
                        proxy_pass http://ghost-app:2368;
                }
        }
}

这里http地址中的ghost-app就是docker-compose.yml文件中的ghost-app服务。

最后编写docker-compose配置文件docker-compose.yml,文件内容已在前面给出。

接下来使用docker-compose up -d来创建并运行服务,-d仍然表示后台运行。docker-conpose为你的应用创建一个网络,docker-compose为每个服务创建一个容器,并加入到这个网络中,被网络中的其它容器访问和发现。此容器能够以容器名称作为hostname标识,被其它容器访问。

在ghost目录使用命令docker-compose up,将执行以下几步:

  1. 创建一个名为ghost_blog的网络 。
  2. 以服务名(ghost-app、nginx、db)分别创建三个容器(Service与容器对应),添加到ghost网络中 。
  3. 容器以服务名作为其hostname相互访问。

如果一切正常会创建三个服务,可以使用docker-compose ps查看到。

这里写图片描述

如果出现异常服务没起来,那么需要检查配置文件并通过docker-compose logs查看日志来找打问题以解决,我们可以先使用stop命令停止服务并使用rm命令清除一下,最后使用docker-compose build命令再次重建服务。
这里写图片描述

服务起来后来到浏览器访问locahost地址,可以看ghost主页。
这里写图片描述

然后访问localhost/ghost地址,注册一个用户,简单发布一篇博客。
这里写图片描述

最后回到主页,可以看到我们发布的内容了。
这里写图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值