Docker 安装与配置指南
本文介绍如何在 Ubuntu 系统上安装 Docker,解决权限问题,配置 Docker Compose,并进行相关的优化设置。参考官方文档:Docker 官方安装指南
一、安装 Docker
1. 卸载旧版本
在安装新版 Docker 之前,建议先卸载旧版本以避免潜在的冲突。执行以下命令卸载旧版本的 Docker:
sudo apt-get remove docker docker-engine docker.io containerd runc
2. 更新包索引并安装必要的依赖
更新包索引并安装一些必要的依赖包:
sudo apt-get update
sudo apt-get install -y ca-certificates curl
3. 配置 Docker 仓库
创建 apt
密钥存储目录
确保密钥存储目录存在,并设置合适的权限:
sudo install -m 0755 -d /etc/apt/keyrings
移除旧的 Docker 配置
删除之前所有与 Docker 相关的配置文件,以确保仓库配置的干净整洁:
sudo rm -rf /etc/apt/sources.list.d/docker.list
sudo rm -rf /etc/apt/keyrings/docker.asc
添加 Docker 的官方 GPG 密钥
从阿里云镜像源添加 Docker 的官方 GPG 密钥:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
设置 Docker 仓库
将 Docker 仓库添加到 apt
源列表中:
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. 安装 Docker 引擎
更新包索引并安装最新版本的 Docker 引擎及相关组件:
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
二、配置 Docker 权限与 Docker Compose
1. 解决 Docker 权限问题
为了避免每次使用 sudo
来运行 Docker 命令,可以将当前用户添加到 docker
用户组:
创建 Docker 用户组
如果 docker
组尚未存在,则创建该组:
sudo groupadd docker
将当前用户添加到 Docker 组
执行以下命令将当前用户添加到 docker
组中:
sudo usermod -aG docker $USER
激活组更改
重新加载组更改,使其立即生效:
newgrp docker
验证权限
运行一个测试镜像以验证配置是否成功:
docker run hello-world
# 如果镜像拉取失败则需要配置代理,请见下文
2. 安装 Docker Compose
注意:新版 Docker 已内置 docker compose
(注意中间有空格)命令,无需单独安装 docker-compose
。推荐使用内置命令:
docker compose version
如果仍然需要安装独立的 docker-compose
,可以执行以下命令:
sudo apt install docker-compose
3. 启动 Docker 服务
确保 Docker 服务已经启动,并设置为开机自启:
启动 Docker 服务
可以使用以下任意一种方式启动 Docker 服务:
sudo service docker start
或
sudo systemctl start docker
设置开机自启
sudo systemctl enable docker
检查 Docker 服务状态
sudo systemctl status docker
4. 完整的权限检查和修复
确保 Docker 套接字的权限正确,并验证用户组配置:
检查 Docker Socket 权限
ls -l /var/run/docker.sock
修改 Socket 权限(如有必要)
如果权限不正确,可以调整为所有用户可读写:
sudo chmod 666 /var/run/docker.sock
检查用户组
查看当前用户所属的组,确认是否包含 docker
:
groups $USER
重启 Docker 服务
应用权限更改:
sudo systemctl restart docker
5. WSL 特定设置
如果你在 Windows Subsystem for Linux 2(WSL2)中使用 Docker,可能需要额外的配置:
设置 iptables
在 WSL2 中设置 iptables 为 legacy 模式:
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
重启 Docker 服务
sudo systemctl restart docker
配置代理(如需要)
一般来说,宿主的代理地址为 127.0.0.1.7890, 正常情况下宿主机的ip:7890 是不能代理的,这对于docker容器内部访问代理很不友好,因此可以使用端口转发的方式,将宿主机的某个端口映射到127.0.0.1.7890端口上,这样使用http://host.docker.internal:映射端口
就能访问宿主机的代理了,和宿主机本身访问127.0.0.1.7890是一致的。端口映射的命令为:
sudo apt-get install socat
# 假设我们映射的宿主ip的端口为7891
socat TCP-LISTEN:7891,fork TCP:127.0.0.1:7890# 映射完成后,docker 通过http://host.docker.internal:7891就可以使用代理了
## 验证方法
curl -x http://host.docker.internal:7891 www.google.com # http://host.docker.internal:7891 就是使用代理
拉取镜像Docker Daemon 代理配置
-
方法一:/etc/systemd/system/docker.service.d/http-proxy.conf
当执行 docker pull 拉取镜像,一般是从 DockerHub 等仓库拉取,此时容易遇到网络问题。
这一拉取过程实际上是 Docker daemon 在执行,而它是由 systemd 启动管理的,并不直接使用我们 shell 中配置的代理环境变量。为了让其走代理,需要编写其 systemd 配置。
影响范围:仅影响 Docker Daemon 的网络请求(如拉取镜像、推送镜像等)。不影响 Docker 客户端(docker 命令)或容器内部的网络请求。
# 创建 Docker 服务配置目录 sudo mkdir -p /etc/systemd/system/docker.service.d # 创建 HTTP 代理配置文件 sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
添加以下内容:
[Service] Environment="HTTP_PROXY=http://127.0.0.1:7890" 或 "http://host.docker.internal:7891" 均可 Environment="HTTPS_PROXY=http://127.0.0.1:7890" 或 "http://host.docker.internal:7891" 均可
保存配置后,需要重启 Docker daemon。注意:这会重启所有容器
sudo systemctl daemon-reload sudo systemctl restart docker
-
方法二:/etc/docker/daemon.json
影响范围:优先级比/etc/systemd/system/docker.service.d低,设置会影响 Docker 的整体行为,不会直接影响容器内部的代理设置,格式是 JSON
sudo mkdir -p /etc/docker sudo nano /etc/docker/daemon.json
添加以下内容
{"proxies": {"http-proxy": "http://host.docker.internal:7891","https-proxy": "http://host.docker.internal:7891","no-proxy": "localhost,127.0.0.1"} }
生效方式:
# 修改后需要重启 Docker 服务:sudo systemctl restart docker
使用过程
# 1. 创建环境变量文件 .env: HTTP_PROXY=http://host.docker.internal:7891 HTTPS_PROXY=http://host.docker.internal:7891 NO_PROXY=localhost,127.0.0.1,192.168.49.2# 在 docker-compose.yml 中使用: services:myapp:env_file:- .env # 或在运行容器时: docker run --env-file .env image_name # 对于 Minikube: export HTTP_PROXY=http://host.docker.internal:7891 export HTTPS_PROXY=http://host.docker.internal:7891 export NO_PROXY=localhost,127.0.0.1,192.168.49.2 minikube start --container-runtime=containerd
验证代理设置
```bash
docker info
``````bash
sudo systemctl show --property=Environment docker
```**注意**:如果 Docker 无法通过设置的代理连接到 Docker Hub,请检查代理配置是否正确,并确保代理服务器正常运行。
docker 容器内部代理
容器内的应用或许需要访问网络,我们也希望其流量通过代理。这需要在容器内配置环境变量。
可以在 Dockerfile 或者 docker run 的时候设定环境变量。host.docker.internal
是docker的特殊变量,它可以动态的获取宿主机的ip地址
内容示例:
# 这里只能使用 http://host.docker.internal:7891 这种方式代理,因为如果输入127.0.0.1 是容器访问自己的环回地址
docker run -e HTTP_PROXY=http://host.docker.internal:7891 \-e HTTPS_PROXY=http://host.docker.internal:7891 \-e NO_PROXY=localhost,127.0.0.1 \your-container-image指定 httpProxy 属性值,相当于在容器内同时设定 http_proxy 和 HTTP_PROXY 两个环境变量。
保存配置后,无需重启任何服务。在保存配置之后启动的 docker 容器,都会自动配置对应环境变量(之前的容器不会改变)。然而,应用是否读取该环境变量并使用代理设置,取决于应用的实现。这并不是一个标准。⚠️ 注意:此处环境变量会在容器内被读取,所以地址 127.0.0.1 指的是容器自身,而非宿主机。
⚠️ 注意:如果容器是以 root 模式启动的(使用 sudo),上面所述的 ~/.docker/config.json 其实指的是 /root/.docker/config.json。
⚠️ 注意:curl 等工具并不支持 socks 代理,只支持 http。所以建议统一配置 http 代理。
6. 验证 Docker 安装
运行以下命令验证 Docker 和 Docker Compose 是否正确安装:
docker run hello-world
docker compose version
三、Docker 日常维护
清理 Docker 缓存
定期清理不再使用的 Docker 镜像、容器、网络和缓存,以释放系统资源:
docker system prune -af
注意:此命令将删除所有未使用的容器、网络、镜像和构建缓存,请谨慎使用。