title: Docker — 容器运行时
created: 2026-08-14
updated: 2026-09-03
type: entity
tags:
- container
- docker
- deployment
- entity
sources:
- raw/scripts/docker.sh
- raw/scripts/离线安装.sh
- raw/scripts/docker.service
Docker — 容器运行时
Docker 是主流的容器引擎,本文基于 raw/scripts/docker.sh 整理安装、镜像加速、代理、容器管理、网络、compose、磁盘清理与数据目录迁移等运维要点。
在线安装
# 官网一键脚本 https://docs.docker.com/install/linux/docker-ce/centos/
curl https://get.docker.com | sh
# 阿里云镜像安装(国内网络推荐)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
国内镜像加速
2024-06 后多数公共镜像站可能失效,列表需及时更新(以下为 docker.sh 内完整列表)。
创建 /etc/docker/daemon.json 配置 registry-mirrors:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.1panel.live",
"https://docker.xuanyuan.me",
"https://dockerproxy.net",
"https://image.cloudlayer.icu",
"https://docker-registry.nmqu.com",
"https://hub.amingg.com",
"https://docker.amingg.com",
"https://docker.hlmirror.com",
"https://hub1.nat.tf",
"https://hub2.nat.tf",
"https://hub3.nat.tf",
"https://hub4.nat.tf",
"https://docker.m.daocloud.io",
"https://docker.kejilion.pro",
"https://docker.367231.xyz",
"https://hub.1panel.dev",
"https://docker.etcd.fun",
"https://docker.cattt.net",
"https://docker.apiba.cn",
"https://proxy.vvvv.ee"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证
docker info | grep -i registry
提示:一个 daemon.json 只能写一个 JSON 对象,镜像加速与代理配置二选一(见下节)。
Docker 走代理
两种方式:拉取代理(daemon.json proxies,仅镜像拉取)与运行代理(systemd 环境变量,容器构建/运行也可用)。
方式一:daemon.json proxies(仅影响 dockerd 拉取/推送)
cat > /etc/docker/daemon.json <<END
{
"proxies": {
"http-proxy": "socks5://127.0.0.1:1080",
"https-proxy": "socks5://127.0.0.1:1080",
"no-proxy": "http://example.com"
}
}
END
systemctl restart docker
方式二:systemd drop-in(全局 HTTP(S)_PROXY 环境变量)
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/proxy.conf <<END
[Service]
Environment="HTTP_PROXY=http://your-proxy.com:your-port"
Environment="HTTPS_PROXY=http://your-proxy.com:your-port"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
END
systemctl daemon-reload
systemctl restart docker
服务管理
systemctl start docker # 启动
systemctl restart docker # 重启(改配置后需先 daemon-reload)
systemctl daemon-reload # 重载配置
systemctl status docker # 查看状态
systemctl enable docker # 开机自启
docker version # 查看版本(Client + Server)
docker info # 查看详细配置/镜像源是否生效
容器运行与生命周期
# 运行容器
# -d 后台运行 | --name 命名 | -p 端口映射 主机:容器 | -e 环境变量 | 镜像:版本
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mima mysql:5.7
# --rm 容器停止后自动删除(测试用) | --net=host 使用宿主机网络
docker run -d --name nginx --rm --net=host nginx
# 停止/删除容器
docker stop mysql
docker rm mysql
# 查看运行容器(-a 含停止的)
docker ps -a
# 进入容器
docker exec -it mysql bash
容器与宿主互拷文件
# 容器内目录/文件复制到当前目录
docker cp nginx:/etc/nginx .
# 宿主机文件复制进容器
docker cp mycontainer:/etc/nginx nginx
# 注:源在宿主机时直接给路径即可
docker cp ./nginx.conf mysql:/etc/nginx/
镜像操作
docker pull mysql:latest # 拉取镜像
docker images # 查看本地镜像
docker rmi images_name # 删除镜像
# 导出/导入镜像 tar(迁移用,保留分层与标签)
docker save -o mysql.tar mysql
docker load -i mysql.tar
# 批量加载当前目录所有 tar
for i in `ls *.tar`; do docker load -i $i; done
# 容器导出(文件系统快照)与导入
docker export -o backup.tar <容器名> # 导出容器为 tar
cat backup.tar | docker import - myimage:backup # 导入为镜像
| 场景 | 命令 | 说明 |
|---|---|---|
| 迁移镜像到另一台机 | docker save + docker load |
保留标签/历史,首选 |
| 备份运行中容器状态 | docker export + docker import |
文件系统快照,丢历史/CMD 需重建参数 |
Docker 网络
docker network ls # 查看网络
docker network create -d bridge my-net # 创建 bridge 网络
# 容器加入自定义网络,可用容器名互相访问
docker run -d --name nginx --network my-net -p 8080:8080 nginx
docker run -d --name mysql --network my-net -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mima mysql
# 查看容器详情(IP、端口、挂载等)
docker inspect <container id>
同一自定义网络内的容器可用
容器名作为主机名互相访问(如应用连数据库用mysql:3306)。
日志查看
docker logs -f <容器名> # 实时跟踪
docker logs --tail 100 <容器名> # 最近 100 行
docker logs --since 30m <容器名> # 按时间过滤(30m/2h/绝对时间)
docker logs -t <容器名> # 带时间戳
docker inspect --format '{{.LogPath}}' <容器名> # 查日志文件路径
# 限制日志大小(daemon.json,防无限增长)
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
docker-compose
# 安装(官网流程 https://docs.docker.com/compose/install/other/)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 兼容旧路径
docker-compose --version
# 使用
docker-compose up -d # 启动(-d 后台)
docker-compose -f docker-compose.yml --env-file uyi.env up -d # 指定文件+环境变量
docker-compose restart # 重启
docker-compose down # 停止并移除(升级流程先 down 再 up -d)
docker-compose up -d
磁盘清理与故障排查
# 磁盘占用总览
docker system df
# 清理:停用容器 + 无用网络 + 悬空镜像 + 构建缓存
docker system prune -a
docker system prune -af
docker builder prune # 仅清构建缓存
docker rm $(docker ps -a -q) # 删除所有容器
docker rmi $(docker images -a -q) # 删除所有镜像
常见问题:ERROR: readlink /var/lib/docker/overlay2: invalid argument
- 多为磁盘写满/overlay2 损坏,先 docker system prune -af 清理磁盘再重启 docker
排障启动:
dockerd --log-level error # 前台启动只看错误日志
systemctl start docker-cleanup.service # 清理残留(如服务有定义)
数据目录迁移(软连接扩容)
场景:自建网盘/镜像占用磁盘过多,新加机械硬盘后通过软连接把 /var/lib/docker 挪到大盘(不动 LVM):
# 1. 查看新盘 UUID
blkid
# 输出示例: /dev/sdb: UUID="78e2497f-5bda-476c-82ea-a6ff84dc8a3b" TYPE="ext4"
# 2. 写入 /etc/fstab 开机自动挂载
echo "UUID=78e2497f-5bda-476c-82ea-a6ff84dc8a3b /data ext4 defaults 0 0" >> /etc/fstab
# 挂载后确认
mount -a && df -h /data
# 3. 停止 docker,移动数据目录,建软连接,重启
systemctl stop docker
mv /var/lib/docker /data/
ln -s /data/docker/ /var/lib/docker
systemctl restart docker
# 4. 验证
docker info | grep "Docker Root Dir" # 应显示 /data/docker 或软链目标
离线安装
适用于无外网环境。下载静态二进制包:
# 下载 docker 静态包(在可联网机器上)
curl -OL https://download.docker.com/linux/static/stable/x86_64/docker-25.0.3.tgz
# 解压并安装到 /usr/bin
tar -zxvf docker-*.tgz
mv docker/* /usr/bin/
配置 systemd 服务:
# 将 docker.service 放入 systemd 目录
mv docker.service /etc/systemd/system/
chmod +x /etc/systemd/system/docker.service
# Rocky 报错可尝试放入 multi-user.target.wants
mv docker.service /etc/systemd/system/multi-user.target.wants
# 依赖(网络防火墙组件)
apt install -y iptables nftables
# 重载并启动
sudo systemctl daemon-reload
sudo systemctl list-unit-files | grep docker
systemctl start docker
systemctl enable docker.service
systemctl status docker
docker -v
相关页面
- network-testing — 网络配置(Docker 依赖 iptables/nftables 网络组件)
- Linux 常规操作与优化 — 系统调优(daemon.json、systemd 配置)
- disk-storage-testing — 存储测试(容器数据卷与磁盘 I/O)