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
,将执行以下几步:
- 创建一个名为ghost_blog的网络 。
- 以服务名(ghost-app、nginx、db)分别创建三个容器(Service与容器对应),添加到ghost网络中 。
- 容器以服务名作为其hostname相互访问。
如果一切正常会创建三个服务,可以使用docker-compose ps
查看到。
如果出现异常服务没起来,那么需要检查配置文件并通过docker-compose logs
查看日志来找打问题以解决,我们可以先使用stop命令停止服务并使用rm命令清除一下,最后使用docker-compose build
命令再次重建服务。
服务起来后来到浏览器访问locahost
地址,可以看ghost主页。
然后访问localhost/ghost
地址,注册一个用户,简单发布一篇博客。
最后回到主页,可以看到我们发布的内容了。