docker之docker-compose的使用!

3,656 阅读6分钟

这是我参与 8 月更文挑战的第 18 天,活动详情查看: 8月更文挑战

简介

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

Docker-Compose将所管理的容器分为三层,分别是工程(project)服务(service)以及容器(container)。

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

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。 使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

安装docker-compose

1.下载 Docker Compose 的当前稳定版本

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2.对二进制文件应用可执行权限

chmod +x /usr/local/bin/docker-compose

3.查看是否安装成功

docker-compose --version

image-20210817140750891

基本使用

参数选项:

-f --file FILE指定Compose模板文件,默认为docker-compose.yml
-p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名
--verbose  输出更多调试信息
-v,-version 打印版本并退出
--log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)

常用命令:

docker-compose up #启动容器
docker-compose down #关闭并删除容器
docker-compose [start | stop | pause | restart] #启动/停止/暂停/重启 容器 
docker-compose run NAME ping baidu.com #在指定容器运行命令
docker-compose kill #机制停止容器
docker-compose scale #设置服务运行的容器个数
docker-compose ps #列出项目中所有的容器
docker-compose rm #删除容器
docker-compose logs #查看日志
docker-compose bulid #构建项目中的容器
docker-compose push #推送镜像
docker-compose pull #拉取依赖镜像
docker-compose config #查看项目容器配置
docker-compose create #为服务创建容器
docker-compose exec NAME /bin/bash #进入指定容器
docker-compose port NAME 端口号 #显示某个容器端口所映射的公共端口

Docker-compose模板文件

Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。 Docker-Compose标准模板文件应该包含versionservicesnetworks 三大部分,最关键的是servicesnetworks两个部分。

参数介绍

version:Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。

image:指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

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

context:选项可以是Dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路径时,被解析为相对于撰写文件的路径,此目录也是发送到Docker守护进程的context

dockerfile:使用dockerfile文件来构建,必须指定构建路径

commond:使用command可以覆盖容器启动后默认执行的命令。

container_name:可以自定义项目名称、服务名称

depends_on:在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题

ports:映射服务与主机的端口

extra_hosts:添加主机名的标签,会在/etc/hosts文件中添加一些记录。

volumes:挂载一个目录或者一个已存在的数据卷容器

dns:自定义DNS服务器。可以是一个值,也可以是一个列表。

expose:暴露端口,但不映射到宿主机,只允许能被连接的服务访问。

net:设置网络模式。

实例

下面演示一下官方的一个实例

1.创建项目文件夹

 mkdir composetest
 cd composetest

2.边写一个演示的项目

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

3.编写requirements.txt依赖列表文件

flask
redis

4.编写Dockerfile文件

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

5.编写docker-compose.yml文件

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

6.启动项目

docker-compose up -d

image-20210817151557870

7.测试

这个演示程序会显示这个网页访问的次数

image-20210817151629590

查看容器的日志

image-20210817151813724

通过docker-compose scale增加容器数量

image-20210817152049423

参考资料

docker官方文档

Docker入门之docker-compose

推荐阅读

Linux Shell编程基础!

Linux sudo和sudoers详解!

Linux TCP内核参数设置与调优(详细)!

运维一定要知道的Linux RAID详解!

Linux服务管理(详解)!

服务器硬件指南!