Docker-Compose的日常使用

本文介绍了如何docker-compose的日常命令与构建

前言

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
Licensed under CC BY-NC-SA 4.0
最后更新于 2025-10-08 16:23 CST
主题 StackJimmy 设计 Blog Run Time
Love U: