방식
이미지의 Config.Volumes
선언되어 있으면, 자동으로 Docker 볼륨이 생성되고 마운트된다.
-> 수동으로도 가능
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": ""
}
],
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
볼륨이 여러개 있을 수도 있음
결론적으로 컨테이너 라이프 사이클과의 별개의 스토리지를 구현해야함
별개의 라이프사이클로 관리하기 위해 볼륨을 만들어 저장
컨테이너를 지워도 볼륨은 별개다
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
파일을 지정하면 절대경로에 파일 마운트도 가능,이 파일을 어떤파일로 마운트 할 건지
파일은 파일로만 마운팅
유닉스의 특성
마운트하면 기존의 파일이 없어짐 -> 새로운 디렉토리 마운트니까
파일 마운트하면 기존에 있는 파일을 두고 파일만 마운팅
설정파일들을 제공할때 많이씀
설정파일 호스트에 미리 준비
나머지들이 다 없어짐 원하면 디렉토리로 가능
대부분은 파일만 바꾸고 싶거나 다른 파일을 추가 파일 마운팅을 해야함
디렉토리 전체를 마운트하면 날라감
웹 자바스크립 코드에 왜 볼륨이 필요한가
워드프레스에 유료 무료 플러그인이 있음
테마와 플러그인이 설치 기본이미지 포함이 안되어있고 볼륨이 별도로 필요
팁! 파일명으로 패키지 찾을 때
yum provides /usr/bin/ip
apt install apt-file
apt-file update
apt-file search /usr/bin/ip
네트워크 플러그인 종류
커널영역과 사용자 영역
커널의 netfilter 기능 커널의 핵심 방화벽 기능 nat 라우팅 기능.. 모든 네트워크 기능을 담당하는 도구
이 도구를 사용하기 위한 명령어가 iptables
iptables 하는게 어려움 -> 제어하기 쉽게 만든게 RH의 firewalld 도구를 써서 설정하면 넷필터에 설정이 됨
데비안은 UFW 도구 얘네는 데몬에 의해 작동
내부적으론 자동으로 iptables로 바껴서 세팅됨
모든건 iptables 로 확인이랑 설정이가능함
인터페이스 확인
ip addr show
브릿지 확인 명령 설치
sudo apt install bridge-utils
brctl show
NAT 테이블 확인
sudo iptables -t nat -L -n
DNAT 라는 설정이 추가로 보임
데스티네이션 NAT 포트포워드 -p 옵션이 있을때 생김
sudo apt update
sudo apt install iproute2
ip addr show
ip route
sudo iptables -t nat -L -n
docker network ls
--network 옵션이 있음 연결할 네트워크를 지정할 수 있음
지정하지 않으면 기본 브리지 네트워크에 연결이 됨
호스트의 네트워크를 공유해서 사용 -> 포트번호 없이 접속이 가능
docker run -d --network host httpd
docker inspect
했을 때
host 의 정보가 아무도 없음 호스트 타입의 네트워크라고만 하고 ID만 있음 -> 나머지 정보는 host랑 같으니까
httpd 컨테이너 실행하고 호스트 타입 또쓰면 실행 에러가 남
could not bind ~~
바인딩이라는 자체는 볼륨이랑 상관이 있는건 아닌데 이 포트랑 연결할 수없음 -> 미리 사용하고 있기 때문에
네트워크가 없는 컨테이너 생성
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