도커 레이어 아키텍쳐
docker build -t app .명령어로 도커 이미지를 빌드하게 되는데, 이 때 Dockerfile이라는 명세서를 기반으로 빌드하게 됩니다.
만약 컨테이너가 우분투 이미지를 베이스로 사용한다고 하면, 첫번쨰는 base Ubuntu Layer라는 레이어가 쌓일 것입니다. 그리고 두번째로 우분투 운영체제에서 사용되어 지는 package를 설치하는게 두번쨰 레이어로 올라갈 겁니다. ( apt-get )
그 외에도 파이썬과 관련된 이미지여서 이와 관련된 레이어가 3번째로 올라갈 수 있으며, 그 이후에 소스코드를 복사한다고 하면 그 내용이 레이어4에 저장이 되고, 그리고 컨테이너의 엔트리포인트를 변경한다고 하면 이게 레이어5에 올라갈 수 있게 됩니다.
만약 레이어 4인 Source Code에 변경이 일어난다고 하면, Layer1 ~ 3은 변경되지 않습니다. 그리고 Layer1~3까지 새로운 브랜치가 파지면서 새로운 코드가 업로드 되는 new Layer 4 ~ 5가 생성됩니다.
이런 식으로 이미지를 빌드한다고 하면 새로운 버전의 이미지가 생성된다하더라도 정장공간을 효율적으로 사용할 수 있게 됩니다.
Image Layer외에도 Container Layer가 있는데, 이는 Image Layer와는 다르게 Read Only가 아니라 Write도 가능합니다. 그리고 컨테이너가 종료시 삭제되어 휘발성이라고 보시면 됩니다. 그래서 영구적으로 파일을 컨테이너에서 사용할 수 있는 방법이 있는데 그 중 첫번째가 호스트 볼륨 입니다.
호스트 볼륨
말 그대로 호스트의 디렉토리를 컨테이너의 특정 결오레 마운트 하는 것입니다.
우선 아래 git을 clone해서 호스트 볼륨 마운트하는 방법을 실습해 보도록 하겠습니다.
https://github.com/tedilabs/fastcampus-devops
우선 진짜로 컨테이너를 삭제하면 그 안의 Container Layer가 삭제되는지 실습하기 위해 ubuntu:focal컨테이너를 하나 만들고 실행했습니다. 그리고 root 디렉터리에 hello라는 파일을 만들고 hello, world!라는 내용을 기입했습니다. 그리고 해당 컨테이너를 삭제해 보도록 하겠습니다.
그럼 당연히 다시 만들어도 당연히 hello라는 이름의 파일은 사라져있을 겁니다.
다음과 같이 오른쪽에 호스트 볼륨을 컨테이너에 마운트 시키는 명령어를 써놨습니다. docker run에 -v옵션을 주면 됩니다. /html디렉토리를 컨테이너상의 ./usr/share/nginx/html과 마운트 시키는 명령어 입니다.
그리고 왼쪽이는 /htm/index.html을 오픈시켰습니다.
그리고 bash쉘로 들어간다음에 curl요청을 localhost:80으로 보내면 이전에 봤던 index.html파일이 응답으로 오는 것을 보실 수 있습니다.
또한 bash쉘에서 /usr/share/nginx/html안에 hello라는 파일을 만들어서 내용을 삽입해도 exit한다음에 나와도 진짜 Host Container안에 hello라는 파일이 존재하게 됨을 알 수 있습니다.
볼륨 컨테이너
볼륨 컨테이너는 위에서 실습한 볼륨 마운트와 사뭇 다릅니다. 실제로 Host Container를 마운트하는 Data-only-Container를 만들고 이 Data-only-Container를 실제 사용할 Container가 참조하게 하는 원리입니다.
실제 실습으로 알아보도록 하겠습니다.
이를 실습하기 위해 미리 작성된 volume-container.sh를 만들고 실행해 주도록 하겠습니다.
우선 $(pwd)/html을 /usr/share/nginx/html와 바인딩한 web-volume이라는 이름의 컨테이너를 ubuntu:focal로 만들었습니다.
그리고 --volumes-from을 통해 fastcampus-nginx1, fastcampus-nginx2컨테이너를 각각, 80, 8080번 포트를 Host Container와 연결했습니다. 그리고 Host Container에서 localhost:80, localhost:8080에 curl요청을 보내게 되면
다음과 같이 정상적으로 응답이 오는 것을 확인할 수 있습니다.
그리고 inspect명령어를 쳐서 보게되면 정상적으로 마운트 된 것을 확인할 수 있습니다.
실제로 들어가서 봐도 파일이 존재하는 것을 보실 수 있게 됩니다.
도커 볼륨
도커 볼륨은 위와 개념은 매우 유사합니다. web-volue이라는 도커 볼륨을 만들게 되고 이를 활용해서 마운트를 하게되면 해당 컨테이너의 데이터가 앞서 지정한 도커 볼륨에 쌓이게 됩니다.
바로 실습으로 넘어가 보도록 하겠습니다.
앞서 만든 쉘스크립트 내용을 보게되면, docker volume create명령을 통해 db라는 도커 볼륨을 하나 생성했습니다.
그리고 docker run명령어를 주는데 fastcampus-mysql이라는 이름으로 mysql:5.7컨테이너를 하나 만듭니다. 그리고 환경변수로 mysql:5.에 필요한 정보를 주입해 줍니다. 그리고 -v옵션으로 도커 볼륨을 설정해 주었습니다.
그리고 docker volume ls결과에서 보시는 바와같이 db 도커볼륨이 하나 생성되었고 이를 Inspect하게 되면, Mountpoint가 /var/lib/docker/volumes/db/_data라고 찍히는데 해당 경로에 쌓여있는 mysql:5.7데이터를 확인해 보도록 하겠습니다.
정상적으로 확인이 됩니다.
그리고 위와같은 voume rn으로 실행중인 컨테이너를 끄고 도커볼륨을 삭제할 수도 있습니다.
읽기전용 볼륨 연결
마지막으로는 해당 도커 볼륨을 읽기전용으로 컨테이너에 마운트 시켜줄 수 있는데 이렇게 하는 이유는 설정파일과 같이 변경되서는 안되는 디렉토리를 도커볼륨과 연결할 떄 사용하기 위함입니다.
다음과 같이 host-volume.sh을 -v옵션으로 마지막에 :roㅇㄹ 추가해주었고 마지막줄에 /usr/share/nginx/html/test경로에 ( 읽기 전용 ro )인데 일부러 파일을 touch하도록 했습니다.
이를 실행하면 당연히 예상하셨겠지만 읽기 전용에 파일을 쓸 수 없다면서 오류를 내뱉게 됩니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ Docker && Kubernetes ] - 도커 컨테이너 다루기: 이미지 빌드 (0) | 2022.09.03 |
---|---|
[ Docker && Kubernetes ] - 도커 컨테이너 다루기: 로그 (0) | 2022.09.03 |
[ Docker && Kubernetes ] - 도커 컨테이너 다루기: 네트워크 (0) | 2022.09.02 |
[ Docker && Kubernetes ] - 도커 컨테이너 다루기: 명령어 실행 (0) | 2022.08.27 |
[ Docker && Kubernetes ] - 도커 컨테이너 다루기: 환경변수 (0) | 2022.08.27 |