我想我也已经阅读了关于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移到新服务器上。
现在我该如何迁移站点文件和数据库?
有没有办法简化所有这些步骤?
答案 0 :(得分:0)
由于图像不包含应用程序的代码,并且通过绑定安装注入了图像,因此还需要单独复制应用程序代码。
通过这种方式使用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文档描述了如何back up and restore named volumes;在这种情况下,您需要做类似的事情
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和RDS。这将需要对docker-compose.yml
进行进一步的修改,以不启动数据库并指向外部数据库。)