该命令十分强大(重点掌握),它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。如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
指定为镜像名称或镜像 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加速镜像
创建或修改/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