호스트에서 Docker 컨테이너의 웹 서버에 액세스하는 방법
boot2docker 1.3.1에서 실행 중입니다.
을 통해 웹 서버를 실행하는 Docker 컨테이너가 uwsgi --http :8080
있습니다.
컨테이너에 연결하면 사용중인 웹 사이트를 탐색 할 수 lynx http://127.0.0.1:8080
있으므로 서버가 작동하고 있음을 알 수 있습니다 .
내 컨테이너를 다음과 같이 실행했습니다.
$ docker run -itP --expose 8080 uwsgi_app:0.2
다음과 같은 세부 정보가 있습니다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5248ad86596d uwsgi_app:0.2 "bash" 11 minutes ago Up 11 minutes 0.0.0.0:49159->8080/tcp cocky_hypatia
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 5248ad86596d
172.17.0.107
으로 이동하여 호스트에서 해당 웹 사이트에 액세스 할 수 있다고 생각했습니다 http://172.17.0.107:49159
.
작동하지 않습니다. Chrome에 '연결 중 ...'이 표시됩니다.
내가 도대체 뭘 잘못하고있는 겁니까?
확장 Anentropic의 대답 : boot2docker
Mac 및 Windows 용 이전 앱 docker-machine
이 새로운 앱입니다 .
먼저 기계를 나열하십시오.
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
default * virtualbox Running tcp://192.168.99.100:2376
그런 다음 머신 중 하나 (기본값 :)를 선택 default
하고 다음을 수행합니다.
$ docker-machine ip default
192.168.99.100
좋아, 바보 야, boot2docker https://docs.docker.com/installation/mac/#container-port-redirection 문서에서 답을 찾았습니다.
컨테이너의 IP가 아닌 boot2docker VM의 IP 주소를 사용해야했습니다.
$ boot2docker ip
192.168.59.103
호스트에서 내 사이트를 탐색 할 수 있습니다. http://192.168.59.103:49159/
route
호스트에 추가 할 필요가 없습니다.
컨테이너의 IP 주소를 찾으려면 추가 설치 가 필요하지 않습니다 .
docker inspect <container>
이것은 풍부한 정보를 제공합니다. grep
IP 주소 용입니다.
여기에 설명 된대로 boot2docker 포트 매핑 옵션 -L을 사용할 수 있습니다 .
따라서 귀하의 경우에는
boot2docker ssh -L 0.0.0.0:8080:localhost:8080
그리고
docker run -it -p 8080:8080 uwsgi_app:0.2
이렇게하면 boot2docker의 IP 주소를 사용할 필요가 없습니다. localhost 또는 자신의 IP 주소를 사용할 수 있습니다 (그리고 외부에서 도커 컨테이너에 액세스 할 수 있음).
[편집 : 원래 버전은 문제의 -P를 무시했습니다]
포트 (번호가 변경됨)를 '게시'하지 않고 컨테이너에 도달하려면 여기에 좋은 실행 방법이 있습니다 .
핵심은 다음과 같습니다.
sudo route -n add 172.17.0.0/16 172.16.0.11
Docker 컨테이너가있는 VirtualBox VM 내부의 사설 네트워크로 라우팅하는 방법을 Mac에 알려줍니다.
같은 문제가 있었고 제 경우에는 AWS EC2 인스턴스를 사용했습니다. 작동하지 않는 컨테이너 IP로 시도했습니다. 그런 다음 AWS 호스트의 실제 퍼블릭 IP를 IP로 사용했습니다.
Boot2docker is outdated, but you may still have this problem on Docker for Windows or Mac, even though the same container works on Linux. One symptom is that trying to access a page on the server inside the container gives the error "didn't send any data" as opposed to "could not connect."
If so, it may be because on Win/Mac the container host has its own IP, it's not localhost as it is on linux. Try running Django on IP 0.0.0.0, meaning accept connections from all IPs, like this:
python manage.py runserver 0.0.0.0:8000
Alternatively, if you need to make sure the server only responds to local requests (such as from your local proxy like nginx, apache, or gunicorn) you can use the host IP returned by hostname -i
.
And make sure you are using the -p
port forwarding option correctly in the docker run
command.
Assuming all is well, you should be able to access your server at http://localhost in a browser running on the host machine.
How to troubleshoot the issue on hosting application on local host browser
For this launch the container with below command, in my case it was:
[root@centoslab3 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b81d8a0e3e1 centos:baseweb "/bin/bash" 8 minutes ago Exited (0) 24 seconds ago webtest
[root@centoslab3 ~]# docker run --name=atul -v /root/dockertest:/var/www/html -i -t -p 5000:8000 centos:baseweb /bin/bash
In the httpd configuration:
[root@adb28b08c9ed /]# cd /etc/httpd/conf
[root@adb28b08c9ed conf]# ll
total 52
-rw-r--r--. 1 root root 34419 Sep 19 15:16 httpd.conf
edit the file with the port 8000 in listner and update the container ip and port under Servername.
Restart the httpd service and you are done.
Hope this helps
ReferenceURL : https://stackoverflow.com/questions/27191815/how-to-access-docker-containers-web-server-from-host
'programing tip' 카테고리의 다른 글
런타임에 DLL 경로 가져 오기 (0) | 2021.01.10 |
---|---|
django-rest-framework serializer로 외래 키 값 검색 (0) | 2021.01.10 |
정적 컨텍스트는 항상 C #에서 단일입니까? (0) | 2021.01.10 |
$ .each ()가 모든 항목을 반복하지 않는 이유는 무엇입니까? (0) | 2021.01.09 |
웹 페이지에서 위쪽 여백을 제거하려면 어떻게합니까? (0) | 2021.01.09 |