Docker 명령어 정리

배진오

@baealex

소비적인 일보단 생산적인 일을 좋아합니다.

Docker

아직 도커를 잘 모르는 상태로 작성하였음을 감안해주시길 바라며 내용은 주기적으로 바뀌거나 추가됩니다. 또한 Ubuntu 20.04 LTS 기준으로 작성되었음을 안내드립니다. *설치를 제외한 모든 명령어를 동일하게 사용할 수 있습니다.


설치
sudo apt-get install docker docker-compose


Image

공유되는 이미지는 이곳에서(https://hub.docker.com/) 찾아 볼 수 있다.


생성

아래는 Python을 실행하기 위한 이미지다. requirements에는 Flask가 포함되었다.

# Directory Structure

- app
  - app.py
  - requirements.txt
- Dockerfile
# Dockerfile

FROM ubuntu:latest
COPY ./app /app
WORKDIR /app

RUN apt-get install -y python3-pip python3-dev
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["app.py"]

또는

# Dockerfile

FROM python:3.6
COPY ./app /app
WORKDIR /app

RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]

이후 Dockerfile이 있는 디렉터리에서 다음 명령 실행

docker build -t <image-name> .

기본적으로 이미지를 빌드할 경우 캐시가 생성된다. 이는 추후 이미지 재빌드시 속도 향상에 기여하지만 의도하지 않은 문제를 일으킬 수 있다. 캐시로 인해 문제가 발생한 경우 --no-cache 옵션을 붙이자.

docker build -t <image-name> . --no-cache

새롭게 알게된 것

도커에 이미지를 새로 빌드할 때 마다 수 많은 패키지를 다시 설치해야 하는 문제가 있어서 상당한 불편함을 느꼈는데 이를 캐시로 해결할 수 있었다. 캐시는 Dockerfile에 변경사항이 '없는' 부분에 대해서 적용된다. 가령 위 명령어를 다시 보자.

# Dockerfile

FROM python:3.6 # 변경사항 없으므로 캐시
COPY ./app /app # 변경사항 있으면 캐시 해제
WORKDIR /app

RUN pip install -r requirements.txt # 캐시 풀려서 다시 설치해됨 ㅠ
ENTRYPOINT ["python"]
CMD ["app.py"]

위 로직을 아래와 같이 변경한다면?

# Dockerfile

FROM python:3.6 # 변경사항 없으므로 캐시
COPY ./app/requirements.txt /app/ # 변경사항 없으므로 캐시
WORKDIR /app

RUN pip install -r requirements.txt # 변경사항 없으므로 캐시

COPY ./app /app # 변경사항 있으면 캐시 해제
ENTRYPOINT ["python"]
CMD ["app.py"]

위처럼 변경하면 패키지 설치까지는 캐시가 적용되어 빠르게 소스코드만 이미지에 올릴 수 있게 된다.


목록
docker images


실행
docker run --name "test" <image-name>:latest /bin/bash

-it                   : 현재 터미널이나 콘솔에 결과를 출력
--rm                  : 실행 후 컨테이너 삭제
--name "<NAME>"       : 컨테이너 이름
ubuntu                : 이미지 이름
/bin/cal              : 컨테이너에서 실행하는 커맨드
-d                    : 백그라운드에서 실행
-p [Host]:[Container] : 호스트와 컨테이너 포트를 매핑


삭제

해당 이미지로 실행중인 컨테이너가 있으면 컨테이너 삭제후 진행할 수 있음

docker rmi <image-name>

이미지 용량이 생각보다 빠르게 차올라서 당황했는데 아래 명령어로 모든 이미지를 정리할 수 있다.

docker stop `docker ps -a -q` # 모든 컨테이너 정지
docker rm -f `docker ps -a -q` # 모든 컨테이너 삭제
docker rmi `docker images -a -q` # 모든 이미지 삭제

None 이미지만 삭제하려는 경우

docker rmi $(docker images -f "dangling=true" -q)


Container

목록

아래 두 명령어는 같은 결과를 보여줌

docker container list
docker ps


접속
docker exec -it <container-id> /bin/bash


로그
docker logs <container-id>


정지
docker stop <container-id>


Compose

Dockerfile은 단순히 image를 빌드하기 위한 도구 docker-compose.yml는 다수의 이미지 빌드 및 실행을 관리하는 툴


생성

허브에 있는 이미지로 컨테이너 만들때

# docker-compose.yml

version: '2.0'

services:
  python:
    image: python:3.8.1-buster
    restart: always

직접 생성한 Dockerfile로 컨테이너 만들때

# Directory Structure

- python
  - Dockerfile
- docker-compose.yml
# docker-compose.yml

version: '2.0'

services:
  python:
    build:
      context: ./python
      dockerfile: ./Dockerfile


빌드

docker-compose.yml이 있는 디렉터리에서 다음 명령어 실행

docker-compose build


실행
docker-compose up -d


정지
docker-compose stop


삭제
docker-compose rm
😥 작성된 댓글이 없습니다!
댓글을 작성하기 위해 로그인이 필요합니다.