[Docker] 도커 컨테이너 다루기 : 볼륨
도커 컨테이너 다루기 : 볼륨
1. 도커 레이어 아키텍처
-
[1] 이미지 레이어 :
$ docker build -t app
-
dockerfile을 통해 빌드된 이미지의 내용은 컨테이너로 실행시 변경되지 않는다.
-
컨테이너로 처음 올라갈 경우 이미 5단계로 구축된 읽기 전용 레이어는 컨테이너 실행시에 변경 되지 않는다.
- 레이어 1 : 운영체제, OS, ubuntu
- 레이어 2 : 운영체제 깔리는 소프트웨어 패키지, apt package, WAS, DBMS 등
- 레이어 3 : 소스가 구성되는 라이브러리 단계, pip, maven, gradle, npm 등등
- 레이어 4 : 소스 코드 (java, python, 등등)
- 레이어 5 : 엔트리 포인트 단계, 빌드된 프로그램이 시작 및 실행되는 상태, JVM 환경변수 설정 등등..
※ 엔트리포인트 : 엔트리 포인트(entry point) 또는 진입점(進入點)은 제어가 운영 체제에서 컴퓨터 프로그램으로 이동하는 것을 말하며, 프로세서는 프로그램이나 코드에 진입해서 실행을 시작한다. 어떤 운영체제나 프로그래밍 언어에서, 초기 엔트리는 프로그램의 한 부분이 아니라 런타임 라이브러리의 한 부분이다. 즉 런타임 라이브러리가 프로그램을 초기화하고 프로그램에 진입한다. 다른 경우에는 프로그램이 진입 직후에 바로 런타임 라이브러리를 호출하고, 이것이 반환된 후에 실제 실행을 시작한다. 이것은 로드 타임에서 런타임으로의 전환이다.
-
-
[2] 컨테이너 레이어 :
$ docker run app
-
읽기 및 쓰기 권한이 임시적으로 존재 한다.
-
이미지를 실행하면 컨테이너가 된다. 컨테이너 기동 상태에서 내부 내용의 변경이 가능하다.
-
컨테이너를 지우는 경우(docker rm) 해당 데이터도 같이 삭재 된다.
-
2. 호스트 볼륨
-
호스트의 디렉토리를 컨테이너의 특정 경로에 마운트한다.
-
docker를 실행 시키는 서버의 호스트를 말한다.
-
실제 도커가 설치되고 컨테이너가 실행되는 물리적 서버의 호스트
-
host-volume.sh 파일 예제
#!/usr/bin/env sh docker run \ -d \ # 현재 경로의 하위 폴더 html에 | 컨테이너의 /usr/share/nginx/html 경로의 내용이 마운트됨 # 즉 컨테이너의 내용이 변경 되면 하위 $(pwd)/html 내용이 변경되어 쌓이게 된다. -v $(pwd)/html:/usr/share/nginx/html \ -p 80:80 \ nginx
- docker for windows : sh -> ps1 변경 시
docker run ` # 줄바꿈은 \ -> `(백틱) -d ` # 디렉토리 경로를 윈도우와 리눅스의 구분확인! -v $pwd\html:/usr/share/nginx/html ` -p 80:80 ` nginx
- ※ VIM 가장 기초적인 명령어
1. 나가기 및 저장
- :q -> 나가기
- :wq -> 변경 내용 저장 후 나가기
- :q! -> 변경 내용 저장하지 않고 나가기
2. 입력 및 수정
- a -> 현재 커서 위치에서 한 칸 뒤로 이동한 뒤 입력 모드로 전환
- i -> 현재 커서 위치에서 입력모드로 전환
- o -> 현재 행 아래에서 새로운 행 하나 만들고 입력모드로 전환
- R -> 수정 모드로 작동. 모든 글자가 덧씌워짐
3. 커서 이동
- normal mode에서 화살표 키 대신 h, j, k, l을 사용해 커서를 이동할 수 있다.
- 순서대로 좌, 하, 상, 우를 뜻한다.
- insert mode에서는 화살표로 커서가 이동 가능 하다.
3. 볼륨 컨테이너
- 특정 컨테이너의 볼륨 마운트를 공유
- 어플리케이션의 데이터만 관리하는 컨테이너
- Data-only Container : 공유되는 데이터만 관리한다.
#!/usr/bin/env sh
# web-volume 이라는 볼륨 컨테이너 생성
docker run \
-d \
-it \
-v $(pwd)/html:/usr/share/nginx/html \
--name web-volume \
ubuntu:focal
docker run \
-d \
--name fastcampus-nginx \
# web-volume 컨테이너의 볼륨을 공유 한다.
--volumes-from web-volume \
-p 80:80 \
nginx
docker run \
-d \
--name fastcampus-nginx2 \
# web-volume 컨테이너의 볼륨을 공유 한다.
--volumes-from web-volume \
-p 8080:80 \
nginx
- docker for windows : sh -> ps1 변경 시
docker run `
-d `
-it `
## 이렇게 되면 아까 호스트 컨테이너에 생성된 html 폴더의 내용도 같이
## 가져가게 되면서 컨테이너를 생성한다. [중요!]
## 호스트의 디렉토리에 파일의 내용물을 수정되면
## 해당 공간은 모든 컨테이너에 공유 된다.
## (컨테이너 종료나 제거 상관없음)
-v $pwd\html:/usr/share/nginx/html `
--name web-volume `
ubuntu:focal
docker run `
-d `
--name fastcampus-nginx `
--volumes-from web-volume `
-p 80:80 `
nginx
container_volume
docker run `
-d `
--name fastcampus-nginx2 `
--volumes-from web-volume `
-p 8080:80 `
nginx
4. 도커 볼륨
- docker에서 제공되는 volume기능
- 위의 볼륨 기능 같은 경우 호스트의 특정 경로를 설정해 데이터를 쌓아 주지만
- 도커 볼륨의 경우 docker가 관리하는 특정 경로에 사용자가 생성한 volume 명으로 데이터가 기록된다.
- linux docker(default) 의 경우 volume 데이터를 관리하는 경로
- /var/lib/docker/volumes/${volume-name}/_data
- docker for windows의 경우 volume데이터를 관리하는 경로 (20.10. 버전 이후 부터)
- \wsl$\docker-desktop-data\data\docker\volumes${volume-name}_data
- 파일 탐색기에서는 조회가 안됨 주의.
- 파일 탐색기에서 해당파일 조회하려면 콘솔창을 띄우고 explorer.exe . 실행
- docker-volume.ps1
#!/usr/bin/env sh
docker volume create --name db
docker volume ls
docker run `
-d `
--name fastcampus-mysql `
-e MYSQL_DATABASE=fastcampus ` # database명,계정명
-e MYSQL_ROOT_PASSWORD=fastcampus ` # database계정 비밀번호
-v db:/var/lib/mysql `
-p 3306:3306 `
mysql:5.7
- docker volume inspect db
[
{
"CreatedAt": "2022-11-14T02:35:50Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/db/_data",
//실질적으로 해당 경로에 적제 : \\wsl$\docker-desktop-data\data\docker\volumes\${volume-name}\_data
"Name": "db",
"Options": {},
"Scope": "local"
}
]
5. 읽기 전용 볼륨 연결
- 볼륨 연결 설정에 :ro (read - only 설정) 옵션을 통해 읽기 전용 마운트 옵션 설정 가능
#!/usr/bin/env sh
docker run `
-d `
-v $pwd\html:/usr/share/nginx/html:ro `
# :ro 옵션 적용 - 해당 디렉토리에 내용물은 docker 명령어 또는 컨테이너에 직적 컨트롤하여 수정이 불가능 함, 호스트에 지정된 경로에 파일을 변경해야 함.
-p 80:80 `
--name ro-nginx `
nginx
docker exec ro-nginx touch /usr/share/nginx/html/hello
Comments