개념 | 역할 |
---|---|
도커 이미지 | 도커 컨테이너를 구성하는 파일시스템과 실행할 애플리케이션 설정을 하나로 합친 것. 컨테이너를 생성하는 템플릿 역할을 한다. |
도커 컨테이너 | 도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화되어 실행되는 상태 |
도커 이미지를 작성할 수 있는 기능
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 | 버전 정보. 이미지 설명을 작성하기 위한 명령 |
ADD | COPY와 유사하나, 로컬 파일 또는 디렉토리 대신 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) 확인
참고 : 책 <도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문>