도커를 호스트 운영체제에 설치하게 되면 기본적으로 여러 네트워크 드라이버들이 설치되게 된다
컨테이너를 실행할 때 사용할 네트워크 드라이버를 지정할 수 있는데, 지정하지 않으면 기본값으로 도커 데몬에 의해 생성되는 docker0 브릿지 네트워크가 실행된다
eth0 은 호스트에서 사용중인 기본 네트워크이며, EC2 를 사용중인 경우 해당 VM 의 private ip 가 설정되어 있는 네트워크 장치이다
docker0 브릿지 네트워크가 도커 컨테이너의 네트워크와 호스트 운영체제의 네트워크를 이어주는 역할을 한다
컨테이너 포트 노출
-p 옵션은 publish 의 의미이며, 호스트의 IP:PORT 를 컨테이너 PORT 와 맵핑시키는 역할을 한다
root@mobius-pub:~/docker# docker run -d -p 80:80 nginx
e6bbd559c687ca196c68da0eec515afacf08c045348ab96186a06fe66265830c
root@mobius-pub:~/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6bbd559c687 nginx "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:80->80/tcp stupefied_jones
...
root@mobius-pub:~/docker#
-p 80:80 과 같이 옵션을 주게되면 0.0.0.0:80->80/tcp 에서 확인할 수 있듯, 호스트의 모든 ip 에 대해 호스트 80 포트를 컨테이너 80 포트와 맵핑된다
root@mobius-pub:~/docker# docker run -d -p 80 nginx
88b74d1b9d89af5a06fd9df7ad175e5aedf5c5e0bec94ed5de620ffa23fce178
root@mobius-pub:~/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88b74d1b9d89 nginx "/docker-entrypoint.…" 4 seconds ago Up 2 seconds 0.0.0.0:49158->80/tcp vibrant_faraday
-p 80 만 주게되어 모든 host ip 의 가용한 포트중 45158 이 할당되어 맵핑되었다
root@mobius-pub:~/docker# docker run -d -p 127.0.0.1:80:80 nginx
f40e42c3c646949b9f2ae8bce7b08efd7d0ff9ca7e9f327986250c1e39b25af4
root@mobius-pub:~/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f40e42c3c646 nginx "/docker-entrypoint.…" 16 seconds ago Up 15 seconds 127.0.0.1:80->80/tcp keen_kapitsa
-p 127.0.0.1:80:80 로 host ip 까지 지정해준 예시
Expose vs Publish
expose 는 docker-file 을 빌드할 때도 있는 옵션
expose 옵션은 문서화 용도 이다
root@mobius-pub:~/docker# docker run -d --expose 80 --name nginx-expose nginx
ee93bb97fd70f866606f9fa30f9bf9c887684e2487e9d1f3f0119219de6ce468
root@mobius-pub:~/docker# docker run -d -p 127.0.0.1:80:80 nginx
c7fc2c3346934550393f0a975a05b73ec2a649a4131860dea57810b86f27d97b
root@mobius-pub:~/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7fc2c334693 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 127.0.0.1:80->80/tcp thirsty_poitras
ee93bb97fd70 nginx "/docker-entrypoint.…" 20 seconds ago Up 19 seconds 80/tcp nginx-expose
앞서 publish 옵션으로 맵핑한 포트 결과와 expose 의 결과가 다르다
expose 로 실행한 컨테이너의 경우 -> 표시가 없고 80 만 나타나있다
expose 로 실행한 컨테이너의 경우 명시된 포트(80)에 curl 로 요청을 보내봐도 응답이 오지 않는다
단순 문서화 하는 용도이기 때문
도커 네트워크 드라이버
root@mobius-pub:~/docker# docker network ls
NETWORK ID NAME DRIVER SCOPE
2c584a0781ab bridge bridge local
d1cff4f61142 host host local
d55794a341b6 minikube bridge local
1ac6ceea130b none null local
docker network ls 명령어로 제공중인 네트워크 목록 확인 가능
도커의 네트워크 드라이버는 Native Drivers, Remote Drivers 로 나뉘며
Remote Drivers 에서 3rd party 플러그인으로 외부 제공되는 드라이버를 설치하여 사용할 수도 있음
네트워크 동작 방식으로 네트워크 드라이버를 분류하게 되면 Single Host 에서 동작할 때와 Multi Host 에서 동작할 때가 서로 다르다
단일 호스트(Single Host)에서 동작 : built-in Driver 인 bridge, host, none
멀티 호스트에서 동작 : overlay
여러 서버들이 존재할 때, 각 서버에 있는 컨테이너들을 연결시키는 가상 네트워크
보통 Container orchestration system 에서 많이 사용
none 네트워크
root@mobius-pub:~/docker/network# cat none.sh
#!/usr/bin/env sh
docker run -it --net none ubuntu:focal
none 네트워크로 설정하여 실행하고, apt update 와 같은 패키징 명령어를 쳐 보면 업데이트가 실패한다
none 의 경우 네트워크 기능이 필요없을 때 또는 커스텀 네트워크 드라이버를 사용해야할 때, 기본 네트워크 드라이버를 none 으로 설정하여 사용하게 된다
host 네트워크
root@mobius-pub:~/docker/network# cat host.sh
#!/usr/bin/env sh
docker run -d --network=host grafana/grafana
도커가 제공해주는 가상 네트워크를 사용하는것이 아니라 직접 host 네트워크에 붙어 사용하는 방식이다
그래서 host 네트워크를 사용하게 되면 포트바인딩을 하지 않고 사용하게 된다
root@mobius-pub:~/docker/network# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92ab6b1e422e grafana/grafana "/run.sh" 7 seconds ago Up 5 seconds eloquent_thompson
root@mobius-pub:~/docker/network#
포트가 표시 되지 않는다
다만, grafana 는 디폴트로 3000 포트를 사용하고 있어 호스트의 3000포트를 사용하게되는 개념이다
호스트 네트워크를 쓰고있어 별도로 inspect 상에서 확인하여도 IPAddress 가 할당되어있지 않음
bridge 네트워크
root@mobius-pub:~/docker/network# cat bridge.sh
#!/usr/bin/env sh
docker network create --driver=bridge fastcampus
docker run -d --network=fastcampus --net-alias=hello nginx
docker run -d --network=fastcampus --net-alias=grafana grafana/grafana
root@mobius-pub:~/docker/network#
도커 디폴트 네트워크인 docker0 을 사용하지 않고, 커스텀 네트워크를 만들어 사용하는 예시이다
nginx 와 grafana 를 사용할 때도 직접 만든 네트워크인 fastcampus 를 할당해주게 된다
--net-alias 옵션으로 bridge 네트워크에서의 alias 를 줘서 bridge 네트워크 안에서 hello 또는 grafana 이름으로 컨테이너 ip 를 조회할 수 있도록 내부 도메인에 저장을 해준다
root@mobius-pub:~/docker/network# ./bridge.sh
0fe382f76a51a6041ab04858fd9d135c4bcf020d3612a960f678351060b9e69f
b478b2c3cd9c4f87e37b0278e35724097812c51c5d9ff785083b6e3a04ba1a8d
73744a34120fa2539e17dd4b57c17e37cea3341d2f881d5e1667cd4b53cb5cc3
root@mobius-pub:~/docker/network# docker network ls
NETWORK ID NAME DRIVER SCOPE
2c584a0781ab bridge bridge local
0fe382f76a51 fastcampus bridge local
d1cff4f61142 host host local
d55794a341b6 minikube bridge local
1ac6ceea130b none null local
root@mobius-pub:~/docker/network#
fastcampus 라는 이름의 네트워크가 생성이 되었음
root@mobius-pub:~/docker/network# docker exec -it 737 bash
bash-5.1$ cd /tmp
bash-5.1$ wget hello
Connecting to hello (172.18.0.2:80)
saving to 'index.html'
index.html 100% |******************************************************************************| 615 0:00:00 ETA
'index.html' saved
bash-5.1$ cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
bash-5.1$
grafana 에 bash 쉘을 실행시켜 접속해보면 앞서 nginx 컨테이너를 띄울때 부여한 hello 라는 alias 로 index.html 을 받아올 수 있다
06. 도커 컨테이너 다루기 - 네트워크
도커 네트워크 구조
컨테이너 포트 노출
-p
옵션은 publish 의 의미이며, 호스트의 IP:PORT 를 컨테이너 PORT 와 맵핑시키는 역할을 한다-p 80:80
과 같이 옵션을 주게되면0.0.0.0:80->80/tcp
에서 확인할 수 있듯, 호스트의 모든 ip 에 대해 호스트 80 포트를 컨테이너 80 포트와 맵핑된다-p 80
만 주게되어 모든 host ip 의 가용한 포트중 45158 이 할당되어 맵핑되었다-p 127.0.0.1:80:80
로 host ip 까지 지정해준 예시Expose vs Publish
->
표시가 없고 80 만 나타나있다도커 네트워크 드라이버
docker network ls
명령어로 제공중인 네트워크 목록 확인 가능none 네트워크
host 네트워크
bridge 네트워크
docker0
을 사용하지 않고, 커스텀 네트워크를 만들어 사용하는 예시이다--net-alias
옵션으로 bridge 네트워크에서의 alias 를 줘서 bridge 네트워크 안에서 hello 또는 grafana 이름으로 컨테이너 ip 를 조회할 수 있도록 내부 도메인에 저장을 해준다veth
네트워크가 생성된 것을 확인할 수 있다(virtual eth)