1. 도커의 레지스트리
도커의 이미지는 경량화되어있기 때문에(레이어 구조로 되어있기 때문) 네트워크를 통해 파일을 공유하기 편하다.
개발자가 가장 많이 사용하는 공간 중 하나인 깃허브와 같이 도커의 이미지도 공유할 수 있는 레지스트리가 있다.
- 직접 설치하는 레지스트리 : HARBOR, 도커 프라이빗 레지스트리
- 클라우드용 레지스트리 : AWS ECR, Azure ACR, Docker Hub
우리는 도커의 이미지를 바탕으로 컨테이너를 실행할 때, 다음과 같은 명령어를 입력한다. (예시 : Nginx)
docker run -d -p 80:80 --name mynginx nginx
-d를 입력할 경우, 해당 컨테이너를 실행시킨 상태에서 다른 명령어 프로그램을 사용할 수 있다.
-p를 입력할 경우, 컨테이너와 호스트 OS의 포트를 연결시킬 수 있다.
하지만 여기서 이미지 이름을 적는 란(nginx)에 많은 부분이 생략되어 있다.
docker run -d -p 80:80 --name mynginx 레지스트리주소/프로젝트명(계정이름)/nginx(이미지명):버전정보(이미지태그)
이처럼 이미지를 지정할 때, 여러 정보들을 입력해야하는 것이 맞다. 하지만 각각 생략될 경우, 다음 값이 기본으로 들어간다.
- 레지스트리 주소 생략 시 : Docker Hub로 지정
- 태그 생략 시 : Latest(가장 최신버전)로 지정
- 프로젝트명 생략 시 : 도커에서 인증한 공식 이미지는 라이브러리(library)로 관리되기 때문에 프로젝트명도 생략 가능하다.
- nginx = docker.io/library/nginx:latest
다음과 같이 하나의 이미지에 대해 여러 이름을 부여할 수 있다. 이름은 다르지만 이미지의 hash 값이 동일하다는 것을 알 수 있다. docker tag 명령어를 사용하면 하나의 이미지를 여러 이름으로 관리가 가능하다. 앞서 언급한 이미지에는 프로젝트명, 계정이름이 들어가는데 이를 달리할 경우, 도커 허브와 같은 레지스트리에 Push할 때, 각각 다른 계정으로 Push된다. 즉, 이름(태그)을 달리하면 하나의 이미지를 여러 곳에 지정하여 보낼 수 있는 것이다.
이처럼 하나의 이미지를 기반으로 생성된 또 다른 이름을 갖는 이미지를 지우더라도 원본 이미지는 삭제되지 않는다. (Untagged 로그만 출력됨) 이는 원본 이미지와 연결되어 있기에 실제로는 하나의 이미지만 존재하는 것이다. 그리고 마지막으로 남은 이미지를 삭제할 때, 실제 스토리지에서 해당 이미지가 삭제된다. (Untagged와 Deleted 로그가 출력됨)
2. 이미지는 레이어 구조로 되어있다.
도커의 이미지는 한겹 한겹 쌓아올려져 만들어진다. 따라서 각각의 레이어는 서로 독립적이기에 이들을 조합하여 새로운 이미지를 만들 수도 있다.
이미지를 Pull할 때도, 하나의 덩어리가 다운로드 되지 않고, 레이어 단위로 다운로드됨을 알 수 있다. 이는 즉, 세부적인 정보가 추가될 경우, 변경되지 않은 레이어에 대해서는 별도로 작업을 하지 않아도 된다. Nginx 이미지를 수정한다면 수정된 내용에 대한 레이어가 추가될 것이다. 그리고 이를 컨테이너로 실행시켜 커밋한다면 새로운 이미지를 만들 수 있다. (커밋이란, 생성된 컨테이너를 바탕으로 이미지를 만드는 작업으로 빌드의 기본동작 방식이다.)
또한 이미지에 있는 레이어들은 Read Only로 읽기만 가능하고, 수정은 불가능하다. 수정이 가능한 경우는 컨테이너 레이어만 가능하다. 컨테이너 레이어란, 실제 이미지가 컨테이너로 동작했을 때, 생성되는 레이어를 말한다. 따라서 실행된 컨테이너를 통해 추가적인 작업을 할 경우, 기존의 이미지 레이어에는 변동이 없으며, 컨테이너 레이어에 수정된 내용이 반영된다. 마찬가지로 이를 커밋할 경우에는 컨테이너 레이어 부분만 기존의 이미지 레이어에 올라가게 되는 것이다. 어쨌든 컨테이너 레이어는 기존의 이미지 레이어의 복사본이기에 원본을 수정하지 않는다. 이처럼 레이어는 원본을 수정하지 않고, 복사본을 만들어 추가로 덧대는 방식이다. 이를 Copy-On-Write(COW) 전략이라고 한다.
출처 :
[2024 NEW] 개발자를 위한 쉬운 도커 강의 - 인프런
현업 개발자가 도커를 사용한 경험을 녹여낸 새로운 커리큘럼으로 기존 교재 및 강의와 차별된 강의를 제공합니다. 단순한 명령어 사용법이 아닌 도커를 왜 사용해야하는지 대한 근본적인 질문
www.inflearn.com
'DevOps(AWS, Docker, Linux, etc) > Docker' 카테고리의 다른 글
Github Actions CI 소요시간 단축시키기 (Gradle 빌드) (0) | 2024.04.20 |
---|---|
스프링부트 + Github Actions + Docker 사용 시 빌드 에러 해결 (0) | 2024.04.15 |
4. 도커 빌드와 빌드 컨텍스트 (0) | 2024.02.09 |
2. 도커 (0) | 2024.01.25 |
1. 가상화 기술 (2) | 2024.01.25 |