首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理VSCode远程开发容器中的多个`network_mode`?

如何处理VSCode远程开发容器中的多个`network_mode`?
EN

Stack Overflow用户
提问于 2021-11-17 11:05:34
回答 2查看 243关注 0票数 1

我希望有一个应用程序,数据库和redis服务在一个开发容器中运行,在那里我可以在容器,应用程序和Windows中访问我的数据库和redis,这是目前我想要的应用程序和数据库的工作方式:

.devcontainer.json

代码语言:javascript
复制
{
  "name": "Node.js, TypeScript, PostgreSQL & Redis",
  "dockerComposeFile": "docker-compose.yml",
  "service": "akira",
  "workspaceFolder": "/workspace",
  "settings": {
    "typescript.tsdk": "node_modules/typescript/lib",
    "sqltools.connections": [
      {
        "name": "Container database",
        "driver": "PostgreSQL",
        "previewLimit": 50,
        "server": "database",
        "port": 5432,
        "database": "akira",
        "username": "ailuropoda",
        "password": "melanoleuca"
      }
    ],
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.fixAll": true
    }
  },
  "extensions": [
    "aaron-bond.better-comments",
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode",
    "mtxr.sqltools",
    "mtxr.sqltools-driver-pg",
    "redhat.vscode-yaml"
  ],
  "forwardPorts": [5432],
  "postCreateCommand": "npm install",
  "remoteUser": "node"
}

docker-compose.yml

代码语言:javascript
复制
version: "3.8"

services:
  akira:
    build:
      context: .
      dockerfile: Dockerfile
    command: sleep infinity
    env_file: .env
    volumes:
      - ..:/workspace:cached

  database:
    image: postgres:latest
    restart: unless-stopped
    environment:
      POSTGRES_USER: ailuropoda
      POSTGRES_DB: akira
      POSTGRES_PASSWORD: melanoleuca
    ports:
      - 5432:5432
    volumes:
      - pgdata:/var/lib/postgresql/data

  redis:
    image: redis:alpine
    tty: true
    ports:
      - 6379:6379

volumes:
  pgdata:

Dockerfile

代码语言:javascript
复制
ARG VARIANT="16-bullseye"
FROM mcr.microsoft.com/vscode/devcontainers/typescript-node:0-${VARIANT}

正如你所看到的,我已经尝试过使用networks来实现我想要的东西,但是没有成功,我的问题是:如何在我的服务中添加Redis,同时仍然能够在应用程序内和Windows上连接redis和数据库?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-17 17:50:25

如果您在WSL上使用Docker,我发现当进程正在侦听::1时,我经常无法连接,但当显式地将端口绑定到127.0.0.1时,可以通过Windows访问该服务。

所以就像这样

代码语言:javascript
复制
ports:
  - 127.0.0.1:5432:5432

可能行得通

票数 1
EN

Stack Overflow用户

发布于 2021-11-17 12:12:14

删除所有network_mode:设置。Compose将使用默认的network_mode: bridge。您将能够使用容器的组合服务名作为主机名在容器之间进行通信,如Docker文档中的Networking in Compose所述。

代码语言:javascript
复制
version: "3.8"
services:
  akira:
    build: .
    env_file: .env
    environment:
      PGHOST: database

  database:
    image: postgres:latest
    ...

在SO问题中,我经常看到试图使用network_mode:让其他东西显示为localhost。该主机名是非常上下文敏感的;如果您问我的笔记本电脑、Stack Overflow HTTP服务器之一、应用程序容器或数据库容器中的localhost是谁,他们都会各自独立地回答“我当然是”,但是指的是不同的网络上下文。network_mode: service:...听起来像是要让另一个容器成为localhost;实际上,使用这种方法是非常不寻常的。

您可能需要更改应用程序代码,以使数据库位置等设置可配置,这取决于它们运行的位置,而环境变量是在Docker中进行设置的一种简单方法。对于这个特定的示例,我使用了标准PostgreSQL客户端库使用的$PGHOST变量;在Typescript/Node上下文中,您可能需要更改代码以引用process.env.SOME_HOSTNAME而不是'localhost'

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70003249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档