도커 이미지(Docker Image) 생성해보기

honeybeeveloper·2022년 8월 21일
0

도커 이미지와 도커 컨테이너

개념역할
도커 이미지도커 컨테이너를 구성하는 파일시스템과 실행할 애플리케이션 설정을 하나로 합친 것.
컨테이너를 생성하는 템플릿 역할을 한다.
도커 컨테이너도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화되어 실행되는 상태
컨테이너가 생성될 때 도커 이미지로부터 이를 구체화하고 컨테이너 안의 파일 시스템상에서 애플리케이션이 실행된다.

Dockerfile 이란 무엇인가?

도커 이미지를 작성할 수 있는 기능
Dockerfile 전용 문법으로 이미지 생성을 위한 스크립트를 작성할 수 있고, 이를 기반으로 이미지를 생성할 수 있다.

Dockerfile 기본 문법

Dockerfile 문법은 명령와 인자로 이루어지고, 명령은 대문자로 작성한다.
Dockerfile 내에서 주석은 '#' 이다.

명령설명
FROM베이스 이미지 지정 명령
RUN쉘 명령을 시행하는 명령. RUN은 이미지 작성시 실행되며, 일종의 새로운 이미지 layer를 만드는 역할을 함
ENTRYPOINT컨테이너가 시작할 때 실행하는 쉘 명령을 지정하는 명령.
docker run 실행시 별도 명령어를 넣을 수있는데 CMD 명령은 해당 명령으로 덮어씌워지지만,
ENTRYPOINT로 지정한 명령은 docker run 커맨드 실행시 함께 넣어진 별도 명령어가 있어도 덮어씌워지지 않고
실행된다.
CMD컨테이너가 시작할 때, 실행하는 쉘 명령을 지정하는 명령.
RUN과 비슷하지만 RUN은 이미지 작성시 실행하는 명령이고 CMD는 컨테이너를 시작할 때 실행하는 명령이다.
COPY파일 또는 디렉토리를 컨테이너에 복사한다.
ADD와 달리 URL은 지정할 수 없으며 압축 파일을 자동으로 풀어주지 않는다.
WORKDIR컨테이너에서의 작업 디렉토리 설정
EXPOSE컨테이너 외부에 오픈할 포트 설정
ENV컨테이너 내부에서 사용할 환경변수를 지정
LABEL버전 정보. 이미지 설명을 작성하기 위한 명령
ADDCOPY와 유사하나, 로컬 파일 또는 디렉토리 대신 URL을 사용할 수 있고 압축 파일을 자동으로 풀어준다.

간단한 도커 이미지를 만들어 보자

HTTP 응답을 반환하는 간단한 애플리케이션을 실행하는 도커 이미지를 만들어보자.
도커 이미지는 Dockerfile로 작성한다.


1) 아래와 같이 간단한 Python flask app 이 있다.

# Python3.8

from flask import Flask

app = Flask(__name__)


@app.route('/test', methods=['GET'])
def test():
    return 'Hello, docker!'
 

2) Dockerfile을 작성한다.

# Dockerfile

FROM python:3.8

WORKDIR /usr/src/app

COPY ./app .

RUN pip install -r requirements.txt

EXPOSE 5000

CMD ["python", "http_docker.py"]

3) 도커 이미지를 빌드한다.

docker image build -t 이미지명[:태그명] Dockerfile경로
docker image build -t docker/hello-test .

-t 옵션 : 태그명 지정. 생략시 latest 태그가 붙는다.
참고로 이미지명 docker/hello-test에서 / 앞에 오는 docker는 네임스페이스다. 이미지명의 충돌을 피하기 위해 네임스페이스를 사용하는 것을 추천한다.


순차적으로 명령이 실행되어 이미지가 생성되는 과정을 확인할 수 있다.

4) 컨테이너를 실행한다.

docker container run -d -p [호스트port:컨테이너port] 이미지명
docker container run -d -p 5000:5000 docker/hello-test

-d 옵션 : 백그라운드로 컨테이너를 실행한다.
-p 옵션 : 호스트 머신의 포트와 컨테이너 포트를 연결(포트포워딩)
도커 컨테이너는 가상 환경이지만, 외부에서 봤을 때 독립적인 하나의 머신처럼 다룰 수 있다.
컨테이너의 포트는 컨테이너 안에 한정된 포트이다. 따라서 위의 예제처럼 컨테이너 밖에서 온 요청을 컨테이너 안에 있는 애플리케이션에 전달하려면 -p 옵션을 사용하여 포트포워딩 해주어햐 한다.

5) 확인





참고 : 책 <도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문>

profile
꿀벌같은 개발자가 되고 싶습니다.

0개의 댓글