这篇整理一套新服务器上安装 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-driver 和 log-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 \
ipv6netCompose 中引用这个外部网络:
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 是基础设施,刚装好时越清楚、越少变量,后面排障越轻松。