Docker 설치 후 기본적으로 3 개의 네트워크가 있습니다.
docker network ls
NETWORK ID NAME DRIVER SCOPE
f3be8b1ef7ce bridge bridge local
fbff927877c1 host host local
023bb5940080 none null local
나는 이것을 단순하게 유지하려고 노력하고있다. 따라서 기본적으로 컨테이너를 시작하면 브리지 (docker0) 네트워크 내부에 생성됩니다.
$ docker run -d jenkins
1498e581cdba jenkins "/bin/tini -- /usr..." 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp friendly_bell
jenkins의 dockerfile에서 포트 8080
와 50000
노출됩니다. 해당 포트는 브리지 네트워크의 컨테이너에 대해 열립니다. 따라서 해당 브리지 네트워크 내부의 모든 것이 포트 8080
및 50000
. 브리지 네트워크에있는 모든 것은 비공개 범위에 "Subnet": "172.17.0.0/16",
있습니다. 외부에서 액세스하려면으로 포트를 매핑해야합니다 -p 8080:8080
. 그러면 컨테이너의 포트가 실제 서버 (호스트 네트워크)의 포트에 매핑됩니다. 따라서 서버에 액세스 8080
하면 포트의 브리지 네트워크로 라우팅됩니다 8080
.
이제 호스트 네트워크도 있습니다. 컨테이너 네트워킹을 컨테이너화하지 않습니다. 따라서 호스트 네트워크에서 컨테이너를 시작하면 다음과 같이 표시됩니다 (첫 번째).
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1efd834949b2 jenkins "/bin/tini -- /usr..." 6 minutes ago Up 6 minutes eloquent_panini
1498e581cdba jenkins "/bin/tini -- /usr..." 10 minutes ago Up 10 minutes 8080/tcp, 50000/tcp friendly_bell
차이점은 포트에 있습니다. 이제 컨테이너가 호스트 네트워크 내부에 있습니다. 따라서 8080
호스트에서 포트를 열면 컨테이너에 즉시 액세스 할 수 있습니다.
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
8080
방화벽에서 포트 를 열었고 이제 포트 에서 서버에 8080
액세스 할 때 젠킨스에 액세스하고 있습니다. 나는 이 블로그 가 그것을 더 잘 이해 하는데도 유용 하다고 생각한다 .
--net=host
Dockerfile 내부에 옵션을 추가 할 수 있습니까?