Docker 볼륨

1. 문제점

docker

  • Docker image는 읽기 전용이며 컨테이너 변경사항은 별도로 저장하여 컨테이너의 정보를 보존함.
  • 단점은 컨테이너가 삭제되면 컨테이너 계층에 저장된 정보는 삭제되며 복구가 불가능 함.
  • 이러한 문제를 방지하기 위해 컨테이너 데이터를 영속적으로 활용하는 방법을 다음 세가지로 제시함.
    • 호스트와 볼륨공유
    • 볼륨 컨테이너 활용
    • 도커가 관리하는 볼륨 생성

2. 호스트 볼륨 공유

  • 다음 스크립트를 통해 호스트 볼륨을 공유한 컨테이너를 실행
docker run -d --name wordpressdb_hostvolume \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7

Info Notice find: ‘/var/lib/mysql/’: Permission denied
chown: changing ownership of ‘/var/lib/mysql/’: Permission denied
호스트 볼륨 마운트의 경우 위와 같은 에러가 발생하는 경우가 있음. 원인은 SELinux때문으로 조치방법은 SELinux 조치하기를 참고함.

  • 실행 예제

3. 볼륨 컨테이너

  • -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유
docker run -it \
--name volumes_form_container \
--volumes-from wordpress_hostvolume \
ubuntu:14.04
  • 실행 예제

4. 도커 볼륨

  • 도커 자체에서 제공하는 볼륨 기능을 활용하여 데이터를 보존
  • 실습 예제

5. 도커 네트워크

  • 도커는 컨테이너 생성 시 내부에 IP(172.17.0.x)를 순차적으로 할당함.
  • 컨테이너 내부에서 ifconfig로 검색하면 eth0로 확인 가능
root@4d0a781a2b45:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
...
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
...
  • 컨테이너 내부의 eth0는 실제 외부와 통신을 할 수 없고 호스트와 연결점이 있어야 함.
  • 컨테이너 생성시 호스트는 veth…를 자동으로 생성하고 컨테이너 내부의 eth0와 자동으로 매핑 됨.
  • 최종적으로 veth…는 docker0 브리지와 바인딩되고 docker0는 호스트의 eth0과 바인딩되어 최종 외부와 통신을 하게 됨.

docker

6. 네트워크 드라이버

  • 도커는 기본적으로 docker0 브리지와 외부 통신이 가능하지만 네트워크 드라이버를 사용하여 외부 통신이 가능함.
  • 네트워크 드라이버
    • 브리지(bridge)
    • 호스트(host)
    • 논(none)
    • 컨테이너(container)
    • 오버레이(overlay)
    • third-party(weave, flannel, openswitch)

6.1 브리지

  • 사용자 정의 브리지
  • docker0와 같이 사용자가 정의한 브리지로 외부와 통신
  • 세부 설정
docker network create --driver=bridge \
--subnet=172.72.0.0./16 \
--ip-range=172.72.0.0./24 \
--gateway=172.72.0.1 \
my_custom_network

6.2 호스트

  • 호스트 네트워크 환경을 그대로 사용
  • 별도의 포트 포워딩 없이 바로 서비스
docker run -it --name network_host \
--net host \
ubuntu:14.04

6.3 None

  • 네트워크를 사용하지 않고 외부와 연결이 단절
docker run -it --name network_none \
--net none \
ubuntu:14.04

6.4 컨테이너

  • 다른 컨테이너의 네트워크 환경을 공유
#컨테이너 생성
docker run -it -d --name network_container_1 ubuntu:14.04

#생성된 컨테이너 네트워크 공유
docker run -it -d --name network_container_2 \
--net container:network_container_1 \
ubuntu:14.04

7. –net-alias

  • –net-alias 옵션을 통해 네트워크 상의 여러 컨테이너에 접근할 수 있음
  • 마치 L4 Switch에 DNS 이름을 호출하면 Round Robin으로 각 호스트를 호출하는 것과 같은효과를 얻음

카테고리:

업데이트:

댓글남기기