前言
Docker-compose 相比 Docker,简单来说,就是把所有需要配置的信息都填写进一个 yaml 文件里,直接通过 yaml 文件一键配置与构建容器。
而且一个项目可以同时设置多个容器,省去了重复配置以及重复容器太多造成混乱的烦恼。
例如,好几个项目需要用到数据库容器,配置多了以后容易分辨不出曾经哪个数据库对应哪个项目。
目前群晖的Container Manager能支持使用 Docker-compose,将近一年使用下来体验良好。因此,我打算将已有的 Docker 容器,逐步转为 Docker-compose 构建。
以下记录日常需要用到的操作。
yaml 配置文件
详细参数可以参考菜鸟教程。
与 Docker 建立config目录相似,yaml 文件通常存放在想要建立的项目的根目录下:
- Nas
- volume1
- docker
- ani-rss
- config
- compose.yaml
不是必须,仅为了层次条理清晰,方便日后整理备份迁移。
如果是群晖,直接在项目中选择 yaml 文件构建就行。
单容器项目
以 emby 为例,官方给的配置如下:
---
version: "2.3" #这一项原本没有,为了方便讲解加上
services:
emby:
image: lscr.io/linuxserver/emby:latest
container_name: emby
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- /path/to/emby/library:/config
- /path/to/tvshows:/data/tvshows
- /path/to/movies:/data/movies
- /opt/vc/lib:/opt/vc/lib #optional
ports:
- 8096:8096
- 8920:8920 #optional
devices:
- /dev/dri:/dev/dri #optional
- /dev/vchiq:/dev/vchiq #optional
- /dev/video10:/dev/video10 #optional
- /dev/video11:/dev/video11 #optional
- /dev/video12:/dev/video12 #optional
restart: unless-stopped
version:指定 Docker-Compose 文件格式版本,有些项目可能需要使用旧版本格式。
services:顾名思义,简单来说就是告诉 Docker “我要运行这几个东西,它们各自怎么配置”。
emby:整个服务的名称,如果不指定容器名,会默认用项目名_服务名_序号当容器名称。
image:容器镜像的名称,填写需要拉取的容器镜像。
container_name:容器名称,必须唯一,docker 命令中用到的容器名就是这里设定的名称,可以自由更改。
environment:配置容器运行需要的环境参数,通常在镜像页面说明文档中会写明各种环境参数的意义,再根据需要选择是否填写。
volumes:目录映射,:左边是本地硬盘的路径,:右边是容器内路径。按示例的配置,硬盘中的/path/to/emby/library文件夹就等于容器内/config文件夹。
ports:访问端口,:左边是要映射的端口,:右边是容器的端口。
devices:硬件设备映射。
restart:重启策略。
明白了各项配置参数的意义后,以下是我根据自己需求更改的配置:
---
services:
emby:
image: lscr.io/linuxserver/emby:beta # 将镜像更换为beta版本
container_name: emby
environment:
# 用户和组ID设置,关系到容器的权限,需要自己获取,下面是我乱填的
- PUID=8888
- PGID=777
# 时区更改
- TZ=Asia/Shanghai
volumes:
# 配置目录,设置library文件夹存放emby的配置文件
- /volume1/docker/emby-beta/library:/config
# 媒体库目录
- /volume1/music:/music
- /volume2/Media/anime:/anime
- /volume2/Media/downloads/Bangumi:/bangumi
- /volume2/Media/animemovie:/animemovie
ports:
# 将内网登录端口改为8888
- 8888:8096
# HTTPS端口没动
- 8920:8920
devices:
# Intel硬解设备映射,如要开启硬解必须设置
- /dev/dri:/dev/dri
# 容器崩溃停止,自动重新启动,不影响手动停止
restart: unless-stopped
注意: /music、/anime、/bangumi、/animemovie路径会被容器当作在不同的分区。如果有硬链接的需求,则需要将映射改为/volume2/Media/downloads/Bangumi:/downloads/bangumi,这样bangumi内的文件可以硬链接至downloads文件夹内。
多容器项目
以 RSS-Hub 为例,直接将多个容器打包在一个服务内,可以相互有联系:
services:
rsshub:
# two ways to enable puppeteer:
# * comment out marked lines, then use this image instead: diygod/rsshub:chromium-bundled
# * (consumes more disk space and memory) leave everything unchanged
image: diygod/rsshub # or ghcr.io/diygod/rsshub
restart: always
ports:
- "1200:1200"
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: "redis://redis:6379/"
PUPPETEER_WS_ENDPOINT: "ws://browserless:3000" # marked
BILIBILI_COOKIE_你的ID:
# 例如想给容器加上bilibili的cookie用于识别,可在环境中加上
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:1200/healthz"]
interval: 30s
timeout: 10s
retries: 3
depends_on:
- redis
- browserless # marked
browserless: # marked
image: browserless/chrome # marked
restart: always # marked
ulimits: # marked
core: # marked
hard: 0 # marked
soft: 0 # marked
healthcheck: # marked
test: ["CMD", "curl", "-f", "http://localhost:3000/pressure"] # marked
interval: 30s # marked
timeout: 10s # marked
retries: 3 # marked
redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 5s
volumes:
redis-data:
相关命令
需要开启 SSH 功能。
登录
登录 SSH 账号:
ssh 用户名@[ip] -p 端口
进入管理员模式:
sudo -i
退出命令:
exit
基础命令
构建镜像:
docker-compose build
查看运行状态:
docker-compose ps
查看日志:
docker-compose logs
进入容器:
docker-compose exec 容器名 /bin/sh
容器内运行命令:
docker-compose exec
删除容器:
docker-compose rm
重启项目:
docker-compose restart
复制文件:
docker-compose cp 文件名.html emby容器名:/app/emby/system/dashboard-ui/
更新项目
查看当前正在运行的项目:
docker-compose ls
cd 到需要更新项目的文件夹:
cd /volume1/docker/项目文件夹
停止项目:
docker-compose stop 项目名
更新项目:
docker-compose pull
重新启动项目并在后台运行:
docker-compose up -d