Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用docker compose运行多个映像实例失败_Docker_Playframework_Playframework 2.0_Docker Compose - Fatal编程技术网

使用docker compose运行多个映像实例失败

使用docker compose运行多个映像实例失败,docker,playframework,playframework-2.0,docker-compose,Docker,Playframework,Playframework 2.0,Docker Compose,您好,我正在尝试部署4个docker容器,其中包含相同的映像(这是一个Java Play应用程序)和一个Nginx,Nginx应该在这些实例之间进行负载平衡 我的docker compose文件如下所示: 版本:“2” 服务: api1: tty:是的 图片:abfalterjakob/playapi 端口: - "9000" api2: tty:是的 图片:abfalterjakob/playapi 端口: - "9001" api3: tty:是的 图片:abfalterjakob/play

您好,我正在尝试部署4个docker容器,其中包含相同的映像(这是一个Java Play应用程序)和一个Nginx,Nginx应该在这些实例之间进行负载平衡

我的
docker compose
文件如下所示:

版本:“2”
服务:
api1:
tty:是的
图片:abfalterjakob/playapi
端口:
- "9000"
api2:
tty:是的
图片:abfalterjakob/playapi
端口:
- "9001"
api3:
tty:是的
图片:abfalterjakob/playapi
端口:
- "9002"
api4:
tty:是的
图片:abfalterjakob/playapi
端口:
- "9003"
nginx:
图片:abfalterjakob/custom_nginx
端口:
- "80:80"
运行一个api实例可以正常工作,但每当我尝试运行第二个实例时,它就会崩溃,并出现以下错误:

Starting docker_api2_1
Attaching to docker_api2_1
api2_1   | tandard_init_linux.go:175: exec user process caused "no such file or directory" [recovered]
api2_1   |      panic: standard_init_linux.go:175: exec user process caused "no such file or directory"
api2_1   |
api2_1   | goroutine 1 [running, locked to thread]:
api2_1   | panic(0x7de000, 0xc82013efc0)
api2_1   |      /usr/local/go/src/runtime/panic.go:481 +0x3e6
api2_1   | github.com/urfave/cli.HandleAction.func1(0xc82011f2e8)
api2_1   |      /go/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/urfave/cli/app.go:478 +0x38e
api2_1   | panic(0x7de000, 0xc82013efc0)
api2_1   |      /usr/local/go/src/runtime/panic.go:443 +0x4e9
api2_1   | github.com/opencontainers/runc/libcontainer.(*LinuxFactory).StartInitialization.func1(0xc82011ebf8, 0xc82001e038, 0xc82011ed08)
api2_1   |      /go/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/factory_linux.go:259 +0x136
api2_1   | github.com/opencontainers/runc/libcontainer.(*LinuxFactory).StartInitialization(0xc8200d0f50, 0x7fa4847fc918, 0xc82013efc0)
api2_1   |      /go/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/factory_linux.go:277 +0x5b1
api2_1   | main.glob.func8(0xc8200da3c0, 0x0, 0x0)
api2_1   |      /go/src/github.com/opencontainers/runc/main_unix.go:26 +0x68
api2_1   | reflect.Value.call(0x744b00, 0x8f0ed0, 0x13, 0x839c18, 0x4, 0xc82011f268, 0x1, 0x1, 0x0, 0x0, ...)
api2_1   |      /usr/local/go/src/reflect/value.go:435 +0x120d
api2_1   | reflect.Value.Call(0x744b00, 0x8f0ed0, 0x13, 0xc82011f268, 0x1, 0x1, 0x0, 0x0, 0x0)
api2_1   |      /usr/local/go/src/reflect/value.go:303 +0xb1
api2_1   | github.com/urfave/cli.HandleAction(0x744b00, 0x8f0ed0, 0xc8200da3c0, 0x0, 0x0)
api2_1   |      /go/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/urfave/cli/app.go:487 +0x2ee
api2_1   | github.com/urfave/cli.Command.Run(0x83cab8, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d0420, 0x51, 0x0, ...)
api2_1   |      /go/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/urfave/cli/command.go:191 +0xfec
api2_1   | github.com/urfave/cli.(*App).Run(0xc820001680, 0xc820070060, 0x2, 0x2, 0x0, 0x0)
api2_1   |      /go/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/urfave/cli/app.go:240 +0xaa4
api2_1   | main.main()
api2_1   |      /go/src/github.com/opencontainers/runc/main.go:137 +0xe24
docker_api2_1 exited with code 2
我猜这可能是端口的问题? 这里是播放应用程序的Dockerfile

FROM java:8

ADD target /app/target
ADD start_script.sh /app
WORKDIR /app
RUN chmod +x ./start_script.sh
CMD ["./start_script.sh"]
EXPOSE 9000
有人知道这里的确切问题吗?

您可能不需要指定
端口
如果不需要API服务器上的端口在Docker之外响应,则根本不需要指定
端口。图像中的
EXPOSE
语句已经存在。您的nginx容器已经可以访问Docker网络中每个API容器上的端口9000

您需要将容器链接在一起,以便它们可以通信 不过,您确实需要告诉nginx容器链接到其他容器。试着这样做:

版本:“2”
服务:
api1:
tty:是的
图片:abfalterjakob/playapi
api2:
tty:是的
图片:abfalterjakob/playapi
api3:
tty:是的
图片:abfalterjakob/playapi
api4:
tty:是的
图片:abfalterjakob/playapi
nginx:
图片:abfalterjakob/custom_nginx
端口:
- "80:80"
链接:
-api1
-api2
-api3
-api4
现在,您的nginx容器可以使用API服务器的服务和端口与它们通信,例如

api1:9000
api2:9000
api3:9000
api4:9000
这还有另外一个好处,即API服务器与外部网络隔离,从而提高了安全性

同样,这假设API服务器不应公开访问,而应仅通过nginx代理进行路由

如果要将端口映射到外部,则必须将内部映射到外部 您告诉Docker使用端口9000、9001等,但您的映像设置为仅暴露9000。要将它们映射到外部,需要设置外部端口,然后将其映射到内部端口,如下所示:

版本:“2”
服务:
api1:
tty:是的
图片:abfalterjakob/playapi
端口:
- "9000:9000"
api2:
tty:是的
图片:abfalterjakob/playapi
端口:
- "9001:9000"
api3:
tty:是的
图片:abfalterjakob/playapi
端口:
- "9002:9000"
api4:
tty:是的
图片:abfalterjakob/playapi
端口:
- "9003:9000"
nginx:
图片:abfalterjakob/custom_nginx
端口:
- "80:80"
链接:
-api1
-api2
-api3
-api4
在最初的示例中,您只使用了一个端口。这会告诉docker compose使用该容器端口,但会安排一个随机主机端口。如果您告诉他们每个人使用端口9000,那么它会将每个容器中的端口9000绑定到一个随机主机端口。但您在4种情况中的3种情况下指定了非公开容器端口


有关更多信息,请参阅。如果您将EXPOSE 9000更改为EXPOSE 9009,因为似乎存在冲突。为了澄清,启动一个api容器是可行的,但只要我想启动第二个,我就会收到错误。我将您的图像更改为ubuntu,没有看到任何错误。可能是因为您的基础映像有某种东西阻止它在两个容器中运行吗?谢谢!设法把一切都解决了。我的当前图像还有一个问题,这是错误消息的实际原因。就文档所述,您不需要使用compose version x>=2将容器相互链接。