如何使用 docker-compose 将多个 docker 图像推送到 docker 集线器?
How to push multiple docker images with docker-compose to docker hub?
我的 docker-compose 文件中有几个图像和服务,用于创建 PHP、Apache、MySql 和 PHPMyAdmin 环境以 运行 我的网站。任何人都可以帮助我如何在 Docker Hub 上推送我的所有图像或使用我的网站代码创建环境?
Docker文件
FROM php:7.4-apache
RUN docker-php-ext-install mysqli
docker-compose.yml
services:
php:
build:
context: .
dockerfile: Dockerfile
ports:
- 80:80
volumes:
- ./src:/var/www/html/
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- 8080:80
environment:
- PMA_ARBITRARY=1
index.php 和 src 文件夹中的所有网站代码
了解可以和不能推送到 Docker Hub 的内容很有用。 Docker Hub 将包含 Docker 图像,但它不能托管数据内容、docker-compose.yml
文件本身或任何其他不是 Docker 图像的内容。您使用的两个支持容器都使用标准 Docker Hub 图像。因此,您需要使 php
容器独立,将其推送到 Docker Hub,然后手动将 docker-compose.yml
文件复制到您要 运行 的位置。
删除对本地系统的依赖。 除了复制 Docker 容器外,您通常不希望复制应用程序源代码。在 docker-compose.yml
文件中,删除将本地系统源代码装载到容器中的 volumes:
,但将其替换为将其复制到映像中的 Docker 文件行:
COPY ./src/ /var/www/html/
这不是实时开发环境,没关系。
命名您的 Docker 中心图像。 您可以在 docker-compose.yml
中同时包含 build:
和 image:
行文件。如果你这样做了,那就指定了图像将被构建的名称(而不是让 Compose 选择它)。这应该给您留下:
services:
php:
build: . # with default Dockerfile
image: myname/myapp
ports:
- '80:80'
# no volumes:
db: # as above
phpmyadmin: # as above
构建并测试。您应该可以进行此设置; docker-compose down -v
清理所有本地工件; docker-compose build
图片,然后 docker-compose up
开始这一切。执行您需要的任何手动测试,以及您构建的任何自动化端到端测试。
推送图片
docker-compose push php
运行 它在别处。 您需要 docker-compose.yml
文件,但不需要任何其他工件。当你在另一台机器上 运行 docker-compose up
时,它会拉取它在本地没有的任何图像。 (如果是私人图片,您可能需要先 docker login
。)
scp docker-compose.yml there:
ssh root@there docker-compose up -d
数据库内容。您的docker-compose.yml
文件没有声明volumes:
存储数据库数据;这可能会导致重新启动时丢失数据。但是,您也不能将这些卷推送到 Docker Hub。您可以在本地系统上备份您的数据库并在远程系统上恢复它;或者您可以 运行 数据库迁移和播种脚本作为应用程序启动的一部分。数据需要与代码(图像)和部署机制(Compose)分开处理。
我的 docker-compose 文件中有几个图像和服务,用于创建 PHP、Apache、MySql 和 PHPMyAdmin 环境以 运行 我的网站。任何人都可以帮助我如何在 Docker Hub 上推送我的所有图像或使用我的网站代码创建环境?
Docker文件
FROM php:7.4-apache
RUN docker-php-ext-install mysqli
docker-compose.yml
services:
php:
build:
context: .
dockerfile: Dockerfile
ports:
- 80:80
volumes:
- ./src:/var/www/html/
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- 8080:80
environment:
- PMA_ARBITRARY=1
index.php 和 src 文件夹中的所有网站代码
了解可以和不能推送到 Docker Hub 的内容很有用。 Docker Hub 将包含 Docker 图像,但它不能托管数据内容、docker-compose.yml
文件本身或任何其他不是 Docker 图像的内容。您使用的两个支持容器都使用标准 Docker Hub 图像。因此,您需要使 php
容器独立,将其推送到 Docker Hub,然后手动将 docker-compose.yml
文件复制到您要 运行 的位置。
删除对本地系统的依赖。 除了复制 Docker 容器外,您通常不希望复制应用程序源代码。在 docker-compose.yml
文件中,删除将本地系统源代码装载到容器中的 volumes:
,但将其替换为将其复制到映像中的 Docker 文件行:
COPY ./src/ /var/www/html/
这不是实时开发环境,没关系。
命名您的 Docker 中心图像。 您可以在 docker-compose.yml
中同时包含 build:
和 image:
行文件。如果你这样做了,那就指定了图像将被构建的名称(而不是让 Compose 选择它)。这应该给您留下:
services:
php:
build: . # with default Dockerfile
image: myname/myapp
ports:
- '80:80'
# no volumes:
db: # as above
phpmyadmin: # as above
构建并测试。您应该可以进行此设置; docker-compose down -v
清理所有本地工件; docker-compose build
图片,然后 docker-compose up
开始这一切。执行您需要的任何手动测试,以及您构建的任何自动化端到端测试。
推送图片
docker-compose push php
运行 它在别处。 您需要 docker-compose.yml
文件,但不需要任何其他工件。当你在另一台机器上 运行 docker-compose up
时,它会拉取它在本地没有的任何图像。 (如果是私人图片,您可能需要先 docker login
。)
scp docker-compose.yml there:
ssh root@there docker-compose up -d
数据库内容。您的docker-compose.yml
文件没有声明volumes:
存储数据库数据;这可能会导致重新启动时丢失数据。但是,您也不能将这些卷推送到 Docker Hub。您可以在本地系统上备份您的数据库并在远程系统上恢复它;或者您可以 运行 数据库迁移和播种脚本作为应用程序启动的一部分。数据需要与代码(图像)和部署机制(Compose)分开处理。