현재 Docker Desktop에서는 --network host
모드로 동작하지 않습니다.
이것이 의미하는바는 host(local)와 docker container와 네트워크를 공유하지 않기 때문에 로컬의 다른 서비스에게 포워딩을 해줄 수가 없습니다.
version: '3.8'
services:
nginx:
image: nginx:stable
container_name: nginx
restart: always
network_mode: "host" # host mode
environment:
TZ: Asia/Seoul
volumes:
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./conf/ssl:/etc/nginx/ssl
- ./conf/conf.d:/etc/nginx/conf.d
- ./conf/vhosts:/etc/nginx/vhosts
- ./logs:/var/log/nginx
- ./html:/etc/nginx/html
실제로 위와같이 host 모드로 네트워크를 구성하게된다면 container 내부에 아무 요청이 오지 않습니다..
80 or 443
--X--> nginx(docker)
Linux는 예외입니다. linux는 host모드가 정상적으로 동작이되며 macOS, Windows에서만 동작하지 않습니다.
( https://github.com/docker/roadmap/issues/238 )
version: '3.8'
services:
nginx:
image: nginx:stable
container_name: nginx
restart: always
# network_mode: "host" # 해당부분 주석처리
environment:
TZ: Asia/Seoul
volumes:
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./conf/ssl:/etc/nginx/ssl
- ./conf/conf.d:/etc/nginx/conf.d
- ./conf/vhosts:/etc/nginx/vhosts
- ./logs:/var/log/nginx
- ./html:/etc/nginx/html
ports: # port를 연동
- 80:80
- 443:443
이렇게 80:80
, 443:443
연결을 해놓고 nginx에 access log 를 보면서 실제 요청이 들어오고 있는지 확인을 해줍니다.
하지만 이렇게 해도 host와의 통신을 할 수 없습니다.
80 or 443
--> nginx(docker)
--X--> host service(:8080)
location / {
# 127.0.0.1 -> host.docker.internal로 변경
proxy_pass http://host.docker.internal:8080;
}
container 내부에서 host와의 통신을 host.docker.internal
로 하고 있는데 이것을 이용하여
127.0.0.1
대신 해당 도메인으로 변경해놓습니다.
이렇게 설정하면 로컬에서 nginx를 이용한 통신이 가능해집니다.
다만 설정하는게 매우매우 귀찮기 때문에 어서 빨리 network에 host 모드가 동작하길 기원해봅니다...
다들 설정하다가 빡쳐서 이 블로그를 보게되셨다면 아래 docker roadmap에 한표를 행사해주세요 ㅎㅎ
( https://github.com/docker/roadmap/issues/238 )
글 재미있게 봤습니다.