06-DockerCompose

nobility 发布于 2022-08-05 466 次阅读


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中可使用到networksvolumes下定义的网络和数据卷
  • 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  #测试可扩展性
此作者没有提供个人介绍
最后更新于 2022-08-05