🌈 프로그래밍/Docker

Docker Volume과 Docker 네트워크의 종류

반응형

2.2.6 도커 볼륨

  • 컨테이너의 치명적인 단점?
    • 컨테이너를 삭제하면 컨테이너 계층에 저장돼있던 DB 정보도 함께 삭제
    • 도커의 컨테이너는 생성과 삭제가 매우 쉬움.

2.2.6.1 호스트 볼륨 공유

볼륨을 활용하는 첫 번째 방법

-v /home/wordpress_db:/var/lib/mysql # [호스트의 공유 디렉터리]:[컨테이너의 공유 디렉터리]
  • 호스트의 /home/wordpress_db 디렉터리와 컨테이너의 /var/lib/mysql 디렉터리를 공유한다는 의미
  • 즉, 컨테이너의 /var/lib/mysql 디렉터리는 호스트의 /home/wordpress_db 디렉터리와 동기화되는게 아니라, 완전히 동일한 디렉터리이다.
  • 디렉터리 단위 공유뿐만 아니라 단일 파일 단위 공유도 가능, 동시에 -v 옵션 사용 가능

2.2.6.2 볼륨 컨테이너

볼륨을 활용하는 두 번째 방법

2.2.6.3 도커 볼륨

볼륨을 활용하는 세 번째 방법

docker volume create --name myvloume
  • 도커 자체에서 제공하는 볼륨 기능을 활용하는 방법이다.

위에서 만들어진 볼륨을 사용하는 컨테이너를 생성하려면.. -v 옵션과는 살짝 다르다.

[볼륨의 이름]:[컨테이너의 공유 디렉터리]
docker run -i -t --name myvloume_1 \
-v myvolume:/root/ \
ubuntu:14.04
  • 방금 만든 myvolume 을 활용해서 새로운 컨테이너 myvloume_1 를 생성
  • 따라서 myvloume_1 컨테이너의 루트 디렉터리에 볼륨을 마운트 시킴.
  • 도커 볼륨도 여러 개의 컨테이너에 공유되어 활용될 수 있다.
  • 볼륨은 디렉터리 하나에 상응하는 단위로 도커 엔진에서 관리한다.

도커 볼륨 정보 확인하기

  • 도커 볼륨 정보는 docker inspect 명령을 통해 확인이 가능하다.
  • 볼륨 뿐만 아니라 inspect 할 단위 즉, 컨테이너, 이미지 등을 명시해주어 정보 출력 가능.

사용하지 않는 볼륨 한번에 지우기

  • docker volume prune 명령 활용

정리

도커 컨테이너 내부가 아닌 외부에 데이터를 적재하고 컨테이너는 외부의 데이터로 동작하도록 설계하는 것을 스테이트리스(stateless) 하다고 한다.

이러한 컨테이너 설계를 지향해야 한다.

반대로 컨테이너 자체에서 데이터를 보관 및 관리하는 스테이트풀(stateful) 한 설계는 지양해야 한다.

2.2.7 도커 네트워크

2.2.7.1 도커 네트워크 구조

  • 이전에 ifconfig 를 통해 eth0lo 의 두 인터페이스가 존재한다는 것을 확인.
  • 컨테이너 내부 IP를 순차적으로 할당
  • 재시작할 때마다 IP는 바뀐다.
  • 이 내부 IP는 도커가 설치된 호스트의 내부 망에서만 사용할 수 있으므로 이를 외부와 연결해야 한다.
  • 이 과정을 도커 엔진 이 가상 네트워크 인터페이스(veth )를 호스트에 자동으로 생성한다.
  • docker0 라는 브리지도 존재하는데 이 브리지가 각 veth 인터베이스와 바인딩돼 호스트의 eth0 인터페이스와 연결해주는 역할을 한다.

2.2.7.2 도커 네트워크 기능

도커 자체만으로 사용할 수 있는 네트워크 목록

❯ docker network ls                                                                                                  ─╯
NETWORK ID     NAME                   DRIVER    SCOPE
23b4f1406b09   bridge                 bridge    local
d10250f74018   host                   host      local
f9187093c97c   none                   null      local
  • 이미 브리지, 호스트, 논이 존재
  • 여기서 브리지 네트워크는 컨테이너를 생성할 때 자동으로 연결되는 docker0 브리지를 활용하도록 설계되어 있음.
❯ docker network inspect bridge                                                                                      ─╯
[
    {
        "Name": "bridge",
        "Id": "23b4f1406b0954ede6f87266a41adfd41d4e73d6da9aae1045b0ea2864a204c9",
        "Created": "2024-08-26T13:49:06.861301334Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16", # 172.17.0.x 순으로 컨테이너의 IP를 순차적으로 할당.
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "65535"
        },
        "Labels": {}
    }
]
  • 브리지 네트워크
    • docker0 브리지와 비슷하게 사용자 정의 브리지를 새로 만들어 이를 각 컨테이너에 연결하는 네트워크 구조
    • --net 옵션을 통해 컨테이너를 생성할 때 새로 만든 브리지를 사용할 수 있도록 할 수 있다.
    • 새로운 컨테이너를 사용자 정의 브리지를 통해 만들면 bridge 네트워크가 할당해주는 IP와는 다름.
      • 아예 새로운 IP 대역으로 컨테이너 IP를 할당함.
  • 호스트 네트워크
    • 컨테이너가 호스트의 네트워크 스택을 공유하도록 하는 네트워크 모드
    • 별도의 포트 포워딩이 필요하지 않음 ⇒ 실제 호스트에서 애플리케이션을 외부에 노출하는 것과 같다.
    • 네트워크 격리가 없기 때문에 네트워크 성능적으로 매우 우수하지만, 보안 측면에서는 안전하지 않음.
  • 컨테이너 네트워크
  • 논 네트워크
    • 아무런 네트워크를 쓰지 않는다!?
    • 외부와 연결을 단절
    • --net none 옵션
    • 언제 사용하는지?
      • 네트워크 통신이 필요하지 않는 작업을 컨테이너에서 하려고 할 때.
      • 단순 파일 처리 및 데이터 변환 같은 작업을 수행할 때 활용한다고 함.
      • 또는 사용자 정의 네트워크를 직접 설정하려고 할 때 격리된 논 네트워크 컨테이너를 생성한다고 함.
  • 브리지 네트워크와 —net-alias
    • 브리지 타입의 네트워크와 --net-alias 옵션을 함께 사용하면 특정 호스트 이름으로 컨테이너 여러 개에 접근이 가능하다.
    • 지정된 별칭을 통해 동일한 브리지 네트워크 내 다른 컨테이너들이 이 컨테이너에 접근할 수 있다.
    • 컨테이너를 재배포 하거나 IP 주소가 변경되어도 동일한 네트워크 별칭을 사용하여 접근할 수 있다.
  • MacVLAN 네트워크
  • 💡MAC (Media Access Control) 주소?
    V : virtual 가상
    LAN
    ⇒ 네트워크 상에서 장치를 식별하는 고유한 식별자 즉, 장치의 고유 ID 값이다.
    ⇒ 이 주소(ID)는 네트워크 인터페이스 카드나 무선 네트워크 어댑터의 물리적 네트워크 장치에 할당.
    ⇒ OSI 모델의 2계층 (데이터 링크 계층) 에서 사용되어진다.
    ⇒ 하드웨어 제조 시 할당되어지며 동일한 로컬 네트워크 내에서 사용되어짐.
    ⇒ 불변성을 띄며, 네트워크 인터페이스 카드에 의해 고정되어짐.
    ⇒ 16진수로 표현된 48비트(6바이트) 길이의 값이다.
    ex) 00:1A:2B:3C:4D:5E
    • 네트워크 상에서 장치들 간의 통신을 담당하는 요소
    • 물리적 네트워크에서 두 장치가 데이터를 주고 받기 위해서는 각 장치마다 MAC 주소가 필요.
    • IP 주소와 다른점?
    • 네트워크 상의 논리적 주소로 장치가 네트워크에 연결될 때 할당됨.
    • 인터넷을 포함한 네트워크 상의 모든 영역에서 사용
    • 네트워크 연결 상태 또는 구성에 따라서 변경될 수 있다.
  • MAC 역할?
  • 호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 환경을 컨테이너에게 동일하게 제공한다.
  • 각 컨테이너에 고유한 MAC 주소와 IP 주소를 할당하여 네트워크 스위치에서 물리적 장치처럼 보이게 한다.
  • MacVLAN 네트워크를 사용하는 컨테이너는 호스트와 통신이 불가함.
  • 이것만 알아두자
    • 여러 종류가 있으며 그 중에서 브리지 모드를 사용한다는 것.
    • 사용하기 위해서는 부모 네트워크 인터페이스를 지정할 필요가 있다는 것.
반응형