docker的国内镜像可用性经常让人走很多弯路。这里将限定特定的环境,将基本操作步骤和遇到的问题逐一呈现,减少后来者曲折。
环境
可以上网的工作电脑,操作系统为ubuntu 24.04版本,网卡接入本地局域网路由器,可连接internet,配置如下:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.2 LTS
Release: 24.04
Codename: noble
$ ifconfig
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.111 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 240e:3b3:30c4:ff41:ca1f:66ff:fee1:26d3 prefixlen 64 scopeid 0x0<global>
inet6 fe80::ca1f:66ff:fee1:26d3 prefixlen 64 scopeid 0x20<link>
inet6 240e:3b3:30c4:ff41::1000 prefixlen 128 scopeid 0x0<global>
ether c8:1f:66:e1:26:d3 txqueuelen 1000 (Ethernet)
RX packets 2678113 bytes 1137360495 (1.1 GB)
RX errors 0 dropped 69 overruns 0 frame 0
TX packets 2482295 bytes 254375099 (254.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 43
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 414022 bytes 63168907 (63.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 414022 bytes 63168907 (63.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ ping -4 www.qq.com
PING www.qq.com (121.14.77.201) 56(84) bytes of data.
64 bytes from 121.14.77.201: icmp_seq=1 ttl=53 time=4.29 ms
64 bytes from 121.14.77.201: icmp_seq=2 ttl=53 time=4.27 ms
操作步骤
- 卸载旧版本docker,安装最新版本docker。
# 1. 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 2. 安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
# 3. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 4. 设置仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 6. 验证安装
sudo docker run hello-world
上述代码框,1-5都顺利执行,到6就卡住了。
$ sudo docker run helloworld
[sudo] password for gauss:
Unable to find image 'helloworld:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded
Run 'docker run --help' for more information
原因也很简单,就是镜像源站不可访问。
$ ping registry-1.docker.io
PING registry-1.docker.io (2a03:2880:f11b:83:face:b00c:0:25de) 56 data bytes
^C
--- registry-1.docker.io ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2036ms
gauss@power-edge-r730:~$ ping -4 registry-1.docker.io
PING registry-1.docker.io (128.242.245.212) 56(84) bytes of data.
# ping 不通
然后参考一系列往上搜索和LLM获得的答案,只有这些,建议你使用国内镜像源。
$ cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://cr.console.aliyun.com",
"https://mirrors.huaweicloud.com",
"https://docker.m.daocloud.io"
],
"bip":"192.168.20.1/24"
}
$ sudo systemctl daemon-reload
$sudo systemctl restart docker
但是没啥用。还是如此,即时看docker的日志,也弄不明白,你只以为配置没有生效。不断尝试后,只好通过命令检查这些源站是否真能用。
这些站点还真不能用curl
https://cr.console.aliyun.com/v2 . 但是万能的搜索、豆包、deepseek都还在推荐这些源站。不知道我这里是否个案。环境特殊,取法翻墙,废了好些功夫,才找到一个可用的。列在云服务器控制台里面。
但是如果你一定要通过helloworld来检查,还是失败的。这里可以下载redis,nginx,mysql等。
所以最后一步就换做拉取wordpress镜像吧。
# 6. 验证安装
$ sudo docker pull wordpress
Using default tag: latest
latest: Pulling from library/wordpress
5040bd298390: Pull complete
568dce68541a: Pull complete
......
cd04b95ebe9c: Pull complete
Digest: sha256:b900bc9ceff22ef1dee076c25a67b6d661f9f108b4347a5646e05a11fef9b866
Status: Downloaded newer image for wordpress:latest
docker.io/library/wordpress:latest
- 装好docker后,赋予docker权限,避免每次都sudo
# 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 退出当前会话重新登录(或重启)
newgrp docker # 立即生效(或直接重启终端)
- 安装并启动nginx
这里使用docker-composer安装nginx并管理容器。首先创建nginx运行需要的配置文件、页面以及日志文件等,然后编辑yaml文件,通过docker-compose启动
gauss@power-edge-r730:~/soft/nginx$ tree
.
├── data
│ ├── conf
│ │ ├── default.conf
│ │ └── enger.aigrow.space.conf
│ ├── htdocs
│ │ └── index.html
│ └── log
│ ├── access.log
│ └── error.log
└── nginx.yaml
5 directories, 6 files
gauss@power-edge-r730:~/soft/nginx$ cat nginx.yaml
services:
nginx:
image: nginx:latest
volumes:
- "./data/log:/var/log/nginx"
- "./data/conf:/etc/nginx/conf.d"
- "./data/htdocs:/usr/share/nginx/html"
restart: always
ports:
- "80:80"
- "443:443"
gauss@power-edge-r730:~/soft/nginx$ docker-compose -f nginx.yaml up &
[1] 982942
[+] Running 2/2e-r730:~/soft/nginx$
Network nginx_default Created 0.1s
Container nginx-nginx-1 Created
- 测试
gauss@power-edge-r730:~/soft/nginx$ curl 127.0.0.1
Hello, Nginx!gauss@power-edge-r730:~/soft/nginx$ curl enger.aigrow.space
this is a test page.
gauss@power-edge-r730:~/soft/nginx$
总结
国内找一个可靠的源站很重要,很多错误都在这里,一些错误信息并不明确。可考虑使用curl源站确认是否ok。