Почему я не могу получить доступ к контейнеру с помощью Dockerfile, но могу получить доступ с помощью Docker-compose? - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь выучить Docker.У меня есть серверное приложение Hello World Django.Когда я пытаюсь запустить свой сервер, используя Dockerfile, мой сервер недоступен.Но когда я использую docker-compose, я могу получить к нему доступ.

Мой вопрос, почему, особенно когда они очень похожи.

Мой Dockerfile:

FROM python:3

# Set the working directory to /app
WORKDIR /bryne

# Copy the current directory contents into the container at /app
ADD . /bryne

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# EXPOSE port 8000 to allow communication to/from server
EXPOSE 8000

# CMD specifcies the command to execute to start the server running.
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
# done!

Команды, используемые при запуске сервера с использованием Dockerfile:

docker build -t swyne-latest docker run swyne-latest

Результат: невозможно получить доступ к серверу с 127.0.0.1:8000

My docker-compose.yml:

version: '3'

services:
  web:
    build: .
    command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    container_name: swyne
    volumes:
      - .:/bryne
    ports:
      - "8000:8000"

Команды, используемые при запуске сервера с использованием docker-compose: docker-compose up

Результат: Доступ к моему серверу возможен на 127.0.0.1:8000

Спасибо

Редактировать: Вывод из сборки Dockerfile:

$ docker build -t swyne-latest .
Sending build context to Docker daemon  60.15MB
Step 1/6 : FROM python:3
3: Pulling from library/python
05d1a5232b46: Already exists 
5cee356eda6b: Already exists 
89d3385f0fd3: Already exists 
80ae6b477848: Already exists 
28bdf9e584cc: Already exists 
523b203f62bd: Pull complete 
e423ae9d5ac7: Pull complete 
adc78e8180f7: Pull complete 
60c9f1f1e6c6: Pull complete 
Digest: sha256:5caeb1a2119661f053e9d9931c1e745d9b738e2f585ba16d88bc3ffcf4ad727b
Status: Downloaded newer image for python:3
 ---> 7a35f2e8feff
Step 2/6 : WORKDIR /bryne
 ---> Running in 9ee8283c6cc6
Removing intermediate container 9ee8283c6cc6
 ---> 5bbd14170c84
Step 3/6 : ADD . /bryne
 ---> 0128101457f5
Step 4/6 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
 ---> Running in 55ab661b1b55
Collecting Django>=2.1 (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/32/ab/22530cc1b2114e6067eece94a333d6c749fa1c56a009f0721e51c181ea53/Django-2.1.2-py3-none-any.whl (7.3MB)
Collecting pytz (from Django>=2.1->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/30/4e/27c34b62430286c6d59177a0842ed90dc789ce5d1ed740887653b898779a/pytz-2018.5-py2.py3-none-any.whl (510kB)
Installing collected packages: pytz, Django
Successfully installed Django-2.1.2 pytz-2018.5
Removing intermediate container 55ab661b1b55
 ---> dce5400552b2
Step 5/6 : EXPOSE 8000
 ---> Running in c74603a76b54
Removing intermediate container c74603a76b54
 ---> ee5ef2bf2999
Step 6/6 : CMD ["python", "manage.py", "runserver", "127.0.0.1:8000"]
 ---> Running in 4f5ea428f801
Removing intermediate container 4f5ea428f801
 ---> 368f73366b69
Successfully built 368f73366b69
Successfully tagged swyne-latest:latest

$ docker run swyne-latest (no output)

1 Ответ

0 голосов
/ 13 октября 2018

Полагаю, это нормально, что в отличие от docker-compose up, docker run swyne-latest не позволяет вам получить доступ к веб-приложению на 127.0.0.1:8000.

, поскольку файл docker-compose.yml (который читается docker-composeно не самим docker) указывает множество параметров, в частности, отображение портов, которые в противном случае должны передаваться как параметры CLI docker run.

Не могли бы вы попробовать вместо этого запустить docker run -p 8000:8000?

Кроме того, я предполагаю, что строка command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000", вероятно, должна помещаться внутри самого Dockerfile с директивой CMD или ENTRYPOINT, не в docker-compose.ymlфайл.

На самом деле, я только что посмотрел на вывод вашей команды docker build, и возникла ортогональная проблема:

команда

CMD ["python", "manage.py", "runserver", "127.0.0.1:8000"]

следует заменить на

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

(см. этот SO ответ для получения дополнительной информации по этой проблеме, хотя и на другом языке, Java вместо Python.)

КакКроме того, полная команда для компиляции Dockerfile не docker build -t swyne-latest, а docker build -t swyne-latest . (с конечной точкой, соответствующейпапка контекста сборки Docker).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...