DockerCompose
是一个基于Docker的命令行工具,根据用户编写的yaml配置文件统一管理多个容器
获取docker-compose
默认情况下,Mac和Windows版本的Docker默认就安装上了docker-compose,但是Linux例外,需要从GitHub上的Compose仓库发行页面下载docker-compose并安装该二进制文件
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose #增加可执行权限
yaml文件格式
- yaml文件格式是类json键值对格式,要求冒号后需要有一个空格
- 使用缩进代表父子层级关系
- 字符串默认不用加单引号或双引号
- 单引号:会转义包裹的字符串中的转义字符
- 双引号:不会转义包裹字符串中的转义字符
- 对于数组和对象行内写法就和json差不多,非行内写法数组要求前面增加一个短横线,也无需小括号,下面是简单的示例
array1: [1, 2]
array2:
- 1
- 2
map1: { key1: value1, key2: value2 }
map2:
key1: value1
key2: vlaue2
docker-compose.yml
默认该配置文件名是docker-compose.yml
文件,该文件的配置共有三个属性,分别如下:
services
:下面一个service就是一个容器,service中可使用到networks
和volumes
下定义的网络和数据卷networks
:下面一个network就是一个网络volumes
:下面一个volume就是一个数据卷
下面是部署一个wordpress的例子(wordpress的镜像使用dockerHub官网进行查询):由例子可以看出,就是将Docker命令转化成了配置文件,具体支持的配置可从docker-compose官网查出
version: "3" #指定docker-compose.yml的版本
services:
wordpress:
image: wordpress
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- net1
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- "mysql:/var/lib/mysql"
networks:
- net1
volumes:
mysql:
networks:
net1:
driver: bridge
使用docker-compose
docker-compose up
:根据docker-compose.yml文件的配置信息创建并启动容器-f
:默认从当前目录中寻找名为docker-compose.yml文件,也可使用该参数进行指定-d
:后台运行
docker-compose down
:删除运行的服务docker-compose stop
:停止运行的服务docker-compose start
:启动使用docker-compose创建并启动但停止的容器docker-compose ps
:查看当前正在运行的服务docker-compose images
:查看docker-compose使用到的的镜像docker-compose exec
:在某个服务中执行命令,服务名是docker-compose.yml文件中定义的docker-compose logs
:查看某个服务中输出的信息
docker-compose水平扩展
使用docker-compose up
命令后使用--scale
指定某个服务的数量,从而达到容器的横向扩展,这些服务容器前面在使用一个负载均衡的容器,将流量负载均衡到不同的服务容器上,需要使用到dockercloud/haproxy镜像
服务器程序app.js文件如下
const redis = require("redis");
const express = require('express')
const os = require('os');
const app = express()
const host = process.env.REDIS_HOST //环境变量中寻找redis主机
const client = redis.createClient(6379, host); //获取redis连接对象
app.get('/', (req, res) => {
client.get("key", (err, data) => {
if (!data) { //若没值设置为1
client.set("key", 1, () => {
res.send(os.hostname + ": " + 1)
});
} else { //若有值则加一,并设置回去
data = parseInt(data) + 1;
client.set("key", data, () => {
res.send(os.hostname + ": " + data)
});
}
});
})
app.listen(80)
Dockerfile文件内容如下
FROM node:10.16.3
LABEL message="app server"
COPY app.js /app/app.js #上传本地文件到容器中
WORKDIR /app/ #移到工作目录
RUN npm install express --registry=https://registry.npm.taobao.org &&\ #安装连接express框架
npm install redis --registry=https://registry.npm.taobao.org #安装连接redis驱动
ENTRYPOINT node app.js #容器启动后运行服务程序
EXPOSE 80 #暴露80端口
docker-compose.yml文件内容如下
version: "3" #指定docker-compose.yml的版本
services:
redis:
image: redis
app:
build:
context: ./
dockerfile: Dockerfile
links:
- redis
environment:
REDIS_HOST: redis
haproxy:
image: dockercloud/haproxy
links:
- app
ports:
- "80:80"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
之后执行下面命令,并且访问浏览器进行测试
docker-compose up -d #单个服务容器启动
docker-compose up -d --scale app=3 #测试可扩展性
Comments NOTHING