# Docker里的服务如何做到原样迁移？

**URL:** <https://meta.appinn.net/t/topic/62832>\
**Category:** 问题求助\
**Tags:** docker\
**Created:** [2024 年11 月 6 日 05:23 UTC](https://meta.appinn.net/t/topic/62832 "2024-11-06T05:23:26Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

作者： ![sutking](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/sutking/32/3428_2.png) [@sutking](https://meta.appinn.net/u/sutking)\
发布日期： [2024 年11 月 6 日 05:23 UTC](https://meta.appinn.net/t/topic/62832/1 "2024-11-06T05:23:26Z")

</div>

最近想把一台服务器（服务器A， **接入互联网** ）的docker里跑的一个服务原样迁移到另外一台服务器（服务器B， **无互联网连接** ）的docker里，两台服务器的系统版本、docker版本、docker compose版本都是完全一样的，可以说是两台条件完全相同的服务器。  
使用`docker ps -a`命令得到如下回复（这么多容器之间互相是依赖和被依赖的关系）：

```auto
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f0f2fa2783bf ghcr.io/anyproto/any-sync-tools:latest "tail -f /dev/null" 2 days ago Exited (255) 44 seconds ago 443/tcp, 8000/tcp, 8080/tcp any-sync-dockercompose-main-netcheck-1
c2d7baa8dc98 ghcr.io/anyproto/any-sync-consensusnode:v0.2.0 "/bin/any-sync-conse…" 2 days ago Exited (255) 44 seconds ago 443/tcp, 8080/tcp, 0.0.0.0:1006->1006/tcp, :::1006->1006/tcp, 0.0.0.0:1016->1016/udp, :::1016->1016/udp, 0.0.0.0:8006->8000/tcp, :::8006->8000/tcp any-sync-dockercompose-main-any-sync-consensusnode-1
be211624c0e6 ghcr.io/anyproto/any-sync-filenode:v0.8.1 "/bin/any-sync-filen…" 2 days ago Exited (255) 44 seconds ago 443/tcp, 8080/tcp, 0.0.0.0:1005->1005/tcp, :::1005->1005/tcp, 0.0.0.0:1015->1015/udp, :::1015->1015/udp, 0.0.0.0:8004->8000/tcp, :::8004->8000/tcp any-sync-dockercompose-main-any-sync-filenode-1
5672983d8e41 ghcr.io/anyproto/any-sync-node:v0.4.7 "/bin/any-sync-node …" 2 days ago Exited (255) 44 seconds ago 443/tcp, 0.0.0.0:1003->1003/tcp, :::1003->1003/tcp, 0.0.0.0:1013->1013/udp, :::1013->1013/udp, 0.0.0.0:8003->8000/tcp, :::8003->8000/tcp, 0.0.0.0:8083->8080/tcp, :::8083->8080/tcp any-sync-dockercompose-main-any-sync-node-3-1
553a3dcacf7f ghcr.io/anyproto/any-sync-node:v0.4.7 "/bin/any-sync-node …" 2 days ago Exited (255) 44 seconds ago 443/tcp, 0.0.0.0:1002->1002/tcp, :::1002->1002/tcp, 0.0.0.0:1012->1012/udp, :::1012->1012/udp, 0.0.0.0:8002->8000/tcp, :::8002->8000/tcp, 0.0.0.0:8082->8080/tcp, :::8082->8080/tcp any-sync-dockercompose-main-any-sync-node-2-1
2f3f0c82f277 ghcr.io/anyproto/any-sync-node:v0.4.7 "/bin/any-sync-node …" 2 days ago Exited (255) 44 seconds ago 443/tcp, 0.0.0.0:1001->1001/tcp, :::1001->1001/tcp, 0.0.0.0:1011->1011/udp, :::1011->1011/udp, 0.0.0.0:8001->8000/tcp, :::8001->8000/tcp, 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp any-sync-dockercompose-main-any-sync-node-1-1
36d83a604787 ghcr.io/anyproto/any-sync-coordinator:v0.4.2 "/bin/any-sync-coord…" 2 days ago Exited (255) 44 seconds ago 443/tcp, 8080/tcp, 0.0.0.0:1004->1004/tcp, :::1004->1004/tcp, 0.0.0.0:1014->1014/udp, :::1014->1014/udp, 0.0.0.0:8005->8000/tcp, :::8005->8000/tcp any-sync-dockercompose-main-any-sync-coordinator-1
95dc521aabba ghcr.io/anyproto/any-sync-coordinator:v0.4.2 "/bin/any-sync-confa…" 2 days ago Exited (0) 2 days ago any-sync-dockercompose-main-any-sync-coordinator_bootstrap-1
2a2a2d984d43 mongo:7.0.2 "docker-entrypoint.s…" 2 days ago Exited (255) 44 seconds ago 27017/tcp any-sync-dockercompose-main-mongo-1-1
41bab00db3d1 redis/redis-stack-server:7.2.0-v6 "redis-server --port…" 2 days ago Exited (255) 44 seconds ago 6379/tcp any-sync-dockercompose-main-redis-1
98be9e66a907 minio/mc:latest "/bin/sh -c ' until …" 2 days ago Exited (0) 2 days ago any-sync-dockercompose-main-create-bucket-1
aab13fab73f8 any-sync-dockercompose-main-generateconfig-processing "bash /code/docker-g…" 2 days ago Exited (0) 2 days ago any-sync-dockercompose-main-generateconfig-processing-1
4036e480ae67 minio/minio:RELEASE.2024-07-04T14-25-45Z "/usr/bin/docker-ent…" 2 days ago Exited (255) 44 seconds ago 9000/tcp any-sync-dockercompose-main-minio-1
4f7bf3b5b0ed any-sync-dockercompose-main-generateconfig-anyconf "bash /code/docker-g…" 2 days ago Exited (0) 2 days ago any-sync-dockercompose-main-generateconfig-anyconf-1

```

我遇到的困难在于有几个容器是用了同一个镜像不同参数启动运行的：`ghcr.io/anyproto/any-sync-node:v0.4.7` `ghcr.io/anyproto/any-sync-coordinator:v0.4.2`，这种情况貌似无法使用`docker save`命令实现从服务器A打包然后拿到服务器B展开即可用。  
我的想法是用`docker save`命令把所有的镜像都打一个包，然后再用`docker export`命令把每一个容器的快照都保存下来，然后把打包好的镜像和快照文件全部拿到服务器B部署，这种方法是否可行？还有没有更稳妥或简单的方法？

**11月7日增加内容：迁移可以不考虑用户数据，只考虑服务本身，保证迁移后服务可正常运行即可。**

---

<div class="post-metadata">

作者： ![angaziwa](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/angaziwa/32/9848_2.png) [@angaziwa](https://meta.appinn.net/u/angaziwa)\
发布日期： [2024 年11 月 6 日 05:39 UTC](https://meta.appinn.net/t/topic/62832/2 "2024-11-06T05:39:38Z")

</div>

没有snapshot吗？直接全盘照搬

---

<div class="post-metadata">

作者： ![chenyiping1995](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/chenyiping1995/32/58814_2.png) [@chenyiping1995](https://meta.appinn.net/u/chenyiping1995)\
发布日期： [2024 年11 月 6 日 05:51 UTC](https://meta.appinn.net/t/topic/62832/3 "2024-11-06T05:51:05Z")

</div>

[GitHub - lavie/runlike: Given an existing docker container, prints the command line necessary to run a copy of it.](https://github.com/lavie/runlike)

runlike 了解一下，只用备份容器和自创容器 image 就行。

---

<div class="post-metadata">

作者： ![sutking](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/sutking/32/3428_2.png) [@sutking](https://meta.appinn.net/u/sutking)\
发布日期： [2024 年11 月 6 日 06:00 UTC](https://meta.appinn.net/t/topic/62832/4 "2024-11-06T06:00:39Z")

</div>

刚才试了一下，这种方法不可行，直接报错。

> [@sutking](#):
>
> 用`docker save`命令把所有的镜像都打一个包，然后再用`docker export`命令把每一个容器的快照都保存下来，然后把打包好的镜像和快照文件全部拿到服务器B部署

---

<div class="post-metadata">

作者： ![Qingwa](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/qingwa/32/58632_2.png) [@Qingwa](https://meta.appinn.net/u/Qingwa)\
发布日期： [2024 年11 月 6 日 06:29 UTC](https://meta.appinn.net/t/topic/62832/5 "2024-11-06T06:29:10Z")

</div>

我歪个楼啊。

我的用法是直接写 docker-compose.yml 然后把数据都映射出来

迁移的时候直接文件夹拿走然后 up -d 就完事了。

你这个是什么样的啊？

---

<div class="post-metadata">

作者： ![Niceb](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/niceb/32/4721_2.png) [@Niceb](https://meta.appinn.net/u/Niceb)\
发布日期： [2024 年11 月 6 日 06:42 UTC](https://meta.appinn.net/t/topic/62832/6 "2024-11-06T06:42:02Z")

</div>

我也觉得应该是这样啊， docker的配置写在compose里面， ， 然后容器里面的程序的配置也专门存放。。 迁移的时候迁移这两个配置就好了呀

---

<div class="post-metadata">

作者： ![nelsonpa](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/n/87869e/32.png) [@nelsonpa](https://meta.appinn.net/u/nelsonpa)\
发布日期： [2024 年11 月 6 日 08:57 UTC](https://meta.appinn.net/t/topic/62832/7 "2024-11-06T08:57:02Z")

</div>

直接把 /var/lib/docker 以及其它挂载点都复制到目标服务器上覆盖同名文件夹不行吗？（操作之前记得把两边的 docker daemon 都关掉）

---

<div class="post-metadata">

作者： ![sutking](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/sutking/32/3428_2.png) [@sutking](https://meta.appinn.net/u/sutking)\
发布日期： [2024 年11 月 6 日 23:34 UTC](https://meta.appinn.net/t/topic/62832/8 "2024-11-06T23:34:58Z")

</div>

把数据都映射出来，那镜像呢？用`docker save`吗？  
如果迁移不考虑数据只考虑服务本身呢？

---

<div class="post-metadata">

作者： ![deatil](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/deatil/32/9378_2.png) [@deatil](https://meta.appinn.net/u/deatil)\
发布日期： [2024 年11 月 7 日 05:12 UTC](https://meta.appinn.net/t/topic/62832/9 "2024-11-07T05:12:21Z")

</div>

将用的容器改别名，再导出  
也可以根据CONTAINER ID导出  
docker通常是本地数据，迁移只迁移数据，容器管理这些用docker-compose.yml管理

---

<div class="post-metadata">

作者： ![NeverMind](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/n/53a042/32.png) [@NeverMind](https://meta.appinn.net/u/NeverMind)\
发布日期： [2024 年11 月 8 日 15:42 UTC](https://meta.appinn.net/t/topic/62832/10 "2024-11-08T15:42:47Z")

</div>

除非是无法直连外网的环境，否则有什么必要迁移镜像本身吗？不都是 docker-compose.yaml 里指定镜像名，然后由其自行拉取嘛

---

<div class="post-metadata">

作者： ![sutking](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/sutking/32/3428_2.png) [@sutking](https://meta.appinn.net/u/sutking)\
发布日期： [2024 年11 月 8 日 23:53 UTC](https://meta.appinn.net/t/topic/62832/11 "2024-11-08T23:53:42Z")

</div>

你说对了，我的服务器B是没有连接互联网的，所以`docker pull`这种命令是没有用的；所以搞了一个环境完全一样的但是能接入互联网的服务器A，想在A上搞定之后原样迁入B。  
再所以：迁移不需要考虑用户数据，因为没有。

---

<div class="post-metadata">

作者： ![Qingwa](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/qingwa/32/58632_2.png) [@Qingwa](https://meta.appinn.net/u/Qingwa)\
发布日期： [2024 年11 月 9 日 01:23 UTC](https://meta.appinn.net/t/topic/62832/12 "2024-11-09T01:23:32Z")

</div>

你没用公共镜像么？我都是把文件映射出来改的，没动过镜像所以无所谓

---

<div class="post-metadata">

作者： ![NeverMind](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/n/53a042/32.png) [@NeverMind](https://meta.appinn.net/u/NeverMind)\
发布日期： [2024 年11 月 9 日 15:01 UTC](https://meta.appinn.net/t/topic/62832/13 "2024-11-09T15:01:15Z")

</div>

没有用户数据那不就简单了，机器A上 `docker image save <image_name>:<tag_name> -o xxx.tar`，机器B上 `docker image load -i xxx.tar`，完整带 tag 导入

---

<div class="post-metadata">

作者： ![sutking](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/sutking/32/3428_2.png) [@sutking](https://meta.appinn.net/u/sutking)\
发布日期： [2024 年11 月 10 日 07:38 UTC](https://meta.appinn.net/t/topic/62832/14 "2024-11-10T07:38:53Z")

</div>

感谢大家的热情帮助🍻事情解决了，说来话长，我放在[这里](https://meta.appinn.net/t/topic/62975)了。  
谢谢各位大佬🙏🙏🍻🍻🍻🍻🍻
