1

我想在开发容器中运行一个应用程序、数据库和 redis 服务,我可以在容器、应用程序和 Windows 上访问我的数据库和 redis,这就是我想要的应用程序的当前工作方式和数据库:

.devcontainer.json

{
  "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

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

ARG VARIANT="16-bullseye"
FROM mcr.microsoft.com/vscode/devcontainers/typescript-node:0-${VARIANT}

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

4

3 回答 3

1

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

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 中进行设置的一种简单方法。对于这个特定的示例,我使用$PGHOST了标准 PostgreSQL 客户端库使用的变量;在 Typescript/Node 上下文中,您可能需要更改代码以引用process.env.SOME_HOSTNAME而不是'localhost'.

于 2021-11-17T12:12:14.443 回答
1

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

所以像

ports:
  - 127.0.0.1:5432:5432

可能有用

于 2021-11-17T17:50:24.797 回答
0

将所有非开发容器切换到 network_mode: service:akira

version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ../..:/workspace:cached
    command: sleep infinity
  postgresql:
    image: postgres:14.1
    network_mode: service:akira
    restart: unless-stopped
    volumes:
      - ../docker/volumes/postgresql:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: pornapp
  redis:
    image: redis
    network_mode: service:akira
    restart: unless-stopped
    volumes:
      - ../docker/volumes/redis:/data

看来这是原始配置: https ://github.com/microsoft/vscode-dev-containers/pull/523

但它被恢复了,因为如果您在其他服务运行时重建开发容器,端口转发将中断: https ://github.com/microsoft/vscode-dev-containers/issues/537

于 2021-12-03T23:19:07.497 回答