<Docker> 이미지
# 도커를 사용하는 이유
애플리케이션을 만들고 테스트하는 과정에서 여러 사람이 다양한 스펙의 PC로 애플리케이션을 실행할 때,
동일한 환경, 동일한 기능을 보장하도록 만들기 위해 도커를 사용한다.
단순 소스코드만 타인과 공유하게 되면, 그 코드를 실행하는 환경이 PC마다 달라서 문제가 발생할 수 있다.
현업에서는 서버에 애플리케이션을 직접 올리지 않고 도커라이징을 거쳐 배포함으로써,
서버와 개발자PC 간 호환성 문제를 줄이고 있다.
# 이미지
도커에서 말하는 이미지는, 소프트웨어를 구성하는 특정 시점의 스냅샷 이라고 생각하면 된다.
내가 A 소프트웨어를 로컬PC에서 개발하면서 필요한 환경변수 설정, 라이브러리 설치 등등을 진행했다고 해보자.
소프트웨어 실행을 위한 로컬PC의 모든 환경을 캡처한 그 파일을 '이미지' 라고 한다.
즉, 도커의 이미지는 소프트웨어 실행에 필요한 코드, 환경변수, 패키지, 프로그래밍언어와 버전 등 모든 환경구성이 압축된 파일이다.
# 이미지 vs 컨테이너
이미지는 앞에서 말했듯이, 어떤 소프트웨어 환경 구성을 위한 압축파일이다.
이미지를 만들었다고 해서 바로 소프트웨어가 실행되는 것은 아니며, 이미지를 실행시켜 컨테이너를 생성하게 된다.
이미지를 실행시킨 다는 것은, 이미지 실행 경로에서 압축파일을 풀고 소프트웨어 실행을 위한 환경을 세팅한다는 것이다.
세팅이 끝나고 실행 준비상태가 된 것이 컨테이너이며, 컨테이너를 실행하면 소프트웨어가 구동된다.
[참고]
- 이미지는 고유한 이름을 갖는다.
- 1개의 이미지로 반드시 1개의 컨테이너만 생성할 수 있는건 아니다.
- 1개의 이미지로 각 컨테이너의 이름을 다르게 지정함으로써 다수의 컨테이너를 생성할 수 있다.
- 이미지는 프로그램, 각 컨테이너는 프로세스에 비유된다.
(이미지=구글크롬, 컨테이너=띄워진 크롬브라우저 여러개)
# 이미지 레지스트리
Github가 소스코드를 저장하는 레포지토리를 갖는것 처럼,
도커 또한 이미지를 저장하는 Dockerhub라는 이미지 레지스트리를 갖는다.
Github는 레포지토리의 url을 특정 로컬 디렉토리에 remote로 연결함으로써 코드를 저장하게 되는 반면에,
Dockerhub는 이미지의 네이밍 규칙을 이용해 저장할 레지스트리를 지정한다.
Github에 push/pull 하는것과 동일하게,
Dockerhub도 이미지를 push/pull 함으로써 로컬 경로에 이미지를 설치하거나 레지스트리에 업로드할 수 있다.
docker 이미지의 네이밍 규칙은 아래와 같다.
- 레지스트리주소/프로젝트명/이미지명:이미지태그
- 레지스트리주소:
dockerhub의 레지스트리 공식 주소는 docker.io이며, 별도의 보관소가 있는 경우 그 주소를 사용한다.
별도의 주소를 사용하지 않고 docker.io 에서 이미지를 pull 할 경우 레지스트리 주소는 생략가능하다. - 프로젝트명:
github의 레포지토리 이름과 같은거라고 보면 된다.
어떤 계정에서, 그 계정 레지스트리에 이미지를 push할 경우 계정 텍스트가 프로젝트명이 되며,
기본값은 docker 공식인 library이다.(이 또한 생략 가능하다.) - 이미지명:
실행하고자하는 애플리케이션의 환경 세팅이 담긴 이미지의 이름이다. - 이미지태그:
Github의 main 브랜치에서 tag로 버전을 기록하듯이,
도커에서 이미지태그는 일반적으로 해당 이미지의 버전을 많이 기록한다.
참고로 이미지를 pull할 때 태그에 버전을 명시하지 않으면, latest를 가져오게 된다.
- 레지스트리주소:
- 아래는 네이밍 규칙의 예시를 보여준다.
(docker CLI 명령어이다.)
# nginx는 docker 공식 라이브러리에 이미지가 존재한다.
docker pull docker.io/library/nginx
# docker.io와 library는 생략 가능하다.
docker pull nginx
# airflow는 Apache 재단에서 관리하는 프로젝트로, 프로젝트명을 명시한다.
docker pull apache/airflow
# 나의 Dockerhub 개인계정이 dataart 이고, 해당 계정 레지스트리에 이미지를 업로드 할 때
docker push dataart/app:1.0
# pull할 때
docker pull dataart/app