docker compose 内容指导

由于之前写了一篇文章,主要是关于docker 基础的东西。这里说一下,容器编排的事情,因为后面 k8s 会用到这个。
参考 下面这个, 文档特别清晰
Docker Compose gitbook

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用

注意 docker compose 有两个版本 一个是 python 编写的 ( docker-compose ),一个是 go 重写的 叫 compose v2 ( docker compose )命令几乎没有区别,只是 go 的少了 -, 我们用python 版的就行。没什么差别

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用
本章将介绍 Compose 项目情况以及安装和使用。

1.Compose 的简介

目标: 定义和运行多个 Docker 容器的应用, 针对多个容器组,进行一键启动和停止。
具体实现: docker-compose.yml 来定义一组相关联的应用容器为一个项目(project) docker-compose.yml 就相当于 dockerfile 的 dockfile

概念
service 服务 , 包含多个运行的容器
project 项目, docker compose 管理的单元

2. 安装

$ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/d
ocker-compose > /etc/bash_completion.d/docker-compose

3 使用

自己跑了一便文档上的例子,确实比较好用哟

  • 在 任意文件夹 内穿件下面三个文件
-bash-4.2# pwd
/home/yangxuelei/docker_compose
-bash-4.2# ls
app.py  docker-compose.yml  Dockerfile

内容分别如下:
app.py

from flask import Flask
from redis import Redis

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

@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

Dockerfile

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]

docker-compose.yml

version: '3'
services:

  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"
  • 运行
docker-compose up  -d  # -d 指定 后台运行,和 docker run -d 类似

运行过程


-bash-4.2# docker-compose up
------------------------------------------------------------------------------
单独创建一个网络 ( 确保容器名能在容器内部作为域名链接,打通网络)

Creating network "docker_compose_default" with the default driver
----------------------------------------------------------------------------------
生成镜像   默认为 (当前目录名_serversname:latest)

Building web
Sending build context to Docker daemon  4.096kB
Step 1/5 : FROM python:3.6-alpine
3.6-alpine: Pulling from library/python
...
Digest: sha256:f6bbda8e3f379c148c8ce45f7e017373158d0b725305b82c3f41d65ec4d18969
Status: Downloaded newer image for python:3.6-alpine
 ---> ac438c122d19
Step 2/5 : ADD . /code
 ---> 0e90ba41919e
......

Successfully tagged docker_compose_web:latest

Pulling redis (redis:alpine)...
alpine: Pulling from library/redis
540db60ca938: Already exists
( redis 镜像已经存在,所以不重新构建了 )

-----------------------------------------------------------------------------
从构建好的镜像 运行运行容器

Creating docker_compose_web_1   ... done
Creating docker_compose_redis_1 ... done
Attaching to docker_compose_web_1, docker_compose_redis_1

看一下刚刚启动的容器:


docker ps 查看启动的容器

上述命令会自动 帮你构建镜像,并按照配置启动容器组。已经存在镜像,则不会成重新构建,除非 使用 docker-compose build 重新构建服务

docker-compose build [options] [SERVICE...]
  • 停止

docker-compose down

停止过程

Stopping docker_compose_web_1   ... done
Stopping docker_compose_redis_1 ... done
Removing docker_compose_web_1   ... done
Removing docker_compose_redis_1 ... done
Removing network docker_compose_default

可以看出,是先停掉容器,然后再删除容器的,也会删除网络。所以必要的数据一定要 挂载到外面做持久化

  • 再次运行

-bash-4.2# docker-compose up -d
Creating network "docker_compose_default" with the default driver
Creating docker_compose_redis_1 ... done
Creating docker_compose_web_1   ... done

可以看到不会重复构建镜像,只会创建新的网络和容器

  • 查看生成的镜像 (服务运行的时候才能显示, 因为是根据容器显示的)
-bash-4.2# docker-compose images
      Container              Repository        Tag       Image Id       Size
------------------------------------------------------------------------------
docker_compose_redis_1   redis                alpine   1690b63e207f   32.32 MB
docker_compose_web_1     docker_compose_web   latest   d14fc1d5217b   53.59 MB

4 docker-compose 相关命令

docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

可选的 参数
-f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名
(up 的时候可以,使用 -p 参数修改 默认的 目录名的项目名)

docker-compose -p compose_test up -d
# Creating compose_test_redis_1 ... done
# Creating compose_test_web_1   ... done
build (仅针对写了 build 的services)
config

检查 Compose 文件是不是对的,错误的话会有错误信息

down

停止容器组,依次删除容器和清楚创建的网络

exec

进入指定的容器 ( services 里定义的服务名) 或者直接 docker exec

ps

查看容器组 (只包含 compose 启动的容器)

images

列出 compose 文件中的镜像

kill (通过发送 SIGKILL 信号来强制停止服务容器)
logs

默认会 用不同的颜色 显示 服务组的控制台日志

pause

暂停一个服务容器,和 docker pause 一样的

pull

拉取服务依赖的镜像

push

推送服务依赖的镜像到 Docker 镜像仓库

restart

重启项目中的服务

rm
run
docker-compose run ubuntu ping docker.com

所有关联的服务将会自动被启动

scale

这个还是挺有用的,设置服务容器的个数

docker-compose scale web=3 db=2
start

启动服务

stop

关闭容器

up

这个命令是最常用的

它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作
docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容

docker compose 模板文件

格式

ymal
一个基本模板

version: "3"

services:
  webapp:
    image: examples/web
    ports:
      - "80:80"
    volumes:
      - "/data"

一些可用的配置项 (只说一下,常用的吧)

每个服务都必须通过 image 或者 build ( 使用 Dockerfile) 指令 指定镜像生成的方式

build

指定dockerfile 路径,相对于 docker-compose.ymal 文件 相对路径 或者 绝对路径

build: ./dir

或者 
build:
      context: ./dir    # Dockerfile 所在文件夹的路径
      dockerfile: Dockerfile-alternate  # Dockerfile 文件名
      args:   # arg 指令指定构建镜像时的变量
        buildno: 1
command
command: echo "hello world"

默认为 dockerfile 的入口命令,你可以用这个覆盖

container_name
container_name: docker-web-container

覆盖默认的规则 : 项目名称服务名称序号

如果指定了 这个容器名,就没办法使用 docker-compose scale 命令了,因为多个容器名不能一样

depends_on

指定当前容器 依赖那个容器(需要先启动)

下面的启动 顺序依次是 redis db web

services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

web 服务不会等待 redis db 「完全启动」之后才启动

expose

暴露端口,但不映射到宿主机

expose:
 - "3000"
 - "8000"
healthcheck

容器健康检查配置

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
image

和build 目的一样,指定某个镜像的生成方式
如果本地不存在 会尝试 pull

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
labels

添加容器描述信息, 和 dockerfile 里面的 labels 一样

labels:
  com.startupteam.description: "webapp for a startup team"
  com.startupteam.department: "devops department"
  com.startupteam.release: "rc3 for v1.0"
network_mode

和 docker run --network 的一样

networks

设置容器使用的网络

ports

和 docker run -p 一样
HOST:CONTAINER 前面是 宿主机,后面是容器,单个 的话就是暴露容器端口

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"
volumes

设置挂在目录
HOST:CONTAINER 宿主机路径/数据卷 : 容器路径
支持相对路径

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

以及其他命令

domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir

关于 compose 容器间的通信 (使用 服务名 即可)
https://michael728.github.io/2019/06/15/docker-compose-networks/

下面关于我的 docker-compose.yml

version: '3'  # 最新的是3,  Compose配置文件格式声明
services:  # 定义服务
    model_server:   # 某个服务
        labels: # 同 dockerfile labels  描述信息
          author: "yangxuelei@airia.cn"
          useage: "airia stream model server"
          lanuage: "golang 1.15.5"
          run_mode: "go mod"
          frame: "gin"
        build: model_server_install  # 指定一个打包的相对目录(或绝对目录)
        container_name: model_server  # 定死容器名, 将不能使用 docker-compose  
scale 命令,因为容器名字不能重复
        ports:  # 端口映射,同dockerfile
          - 8080:8080
        volumes:  # 数据挂载,同 dockerfile
          - /home/yangxuelei/airia_stream_mount/model_server:/home/root/media

        depends_on:  # 容器依赖,会在他们之后启动当前的 service
          - redis
          - mysql

    monitor_server: 
        labels:
          useage: "airia stream monitor server"
          language: "python3.6"
          frame: "django 2.2"
        build: monitor_server_install
        container_name: monitor_server
        depends_on:
          - redis
          - mysql
        ports:
          - 8086:8086
          - 8505:8505
          - 8506:8506
        volumes:
          - /home/yangxuelei/airia_stream_mount/monitor_server:/home/RESOURCES/monitor
/alert/images

    mysql:
        image: mysql  # 直接使用官方镜像
        expose: # 暴露端口,服务之间,而不是暴露到宿主机
          - 3306
        environment:  # 设置一些环境变量 
          TZ: Asia/Shanghai
          MYSQL_ROOT_PASSWORD: abcd@1234
          MYSQL_USER: root
          MYSQL_PASS: abcd@1234
          MYSQL_DATABASE: model_server
        volumes:
          - /home/yangxuelei/airia_stream_mount/mysql-data:/var/lib/mysql  # 数据持久
化到外面/初始化数据库结构
          # 我是直接弄一个空的数据库,执行完吧 /var/lib/mysql放到外面的挂在目录,然后模拟初始化
          - /home/yangxuelei/airia_stream_mount/init.sh:/var/init.sh  # 挂载外部初始化
数据脚本, 这个后面不需要了,直接用上面的数据挂载初始化
        # command: /bin/sh /var/init.sh  # 指定这个初始化文件,传给 mysql的
entrypoint 命令
        container_name: aistream_mysql
        labels:
          useage: "model_server and monitor server data stoage"

    redis:
        image: redis
        expose:
          - 6379
        container_name: aistream_redis
        labels:
          useage: "for websocket"


# 启动
# docker-compose -p haha up -d  后台启动, 有打包好的镜像会直接运行
# docker-compose -p haha build 重新打包生成镜像
# docker-compose -p haha down  停止服务并移除容器和网络
# docker-compose -p haha logs  查看所有的启动日志

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容