이미지를 왜 만들어? 내 서비스에 필요한 기능이 도커 허브에 없거나 내 애플리케이션을 배포하려고
도커 이미지를 만들거면 도커 파일을 만들어줘야 한다.
주로 컨테이너를 만드는데 있어 필요한 패키지, 소스코드, 환경변수 등을 작성한다.
Dockerfile에서 자주 사용되는 명령어
명령어 | 설명 |
FROM <image>:<tag> | 베이스 이미지 지정 |
RUN | 수행할 명령어 지정 |
CMD | 컨테이너가 실행될 때 수행할 명령어 |
EXPOSE | 포트 지정 |
ENV | 환경변수 지정 |
COPY | 로컬 파일을 컨테이너로 복사 |
ADD | 이미지 생성시 파일 추가 |
ENTRYPOINT | 컨테이너 실행할 때 수행할 명령어 |
VOLUME | 이미지의 볼륨 지정 |
WORKDIR | 컨테이너 작업 디렉토리 지정 |
예제 Dockerfile
FROM Ubuntu
RUN apt-get update && apt-get -y install python
RUN pip install flask flask-mysql
COPY . /opt/source-code
ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run
FROM : base os로 ubuntu 지정
RUN : 도커로 하여금 애플리케이션에 필요한 파이썬을 설치한다
COPY : 로컬에 있는 파일들을 컨테이너의 디렉토리로 복사한다
ENTRYPOINT : 도커 런할때 실행되는 명령어로 주로 애플리케이션 실행 명령어가 들어간다
도커 이미지 생성
docker build . -f Dockerfile -t sample
도커 빌드시 각 명령어별 레이어가 캐싱이 된다. 위의 예제에서는 총 5개의 레이어가 생성된다.
애플리케이션을 계속 개발하게 되면서 만약 Dockerfile에 변경이 생긴다면 도커 빌드할때 변경된 레이어만 새로 빌드해서 사용된다.
해당 레이어에 대한 크기 혹은 정보를 보고 싶으면 아래 명령어를 사용하면 된다
docker history [Image Name]
완성된 도커 이미지는 개인 레포지토리로 업로드할 수 있는데 이때 개인 private repository는 두개뿐이다
docker push [Image name]
컨테이너가 종료되는 사유
1. 컨테이너 안에서 메인 프로세스가 성공적으로 완료되었을 경우
대부분의 경우인데, 순수하게 프로세스를 전부 처리하고 나서 컨테이너 입장에선 할일이 없으니 해당 컨테이너를 종료시킨다.
2. 컨테이너에서 쉘을 실행했지만 터미널을 연결시키지 않은 경우
컨테이너에서 shell을 실행하도록 했는데 터미널을 연결 안시키면 프로세스 입장에선 할일이 없다. 이 경우 docker run 할때 -it 옵션을 추가해주면 된다.
3. 실행중인 컨테이너안에서 종료 시킨경우
이 경우 사용자가 컨테이너에 접근해서(attach) 내용을 살피다가 ctrl + c로 탈출하는 순간 프로그램은 종료 시그널을 받고 해당 컨테이너도 역시 종료가 되버린다.
4. docker stop 명령어 사용
5. 도커 데몬을 재시작한 경우
도커는 디폴트로 컨테이너를 재시작하지 않는다. 그래서 내 컴퓨터에서 컨테이너가 재시작되길 원하면 docker run 할 당시 --restart 옵션을 추가해줘야 한다.
6. 컨테이너가 너무 많은 자원을 사용하는 경우
컨테이너가 너무 많은 자원을 사용할 경우 OS가 자동으로 그 프로세스를 차단해버리는데 이 경우 -m 옵션으로 자원을 제한둘 수 있다.
Docker를 처음 공부하다 보면 아마 ubuntu 이미지를 많이 사용하게 될텐데, ubuntu 이미지를 docker run 명령어로 수행하면 바로 exit 상태로 넘어가진다.
컨테이너는 일단 기본적으로 서버를 제공하는게 아니라 어느 명령을 실행할 환경을 제공해주는 것뿐이고, 그 명령을 수행하면 exit 상태로 변한다. ubuntu 이미지를 살펴보면 마지막에 /bin/bash 명령어를 수행한다. 그러니 컨테이너 입장에서는 저 쉘 명령어를 실행할 수 있는 환경을 만들었으니 사실상 할일은 다한거다.
만약 ubuntu 이미지를 사용한 컨테이너의 상태를 유지하고 싶다면 -it 옵션같은걸 추가해서 docker run을 해야 컨테이너는 계속 실행중인 상태로 유지가 된다. (컨테이너가 종료되는 사유 1,2번에 해당된다)
'[Docker]' 카테고리의 다른 글
[Docker] CMD vs ENTRYPOINT (2) | 2022.09.12 |
---|---|
[Docker] ADD vs COPY (0) | 2022.09.11 |
[Docker] 잊을것 같으니 메모하자 - 도커 명령어 옵션 (0) | 2022.09.09 |
[Docker] 잊을것 같으니 메모하자 - 도커 명령어 (0) | 2022.09.09 |