我有两个应该互相通信的图像。第一个图像是Web API,第二个图像是Web本身。
在构建和运行映像之前,我nat
使用以下命令创建一个名为的新网络:
docker network create nat
此后,我开始创建映像,该映像image-api
在端口8080和image-web
8081上运行。
然后,我image-api
使用以下命令运行图像:
docker run -d -p 3000:8080 --network nat image-api
我将容器端口映射8080
到了主机端口3000
。我尝试3000
在浏览器中访问localhost端口,并且该端口正在运行,没有错误,并给了我应有的响应。
这里的问题是第二张image-web
图片。我尝试使用以下命令运行它:
docker run -d -p 3001:8081 --network nat image-web
当我尝试localhost:3001
在浏览器中访问时,它正在运行,但没有提供来自image-api
容器的数据。当我尝试记录image-web
容器时,它给我一个错误,例如:
Error: getaddrinfo ENOTFOUND image-api
以防万一,我尝试使用如下URLimage-api
从image-web
容器访问容器:
http://image-api/ping
这是我的image-api Dockerfile:
FROM node:14 as builder
WORKDIR /app
COPY package.json /app
RUN npm install
FROM node:14
EXPOSE 8080
CMD ["node", "server.js"]
WORKDIR /server
COPY --from=builder /app/node_modules /server/node_modules
COPY server.js .
这是我的图像网络Dockerfile:
FROM node:14 as builder
WORKDIR /app
COPY package.json .
RUN npm install
FROM node:14
ENV IMAGE_URL=http://image-api/ping
EXPOSE 8081
CMD ["node", "app.js"]
WORKDIR /web
COPY --from=builder /app/node_modules /web/node_modules
COPY /src .
为了以防万一,我已经尝试在没有docker的情况下运行它们,并且它们应在本地计算机中运行。
编辑:
我还尝试过使用这样的名称运行容器:
docker run -d -p 3000:8080 --network nat --name imageapi image-api
并尝试使用以下方式访问它:
http://imageapi/ping
但这仍然给我同样的错误
解决方案:
正如@davidMaze指出的那样。使用--name
标签运行我们的容器后。我可以使用访问我的容器http://imageapi:8080/ping
docker run --name
启动容器时,您需要明确指定a 。由于您可以从同一映像运行多个容器,因此Docker不会根据映像名称自动分配容器名称。您需要自己设置。
docker run -d -p 3000:8080 --network nat --name image-api image-api
docker run -d -p 3001:8081 --network nat --name image-web image-web
设置容器名称后,Docker将提供内部DNS服务,并且该名称可以从同一网络上的其他容器访问该容器。
Docker文档中的使用桥接网络对此进行了进一步描述,尽管与过时的网络模式形成了鲜明对比。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句