问题
在服务器不出网的情况下,无论是docker-compose up -d还是直接docker build -t xxx .都会报错,因为Docker会默认强制进行网络检查
1 2 3 4 5 6 7 8 9 10 11 12
| [root@localhost]# docker-compose up -d WARN[0000] /../xxx/docker-compose.yml: `version` is obsolete [+] Running 1/0 ! web Warning Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on xxx.xxx.xxx.xxx:xx: dial udp xxx.xxx.xxx.xxx:xx... 0.1s [+] Building 0.5s (2/2) FINISHED docker:default => [web internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 210B 0.0s => ERROR [web internal] load metadata for docker.io/library/php:8.2-apache 0.0s ------ > [web internal] load metadata for docker.io/library/php:8.2-apache: ------ failed to solve: php:8.2-apache: failed to resolve source metadata for docker.io/library/php:8.2-apache: failed to do request: Head "https://registry.docker-cn.com/v2/library/php/manifests/8.2-apache?ns=docker.io": dial tcp: lookup registry.docker-cn.com on xxx.xxx.xxx.xxx:xx: dial udp xxx.xxx.xxx.xxx:xx: connect: network is unreachable
|
解决方法
在这种情况下只能先在能上网的电脑上拉取镜像,然后把镜像保存为 tar 包并传到内网服务器,服务器使用本地镜像构建。
步骤如下:
然后保存到本地
1
| docker save -o xxx.tar xxx
|
然后通过sftp或者物理方式将tar包上传到服务器
然后在服务器上
然后再
1
| docker-compose build --pull never
|
让其强制docker-compose在构建时永不尝试拉取或检查更新基础镜像,如果本地没有就会直接报错,如果本地有就会直接使用
但我现在这个机子上没用,会显示no such service: never
应该是版本太老无法识别--pull never这个参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| [root@localhost]# docker version Client: Docker Engine - Community Version: 26.1.4 API version: 1.45 Go version: go1.21.11 Git commit: 5650f9b Built: Wed Jun 5 11:32:04 2024 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 26.1.4 API version: 1.45 (minimum version 1.24) Go version: go1.21.11 Git commit: de5c9cf Built: Wed Jun 5 11:31:02 2024 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.33 GitCommit: d2d58213f83a351ca8f528a95fbd145f5654e957 runc: Version: 1.1.12 GitCommit: v1.1.12-0-g51d5e94 docker-init: Version: 0.19.0 GitCommit: de40ad0
|
1 2
| [root@localhost]# docker compose version Docker Compose version v2.27.1
|
但检查之后发现版本并非那么旧
1 2 3 4
| [root@localhost]# which docker-compose /usr/bin/docker-compose [root@localhost]# which docker /usr/bin/docker
|
1 2
| [root@localhost]# docker-compose -v Docker Compose version v2.27.1
|
对此的解决方案是
1
| DOCKER_BUILDKIT=0 docker build -t xxx .
|
直接使用DOCKER_BUILDKIT=0让其不要使用 BuildKit,而是退回到旧的构建引擎
但用旧的这个也有一些问题,所以
最终解决方案
直接在本地build
然后导出
1
| docker save -o xxx.tar xxx
|
上传后再
不就完事了吗
相关资料
Docker离线部署流程-阿里云开发者社区
Docker Compose | 菜鸟教程