不使用Docker Compose,如何在Dockerfile中创建并关联两个镜像?
我来帮你一步步解决这两个问题,结合你写的Dockerfile来拆解说明:
1. 在Dockerfile中生成两个独立镜像(无需Docker Compose)
你已经用到了Docker的多阶段构建语法,但默认情况下,docker build只会输出最后一个阶段的镜像。要生成两个独立镜像,你需要给每个构建阶段命名,并通过--target参数指定构建目标。
首先修改你的Dockerfile,给第一个Node.js阶段加上名称:
# 第一个阶段:Node.js应用镜像,命名为node-app FROM node:latest as node-app RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json /usr/src/app/ RUN npm i COPY . /usr/src/app EXPOSE 4000 CMD [ "npm", "start" ] # 第二个阶段:MongoDB镜像,已命名为mongo FROM mongo:latest as mongo WORKDIR /data VOLUME ["/data/db"] EXPOSE 27017
然后分别构建两个镜像:
- 构建Node.js应用镜像:
docker build --target node-app -t my-node-app . - 构建MongoDB镜像:
docker build --target mongo -t my-mongo .
执行完这两个命令后,用docker images就能看到你生成的两个镜像了。
2. 让两个镜像的容器实现关联通信(无需Docker Compose)
要让Node应用容器能连接到MongoDB容器,核心是利用Docker的自定义网络——在同一个自定义网络内的容器可以通过容器名称直接互相访问,无需依赖IP地址。
步骤如下:
- 创建一个自定义Docker网络:
docker network create app-network - 启动MongoDB容器,将其加入这个自定义网络:
这里docker run -d --name mongo-db --network app-network my-mongo--name mongo-db是给容器起的名称,后面Node应用会用这个名称来连接数据库。 - 调整你的Node应用代码,把MongoDB连接地址改成
mongodb://mongo-db:27017(因为在自定义网络里,容器名称可以直接被解析)。 - 启动Node应用容器,同样加入
app-network网络,并映射端口:docker run -d --name node-service --network app-network -p 4000:4000 my-node-app
这样两个容器就处于同一个网络中,Node应用就能顺利连接到MongoDB了。
注意:不要使用Docker的默认bridge网络来关联容器,默认网络不支持容器名称解析,需要手动指定IP或者已被弃用的
--link参数,自定义网络是更规范的做法。
内容的提问来源于stack exchange,提问作者MrSkineto
相关产品推荐
相关产品推荐

