6. 单机编排之Docker Compose

1 Docker Compose

Docker Compose是一个单机的容器编排工具, 可以用来解决不同容器内应用之间的依赖关系
并且可以代替docker命令对容器进行创建, 启动和停止等手工操作
docker-compose项目是Docker官方的开源项目, 负责实现对docker容器集群的快速编排
其将管理的容器分为三层, 分别是工程(project), 服务(service),以及容器(container)
docker-compose只适用于单机的容器编排, 对于容器集群, 还需要使用k8s去实现

2 安装和准备

2.1 安装

docker compose多种安装方式
1. pip安装, 因为docker-compose本身就是Python开发的
2. 通过github下载对应版本, 安装
3. 利用deb或yum安装, 不过版本比较老旧

github安装docker-compose

官方在github提供docker-compose资源, 而其本身就是一个二进制程序, 因此, 直接下载, 保存到PATH变量目录, 修改权限即可使用
v1.26.2
root@docker-compose:~# ll -t /usr/sbin
total 24320
-rwxr-xr-x  1 root root 12254160 Feb  9 04:34 docker-compose* # 需要添加x权限, 本身是没有执行权限的

2.2 命令使用

常用选项:
-f File # 指定docker-compose使用的文件, 默认会使用同目录下的docker-compose.yml文件
-p NAME # 指定项目名称, 默认将使用当前所在目录名称作为项目名, 因此, 执行docker-compose命令最好进入到对应的项目目录下
常用命令:
build 构建镜像
bundle 从当前docker-compose文件生成一个以<当前目录>为名称的json格式的Docker Bundle备份文件
config -q 查看当前配置, 没有错误不输出任何信息
create 创建服务, 较少使用
down 停止和删除所有容器, 网络, 镜像和数据卷
events 从容器接收实时事件可以指定json日志格式, 较少使用
exec 进入指定容器进行操作
help 显示帮助信息
images 显示镜像信息, 较少使用
kill 强制终止运行中的容器
logs 查看容器的日志
pause 暂停服务
port 查看端口
ps 列出容器, 较少使用
pull 重新拉取镜像, 镜像发生变化后, 需要重新拉取镜像, 较少使用
push 上传镜像
restart 重启服务, 较少使用
rm 删除已经停止的服务
run 一次性运行容器
scale 设置指定服务运行的容器个数
start 启动服务, 较少使用
stop 停止服务, 较少使用
top 显示容器运行状态
unpause 取消暂停
up 创建并启动容器, 较少使用

3 docker-compose 文件格式

docker-compose使用yaml文件, 格式要求严格的行首缩进
默认docker-compose命令会调用当前目录下的docker-compose.yml的文件, 因此一般执行docker-compose命令前, 先进入docker-compose.yml文件所在目录

4 从docker compose启动容器

4.1 创建docker compose文件

docker compose文件可在任意目录, 创建文件名为docker-compose.yml配置文件, 要注意前后的缩进
root@docker-compose:~# mkdir /data/docker-compose
root@docker-compose:~# cd /data/docker-compose
root@docker-compose:/data/docker-compose# vim docker-compose.yml
server-nginx-web:                                                                                                                           
    image: nginx
    container_name: nginx-web
    expose:
      - 80
      - 443
    ports:
      - "80:80"
      - "443:443"

4.2 检查配置和格式

root@docker-compose:/data/docker-compose# docker-compose config
services:
  server-nginx-web:
    container_name: nginx-web
    expose:
    - 80
    - 443
    image: nginx
    network_mode: bridge
    ports:
    - 80:80/tcp
    - 443:443/tcp
version: '2.1'
root@docker-compose:/data/docker-compose# docker-compose config -q

4.3 启动容器

必须在docker-compose文件所在的目录执行

前台启动
docker-compose up
Status: Downloaded newer image for nginx:latest
Creating nginx-web ... done
Attaching to nginx-web
nginx-web           | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx-web           | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx-web           | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx-web           | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
nginx-web           | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
nginx-web           | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx-web           | /docker-entrypoint.sh: Configuration complete; ready for start up
root@docker-compose:~# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                      NAMES
ba4372e946d5        nginx               "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx-web
图片.png
换到另一个终端, 进入容器
root@docker-compose:/data/docker-compose# docker-compose exec server-nginx-web bash

4.4 退出前台运行的容器

ctrl + c 
Stopping nginx-web ... done
root@docker-compose:/data/docker-compose# docker-compose ps
  Name                 Command               State    Ports
-----------------------------------------------------------
nginx-web   /docker-entrypoint.sh ngin ...   Exit 0 

4.5 启动退出的容器

root@docker-compose:/data/docker-compose# docker-compose start 
Starting server-nginx-web ... done
docker-compose up 前台启动
docker-composeu up -d  后台启动

4.6 退出容器

root@docker-compose:/data/docker-compose# docker-compose kill
Killing nginx-web ... done
root@docker-compose:/data/docker-compose# docker-compose ps
  Name                 Command                State     Ports
-------------------------------------------------------------
nginx-web   /docker-entrypoint.sh ngin ...   Exit 137 

4.7 删除容器

4.7.1 只删除停止的容器

root@docker-compose:/data/docker-compose# docker-compose rm
Going to remove nginx-web
Are you sure? [yN] y
Removing nginx-web ... done

4.7.2 直接删除正在工作的容器

后台启动
root@docker-compose:/data/docker-compose# docker-compose up -d
Creating nginx-web ... done
root@docker-compose:/data/docker-compose# docker-compose ps
  Name                 Command               State                    Ports                  
---------------------------------------------------------------------------------------------
nginx-web   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
停止并删除容器
root@docker-compose:/data/docker-compose# docker-compose down
Stopping nginx-web ... done
Removing nginx-web ... done
root@docker-compose:/data/docker-compose# docker-compose ps
Name   Command   State   Ports
------------------------------
镜像也会被删除
root@docker-compose:/data/docker-compose# docker-compose images
Container   Repository   Tag   Image Id   Size
----------------------------------------------
基础镜像还在, 所以在启动,也无需重新拉镜像, 但是是重新创建docker-compose
相当于利用拉取的镜像, 在创建为docker-compose镜像
[root@Ubuntu-1804-2:/apps/harbor]# docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
10.0.0.29/alpine-test/alpine    v1.0                e50c909a8df2        11 days ago         5.61MB
alpine                          latest              e50c909a8df2        11 days ago         5.61MB
goharbor/chartmuseum-photon     v0.8.1-v1.7.6       ca4e65cc8cbf        17 months ago       114MB
goharbor/harbor-migrator        v1.7.6              bd65976b2563        17 months ago       680MB
goharbor/redis-photon           v1.7.6              477066fd0e02        17 months ago       109MB
goharbor/clair-photon           v2.0.8-v1.7.6       a65550304aa5        17 months ago       165MB
goharbor/notary-server-photon   v0.6.1-v1.7.6       1bfca6aac750        17 months ago       136MB
goharbor/notary-signer-photon   v0.6.1-v1.7.6       8535add7bfa5        17 months ago       133MB
goharbor/harbor-registryctl     v1.7.6              bb06dcda87fa        17 months ago       103MB
goharbor/registry-photon        v2.6.2-v1.7.6       8fa930eedbea        17 months ago       87.7MB
goharbor/nginx-photon           v1.7.6              fea7c162d250        17 months ago       37MB
goharbor/harbor-log             v1.7.6              f9b50bc6e136        17 months ago       82.6MB
goharbor/harbor-jobservice      v1.7.6              cfac2ab2d45a        17 months ago       85.1MB
goharbor/harbor-core            v1.7.6              37379145c410        17 months ago       96.6MB
goharbor/harbor-portal          v1.7.6              eafab006217d        17 months ago       41.7MB
goharbor/harbor-adminserver     v1.7.6              2d91210e25ed        17 months ago       73.3MB
goharbor/harbor-db              v1.7.6              f28a4ae69c04        17 months ago       146MB

4.8 后台执行

root@docker-compose:/data/docker-compose# docker-compose up -d
Creating nginx-web ... done
root@docker-compose:/data/docker-compose# docker-compose images
Container   Repository    Tag       Image Id      Size 
-------------------------------------------------------
nginx-web   nginx        latest   f6d0b4767a6c   133 MB

4.9 停止, 启动, 重启

root@docker-compose:/data/docker-compose# docker-compose stop
Stopping nginx-web ... done
root@docker-compose:/data/docker-compose# docker-compose start
Starting server-nginx-web ... done
root@docker-compose:/data/docker-compose# docker-compose ps
  Name                 Command               State                    Ports                  
---------------------------------------------------------------------------------------------
nginx-web   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
root@docker-compose:/data/docker-compose# docker-compose restart
Restarting nginx-web ... done
root@docker-compose:/data/docker-compose# docker-compose ps
  Name                 Command               State                    Ports                  
---------------------------------------------------------------------------------------------
nginx-web   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

4.10 日志查看

json格式查看

root@docker-compose:/data/docker-compose# docker-compose restart
Restarting nginx-web ... done

root@docker-compose:/data/docker-compose# docker-compose events --json



{"time": "2021-02-09T05:35:15.211387", "type": "container", "action": "kill", "id": "aa33b6a73eb3687896c5b1a0a9f55273a2e9fdd052b9cc8639ec22b5d4529a40", "service": "server-nginx-web", "attributes": {"name": "nginx-web", "image": "nginx"}}
{"time": "2021-02-09T05:35:15.282536", "type": "container", "action": "die", "id": "aa33b6a73eb3687896c5b1a0a9f55273a2e9fdd052b9cc8639ec22b5d4529a40", "service": "server-nginx-web", "attributes": {"name": "nginx-web", "image": "nginx"}}
{"time": "2021-02-09T05:35:15.405425", "type": "container", "action": "stop", "id": "aa33b6a73eb3687896c5b1a0a9f55273a2e9fdd052b9cc8639ec22b5d4529a40", "service": "server-nginx-web", "attributes": {"name": "nginx-web", "image": "nginx"}}
{"time": "2021-02-09T05:35:16.433548", "type": "container", "action": "start", "id": "aa33b6a73eb3687896c5b1a0a9f55273a2e9fdd052b9cc8639ec22b5d4529a40", "service": "server-nginx-web", "attributes": {"name": "nginx-web", "image": "nginx"}}
{"time": "2021-02-09T05:35:16.433600", "type": "container", "action": "restart", "id": "aa33b6a73eb3687896c5b1a0a9f55273a2e9fdd052b9cc8639ec22b5d4529a40", "service": "server-nginx-web", "attributes": {"name": "nginx-web", "image": "nginx"}}
默认格式查看

root@docker-compose:/data/docker-compose# docker-compose events
2021-02-09 05:36:07.859265 container kill aa33b6a73eb3687896c5b1a0a9f55273a2e9fdd052b9cc8639ec22b5d4529a40 (image=nginx, name=nginx-web)
2021-02-09 05:36:07.961174 container die aa33b6a73eb3687896c5b1a0a9f55273a2e9fdd052b9cc8639ec22b5d4529a40 (image=nginx, name=nginx-web)
2021-02-09 05:36:08.132842 container stop aa33b6a73eb3687896c5b1a0a9f55273a2e9fdd052b9cc8639ec22b5d4529a40 (image=nginx, name=nginx-web)
2021-02-09 05:36:08.893008 container start aa33b6a73eb3687896c5b1a0a9f55273a2e9fdd052b9cc8639ec22b5d4529a40 (image=nginx, name=nginx-web)
2021-02-09 05:36:08.893067 container restart aa33b6a73eb3687896c5b1a0a9f55273a2e9fdd052b9cc8639ec22b5d4529a40 (image=nginx, name=nginx-web)

4.11 指定同时启动的容器的数量

通过docker-compose文件可以同时启动多个不同服务的容器
root@docker-compose:/data/docker-compose# vim docker-compose.yml 
server-nginx-web:
    image: nginx
    #container_name: nginx-web # 同时启动多个同一镜像的容器, 不要自定容器名称, 否则会冲突
    expose:
      - 80
      - 443
    #ports: # 同时启动多个同一镜像的容器, 不要指定端口号, 否则会冲突
    #  - "80:80"
    #  - "443:443"

#再添加一个服务
server-tomcat-web:
    image: tomcat
--scale用来指定要启动的各种服务容器的数量, 如果, 没有指定--scale, 而yml文件有写了服务, 那么就会默认启动一个
root@docker-compose:/data/docker-compose# docker-compose up -d --scale server-nginx-web=2
root@docker-compose:/data/docker-compose# docker-compose ps
               Name                             Command               State        Ports     
---------------------------------------------------------------------------------------------
docker-compose_server-nginx-web_1    /docker-entrypoint.sh ngin ...   Up      443/tcp, 80/tcp
docker-compose_server-nginx-web_2    /docker-entrypoint.sh ngin ...   Up      443/tcp, 80/tcp
docker-compose_server-tomcat-web_1   catalina.sh run                  Up      8080/tcp 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容