도커 이미지란?
torch Dockerfile
로 Dockerfile 생성FROM <image>[:<tag>][AS <name>]
# 예시)
FROM ubuntu
FROM ubuntu:20.04
FROM nginx:latest AS ngx
COPY <src>... <dest>
# 예시)
COPY test.txt /abc/def/test_copy.txt
COPY my-workspace /abc/def/test-workspace
RUN <command>
# 예시)
RUN pip install -r requirements.txt
CMD <command>
# 예시)
CMD python main.py
CMD ["bash"]
# CMD ["bash"] : default 명령을 bash로 설정합니다.
# 이후 docker run 실행 시 실행할 커맨드를 주지 않으면 이 default 명령이 실행됩니다.
CMD vs ENTRYPOINT
- Entrypoint는 CMD와 같은 역할을 합니다.
- CMD:
docker run
으로 실행될 때 사용자가 직접 실행할 명령어를 입력하면CMD
에 입력해두었던 명령어 대신 새로 입력받은 명령어를 사용합니다.- ENTRYPOINT:
ENTRYPOINT
에 입력해둔 명령어는 항상 실행됩니다. 만약 새로운 명령어가 있다면,ENTRYPOINT
가 실행되고 나서 실행됩니다.- 만약
ENTRYPOINT
와CMD
가 둘 다 있다면, CMD는 ENTRYPOINT에 매개 변수만 전달하는 역할을 합니다.
- ex) Dockerfile(
CMD
&ENTRYPOINT
)
Shell vs Exec
RUN과 CMD, ENTRYPOINT 등은 커맨드 명령을 수행하는 키워드입니다. 이때, 명령을 주는 방식은 Shell과 Exec으로 나눌 수 있습니다.
- shell : 쉘 프롬프트에 명령을 기술하는 방식
/bin/sh -c
을 사용하여 명령을 수행하는 것과 같음.- ex)
CMD echo "hello"
- exec : 쉘을 경유하지 않고, 직접적으로 바로 실행하는 방식
- ex)
CMD ["/bin/echo", "Hello"]
RUN
CMD
ENTRYPOINT
)가 컨테이너 내 어떤 디렉토리에서 수행될 것인지를 명시하는 명령어입니다.WORKDIR /path/workdir
# 예시)
WORKDIR /home/test
ENV <key> <value>
ENV <key>=<value>
# 예시)
ENV PYTHONPATH=/app
ENV PYTHONBUFFERED 1
EXPOSE <port>
EXPOSE <port>/<protocol>
# 예시)
EXPOSE 8080
아까 생성시킨 Dockerfile을 실행하여 Dockerfile을 작성해봅시다.
명령어가 많아지면 레이어가 쌓여 메모리가 커지게 됩니다. 이를 해결하기 위해 다음과 같은 방법을 사용할 수 있습니다.
# 안 좋은 예시
RUN apt-get update && apt-get install -y
RUN aufs-tools
RUN automak
...
# 좋은 예시
RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
build-essential \
...
RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
build-essential \
... \
&& RUN rm -rf /var/lib/apt/lists/*
docker build [OPTIONS] PATH | URL | -
-t
: 태그를 지정docker build -t my-first-image:v1.0.0 .
docker commit [OPTIONS] CONTAINER [REPO/IMG:TAG]
-a
: 작성자 설정-m
: 커밋 메시지 지정# 실행 중인 test-container를 test/ubuntu:1.1로 커밋
docker commit -a "whattsup" -m "test" test-container test/ubuntu:1.1
# 컨테이너
docker export [container-name] > [tar-name.tar] # container -> tar
cat [tar-name.tar] | docker image import - [REPO/IMG:TAG] # tar -> image
# 이미지
docker image save -o [tar-name.tar] [image-name] # image -> tar
docker image load -i [tar-name.tar] # tar -> image
Docker Registry는 이미지를 저장 및 다운로드할 수 있는 공간입니다.
docker run -d -p 5000:5000 --name registry registry
my-first-image:v1.0.0
을 방금 생성한 registry를 바라보도록 tag합니다.docker tag my-first-image:v1.0.0 localhost:5000/my-first-image:v1.0.0
docker push localhost:5000/my-first-image:v1.0.0
curl -X GET http://localhost:5000/v2/_catalog
curl -X GET http://localhost:5000/v2/my-first-image/tags/list
Docker Hub를 이용하기 위해선, 먼저 회원가입이 필요합니다.
docker login
docker tag my-first-image:v1.0.0 <username>/<imagename>:<tag>
docker push <username>/<imagename>:<tag>