Ubuntu下启用了两个docker容器,一个是web应用,另一个是数据库,之前是通过docker-compose方式安装的容器,如何完整将docker中的应用及数据迁移到新的服务器?
Ubuntu下启用了两个docker容器,一个是web应用,另一个是数据库,之前是通过docker-compose方式安装的容器,如何完整将docker中的应用及数据迁移到新的服务器?
1、在原来的服务器中,通过以下命令查看所有在运行的容器:
sudo docker ps
2、然后分别导出要迁移的应用和数据库容器:
# 导出应用容器
docker commit app_container app_image
docker save -o app_image.tar app_image
# 导出数据库容器
docker commit db_container db_image
docker save -o db_image.tar db_image
3、查看两个应用的数据挂载方式,通过以下命令,查看“Mounts”信息,如果是Type: "bind",那就直接将两个容器的source文件夹打包为data.tar
docker inspect <container_id>
4、将以上三个文件和docker-compose.yml文件通过scp复制到新的服务器,命令如下:
scp -C -P <port> file user@new_server_ip:/path/to/destination
#-C是压缩传输,能极大提升传输速率,-P是指定新服务器的ssh端口
5、按照刚才第3步两个容器的source地址创建相应的文件夹,并将数据文件拷贝到相应的文件夹中。docker-compose.yml文件可按照老服务器的路径在新服务器存放该文件。
6、按照以下命令,在新服务器中安装docker,并加载镜像文件:
# 更新包索引
sudo apt update
# 安装 Docker
sudo apt install -y docker.io
# 启动 Docker 服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 安装 Docker Compose
sudo apt install -y docker-compose
# 进入到容器文件存放目录
cd /path/to/destination
# 导入应用镜像
docker load -i app_image.tar
# 导入数据库镜像
docker load -i db_image.tar
7、用“docker image ls”命令查看已经加载的镜像信息;
8、通过vim等编辑工具打开docker-compose.yml,将文件中的“image”信息替换成第7步显示出来对应的“IMAGE”信息,保存文件,其他信息可以根据实际需要调整,但除了端口不建议调整其他信息,否则,上述已经拷贝到相应文件夹的备份数据要重新调整。
9、最后进入到docker-compose.yml所在目录,并采用以下命令启动已经加载的两个容器,应该就大功告成了:
sudo docker-compose up -d
10、若发现页面可以访问,但是一直没有加载数据,可以通过以下命令进行查看日志:
docker logs <database_container_name_or_id>
11、若发现存在“connection database failed:”的错误,需要通过一下命令进入到docker,以MySQL为例:
docker exec -it database_container_name_or_id /bin/bash
12、找到/etc/mysql/my.cnf配置文件(或者其他文件夹下的my.cnf文件),在 my.cnf 中没有看到 bind-address 这一行,没有可以手动添加,以接受来自其他主机(如其他 Docker 容器)的连接,设置如下:
bind-address = 0.0.0.0
13、重启数据库和应用容器,应该就没有问题了:
docker restart <database_container_name_or_id>