将现有 Docker 个容器迁移到 Docker Compose
Migrating existing Docker containers to Docker Compose
我有几个由经典 Docker 命令启动的 运行ning 容器。这些容器正在使用 Docker 网络,该网络也是 "by hand":
创建的
docker network create simple-network
docker run -d \
--name docker-registry \
--net=simple-network \
-p 5000:5000 \
-v [...] \
registry:2.3.0
docker run -d \
--name docker-registry-web \
--net=simple-network \
-p 8080 \
-v [...] \
hyper/docker-registry-web
docker run -d \
--name nginx \
--net=simple-network \
-p 80:80 \
-p 443:443 \
-v [...] \
nginx:1.9.8
我想使用 Docker Compose 来 运行 这些容器,因为它更易于管理。
是否可以将这些容器迁移到 Docker Compose 中,或者只能将 Compose 与全新的容器一起使用?
我想在这次迁移过程中使用相同的卷!停机不是问题。
docker-compose.yml
version: '2'
docker-registry:
image: registry:2.3.0
ports:
- "5000:5000"
volumes:
- [...]
docker-registry-web:
image: hyper/docker-registry-web
expose:
- "8080"
volumes:
- [...]
nginx:
image: nginx:1.9.8
ports:
- "80:80"
- "443:443"
volumes:
- [...]
我相信 compose 的目的是 运行 多容器应用程序。虽然您可能会得到类似的设置,但您似乎不太可能真正将 运行ning docker 容器拉入 docker 组合环境。
要重新使用现有网络,您可以使用
networks:
default:
external:
name: simple-network
要重新使用这些卷,这取决于它们是什么类型的卷。如果它们是命名卷,你可以做类似的事情:
volumes:
data:
external:
name: the_name_of_the_volume
然后您将在服务中使用 volumes: [data]
来使用它。
如果它们是主机卷,那真的很简单,只需使用相同的配置即可。
如果它们是未命名的卷,您可以将卷 ID 用作外部卷(与使用命名卷的方式相同)。
重新使用容器是不可能的。您可以让 Compose 接管由 docker 创建的容器,但它们需要具有正确的 labels
。找到标签的最简单方法是 docker inspect
通过 compose 创建的容器查看 key/values。由于您无论如何都必须重新创建一个容器来应用标签,因此停止它们并 up
组合可能更容易。
更新 dnephin's 重用命名卷示例的一部分,以防对下一个人有所帮助:
在 docker-compose.yml 的卷部分中,您不应该再使用 name: name_of_the_volume
,只需使用名称定义它们,例如
volumes:
app-mongo-data:
external: true
app-mongo-config:
external: true
然后通过(在此示例中)app-mongo-data
或 app-mongo-config
在您的服务中引用它们,如下所示:
version:'3'
services:
app-db:
image: mongo:latest
expose:
- "27017"
volumes:
- app-mongo-data:/data/db
- app-mongo-config:/data/configdb
可能对问题的网络方面有所帮助(尽管不是所问的内容):docker-compose.yml 以上几行来自让我使用 [=18= 引用我的应用程序的数据库]
app-db:27017
因为 compose 包含一个用于列出的服务的名称解析器,并且端口公开给由此 compose 启动的所有服务。
我有几个由经典 Docker 命令启动的 运行ning 容器。这些容器正在使用 Docker 网络,该网络也是 "by hand":
创建的docker network create simple-network
docker run -d \
--name docker-registry \
--net=simple-network \
-p 5000:5000 \
-v [...] \
registry:2.3.0
docker run -d \
--name docker-registry-web \
--net=simple-network \
-p 8080 \
-v [...] \
hyper/docker-registry-web
docker run -d \
--name nginx \
--net=simple-network \
-p 80:80 \
-p 443:443 \
-v [...] \
nginx:1.9.8
我想使用 Docker Compose 来 运行 这些容器,因为它更易于管理。
是否可以将这些容器迁移到 Docker Compose 中,或者只能将 Compose 与全新的容器一起使用?
我想在这次迁移过程中使用相同的卷!停机不是问题。
docker-compose.yml
version: '2'
docker-registry:
image: registry:2.3.0
ports:
- "5000:5000"
volumes:
- [...]
docker-registry-web:
image: hyper/docker-registry-web
expose:
- "8080"
volumes:
- [...]
nginx:
image: nginx:1.9.8
ports:
- "80:80"
- "443:443"
volumes:
- [...]
我相信 compose 的目的是 运行 多容器应用程序。虽然您可能会得到类似的设置,但您似乎不太可能真正将 运行ning docker 容器拉入 docker 组合环境。
要重新使用现有网络,您可以使用
networks:
default:
external:
name: simple-network
要重新使用这些卷,这取决于它们是什么类型的卷。如果它们是命名卷,你可以做类似的事情:
volumes:
data:
external:
name: the_name_of_the_volume
然后您将在服务中使用 volumes: [data]
来使用它。
如果它们是主机卷,那真的很简单,只需使用相同的配置即可。
如果它们是未命名的卷,您可以将卷 ID 用作外部卷(与使用命名卷的方式相同)。
重新使用容器是不可能的。您可以让 Compose 接管由 docker 创建的容器,但它们需要具有正确的 labels
。找到标签的最简单方法是 docker inspect
通过 compose 创建的容器查看 key/values。由于您无论如何都必须重新创建一个容器来应用标签,因此停止它们并 up
组合可能更容易。
更新 dnephin's 重用命名卷示例的一部分,以防对下一个人有所帮助:
在 docker-compose.yml 的卷部分中,您不应该再使用 name: name_of_the_volume
,只需使用名称定义它们,例如
volumes:
app-mongo-data:
external: true
app-mongo-config:
external: true
然后通过(在此示例中)app-mongo-data
或 app-mongo-config
在您的服务中引用它们,如下所示:
version:'3'
services:
app-db:
image: mongo:latest
expose:
- "27017"
volumes:
- app-mongo-data:/data/db
- app-mongo-config:/data/configdb
可能对问题的网络方面有所帮助(尽管不是所问的内容):docker-compose.yml 以上几行来自让我使用 [=18= 引用我的应用程序的数据库]
app-db:27017
因为 compose 包含一个用于列出的服务的名称解析器,并且端口公开给由此 compose 启动的所有服务。