Приложение Docker не может получить доступ с хост-компьютера

#docker #docker-compose #wsl-2

Вопрос:

Я создал файл docker и создал контейнер docker, используя этот файл. Но веб-приложение docker недоступно с хост-компьютера. Я использую WSL2 для запуска docker. Мой контейнер docker находится внутри моего дистрибутива ubuntu. Когда я запускаю контейнер, он говорит, что приложение запущено. Но когда я попытался получить доступ к веб-серверу из chrome на моем компьютере с Windows (хосте), он говорит, что не удалось подключиться. Мое отображение портов выглядит нормально.

Вот мой файл docker-compose.yml

 version: '2'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: dp
      MYSQL_USER: app
      MYSQL_PASSWORD: appuser
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
    ports:
      - "3307:3306"
    volumes:
      - "./db_dump:/docker-entrypoint-initdb.d/:ro"
    container_name: mysql_db
  app:
    build:
      context:
        ./
    volumes:
      - "./dp:/app"
    ports:
      - "3000:3000"
    depends_on: 
      - db
    links: 
      - db
    environment: 
      MYSQL_HOST: db
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: dp
      MYSQL_USER: app
      MYSQL_PASSWORD: appuser
    container_name: dp_app
 

Вот мой док-файл

 FROM node:14.15.5-alpine3.13
RUN mkdir -p /app
WORKDIR /app
#RUN adduser -S app
COPY ./dp/ .
RUN npm install
RUN npm install sharp --ignore-scripts=false
#RUN chown -R app /app
#USER app
EXPOSE 3000
CMD [ "npm", "run", "deploy" ]
 

У меня в корневом каталоге есть папка с именем dp, которая является следующим приложением js. Также у меня есть папка под названием db_dump, в которой есть мои начальные сценарии бд для настройки базы данных.

Вот сценарии в файле package.json в папке dp

 "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "deploy": "next build amp;amp; next start"
  }
 

Когда я запускаю docker-compose up , создается изображение, создается следующее приложение и запускается с сообщением

ready - started server on 0.0.0.0:3000, url: http://localhost:3000 Поскольку я привязал 3000 портов контейнера к 3000 портам моей хост-машины, я должен иметь доступ к веб-серверу с локального хоста:3000, верно? Но я не могу получить к нему доступ. Я даже попытался получить ip-адрес контейнера docker docker inspect , но это тоже не сработало. Я попытался подключить сервер mysql с помощью порта 3307, который также не работает. Кажется, ошибки нет. Но не смог подключиться.

Я попробовал curl -I http://localhost:3000 из другого экземпляра wsl, он показывает 200 ответов. Но когда я пытаюсь сделать то же самое из командной строки Windows, это не работает. Не в состоянии понять, в чем проблема.

Комментарии:

1. В package.json настройках вашей "deploy": "next build amp;amp; next start" попытки "deploy": "next build amp;amp; next start -p 3000" . 3000 на самом деле является портом разработки, вы не должны использовать его для prod

2. @Superbman, я изменил сценарий, как ты и предлагал. Но все равно не работает.

3. Просто чтобы уточнить, вы делаете docker-compose up это из Windows или из Ubuntu (WSL)?

4. Я работаю docker-compose up с Ubuntu WSL.

Ответ №1:

Если вы используете Docker-машину на Mac или Windows, используйте ip-адрес docker-машины MACHINE_VM, чтобы получить IP-адрес вашего хоста Docker. Затем откройте http://MACHINE_VM_IP:5000 в браузере.

Попробуйте это, это должно сработать.