【问题标题】:Docker files to docker composeDocker 文件到 docker compose
【发布时间】:2021-01-09 10:33:04
【问题描述】:

我是 docker 的新手。我正在制作一个 java sockets 音乐服务器,我有 2 个文件。 Client.java 和 Server.java。两者都在单独的容器中。值得一提的是,我在命令行中运行这两个服务

Docker 文件

FROM java:8
COPY Server.java /
RUN javac Server.java
EXPOSE 25000
ENTRYPOINT ["java"]
CMD ["Server"]
FROM java:8
COPY Client.java /
RUN javac Client.java
EXPOSE 25000
ENTRYPOINT ["java"]
CMD ["Client"]

我还创建了一个网络供这两个人交流。

docker network create client_server_network

我按如下方式运行图像:

docker run --env SERVER_HOST_ENV=server --network-alias server --network client_server_network -it server

docker run --network client_server_network -it clientimage

现在我想用这两个 Dockerfile 和网络创建一个 docker compose 文件。这是我到目前为止所做的:

version:'3'
services:
  client:
    image: java:8
    ports:
      -25000:25000
    network:
      default:
        name: client_server_network  
    

  server:
    image: java:8
    ports:
      -25000:25000
    environment:
      -SERVER_HOST_ENV=server 
    network:

我的问题是如何在两种服务中添加公共网络。我写 docker compose 文件的方式也正确吗?

【问题讨论】:

    标签: java docker docker-compose


    【解决方案1】:

    以下是代码,默认情况下,两个容器都添加到名为 net 的网络中,并且它还必须在最后一行提供

    version:'3'
    services:
      client:
        image: java:8
        ports:
          - 25000:25000
        networks:
          - client_server_network  
        
    
      server:
        image: java:8
        ports:
          - 25000:25000
        environment:
          - "SERVER_HOST_ENV=server" 
        networks:
          - client_server_network
    networks:
      client_server_network:
    

    请注意,网络应在同一级别的服务和版本中最后共同指定。因为缩进是 docker-compose 的一个主要因素。如果缩进不正确可能会显示错误。

    【讨论】:

    • 谢谢,这似乎非常接近。在最后一行net: 我应该写我的网络名称?喜欢net: client_server_network
    • @william12 是的,兄弟,您必须更改将网络指定为 client_server_network 的位置,例如:在客户端和服务器部分以及最后一个部分中
    • 这只会运行两个 java 容器,而不是 OPs 容器,不是吗?我认为 OP 需要用docker build -t JServer . 构建这两个,然后在docker-compose 中有image: JServer(对于客户端也是如此)
    【解决方案2】:

    删除整个文件中的所有networks: 块。 clientserver 将被这两个容器用作主机名。

    Docker 文档中的Networking in Compose 进一步描述了此行为。如果您不声明顶级 networks:,Compose 会创建一个名为 default 的网络,如果您未在给定服务上声明 networks:,Compose 会将其附加到该 default 网络。

    两个docker run 命令的功能转换如下所示:

    version: '3.8'
    # Compose creates `networks: { default: }` on its own; you do not need
    # top-level `networks:`
    services:
      server: # <-- this name is usable as a host name
        image: server
        environment:
          - SERVER_HOST_ENV=server
        # Automatically on `networks: [default]`
      client:
        image: clientimage
    

    【讨论】:

    • image: clientimage 你的意思是 dockerfile?
    • 您必须先使用docker build -t &lt;nameOfTheImage&gt; . 构建映像!注意这里的.,它指的是当前目录(所以你需要在dockerfile所在的目录下运行这个命令)。然后您可以在docker-compose 中使用此图像名称。 (您需要同时构建客户端映像和服务器映像)或者您可以指定 dockerfile like this
    • 在你的例子中你docker run ... clientimage;这是相同的图像名称。您还可以将 Compose 配置为 build: 图像本身。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多