Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。使用前面介绍的Dockerfile咱们很容易定义一个单独的应用容器。然而在平常开发工做中,常常会碰到须要多个容器相互配合来完成某项任务的状况。例如要实现一个 Web 项目,除了 Web 服务容器自己,每每还须要再加上后端的数据库服务容器;再好比在分布式应用通常包含若干个服务,每一个服务通常都会部署多个实例。若是每一个服务都要手动启停,那么效率之低、维护量之大可想而知。这时候就须要一个工具可以管理一组相关联的的应用容器,这就是Docker Compose。 Compose有2个重要的概念java
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
复制代码
这个方法如今基本行不通,下载太慢了,不推荐使用。node
从https://github.com/docker/compose/releases/download/1.25.0/docker-compose-Linux-x86_64
下载对应的安装包,好比我下载了Linux-x86_64的。python
将下载好的安装包剪切到/usr/local/bin/docker-compose
目录下 mv /app/download/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
mysql
添加执行权限 sudo chmod +x /usr/local/bin/docker-compose
git
#安装依赖
yum -y install epel-release
#安装PIP
yum -y install python-pip
#升级PIP
pip install --upgrade 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
github
验证docker compose版本web
[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
redis
rm /usr/local/bin/docker-compose
sql
pip uninstall docker-compose
docker
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 down
stop
格式为 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 elasticsearch
restart
重启项目中的服务。用法跟上面的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
查看单独容器的日志
模板文件是使用 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
image: apache/skywalking-oap-server:6.5.0
image: apache/skywalking-ui:6.5.0
复制代码
ports
ports:
- "3000"
- "8080:8080"
- "127.0.0.1:8001:8001"
复制代码
volumes
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:
nproc: 65535
nofile:
soft: 20000
hard: 40000
复制代码
depends_on
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
首先我须要推荐两件事:
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
复制代码
本次实战咱们以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日知录 , 我的网站