当前位置: 首页 > article >正文

Ubuntu 安装 docker 配置环境及其常用命令

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 代理配置
  1. 方法一:/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
    
  2. 方法二:/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

注意:此命令将删除所有未使用的容器、网络、镜像和构建缓存,请谨慎使用。


http://www.kler.cn/a/512485.html

相关文章:

  • C++ 类与对象(上)
  • 第12章:Python TDD完善货币加法运算(一)
  • [Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器
  • 题解 CodeForces 1037D Valid BFS? 三种解法 C++
  • 解决leetcode第3426题所有安放棋子方案的曼哈顿距离
  • boss直聘 __zp_stoken__ 分析
  • SQLite 3.48.0 发布,有哪些更新?
  • 【K8S系列】在 K8S 中使用 Values 文件定制不同环境下的应用配置
  • 【深度学习】2.视觉问题与得分函数
  • JavaScript笔记APIs篇03——DOM节点Bom操作本地存储正则表达式
  • Ant Design Vue 的 a-input-number 组件限制最小值和最大值
  • c++常见设计模式之适配器模式
  • Ubuntu如何安装redis服务?
  • 【王树森搜素引擎技术】相关性03:文本匹配(TF-IDF、BM25、词距)
  • goodreads书籍评论爬取NRC Emotion Lexicon分析
  • Ae 表达式语言引用:Layer - 3D
  • excel 判断某个单元格的日期,如果超过3天,则在另一个单元格显示超过三天的公式
  • 【前端学习路线】前端入门 详细知识点学习路径(附学习资源)
  • VSCode下EIDE插件开发STM32
  • K8S中Pod控制器之DaemonSet(DS)控制器
  • Windows 服务器访问慢解决办法
  • 如何使用Spring Boot框架整合Redis:超详细案例教程
  • 日志(elk stack)基础语法学习,零基础学习
  • 【每日一题】LeetCode - 最长公共前缀
  • WPF 使用webView显示浏览器网页
  • Edu邮箱免费获取Photoshop等设计软件