docker - 使用 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 一起移动到新服务器。
现在如何迁移站点文件和数据库呢?
有没有办法简化所有这些步骤?
解决方案
由于您的镜像不包含您的应用程序代码,并且您通过绑定挂载注入它,因此您还需要单独复制您的应用程序代码。
以这种方式使用 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
不启动数据库并改为指向外部数据库。)
推荐阅读
- firebase - Flutter 中的 Cloud Firestore getAll() 等效项
- kubernetes - 尝试从 Web 客户端 (grpc-web) 调用 GRPC 服务器(在 GKE 上)时出现“404 未找到”
- wordpress - 古腾堡自定义元块不将元保存到自定义帖子类型
- android - 如何在颤振(android)应用程序中使用 C++ 代码?
- bash - Bash函数不回显附加参数
- sql - 分层查询显示每个父级下的所有子级
- javascript - 如何将此图像加载到自动完成文本框中?
- express - 使用 express-ntlm 身份验证对 TFS api 进行身份验证
- initialization - 选择一个理想的 CRC 初始值
- firebase - 编辑由 dialogflow 创建的 firebase 函数