[도커] Part1: Getting started docs.docker.com/get-started/ [상]

DongGu·2021년 3월 18일
0
post-thumbnail

Part 4: Share the application

이미지를 구축했으니 이제 공유할 예정이다! 도커 이미지를 공유하려면 docker registry를 사용해야 한다. 기본 레지스트리는 Docker Hub이며, 우리가 사용한 모든 이미지에서 저장되는 곳이다.

  • 참고: Docker ID
    도커 ID를 사용하면 컨테이너 이미지를 위한 세계 최대의 도서관이자 커뮤니티인 도커 허브에 접속할 수 있다. 도커 ID가 없는 경우 무료로 도커 ID를 만들자.

Create a repo

이미지를 저장하려면 우선 도커 허브에 저장소(repository)를 만들어야 한다.

  1. Docker Hub를 사용하여 이미지를 등록하고 공유하자.
  2. 도커 허브에 로그인하자.
  3. 리포지토리 생성 단추를 클릭하라.
  4. repo 이름의 경우 getting-started. 공개설정이 public으로 되어 있는지 확인한다.
  • 참고: 개인 저장소 (private repo)
    도커가 특정 사용자 또는 팀으로 콘텐츠를 제한할 수 있는 개인 저장소를 제공하고 있다. (아마 유료)
  1. Create 버튼을 클릭하십시오!

페이지 오른쪽을 보면 'Doccker commands'라는 섹션이 나온다. 이것은 당신이 이 repo로 푸시하기 위해 실행해야 할 명령의 사례를 제공한다

Push the image

  1. 명령줄에서 Docker Hub에 표시되는 푸시 명령을 실행해 보자. "도커"가 아니라 네임스페이스를 사용한다는 점에 유의하자.
    $ docker push docker/getting-started The push refers to repository [docker.io/docker/getting-startd] An iamge does not exist locally with the tag: docker/getting-started

왜 실패했을까? 푸시 명령은 docker/getting-started라는 이미지를 찾고 있었지만 찾지 못했다. 만약 docekr image ls를 실행해보면, getting-startd이미지가 없다는 것을 확인할 수 있다.

이를 바로잡기 위해서는 우리가 구축한 기존 이미지에 '태그'를 붙여 다른 이름을 붙여야 한다.

  1. 명령을 사용하여 도커 허브에 로그인하자
    docker login -u YOUR-USER-NAME.

  2. docker tag 명령어를 사용해라. getting-started 이미지에 새로운 이름을 주기위해. 확실히 해라 YOUR-USER-NAME 도커 아이디와 함께.
    docker tag getting-started YOUR-USER-NAME/getting-started

  3. 푸시 명령을 다시 시도해보자. Docker Hub에서 값을 복사하면, tagname portion을 드랍할 수 있다. 이미지 이름에 태그를 달지 않았기 때문이다. 태그를 지정하지 않으면 Docker는 latest 태그를 사용할 것이다.
    docker push YOUR-USER-NAME/getting-started

Run the image on a new instance

이제 우리의 이미지가 구축되어 레지스트리에 등록되었으니, 이 컨테이너 이미지를 본 적이 없는 새로운 인스턴스로 앱을 실행해 보자! 이를 위해 우리는 도커와 함께 Play를 사용할 것이다.

  1. 도커로 재생하려면 브라우저를 여십시오.

  2. 로그인을 누른 다음 드롭다운 목록에서 도커를 선택하십시오.

  3. 도커 허브 계정에 연결하십시오.

  4. 로그인한 후 왼쪽 막대에서 ADD NEW Instance(새 인스턴스 추가) 옵션을 클릭하십시오. 보이지 않으면 브라우저를 조금 더 넓게 만드십시오. 몇 초 후 브라우저에서 터미널 창이 열린다.

  5. 터미널에서 새로 푸시된 앱을 시작하십시오.
    docker run -dp 3000:3000 YOUR-USER-NAME/getting-tarted

당신은 이미지가 아래로 당겨지는 것을 보고시작해야 한다!

  1. 3000badge가 나타나면 해당 badge를 클릭하십시오. 그러면 수정된 앱이 나타날 것이다! 3000 badge가 표시되지 않으면 "Open Port" 버튼을 클릭하고 3000을 입력하면 된다.

Part 5: Persist the DB

컨테이너를 출시할 때마다 우리의 할 일 목록이 깨끗이 지워지고 있어. 왜 이럴까? 컨테이너가 어떻게 작동하는지 자세히 살펴보자.

The container's filesystem

컨테이너가 실행될 때, 그것은 그것의 파일 시스템을 위해 이미지의 다양한 레이어를 사용한다. 또한 각 컨테이너에는 파일을 생성/업데이트/제거할 수 있는 고유한 "스크래치 공간"이 있다. 같은 이미지를 사용한다고 해도 다른 컨테이너에는 어떤 변화도 보이지 않을 것이다.

1) See this in practice

이것을 실제로 보기 위해, 우리는 두 개의 컨테이너를 시작하고 각각의 컨테이너에 파일을 만들 것이다. 한 컨테이너에서 생성된 파일은 다른 컨테이너에서 사용할 수 없다는 것을 알게 될 것이다.

  1. ubuntu 컨테이너(/data.txt라고 이름지어진)를 시작해라. 1에서 10000 사이의 임의의 숫자로.

docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"

커맨드가 궁금할 경우를 대비해서 우리가 bash shell을 시작하고, 두 가지 명령(&&을 가지고 있는 이유)을 호출했다. 첫 번째 부분은 하나의 무작위 숫자를 선택하여 에 /data.txt에 기록한다. 두 번째 명령어는 단순히 컨테이너가 계속 실행되도록 파일을 감시하는 것이다.

  1. 컨테이너에 exec함으로써 아웃풋을 검증할 수 있다.
    이렇게 하려면 대시보드를 열고 ubuntu 이미지를 실행 중인 컨테이너의 첫 번째 작업을 클릭하십시오.

우분투 컨테이너에서 shell을 작동하고 있는 터미널을 볼 것이다. 다음의 커맨드라인을 작동시키자. /data.txt 파일의 내용물을 보기 위해. 나중에 이 터미널을 다시 닫자.

cat /data.txt

cli를 선호한다면 docker exec를 똑같이 명령하면 된다. 컨테이너의 ID(use docker ps to get it)가 필요하고, 다음 명령어로 내용을 얻을 것이다.
docker exec <container-id> cat /data.txt
난수를 볼 수 있을 것이다.

  1. 같은 이미지를 가진 다른 우분투 컨테이너를 실행해보자. 우리가 같은 파일을 가지고 있지 않다는 것을 볼 수 있다.

docker run -it ubuntu ls /
data.txt 파일이 없다. 첫 번째 컨테이너에 대해서만 스크래치 공간에 쓰여있었기 때문이다.

  1. 다음 명령을 사용하여 첫 번째 컨테이너를 제거하자. docker rm -f

Containers volumes

이전 실험에서는 각 컨테이너가 시작될 때마다 이미지 정의에서 시작하는 것을 보았다. 컨테이너가 파일을 생성, 업데이트 및 삭제할 수 있지만 컨테이너가 제거되고 모든 변경 사항이 해당 컨테이너로 격리될 때 변경 내용이 손실된다. 볼륨이 있으면 이 모든 것을 바꿀 수 있다.

볼륨은 컨테이너의 특정 파일 시스템 경로를 호스트 시스템에 다시 연결하는 기능을 제공한다. 컨테이너의 디렉토리가 마운트된 경우, 해당 디렉토리의 변경사항이 호스트 시스템에도 나타난다. 컨테이너 재시작을 통해 동일한 디렉터리를 마운트하면 동일한 파일이 표시될 겁니다.

책에는 크게 두 가지 유형이 있다. 우리는 결국 두 가지 모두를 사용할 것이지만, 우리는 명명된 볼륨부터 시작할 것이다.

Persist the todo data

기본적으로 todo 앱은 SQLite 데이터베이스(/etc/todos/todo.db)에 데이터를 저장한다. SQLite에 익숙하지 않아도 괜찮다. 그것은 단순히 모든 데이터가 하나의 파일에 저장되는 관계형 데이터베이스일 뿐이다. 이것이 대규모 애플리케이션에는 최선이 아니지만, 소규모 데모버전에는 상관 없다. 나중에 이것을 다른 데이터베이스 엔진으로 바꾸는 것에 대해 이야기하겠다.

데이터베이스가 단일 파일인 상태에서 호스트에서 해당 파일을 유지한 후 다음 컨테이너에 사용할 수 있도록 할 수 있다면 마지막 컨테이너가 중단된 부분을 픽업할 수 있을 것이다. 볼륨을 만들어 데이터가 저장된 디렉토리에 첨부(흔히 "마운트"라고 함)함으로써, 우리는 데이터를 유지할 수 있다. 우리의 컨테이너가 에 쓰듯이. todo.db 파일, 볼륨의 호스트에 유지된다.

언급했듯이 우리는 named volumne을 사용할 것이다. named volumne을 단순히 데이터 버킷이라고 생각해 보십시오. Docker는 디스크의 실제 위치를 유지하고 볼륨 이름만 기억하면 된다. 볼륨을 사용할 때마다 도커는 정확한 데이터가 제공되었는지 확인할 것이다.

  1. 볼륨 만들기 (docker volume create를 사용함으로써)
    docker volumne create todo-db

  2. todo app 컨테이너를 중지시킨다. (또는 docker rm -f <id>), 영구적인 볼륨을 사용하지 않으면서 실행 중이기 때문이다.

  3. todo app 컨테이너를 사용해라. 그리고 -v 플래그를 볼륨마운트를 구체화하기 위해 사용해라. 우리는 named volume을 사용할 것이다. 그리고 /etc/todos에 마운트할 것이다. 이는 그 저장소의 모든 파일을 캡쳐할 수 있다.
    docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started

  4. 컨테이너가 시작되면 앱을 열고 몇 가지 항목을 작업관리 목록에 추가하십시오.

  5. todo 앱의 컨테이너를 제거하십시오. 대시보드 사용하거나 docker ps 신분증을 따고 나서 docker rm -f <id>로 컨테이너를 제거해라.

  6. 위에서 동일한 명령을 사용하여 새 컨테이너를 시작하십시오.

  7. 앱을 열어라. 당신은 당신의 아이템들이 여전히 당신의 리스트에 남아 있는 것을 볼 수 있다.

  8. 목록 체크아웃이 끝나면 용기를 꺼내십시오.

  • 참고
    명명된 볼륨과 바인딩 마운트(잠시 후에 설명)가 기본 Docker 엔진 설치에서 지원되는 두 가지 볼륨 유형이지만 NFS, SFTP, NetApp 등을 지원하는 데 사용할 수 있는 볼륨 드라이버 플러그인이 많다! 이는 특히 Girm, Kubernetes 등과 함께 클러스터된 환경에서 여러 호스트에서 컨테이너를 실행하기 시작할 때 중요하다.

Dive into the volume

많은 사람들이 "내가 명명된 볼륨을 사용할 때 실제로 내 데이터를 저장하는 곳이 어디냐?"고 묻는 경우가 많다. 알고 싶다면, 당신은 그것을 사용할 수 있다. docker volume inspect 명령어이다.

docker volume inspect todo-db 
[     
  {         
    "CreatedAt": "2019-09-26T02:18:36Z",
    "Driver": "local",         
    "Labels": {},         
    "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
    "Name": "todo-db",         
    "Options": {},         
    "Scope": "local"     
  } ] 

Mountpoint는 데이터가 저장되는 실제 디스크의 위치이다. 대부분의 시스템에서는 호스트에서 이 디렉토리에 액세스하려면 루트 액세스 권한이 있어야 한다는 점에 유의하십시오.

Docker Desktop에서 볼륨 데이터에 직접 액세스

Docker Desktop에서 실행되는 동안 Docker 명령은 실제로 시스템의 작은 VM 내에서 실행되며, Mountpoint 디렉토리의 실제 컨텐츠를 보려면 먼저 VM 내부로 들어가십시오.

profile
코딩하는 신방과생

0개의 댓글