本系列帖子传送门
Docker(四)创建centos、mysql、nacos、redis容器及理解
Docker(五)OpenEuler22.03 安装docker ce、排坑
目录
[一、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
- 安装操作系统、关闭 selinux 等操作见以下帖子
Centos7 / OpenEuler 操作系统安装 、构建 yum / dnf 源 、 测试环境防火墙的初始化
- 卸载系统自带的冲突软件包
bash
## openEuler 默认预装了 podman、containerd 等容器相关软件,与 Docker 可能会产生冲突,卸载了干净
[root@milvus2 ~]# sudo dnf remove -y podman containerd runc docker docker-client docker-common docker-engine
- 安装必要的依赖包
bash
[root@milvus2 ~]# sudo dnf install -y dnf-plugins-core
- 配置 Docker CE 软件源(华为云镜像)
bash
## 使用华为云镜像源速度更快且稳定,我们一直用它。另外 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
- 更新软件源缓存并安装 Docker CE
bash
## 更新缓存
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
- 配置国内镜像加速器(这一步有坑)
bash
## 创建 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
- 启动 Docker 服务并设置开机自启
bash
## 启动 Docker 服务
[root@milvus2 ~]# sudo systemctl start docker
## 设置开机自启动
[root@milvus2 ~]# sudo systemctl enable docker
- 验证。如果下面三步都能成功执行
bash
## 查看 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。
bash
## 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之后,问题解决。
bash
## 备份原配置
[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 。但是 镜像加速器一定要紧跟时代,不能使用过期的。