离线环境Docker部署

文章发布时间:

最后更新时间:

文章总字数:
686

页面浏览: 加载中...

问题

在服务器不出网的情况下,无论是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 pull xxx:latest

然后保存到本地

1
docker save -o xxx.tar xxx

然后通过sftp或者物理方式将tar包上传到服务器

然后在服务器上

1
docker load -i xxx.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 build -t xxx .

然后导出

1
docker save -o xxx.tar xxx

上传后再

1
docker load -i xxx.tar

不就完事了吗

相关资料

Docker离线部署流程-阿里云开发者社区
Docker Compose | 菜鸟教程