[도커 기초 시리즈 포스팅]
[Docker] 기초 시리즈 (1) 도커의 개념과 사용이유
[Docker] 기초 시리즈 (2) Ubuntu에 도커 엔진 설치
[Docker] 기초 시리즈 (3) 이미지와 컨테이너 관계, 도커 아키텍처
[Docker] 기초 시리즈 (4) 도커 이미지의 구조
[Docker] 기초 시리즈 (5) 도커 이미지 다루기 - Docker Hub(Registry)
[Docker] 기초 시리즈 (6) 도커 이미지 다루기 - 이미지 직접 생성 (Now)
[Docker] 기초 시리즈 (7) 자주 사용하는 Dockerfile 명령어
[Docker] 기초 시리즈 (8) 자주 사용하는 도커 명령어 모음
[Docker] 기초 시리즈 (9) 도커 컨테이너 - 개념, 기본 사용법
[Docker] 기초 시리즈 (10) 도커 컨테이너 - Volume 관리
❑ 도커 이미지 다루기 - 이미지 직접 생성
유저가 생성하는 도커 이미지는 1) 미지 생성 단계를 정의한 Dockerfile 파일을 만들어 빌드하는 방법과 2)이미 생성된 컨테이너의 변경점을 반영해 이미지를 생성하는 방법이 있다.
두 가지 방법 모두 일반적으로 도커 허브에서 제공하는 Official 이미지를 내려받아 유저의 목적에 맞게 변경한 후 새로운 이미지로 생성하게 된다.
[참고] 도커 이미지 이름 구성
{저장소 이름}/{이미지 이름}:{이미지 태그}
예시: citronbanana/nginx:1.41
예시: citronbanana/nginx:latest
- 도커 이미지 Pull / Push 시 저장소 이름을 생략하면 기본 저장소인 도커 허브로 인식한다
1) Dockerfile ★
1-1) Dockerfile의 개념
- Dockerfile이라고 불리는 텍스트 파일과 docker build 명령어를 통해 이미지를 생성하는 방법이다.
- Dockerfile에 도커 이미지를 생성하기 위한 FROM, ENV, RUN 등의 Dockerfile 문법 명령어를 작성한다.
- 호스트 시스템으로부터 이미지에 복사하고 싶은 파일을 명시하고, 컨테이너에 어떤 의존성을 설치해야 하는지, 환경변수 설정은 어떻게 할지, 컨테이너로 만들었을 때 어떻게 구동해야하는지 등을 설정하는 파일이다.
- Dockerfile 방식은 실제 업무환경(엔터프라이즈 환경)에서 적용하기에 적합한 방법이다.
- 도커 이미지를 체계적(systematic)이고, 유연하게(flexible) 구축할 수 있고, 안정적(reliable)이고 안전한 컨테이너를 구축할 수 있는 방법이다.
- 장점
- 깨끗하고 컴팩트하며 반복 가능한 레시피 기반(recipe-based) 이미지다.
- 라이프 사이클 관리가 편하다
- CI, CD 프로세스와 통합이 용이하다
- 단점
- 도커 파일 자체 문법이 따로 있기 때문에 초보자에게 배우는 시간이 필요하다
- Dockerfile Official Reference | https://docs.docker.com/engine/reference/builder/
1-2) Dockerfile 작성
예제) 우분투(Ubuntu) 이미지에 Nginx 설치 후 새로운 이미지로 만들기
Step1. Dockerfile 작성
# 1) 도커 허브에서 우분투 이미지 다운로드
FROM ubuntu:20.04
# 2) nginx 설치
RUN apt-get update && \
apt-get update- y && \
apt-get install -y nginx curl
- Dockerfile은 지시어(FROM, RUN, ....)와 인자(ubuntu:20.04)의 나열로 구성된다.
Step2. docker build 명령어로 이미지 생성
$ docker build -t webserver_nginx:0.0.1 .
*문법: docker build -t {이미지 명}:{태그} -f {도커파일 위치} {빌드 컨텍스트}
- 도커 호스트에서 docker build 명령어를 이용해 이미지를 생성한다.
- -t : tag의 약자. 위 예시에선 이미지 이름이 my_app 이고, 태그가 v1 인 이미지를 생성하는 것
- -f : 생략 가능한 옵션이다. 빌드 컨텍스트로 사용한 디렉토리에 있는 Dockerfile을 사용하지 않고 다른 위치의 Dockerfile을 사용할 경우 지정
- nginx:0.0.1 뒤의 . 은 빌드 컨텍스트를 나타낸다. 빌드 컨텍스트는 docker build 명령어 수행시 필요한 파일들이 위치한 도커 호스트의 디렉토리를 의미한다. 아래 [참고] Build Context에서 더 확인해보자
- 위와 같이 입력하면 빌드 컨텍스트로 지정된 현재 위치에서 'Dockerfile' 이란 이름을 가진 파일을 찾아 webserver_nginx라는 이름의 이미지를 생성해준다
Step3. 생성된 이미지 확인
$ docker images
[참고] docker build -f 옵션
예시1) -f 옵션 미사용. 빌드 컨텍스트에서 'Dockerfile'을 찾음
$ docker build -t webserver_nginx:0.0.1 .
예시2) -f 옵션 사용. -f 옵션의 위치에서 'MyDockerfile'을 찾음
$ docker build -t webserver_nginx:0.0.1 -f example/MyDockerfile .
[참고] Build Context (빌드 컨텍스트)
- Dockerfile로 docker build 명령어 수행 시 필요한 정보(파일 등)를 docker daemon에게 전달하기 위해 도커 호스트의 디렉토리를 지정해주는 것. 지정된 디렉토리를 빌드 컨텍스트라 함
- 빌드 컨텍스트로 지정된 디렉토리의 모든 정보는 docker daemon에게 전달된다.
- 기본적으로는 Dockerfile의 위치를 알려주기 위해 사용하지만, 호스트 OS에 있는 특정 파일들을 복사하기 위해 그 위치를 알려주는 용도 역시 주 목적이다.
[참고] .dockerignore
- 빌드 컨텍스트로 지정된 디렉토리에 너무 많은 정보가 있을 경우 빌드하는데 시간이 오래 소요될 수 있으므로 불필요한 정보는 .dockerignore로 설정한다
- .gitignore와 문법이 동일하다
example
*/temp*
*/*/temp*
temp?
*.md
2) 컨테이너로 이미지 생성 (interactive)
- docker commit 명령어를 사용해 컨테이너를 이미지로 만드는 방법이다.
- 도커 컨테이너 생성 후 변경 사항(파일 생성, 변경 등..)을 반영한 이미지로 새롭게 빌드(생성)하고 싶을 때 사용한다.
- 장점
- 도커 이미지를 만드는 가장 빠르고 간단한 방법
- testing, trouble shooting, 종속성 결정(determining dependencies), 프로세스 검증(validating processes)에 적합하다
- 단점
- 라이프 사이클 관리가 어렵다
- 오류가 발생하기 쉬운 실시간 대화형 프로세스(live interactive processes)를 직접 재구성해야한다
- 레이어 최적화된 이미지를 구성하는게 어렵다
예제) 우분투(Ubuntu) 이미지에 Nginx 설치 후 새로운 이미지로 만들기
Step1. 도커 허브에서 우분투 이미지 다운로드
docker pull ubuntu:20.04
Step2. 우분투 이미지로 컨테이너 실행
docker run -it ubuntu:20.04 --name nginx_contatiner
Step3. 생성한 컨테이너(webserver_nginx)에 nginx 설치
# apt-get update && apt-get install -y nginx
Step4. 도커 컨테이너 내부 쉘에서 빠져나오기
Ctrl + P, Q
Step5. 도커 컨테이너로 새로운 이미지 생성하기
$ docker commit nginx_contatiner webserver_nginx:0.0.1
*문법: docker commit [컨테이너 명] [생성할 이미지 명]:[태그]
- docker commit 옵션
- -a : author의 약자. 커밋한 사람 정보
- -m : commit message
Step6. 생성된 이미지 확인
$ docker images
❑ REFERENCE
https://jfrog.com/knowledge-base/a-beginners-guide-to-understanding-and-building-docker-images/
'DevOps > Docker' 카테고리의 다른 글
[Docker] 기초 시리즈 (8) 자주 사용하는 도커 명령어 모음 (0) | 2022.05.14 |
---|---|
[Docker] 기초 시리즈 (7) 자주 사용하는 Dockerfile 명령어 (0) | 2022.05.08 |
[Docker] 기초 시리즈 (2) Ubuntu에 도커 엔진 설치 (0) | 2022.04.30 |
[Docker] 기초 시리즈 (4) 도커 이미지의 구조 (0) | 2022.04.29 |
[Docker] 기초 시리즈 (3) 이미지와 컨테이너 관계, 도커 아키텍처 (0) | 2021.12.30 |