혜잉이의 소소한 공간

[docker#4] 네트워크 관리 본문

Cloud/Dock & Kubernetes

[docker#4] 네트워크 관리

kimhyeing 2025. 2. 22. 11:19

 

 

📌 옵션 

 

 

 

 

# 바인드 마인드 방식 볼륨 구성, 서로 다른 페이지를 보여줌

docker container run -d --name web1 -v /www1:/usr/share/nginx/html -p 8081:80 nginx
docker container run -d --name web2 -v /www2:/usr/share/nginx/html -p 8082:80 nginx
docker container run -d --name web3 -v /www3:/usr/share/nginx/html -p 8083:80 nginx

 

 

echo "<h1>web1 test page</h1>" > /www1/index.html 
echo "<h1>web2 test page</h1>" > /www2/index.html 
echo "<h1>web3 test page</h1>" > /www3/index.html

- 접근하는 컨테이너가 각각 다름

 

 

- 컨테이너는 생성되었지만 현재 사용중인 포트여서 에러가 발생하는 것으로 보임.

 

 

ip add 명령어를 통해 보이는 정보중에 ens33은 리눅스 네트워크 정보

 

 

docker0 정보 확인

 

 

 

 컨테이너 호스트 네임 & 'hosts' 파일 & DNS 서버 설정 

docker container run -it --rm --name myweb \
--hostname webserver \
--add-host docker1:172.17.0.1 \
--dns 8.8.8.8 centos

 

- 기본 경로

 

 

즉, 이렇게 통신한다고 생각하면 됨.

 

 

 

 

 

 

컨테이너를 생성하면 기본적으로 전부 같은 네트워크

각각의 컨테이너는 도커 0번을 게이트웨이로 지정

 

 


 

 사용자 정의 네트워크 생성 및 연결

 

docker network ls
- 도커가 지원하고 있는 네트워크 타입

 

 

docker network create -d bridge testnet

 

docker container run -it --rm --name myweb3 --network=testnet centos

 

 

 

현재 완성된 네트워크 구성은 위와 같음.

 



자신의 게이트웨이(화살표 방향) 및 외부로의 통신은 다 정상적으로 이루어짐.

 


💻 Docker 는 SDN(Software Define Network)를 사용하여 컨테이너의 통신을 관리 

Docker 네트워크는 bridge, host, none 3 가지 유형 기본적으로 bridge 유형를 사용하여 컨테이너를 구성

 

docker container run --rm --network=bridge busybox ip address

* 비지박스는 용량이 작은 리눅스라고 생각하면 됨

--rm : 명령이 끝나면 자동으로 삭제되도록 설정

--network=bridge : 설정 안해도 상관은 없음 

 

 


 

 

1. 네트워크 타입 : host

docker container run –d --rm --name mynginx --network=host nginx

- 본체 정보를 그대로 가져와서 사용

 

docker container exec -it mynginx /bin/bash

 

- 데비안 이미지를 이용하여 컨테이너를 구동

 

- 패키지가 설치되어 있지 않아서 ip address 라는 명령어를 지원하지 않음

 

apt-get -y install iproute2

 

 

패키지 설치 후 ip address 명령어 정상적으로 사용 가능

 

컨테이너의 네트워크 장치와 호스트의 네트워크 장치가 동일함.

 

 


2. 네트워크 타입 : bridge 

 

docker network create -d bridge br0 

docker network create -d bridge --subnet 192.168.100.0/24 --gateway 192.168.100.254 br1 
docker container run -it --name testserver --network=br1 centos



docker network inspect br1
- 현재 네트워크를 사용하는 컨테이너가 생기면 보이게됨


docker container run -it --rm --name testserver --network=br1 centos ip adress


* 고정 IP 할당
docker container run -it --rm --name testserver --network=br1 --ip 192.168.100.101 centos ip adress


* 컨테이너 연결 해제
docker network disconnect br0 myweb
* 삭제
docker network rm br0

 

 

 

docker container run -itd --name alpine1 --network=bridge alpine ash
docker container run -itd --name alpine2 --network=bridge alpine ash

(가장 많이 사용하는 네트워크 타입)

- 기본 값이여서 굳이 타입을 지정하지 않아도 됨

- alpine 은 용량이 작은 리눅스임.

 

 

 

* 브리지 정보 확인

docker network inspect bridge

 

docker container attach alpine1 

- 알파1, 알파2 가 ash 이고 백그라운드로 동작중인데, alpine1 에 바로 연결함

 

ip address
- IP 확인
ip route
- 게이트웨이 확인 (도커1번에 도커 0번 장치에 연결되어 있음) - 172.17.0.1 

 

cat etc/resolv/conf
- dns 서버 확인

 

- IP 대신 Host 주소를 넣어서 사용

 

 

* 외부로 ping 테스트

*

 

 


3. 사용자 정의 bridge 네트워크 

 

docker network create -d bridge alpinenet

 

 

docker container run -itd --name alpine1 --network=alpinenet --privileged alpine ash
docker container run -itd --name alpine2 --network=alpinenet --privileged alpine ash
docker container run -itd --name alpine3 --privileged alpine ash

docker network connect alpinenet alpine3
docker container run -itd --name alpine4 --privileged alpine ash

privileged : 시스템과 관련된 작업을 할 수 있음

 

- alpine3 은 네트워크가 두개임 (브리지와 알파인넷)

 

 

⚠️  alpinenet Network 

 

 

⚠️  bridge Network 

 

 

즉, 서로 다른 네트워크끼리는 통신할 수 없음

통신하게 하려면 apline3 이 라우터처럼 동작해야함.

 


 

✅ apline 1 접속 테스트

 

apline1 -> 2
             -> 3 
같은 네트워크 통신 가능

* 호스트 파일에 호스트 정보가 없어도 통신 가능
- 자동 서비스 검색 기능
  사용자 정의 네트워크에 연결된 컨테이너들은 IP 주소로 통신할 수 있을 뿐만 아니라 이름으로도 가능
  
기본 브리지 모드에서는 해당 기능은 없음.
사용자가 만든 브리지 모드에서만 활성화


다른네트워크 통신 불가
apline1 -> 4

 

 


 

✅ apline 3 접속 테스트

 

- 기본 브리지 모드에서는 이름 서비스를 제공하지 않으므로 이름으로 통신 불가 (호스트 파일에 추가 필요)

 

 


 

 

 

✅ apline 1 라우팅 설정

docker container attach alpine1
apk update
apk add openrc --no-cache

route add -net 172.17.0.0 netmask 255.255.0.0 gw 172.18.0.4
(ctrl + pq 로 나와야함)

 

 

✅ apline 2 라우팅 설정

docker container attach alpine2
apk update
apk add openrc --no-cache

route add -net 172.17.0.0 netmask 255.255.0.0 gw 172.18.0.4
(ctrl + pq 로 나와야함) 

 

 

✅ apline 4 라우팅 설정

docker container attach alpine4
apk update
apk add openrc --no-cache

route add -net 172.18.0.0 netmask 255.255.0.0 gw 172.17.0.2
(ctrl + pq 로 나와야함)

 

 

 

 

a1 -> a4 Ping Test

 

- 서로 다른 네트워크를 사용하는 컨테이너끼리는 통신이 안되야하는게 맞지만, 

  라우터처럼 사용할 수 있는 중계기가 있다면 통신이 가능함

 


4. --link 옵션을 이용한 컨테이너 구성

docker container run -d --name mysql -v /dbdata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=wordpress \
-e MYSQL_PASSWORD=wordpress mysql:5.7

환경 변수 2개 설정

mysql 이미지 사용

 

docker container run -d --name wordpress \
--link mysql:mysql57 \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=wordpress \
-p 80:80 wordpress:5

워드프레스 이미지 구동

 

docker container exec -it wordpress /bin/bash

워드프레스 컨테이너에 bash 실행

 

apt-get update 
- 저장소 정보 업데이트 
apt-get -y install iproute2
- ping을 사용하기 위해 패키지 설치 

 

'Cloud > Dock & Kubernetes' 카테고리의 다른 글

[docker#6] 리소스 제한 및 모니터링  (0) 2025.02.28
[docker#5] portainer 이용  (0) 2025.02.28
[docker#3] 볼륨  (0) 2025.02.22
[docker#2] 컨테이너 관리  (0) 2025.02.22
[docker#1] 기본 명령어  (0) 2025.02.20