
현재 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 )
글 재미있게 봤습니다.