3 minute read

도커 컨테이너 다루기 : 볼륨

1. 도커 레이어 아키텍처

도커 볼륨 01

  • [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. 볼륨 컨테이너

도커 볼륨 02

  • 특정 컨테이너의 볼륨 마운트를 공유
  • 어플리케이션의 데이터만 관리하는 컨테이너
  • 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

Categories:

Updated:

Comments