首页 > 解决方案 > 使用 docker 将图像、容器、文件、数据库迁移到另一台服务器

问题描述

我想我也已经阅读了几乎所有关于 stackoverflow 的文章和帖子,但我不太理解逻辑并获得最佳结果。

这是我的 docker-compose.yml 文件:

version: '3'
services:
  php:
    image: php:7.4-apache
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html/
    networks:
      - app-network

  db:
    image: mysql:8.0
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - MYSQL_DATABASE=my_db
    volumes: 
      - dbdata:/var/lib/mysql
    command: '--default-authentication-plugin=mysql_native_password'
    networks:
      - app-network


volumes:
    dbdata:
    src:

networks:
  app-network:
    driver: bridge

这是我的 Dockerfile:

FROM php:7.4-apache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli && apachectl restart
EXPOSE 80

我的目标是将包括站点和数据库在内的所有内容复制到另一台服务器。

我使用以下命令导出了所有图像:

docker save $(docker images | grep -v \<none\> | sed '1d' | awk '{print $1 ":" $2 }') -o allinone.tar

我将此 .tar 文件与 docker-compose.yml、.env、Dockerfile 一起移动到新服务器。

现在如何迁移站点文件和数据库呢?

有没有办法简化所有这些步骤?

标签: dockerdocker-compose

解决方案


由于您的镜像不包含您的应用程序代码,并且您通过绑定挂载注入它,因此您还需要单独复制您的应用程序代码。

以这种方式使用 Docker 并没有给您带来太多好处。您可以使用 Ansible、Chef 或 Salt Stack 等系统自动化工具将应用程序代码和部署文件复制到目标系统,但这些工具也可以安装应用程序运行时和数据库依赖项。

更好的方法是将应用程序的代码包含在图像中。您还需要访问 Docker 注册表。Docker Hub 很方便,大多数公有云提供商都有一个(ECR、GCR、ACR,...),并且有多种第三方托管选项;您也可以在本地运行自己的。

要将您的代码包含在映像中,请在 Dockerfile 中添加以下行:

COPY src /var/www/html/

在您的docker-compose.yml文件中,您需要告诉 Docker 实际使用您正在构建的映像。你需要把它告诉build:图像;您还需要告诉它存储库中图像的名称。不要用 覆盖图像中的代码volumes:。(我也会删除所有的networks:块;Compose 会提供一个default为你命名的网络。)

version: '3.8'
services:
  php:
    build: .
    image: exper1/php-app # or another registry-specific name
    ports:
      - 80:80
  db:
    # as in the question, except without the networks: block or container_name:
volumes:
  dbdata:

现在您可以docker-compose build && docker-compose push将自定义镜像推送到 Docker Hub(或其他地方)。

如果无法重建数据库数据,则需要单独复制。Docker 文档描述了如何备份和恢复命名卷;在这种情况下,您需要做类似的事情

docker-compose run -v $PWD:/export -w /var/lib/mysql db \
  tar cvzf /export/db.tar.gz .

现在您需要将docker-compose.yml文件和导出的db.tar.gz文件复制到另一个系统。您不需要 Dockerfile 或应用程序源代码。从;中删除该build:docker-compose.yml重新导入数据库数据

docker-compose run -v $PWD:/export -w /var/lib/mysql db \
  tar xvzf /export/db.tar.gz

你现在可以运行

docker-compose up -d

它将从 Docker Hub 或您的其他注册表服务器中提取包含所有应用程序源的映像。

(如果您在云环境中,使用具有自动备份和快照功能的托管数据库解决方案是一个很好的论据。如果您在 Amazon EC2 实例上运行它,您可以将 ECR 用于您的映像注册表,并将 RDS 用于例如,您的数据库。这将需要进一步修改以docker-compose.yml不启动数据库并改为指向外部数据库。)


推荐阅读