Docker 安装、日志轮转与 IPv6 支持配置

记录一台新 Ubuntu/Debian 服务器从 Docker 安装、Compose 插件、Dockge/Portainer 管理面板,到 Docker 日志轮转和按需启用 IPv6 的配置流程。

这篇整理一套新服务器上安装 Docker 的基础流程,并把刚装好 Docker 后最容易忽略的日志轮转问题一起处理掉。

核心建议很简单:

  • 新机器先把 Docker 和 Docker Compose 装好。
  • 立刻给 Docker daemon 配一个全局日志轮转兜底,避免容器日志长期写爆硬盘。
  • Compose 文件里如果单独配置了 logging,以 Compose 的容器级配置为准,不会和 daemon 默认值冲突。
  • Docker IPv6 不建议第一次安装时顺手整段开启,只有明确需要容器直连 IPv6、容器对外提供 IPv6 服务,或某些应用必须在容器网络内使用 IPv6 时,再单独启用。

一、安装 Docker

在 Ubuntu 或 Debian 上,最省事的方式是使用 Docker 官方安装脚本:

sh <(curl -sSL https://get.docker.com)

安装后检查客户端和服务端版本:

docker version

查看 Docker 服务是否能正常列出容器:

docker ps

如果当前是 root 用户,以上命令通常可以直接执行。如果后续希望普通用户也能运行 Docker,需要把用户加入 docker 组:

sudo usermod -aG docker $USER

然后重新登录 SSH 会话,再测试:

docker ps

注意:加入 docker 组后,这个普通用户基本等同于拥有宿主机 root 权限。只应给可信用户加入该组。

二、安装 Docker Compose 插件

现在推荐使用 Docker CLI 插件形式的 Compose,也就是执行 docker compose,而不是老的 docker-compose 命令。

如果系统软件源已经提供可用版本,可以直接安装:

sudo apt-get update
sudo apt-get install -y docker-compose-plugin
docker compose version

如果软件源里的版本太旧,也可以手动从 GitHub 获取最新版本并放到 Docker CLI 插件目录:

LATEST=$(curl -sL https://api.github.com/repos/docker/compose/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -sSL https://github.com/docker/compose/releases/download/$LATEST/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
docker compose version

如果服务器不是 x86_64 架构,需要把下载文件名里的 linux-x86_64 换成对应架构,例如 linux-aarch64

三、给 Docker 配置全局日志轮转

Docker 默认使用 json-file 日志驱动。这个驱动兼容性很好,docker logs 也能直接读取,但如果不设置轮转,容器长期运行后日志文件可能持续变大,最后把系统盘写满。

建议新装 Docker 后先写入一个全局默认日志配置:

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "20m",
    "max-file": "3"
  }
}
EOF

sudo systemctl restart docker
docker info --format 'LoggingDriver={{.LoggingDriver}}'

看到下面输出,就说明默认日志驱动仍是 json-file

LoggingDriver=json-file

这里的含义是:每个容器最多保留 3 个日志文件,每个文件最大约 20 MB,也就是单个容器最多约 60 MB 本地 JSON 日志。

这个配置是 Docker daemon 的全局默认值。新创建的容器会继承它;如果某个 Compose 文件或 docker run 单独指定了日志配置,则以容器自己的配置为准。

四、Compose 里的日志配置会不会冲突

不会冲突。

/etc/docker/daemon.json 里的 log-driverlog-opts 是全局默认配置。Compose 文件里的 logging 是容器级配置,会覆盖全局默认值。

例如某个服务日志比较多,可以在 Compose 中单独调小:

services:
  app:
    image: nginx:latest
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

某个服务需要保留更久,也可以单独调大:

services:
  app:
    image: nginx:latest
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "5"

推荐做法是:daemon 配一个保守兜底,重要服务再在 Compose 里按需覆盖。

五、确认日志轮转是否生效

查看 Docker 当前日志驱动:

docker info --format 'LoggingDriver={{.LoggingDriver}}'

查看某个容器实际日志配置:

docker inspect <容器名或ID> --format '{{json .HostConfig.LogConfig}}'

例如:

docker inspect nginx --format '{{json .HostConfig.LogConfig}}'

如果容器已经在修改 daemon.json 之前创建,它不一定会自动继承新的默认日志参数。最稳妥的方式是重建容器:

docker compose down
docker compose up -d

单纯 restart 旧容器不一定会改变它创建时已经固定下来的日志配置。

六、安装 Dockge

Dockge 是一个 Docker Compose Web 管理工具。安装前先确认 Compose 可用:

docker compose version

创建目录并下载官方 Compose 文件:

mkdir -p /opt/{dockge,stacks}
wget -q -O /opt/dockge/compose.yaml https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml
cd /opt/dockge
docker compose up -d

访问地址:

http://虚拟机IP:5001

多数内网环境下,先用 http://IP:5001 验证服务正常即可。后续如果需要公网访问,再考虑通过 Nginx Proxy Manager、Caddy 或 Traefik 加 TLS。

七、安装 Portainer

Portainer 是另一个常用 Docker Web 管理面板,适合查看容器、镜像、数据卷、网络和日志。

创建数据卷:

docker volume create portainer_data

启动 Portainer CE:

docker run -d \
  -p 8000:8000 \
  -p 9443:9443 \
  --name=portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

访问地址:

https://虚拟机IP:9443

第一次访问会要求创建管理员账号。因为 Portainer 挂载了 /var/run/docker.sock,它对 Docker 的控制权限很高,不建议直接暴露到公网。

八、什么时候需要开启 Docker IPv6

日志轮转建议一开始就配;IPv6 则不是刚装 Docker 的必选项。

下面这些场景可以考虑开启 Docker IPv6:

  • 容器需要直接访问 IPv6 网络。
  • 容器内应用必须监听 IPv6 地址。
  • 你希望容器网络自己分配 IPv6 地址,而不是只通过宿主机端口映射提供 IPv6 入口。
  • 你明确知道路由器、防火墙、云安全组和宿主机内核转发都已经准备好。

下面这些场景通常不需要开启 Docker IPv6:

  • 只是让宿主机通过 IPv6 访问互联网。
  • 只是把 Web 服务映射到宿主机端口,再由 Nginx Proxy Manager 或宿主机反代处理。
  • 只是内网自用 Docker 服务,例如 Dockge、Portainer、普通数据库和缓存。

如果只是内网新装 Docker,建议先不启用 IPv6,减少变量。

九、按需开启 Docker 默认 bridge 的 IPv6

如果确认需要让 Docker 默认 bridge 网络支持 IPv6,可以把日志配置和 IPv6 配置合并到同一个 /etc/docker/daemon.json

示例:

sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "20m",
    "max-file": "3"
  },
  "ipv6": true,
  "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
  "ip6tables": true
}
EOF

sudo systemctl restart docker

这段配置做了三件事:

  • ipv6: true:开启 Docker IPv6 功能。
  • fixed-cidr-v6:给默认 bridge 网络分配一段 IPv6 地址池。
  • ip6tables: true:让 Docker 管理 IPv6 相关转发规则。

这里使用的 fd00:dead:beef:c0::/80 是 ULA 内网 IPv6 地址段,只适合作为容器内部地址池。它不是公网 IPv6 前缀,不能让容器自动拥有公网 IPv6 可达性。

很多旧教程会加:

"experimental": true

现在通常不建议为了 IPv6 顺手加这一项。除非你正在使用某个明确依赖 Docker experimental feature 的功能,否则不要把它作为默认配置。

十、用自定义 Docker 网络启用 IPv6

更推荐的方式是为需要 IPv6 的服务单独建一个用户自定义网络,而不是把所有容器都放到默认 bridge 上。

创建一个启用 IPv6 的 Docker 网络:

docker network create \
  --ipv6 \
  --subnet fd00:dead:beef:100::/64 \
  ipv6net

Compose 中引用这个外部网络:

services:
  app:
    image: nginx:latest
    networks:
      - ipv6net

networks:
  ipv6net:
    external: true
    name: ipv6net

这种方式更清晰:只有需要 IPv6 的服务接入 ipv6net,其他普通服务继续使用默认网络。

十一、IPv6 排查命令

查看 Docker daemon 配置:

cat /etc/docker/daemon.json

查看 Docker 网络:

docker network ls
docker network inspect bridge
docker network inspect ipv6net

进入容器检查 IPv6 地址:

docker exec -it <容器名> sh
ip -6 addr

从容器内测试 IPv6 出站:

ping -6 2606:4700:4700::1111

如果容器有 IPv6 地址但无法出站,重点检查宿主机 IPv6 转发、防火墙、上游路由器和云安全组。Docker 分配 ULA 地址并不等于外网能直接访问容器。

十二、推荐最终配置

新服务器刚装 Docker 时,建议先只使用这一份 /etc/docker/daemon.json

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "20m",
    "max-file": "3"
  }
}

这份配置足够解决最实际的问题:避免容器日志无限增长。

等以后确实需要容器 IPv6,再单独规划 IPv6 网络、地址池、防火墙和路由。不要为了“看起来更完整”把 IPv6、experimental 和日志轮转一次性全塞进去。Docker 是基础设施,刚装好时越清楚、越少变量,后面排障越轻松。

参考资料