1
bugmakerxs 2023-04-11 11:54:55 +08:00 1
#!/bin/bash
BASE_DIR=$(cd `dirname $0`;pwd) echo $BASE_DIR docker run -p 3306:3306 \ --name mysql \ -e TZ='Asia/Shanghai' \ -v $BASE_DIR/log:/var/log/mysql \ -v $BASE_DIR/data:/var/lib/mysql \ -v "$BASE_DIR/conf/mysql.conf.d":"/etc/mysql/mysql.conf.d" \ -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7 数据挂载到物理机上,物理机上的$BASE_DIR/data 可以复制到另一个机器,数据都在。 |
2
512357301 2023-04-11 11:58:13 +08:00 via Android 3
docker save 保存的是镜像( image ),docker export 保存的是容器( container );
docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像; 你这种情况应该用 docker export 导出容器,用 docker import 导入 tar 包 参考链接(用 base64 解码):aHR0cHM6Ly93d3cucnVub29iLmNvbS9kb2NrZXIvZG9ja2VyLWNvbW1hbmQtbWFudWFsLmh0bWw= |
3
aru 2023-04-11 11:59:05 +08:00
楼上正解
还有更好的办法是使用 docker-compose |
4
lyusantu OP @512357301 #2 export 我试过,但是 import 后再执行时会报错 docker: Error response from daemon: No command specified.
网上搜了一下说是需要在结尾指定 command ,我于是在结尾追加 /bin/bash ,可以成功启动,但是状态会变为 Exited 并且 docker logs 不会显示任何日志 |
6
thinkershare 2023-04-11 13:44:43 +08:00 2
@lyusantu 数据是单独的卷,你要讲卷重新挂载上去。我日常开发常常这样完,完全没问题。容器应该状态,将所有可以变更的东西都放到容器外,这样可以就可以再另外一台机器直接启动一个同版本的新容器,挂载上目录就可以跑了。避免需要将容器导出为镜像的流程。
|
7
lyusantu OP |
8
kaedeair 2023-04-11 14:44:57 +08:00 1
你如果用的官方镜像可以把 /var/lib/mysql 和 /etc/mysql/conf.d 打包出来,然后起新的容器时挂载回去就行了
|
9
thinkershare 2023-04-11 14:55:10 +08:00 1
@lyusantu 挂载数据卷要简单很多,SQL 导出费事又费力。直接将卷打包后再另外一台机器上解压后,重新使用相同命令启动新容器,什么都不需要。不过调试阶段,怎么折腾都无所谓。
|
10
512357301 2023-04-11 21:11:21 +08:00 via Android
@lyusantu 可以先把容器停止了,别删除哈,然后用 docker cp 命令,把容器里的 /var/lib/mysql 和 /etc/mysql/conf.d 分别拷贝到本地某个目录下,然后把这个目录打包成.tar 格式的(tar 包能保留 linux 的文件夹权限),传到新机器,解包。然后在新机器直接用 mysql 的镜像启动,官方镜像就行,把这两个目录挂载到对应位置,理论上能一次性启动成功。
第一次玩 docker 的话,可能没法搞定,那可以在新机器先不挂载任何目录的情况下通过教程先启动一个干净的 mysql(跟旧机器同版本哈,理论上不用追加 cmd),确认启动成功没问题的话,再在这个容器基础上加上挂载目录,说起来有点绕,其实本质是 mysql 镜像初始化启动的时候会自己加一些环境变量或者其他的杂七杂八的,所以才先启动一个,然后再它的基础上改。 可以用 Portainer 管理 docker ,很好用,改容器配置也很直观。 |