Docker-Compose基础与实战,看这一篇就够了

what & why
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。使用前面介绍的Dockerfile我们很容易定义一个单独的应用容器。然而在日常开发工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器;再比如在分布式应用一般包含若干个服务,每个服务一般都会部署多个实例。如果每个服务都要手动启停,那么效率之低、维护量之大可想而知。这时候就需要一个工具能够管理一组相关联的的应用容器,这就是Docker Compose。
Compose有2个重要的概念
- 项目(Project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
- 服务(Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
docker compose 安装与卸载
安装
二进制包在线安装
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
这个方法现在基本行不通,下载太慢了,不推荐使用。
二进制包离线安装
从https://github.com/docker/compose/releases/download/1.25.0/docker-compose-Linux-x86_64下载对应的安装包,比如我下载了Linux-x86_64的。
将下载好的安装包剪切到/usr/local/bin/docker-compose目录下
mv /app/download/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
pip安装
- 先安装好pip工具
#安装依赖
yum -y install epel-release
#安装PIP
yum -y install python-pip
#升级PIP
pip install --upgrade pip
- 验证pip 版本
[root@tymonitor bin]# pip --version
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
安装docker compose
pip install -U docker-compose==1.25.0

- 验证docker compose版本
[root@tymonitor bin]# docker-compose --version
docker-compose version 1.25.0, build b42d419
安装补全插件
curl -L https://raw.githubusercontent.com/docker/compose/1.25.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
卸载
二进制卸载
rm /usr/local/bin/docker-compose
pip卸载
pip uninstall docker-compose
docker compose 重要命令
命令选项
- -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
- -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
- --x-networking 使用 Docker 的可拔插网络后端特性
- --x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge
- --verbose 输出更多调试信息。
- -v, --version 打印版本并退出。
常用&重要命令
config
验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
如:docker-compose -f skywalking.yml config
此命令不会执行真正的操作,而是显示 docker-compose 程序解析到的配置文件内容:

images
列出 Compose 文件中包含的镜像。如docker-compose -f skywalking.yml images

ps
列出项目中目前的所有容器。如docker-compose -f skywalking.yml ps

build
构建(重新构建)项目中的服务容器。如:docker-compose -f skywalking.yml build,一般搭配自定义镜像,比如编写的Dockfile,功能类似于docker build .up
该命令十分强大(重点掌握),它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。如docker-compose -f skywalking.yml up。默认情况,docker-compose up启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。

如果使用docker-compose up -d将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
默认情况,如果服务容器已经存在,docker-compose up将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配docker-compose.yml文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用docker-compose up --no-recreate。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用docker-compose up --no-deps -d <SERVICE_NAME>来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。此命令有如下选项:
①:-d在后台运行服务容器。
②:--no-color不使用颜色来区分不同的服务的控制台输出。
③:--no-deps不启动服务所链接的容器。
④:--force-recreate强制重新创建容器,不能与 --no-recreate 同时使用。
⑤:--no-recreate如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
⑥:--no-build不自动构建缺失的服务镜像。
⑦:-t, --timeout TIMEOUT停止容器时候的超时(默认为 10 秒)。down
此命令停止用up命令所启动的容器并移除网络,如docker-compose -f skywalking.yml downstop
格式为docker-compose stop [options] [SERVICE...]
停止已经处于运行状态的容器,但不删除它。通过docker-compose start可以再次启动这些容器,如果不指定service则默认停止所有的容器。如docker-compose -f skywalking.yml stop elasticsearch
选项:
-t, --timeout TIMEOUT停止容器时候的超时(默认为 10 秒)。start
启动已经存在的服务容器。用法跟上面的stop刚好相反,如docker-compose -f skywalking.yml start elasticsearchrestart
重启项目中的服务。用法跟上面的stop,start一样logs
格式为docker-compose logs [options] [SERVICE...]
查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。该命令在调试问题的时候十分有用。如docker-compose -f skywalking.yml logs查看整体的日志,docker-compose -f skywalking.yml logs elasticsearch查看单独容器的日志
docker compose 模板文件
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。本文主要列出几个常见&重要的指令,其他指令大家可以自行百度。
默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。
version: '3'
services:
elasticsearch:
image: elasticsearch:6.8.5
container_name: elasticsearch
restart: always
volumes:
- /app/skywalking/elasticsearch/data:/usr/share/elasticsearch/data:rw
- /app/skywalking/elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /app/skywalking/elasticsearch/conf/jvm.options:/usr/share/elasticsearch/config/jvm.options
- /app/skywalking/elasticsearch/logs:/usr/share/elasticsearch/logs:rw
environment:
- TZ=Asia/Shanghai
- xpack.monitoring.enabled=false
- xpack.watcher.enabled=false
ports:
- "9200:9200"
- "9300:9300"
注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中重复设置。
常用&重要命令
images
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
image: apache/skywalking-oap-server:6.5.0
image: apache/skywalking-ui:6.5.0
ports
暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以,端口字符串都使用引号包括起来的字符串格式。
ports:
- "3000"
- "8080:8080"
- "127.0.0.1:8001:8001"
volumes
数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。
volumes:
- /app/skywalking/elasticsearch/data:/usr/share/elasticsearch/data:rw
- conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
ulimits
指定容器的 ulimits 限制值。
例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
depends_on
解决容器的依赖、启动先后的问题。以下例子中会先启动 redis mysql 再启动 web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: mysql
environment
设置环境变量。你可以使用数组或字典两种格式。
environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
environment:
- SW_STORAGE= elasticsearch
- SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
restart
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为always或者unless-stopped。
restart: always
docker-compose 实战
首先我需要推荐两件事:
- 配置docker加速镜像
创建或修改/etc/docker/daemon.json
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com",
"https://reg-mirror.qiniu.co"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- 给你的ide工具装上docker插件

本次实战我们以docker-compose部署skywalking为例。编写skywalking.yml,内容如下。
version: '3.3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.8.5
container_name: elasticsearch
restart: always
ports:
- 9200:9200
- 9300:9300
environment:
discovery.type: single-node
ulimits:
memlock:
soft: -1
hard: -1
oap:
image: skywalking/oap
container_name: oap
depends_on:
- elasticsearch
links:
- elasticsearch
restart: always
ports:
- 11800:11800
- 12800:12800
environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
ui:
image: skywalking/ui
container_name: ui
depends_on:
- oap
links:
- oap
restart: always
ports:
- 8080:8080
environment:
SW_OAP_ADDRESS: oap:12800
部署完成后将其上传至服务器,执行docker-compose -f /app/skywalking.yml up -d即可。

个人公众号:JAVA日知录 , 个人网站

Docker-Compose基础与实战,看这一篇就够了的更多相关文章
- 关于 Docker 镜像的操作,看完这篇就够啦 !(下)
紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...
- 关于 Docker 镜像的操作,看完这篇就够啦 !(上)
文章首发于微信公众号: 小哈学Java 镜像作为 Docker 三大核心概念中,最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的.本文将带您一步一步,图文并重,上手操作来学习它. 目录 ...
- Mybatis教程-实战看这一篇就够了
转自:https://blog.csdn.net/hellozpc/article/details/80878563 1.从JDBC谈起 1.1.使用IDEA创建maven工程 1.2.引入mysql ...
- 010.Docker Compose构建WordPress实战
一 前期规划 类型 版本 备注 WordPress镜像 wordpress:latest MySQL数据库 5.7 Docker已安装,参考<002.Docker版本及安装>. D ...
- 029.Docker Compose部署Zabbix实战
一 前期规划 1.1 Zabbix架构图 1.2 其他规划 组件 类型 版本 备注 Zabbix Web zabbix-web-apache-mysql镜像 wordpress:latest 也可采用 ...
- 部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了
部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了 安大虎 momenta 中台开发工程师 6 人赞同了该文章 就目前的形势看,一家公司的运维体系不承载在 Do ...
- JVM内存模型你只要看这一篇就够了
JVM内存模型你只要看这一篇就够了 我是一只孤傲的鱼鹰 让我们不厌其烦的从内存模型开始说起:作为一般人需要了解到的,JVM的内存区域可以被分为:线程栈,堆,静态方法区(实际上还有更多功能的区域,并且这 ...
- Java中的多线程=你只要看这一篇就够了
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了
title author date CreateTime categories win10 uwp win2d 入门 看这一篇就够了 lindexi 2019-5-25 20:0:52 +0800 2 ...
- 鸿蒙应用程序Ability(能力)看这一篇就够
本节概述 什么是Ability Ability分类 Ability生命周期 Ability之间跳转 什么是Ability Ability意为能力,是HarmonyOS应用程序提供的抽象功能.在Andr ...
随机推荐
- mp-vue拖拽组件的实现
作为一个效率还不错的小前端,自己的任务做完之后真的好闲啊,千盼万盼终于盼来了业务的新需求,他要我多加一个排序题,然后用户通过拖拽来排序,项目经理看我是个实习生,说有点复杂做不出来就算了,我这么闲的一个 ...
- ES6---变量解构赋值
1.数组的解构赋值 1.1 基本用法 解构赋值:在ES6中 ,按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构赋值.本质:这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量 ...
- Navicate12激活教程(完整详细版)
写在前面 最近身边的小伙伴苦于没有Navicat12的激活工具,不能使用最新版的Navicat,鉴于此,遂将自己整理的文章贴出来,供大家参考,不过个人还是主张维护正版的意愿,如果经济实力允许的话,还是 ...
- Spring之Zuul初步使用(十)
一.zuul是什么 zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架. ...
- linux sqlite安装
wget http://www.sqlite.org/sqlite-3.6.16.tar.gz tar -zxvf sqlite-3.6.16.tar.gz cd sqlite-3.6.16 ./c ...
- 设计模式C++描述----06.适配器(Adapter)模式
一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...
- CSAPP:代码优化【矩阵运算】
编程除了使程序在所有可能的情况下都正确工作,还需要考虑程序的运行效率,上一节主要介绍了关于读写的优化,本节将对运算的优化进行分析.读写优化 编写高效程序需要做到以下两点: 选择一组合适的算法和数据结构 ...
- 在虚拟机上的关于NFS网络文件系统
小知识: NFS(Network Files System)即网络文件系统,NFS文件系统协议允许网络中的主机通过TCP/IP协议进行资源共享,NFS客户端可以像使用本地资源一样读写远端NFS服务端的 ...
- 使用jieba分析小说人物出现次数
分析: 1. 读取小说,以读的形式打开 with open('文件名.txt','r',encoding='utf8') as f: str = f.read() 2. 切割小说 ret = jieb ...
- 差异:后缀数组(wzz模板理解),单调栈
因为涉及到对模板的理解,所以就着代码看会好一些. 让那些坚决不颓代码的人受委屈了. 我是对着wzz的板子默写的,可能不完全一样啊. 还有代码注释里都是我个人的理解,不保证正确,但欢迎指正. 可以有选择 ...