59/120

김건호·2022년 5월 9일
1

Docker 볼륨

방식

  • Bind: 볼륨은 도커 데몬이 관리하지 않음
  • Volume: 볼륨은 도커 데몬이 관리함

이미지의 Config.Volumes 선언되어 있으면, 자동으로 Docker 볼륨이 생성되고 마운트된다.
-> 수동으로도 가능

docker volume

볼륨 확인

docker volume ls

사용하지 않는 볼륨 제거

docker volume prune

사용 기준 컨테이너가 마운트 하고 있나

수동볼륨 마운트

create로 볼륨을 미리 만들 수 있음
-d 로 로컬드라이버 로컬에 있는 디렉토리를 사용

docker info 로 정보를 보면 플러그인에 로그 관련이 있고 볼륨 관련 플러그인도 있음
docker volume create test-vol
vagrant@docker  ~  docker volume ls
DRIVER    VOLUME NAME
local     test-vol

 vagrant@docker  ~  docker inspect test-vol
[
    {
        "CreatedAt": "2022-05-09T02:28:11Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
        "Name": "test-vol",
        "Options": {},
        "Scope": "local"
    }
]

빈볼륨이라 내용이 없음

vagrant@docker  ~  sudo ls /var/lib/docker/volumes/test-vol/_data
docker run -itd -v 볼륨이름:컨테이너 위치 # 디렉토리 자동으로 만들어짐

config는 이미지에서 가져오는정보

 "Mounts": [
            {
                "Type": "volume",
                "Name": "test-vol",
                "Source": "/var/lib/docker/volumes/test-vol/_data",
                "Destination": "/test-vol",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],

mount 확인

 vagrant@docker  ~  docker exec -it 8b1 bash
root@8b1616d94ece:/# pwd
/
root@8b1616d94ece:/# ls
bin   dev  home  lib32  libx32  mnt  proc  run   srv  test-vol  usr
boot  etc  lib   lib64  media   opt  root  sbin  sys  tmp       var
root@8b1616d94ece:/test-vol# echo "hello volume" > hello.txt
root@8b1616d94ece:/test-vol# ls
hello.txt
root@8b1616d94ece:/test-vol# cat hello.txt
hello volume

 vagrant@docker  ~  sudo ls /var/lib/docker/volumes/test-vol/_data
hello.txt

vagrant@docker  ~  sudo cat /var/lib/docker/volumes/test-vol/_data/he
llo.txt
hello volume

컨테이너 지워도 볼륨 삭제되지 않음

 vagrant@docker  ~  docker run -itd -v test-vol:/test ubuntu
469d2f03902ff1188a3058790ae28617c09174c31e30019a15f7695f9a5cddaa
 vagrant@docker  ~  docker exec 469 ls /test
hello.txt

볼륨을 미리 만들어 놓지 않아도 없으면 알아서 생성됨
있으면 그대로 사용하게 되고

docker run -itd -v abc:/abc -v xyz:/xyz ubuntu
볼륨이 여러개 있을 수도 있음

볼륨 사용의 장점

  1. 스토리지 역할
    컨테이너 시간에 지나면서 변경되는걸 허락 하지 않음
    컨테이너 지우면 설치하고 텍스트 파일 수정한건 없어짐

결론적으로 컨테이너 라이프 사이클과의 별개의 스토리지를 구현해야함
별개의 라이프사이클로 관리하기 위해 볼륨을 만들어 저장
컨테이너를 지워도 볼륨은 별개다
2. 한 번 생성한 볼륨에는 정보가 저장되어 환경변수를 쓰지 않아도 됨

컨테이너를 지워도 볼륨은 살아있기 때문에 환경변수 부여해서 최초로 실행하고 다시 실행할때
환경변수 없이해도 잘 실행이 됨

mysql 작동시 root 패스워드 정보가 있는지 중요한데 그래서 환경변수가 필요했던거고 두번째 할때는 볼륨에 이미 데이터베이스가 잇어서 제공하고 루트 패스워드가 있으니까 패스워드를 별도로 설정할 필요가 없음

3번으로 새롭게 만들고 볼륨을 기존 볼륨으로 설정 근데 환경변수로 패스워드를 바꿈
새롭게 만들어짐 ->환경변수 한거는 로그인이 안됨 -> 볼륨 정보를 먼저 참조

3번도 2번도 동일한 볼륨을 연결하고 있는 경우 -> 하나의 볼륨을 서로다른 컨테이너가 마운트해서 쓰고 있다 -> VM은 NFS 해야햇는데 얘는 공유가능

가능한 문제점

NFS는 둘다 동시에 같은 파일에 쓰기가 가능하느냐는 안됨 ->NFS는 Lock 기능을 가지고 있다
컨테이너의 볼륨은 NFS가 아니기때문에 Lcok 기능이 없음 -> 동시 파일 쓰기 시도가 되는 경우가 있음 -> 어떤 결과를 만들어낼지 모름 -> 데이터가 깨질수도있고 문제가 발생할수도 있음 감안을 해야함

간단한 실습

vagrant@docker  ~  docker run -itd -v abc:/abc --name u1 ubuntu
d9a00cd3581195fd359f98e80537b8ee1047ca69607ef3c5b69000f4787b8568
 vagrant@docker  ~  docker run -itd -v abc:/abc:ro --name u2 ubuntu
36d97a3e06214ad54b61915c85cda801fd46a1eabf7cbe3f904031a36fb7be6c

콜론뒤에 ro 리드온니
기본적은로는 rw가들어감
u1 인스펙터 마운트 RW 트루
u2 는 RW false

 vagrant@docker  ~  docker exec -it u1 bash
root@d9a00cd35811:/# cd abc/
root@d9a00cd35811:/abc# touch a b c
root@d9a00cd35811:/abc# ls
a  b  c
root@d9a00cd35811:/abc# exot
bash: exot: command not found
root@d9a00cd35811:/abc# exit
exit
 ✘ vagrant@docker  ~  docker exec -it u2 bash
root@36d97a3e0621:/# cd abc/
root@36d97a3e0621:/abc# ls
a  b  c
root@36d97a3e0621:/abc# touch x y z
touch: cannot touch 'x': Read-only file system
touch: cannot touch 'y': Read-only file system
touch: cannot touch 'z': Read-only file system

-v 옵션뒤에 컨테이너의 마운트 포인트 앞에 보면 경로로 되어있음 -> 호스트의 경로 -> 바인드 방식

볼륨 방식 마운트

볼륨: 읽기-쓰기가 가능한 빈 저장소를 생성

빈 볼륨 생성

docker volume create <NAME>

볼륨 목록

docker volume ls

볼륨 삭제

docker volume rm <NAME>

사용하지 않는 볼륨 삭제

docker volume prune

사용하지 않는? 컨테이너에 마운트되지 않음

볼륨을 사용한 컨테이너

docker run -v <VOL-NAME>:<MOUNTPOINT>[:ro] <IMAGE>

지정한 볼륨 이름이 없으면 생성

docker run --name wp-db -d -e MYSQL_ROOT_PASSWORD=P@ssw0rd -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpadm -e MYSQL_PASSWORD=P@ssw0rd --restart always --cpus 0.5 --memory 1000m -v wp-db-vol:/var/lib/mysql mysql:5.7

바인드 방식 마운트

경로는 반드시 절대 경로
바인드 방식은 컨테이너에게 제공할 볼륨을 호스트의 특정 디렉토리를 지정하는 방식
호스트의 디렉토리를 컨테이너에게 제공: 미리 데이터를 채워서 제공이 가능

docker run -v <ABSOLUTE_PATH>:<MOUNTPOINT>[:ro] <IMAGE>

디렉토리 전체 마운트

docker run -d -v /home/vagrant/contents:/usr/local/apache2/htdocs httpd

파일 마운트

docker run -d -v /home/vagrant/contents/hello.html:/usr/local/apache2/htdocs/hello.html httpd

파일을 지정하면 절대경로에 파일 마운트도 가능,이 파일을 어떤파일로 마운트 할 건지
파일은 파일로만 마운팅

파일마운트랑 디렉토리 마운트의 차이

유닉스의 특성
마운트하면 기존의 파일이 없어짐 -> 새로운 디렉토리 마운트니까
파일 마운트하면 기존에 있는 파일을 두고 파일만 마운팅

설정파일들을 제공할때 많이씀
설정파일 호스트에 미리 준비
나머지들이 다 없어짐 원하면 디렉토리로 가능
대부분은 파일만 바꾸고 싶거나 다른 파일을 추가 파일 마운팅을 해야함
디렉토리 전체를 마운트하면 날라감

웹 자바스크립 코드에 왜 볼륨이 필요한가
워드프레스에 유료 무료 플러그인이 있음
테마와 플러그인이 설치 기본이미지 포함이 안되어있고 볼륨이 별도로 필요

사용 용도

  • 바인드: 설정파일, 기타 파일을 제공하기 위한 목적
  • 볼륨: 데이터를 저장하기 위한 빈 디렉토리 제공하기 위한 목적

Docker 네트워크

팁! 파일명으로 패키지 찾을 때

yum provides /usr/bin/ip

apt install apt-file
apt-file update
apt-file search /usr/bin/ip

네트워크 플러그인 종류

  • bridge: 기본 네트워크
  • host
  • null
  • ipvlan, macvlan, overlay

iptables

커널영역과 사용자 영역
커널의 netfilter 기능 커널의 핵심 방화벽 기능 nat 라우팅 기능.. 모든 네트워크 기능을 담당하는 도구
이 도구를 사용하기 위한 명령어가 iptables

iptables 하는게 어려움 -> 제어하기 쉽게 만든게 RH의 firewalld 도구를 써서 설정하면 넷필터에 설정이 됨
데비안은 UFW 도구 얘네는 데몬에 의해 작동
내부적으론 자동으로 iptables로 바껴서 세팅됨
모든건 iptables 로 확인이랑 설정이가능함

브릿지 네트워크

호스트 확인

인터페이스 확인

ip addr show
  • docker0: 브릿지
  • vethX: 가상 인터페이스

브릿지 확인 명령 설치

sudo apt install bridge-utils
brctl show

NAT 테이블 확인

sudo iptables -t nat -L -n
  • MASQUERADE: Source NAT

DNAT 라는 설정이 추가로 보임
데스티네이션 NAT 포트포워드 -p 옵션이 있을때 생김

컨테이너 확인

sudo apt update
sudo apt install iproute2
ip addr show
ip route

포트 포워딩이 설정된 컨테이너

sudo iptables -t nat -L -n
  • DNAT: Destination NAT

호스트 네트워크

docker network ls
--network 옵션이 있음 연결할 네트워크를 지정할 수 있음
지정하지 않으면 기본 브리지 네트워크에 연결이 됨

호스트의 네트워크를 공유해서 사용 -> 포트번호 없이 접속이 가능

docker run -d --network host httpd

docker inspect 했을 때
host 의 정보가 아무도 없음 호스트 타입의 네트워크라고만 하고 ID만 있음 -> 나머지 정보는 host랑 같으니까

httpd 컨테이너 실행하고 호스트 타입 또쓰면 실행 에러가 남
could not bind ~~
바인딩이라는 자체는 볼륨이랑 상관이 있는건 아닌데 이 포트랑 연결할 수없음 -> 미리 사용하고 있기 때문에

Null 네트워크

네트워크가 없는 컨테이너 생성

docker run -d --network none httpd

브릿지 네트워크 생성

docker network create --driver bridge --subnet 192.168.200.0/24 --gateway 192.168.200.1 wordpress-network
docker run --name wp-db -d \
-e MYSQL_ROOT_PASSWORD=P@ssw0rd \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpadm \
-e MYSQL_PASSWORD=P@ssw0rd \
--restart always --cpus 0.5 --memory 1000m \
-v wp-db-vol:/var/lib/mysql \
--network wordpress-network \
mysql:5.7
docker run --name wp-web -d \
--link wp-db:mysql \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=wpadm \
-e WORDPRESS_DB_PASSWORD=P@ssw0rd \
-e WORDPRESS_DB_NAME=wordpress \
--restart always --cpus 0.5 --memory 500m \
-p 80:80 -v wp-web-app:/var/www/html \
--network wordpress-network \
wordpress:5-apache
profile
Ken, 🔽🔽 거노밥 유튜브(house icon) 🔽🔽

0개의 댓글