도커 허브에 이미 있는 이미지들을 사용할 수도 있지만 직접 도커 이미지를 만들어 사용할 수도 있고 직접 만든 도커 이미지를 도커 허브에 올려 공유할 수도 있다.
도커 허브란?
- Docker에서 운영하는 Docker 이미지 저장소 서비스
컨테이너는 도커 이미지로 생성된다. 그렇다면 도커 이미지는 어떻게 생성할까?
도커 이미지 생성하는 순서
Dockerfile 작성 → 도커 클라이언트 → 도커 서버 → 이미지 생성
Dockerfile에 입력된 것이 도커 클라이언트에 전달 되어야 하고, 도커 클라이언트에 전달된 모든 중요한 작업들은 도커 서버에서 한다.
Dockerfile이란?
- 도커 이미지를 만들기 위한 설정 파일이다.
(도커 이미지를 만들기 위해 필요한 기본 명령어들을 지정하기 위한 script)- 컨테이너가 어떻게 행동해야 하는지에 대한 설정들을 정의해준다.
[도커 파일 형식]
# 베이스 이미지를 명시해준다. → 어떤 OS를 사용할 것인지 명시
FROM baseImage
# 추가적으로 필요한 파일들을 다운로드 받기 위한 몇 가지 명령어를 명시해준다.
RUN command
# 컨테이너 시작 시 실행될 명령어를 명시해준다.
CMD ["excecutable"]
베이스 이미지란?
- 도커 이미지는 여러 개의 레이어로 되어 있는데, 그 중에서 베이스 이미지는 이 이미지의 기반이 되는 부분이다.
레이어란?
- 레이어는 중간 단계의 이미지이다.
도커 파일에 작성할 내용
# ubuntu, centos 등을 사용해도 되지만 hello를 출력하는 기능은 큰 사이즈의 베이스 이미지가 필요하지 않다.
FROM alpine
# hello 문자를 출력하기 필요한 echo가 이미 alpine 안에 있기 때문에 RUN 부분은 생략해도 된다.
# echo : 도스, OS/2, 유닉스 및 유닉스 계열 운영 체제에서 문자열을 컴퓨터 터미널에 출력하는 명령어
# RUN command
# 컨테이너 시작 시 실행될 명령어 echo hello를 적어준다.
CMD ["echo", "hello"]
여기서 FROM, RUN, CMD
등은 도커 서버에게 무엇을 하라고 알려주는 것이다.
FROM
RUN
CMD
도커 이미지를 만들기 위해선 도커 파일에 입력된 것들이 도커 클라이언트에 전달 되어서 도커 서버가 인식하게 해야 한다.
Dockerfile 작성 → 도커 클라이언트 → 도커 서버 → 이미지 생성
👉 그렇게 하기 위해서 docker build ./(도커 파일 위치)
또는 docker build .(도커 파일 위치)
build 명령어
- 해당 디렉토리 내에서 dockerfile이라는 파일을 찾아서 도커 클라이언트에 전달시켜준다.
(디렉토리를 명시해주면 dockerfile이라는 파일을 알아서 찾아준다.)- docker build 뒤 ./와 .은 둘 다 현재 디렉토리를 가리킨다.
결과
docker build ./
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM alpine
---> a24bb4013296
Step 2/2 : CMD ["echo", "hello"]
---> Running in 16c04fc73f76
Removing intermediate container 16c04fc73f76
---> 872457464cf6
Successfully built 872457464cf6
이 때, 임시 컨테이너를 생성하고 다시 지우는데 왜 그러는 걸까?
alpine 이미지
임시 컨테이너 생성(16c04fc73f76)
→ 하드 디스크에 파일 시스템 스냅샷(베이스 이미지&다른 레이어들) 추가
→ 시작 시 실행할 명령어 아직 없음
임시 컨테이너에 시작 시 실행할 명령어 추가
------------------------임시컨테이너 완성------------------------
→ 이제 임시 컨테이너는 필요 없다. 임시 컨테이너를 토대로 새로운 이미지를 만들어준다.
이미지가 완성됐다. 이제 시작 시 실행 될 명령어가 생성 됐다.
→ 처음 alpine 이미지와는 다름(아이디도 달라짐)
임시컨테이너 삭제
베이스 이미지에서 다른 종속성이나 새로운 커맨드를 추가할 때는 임시 컨테이너를 만든 후 그 컨테이너를 토대로 새로운 이미지를 만든다. 그리고 그 임시 컨테이너는 지워준다.
출처
인프런 [따라하며 배우는 도커와 CI환경]