本系列帖子传送门

Docker(一) 简介与基础操作(图文)

Docker(二) dockerfile创建镜像(图文)

Docker(三)dockerfile命令说明(图文)

Docker(四)创建centos、mysql、nacos、redis容器及理解

Docker(五)OpenEuler22.03 安装docker ce、排坑

目录

零、说在前面

一、OpenEuler22.03 安装docker ce

二、问题和解决

三、感想


零、说在前面

        我在本系列的第一篇帖子中详细介绍了docker的基础内容,但缺乏一步步的实操过程,因此诞生了这篇帖子。

        其次,本次使用 docker ce 进行整体操作,它是docker公司于2017年推出的免费开源社区版,我们之前说docker收费,其实是 docker ee版收费,docker ce一直免费。它与ee的核心引擎完全一致、基本功能完全相同、命令行接口完全兼容、镜像生态完全互通。更多的 ce和ee的区别联系网上一搜一大把,这里不再赘述。

        另外,想详细说说如何解决常见的“docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).”报错

一、OpenEuler22.03 安装docker ce

        0. 安装操作系统、关闭 selinux 等操作见以下帖子

        Centos7 / OpenEuler 操作系统安装 、构建 yum / dnf 源 、 测试环境防火墙的初始化

        1. 卸载系统自带的冲突软件包

## openEuler 默认预装了 podman、containerd 等容器相关软件,与 Docker 可能会产生冲突,卸载了干净
[root@milvus2 ~]# sudo dnf remove -y podman containerd runc docker docker-client docker-common docker-engine

        2. 安装必要的依赖包

[root@milvus2 ~]# sudo dnf update -y
[root@milvus2 ~]# sudo dnf install -y dnf-plugins-core curl

        3. 配置 Docker CE 软件源(华为云镜像)

## 使用华为云镜像源速度更快且稳定,我们一直用它。另外 Docker 官方源不识别 openEuler 的版本号,需要手动修改为 CentOS 8 的版本
## 添加华为云 Docker CE 源
[root@milvus2 ~]# sudo wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo

## 修改源中的系统版本变量为 8(openEuler 22.03 与 CentOS 8 二进制兼容)
[root@milvus2 ~]# sudo sed -i 's+$releasever+8+' /etc/yum.repos.d/docker-ce.repo

        4. 更新软件源缓存并安装 Docker CE

## 更新缓存
sudo dnf makecache

## 安装最新版 Docker CE 及相关组件(包含 docker compose,至于docker compose 的作用和应用场景请自行搜索了解)
[root@milvus2 ~]# sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

        5. 配置国内镜像加速器(这一步有坑)

## 创建 Docker 配置目录
[root@milvus2 ~]# sudo mkdir -p /etc/docker

## 配置镜像加速器
[root@milvus2 ~]# sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "500m",
    "max-file": "3"
  }
}
EOF

## 重新加载 systemd 配置
[root@milvus2 ~]# sudo systemctl daemon-reload

        6. 启动 Docker 服务并设置开机自启

## 启动 Docker 服务
[root@milvus2 ~]# sudo systemctl start docker

## 设置开机自启动
[root@milvus2 ~]# sudo systemctl enable docker

        7. 验证。如果下面三步都能成功执行

## 查看 Docker 版本信息,能看到包含 Client 和 Server 两部分的版本信息
[root@milvus2 ~]# docker version

## 查看 Docker 系统信息,包括Docker 的存储驱动、镜像加速器配置、容器和镜像数量等详细信息
[root@milvus2 ~]# docker info

## 拉取 hello-world 测试镜像并运行容器
[root@milvus2 ~]# docker run --rm hello-world

## 执行完拉取 hello-world 容器后,应该能看到一个类似 Hello from Docker!  字样的内容,说明已成功

二、问题和解决

        事实上,我在第7步的时候发现根本拉取不到 hello-world 的镜像。同时报出了“Docker(一) 简介与基础操作(图文)”中出现的 Get "https://registry-1.docker.io/v2/" 错误

        问题的根源在于我既没有为 虚拟机设置 DNS ,也没有在 docker 的 daemon.json 配置文件中添加 DNS 的设置。同时我在第5步设置的三个国内镜像也有问题了。

        排查步骤如下。排查结果是第一个命令 ping 不通,第三个命令没有反应。可以确认是 dns 解析失败的问题,进而无法连接 Docker Hub。

## 1. 测试 DNS 解析,用来确定DNS 是否能解析 Docker Hub 域名
[root@milvus2 ~]# ping -c 4 registry-1.docker.io

## 2. 测试外网连通性,用来确定虚拟机是否能访问外网
[root@milvus2 ~]# ping -c 4 8.8.8.8

## 3. 测试 HTTPS 连接,用来确定HTTPS 连接是否正常
[root@milvus2 ~]# curl -I https://registry-1.docker.io/v2/

        解决方法如下。执行了下面的命令,更换了 daemon.json 配置文件的内容并重启Docker之后,问题解决。

## 备份原配置
[root@milvus2 ~]# sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak

## 修改 Docker 配置,添加 DNS
[root@milvus2 ~]# sudo tee /etc/docker/daemon.json <<EOF
{
  "dns": ["8.8.8.8", "8.8.4.4", "114.114.114.114"],
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.ustc.edu.cn"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "500m",
    "max-file": "3"
  }
}
EOF

## 重启 Docker 服务
[root@milvus2 ~]# sudo systemctl daemon-reload
[root@milvus2 ~]# sudo systemctl restart docker

三、感想

        如果我在装完虚拟机的时候,为虚拟机配置如上所示的 DNS 信息,那么也不必在 Docker 的daemon.json 文件中显式指定 DNS 。但是 镜像加速器一定要紧跟时代,不能使用过期的。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐