naroSEC

들어가기 앞서

Docker를 사용할 때 자주 사용하지 않는 명령어의 경우, 그때그때마다 검색하여 명령어를 찾아야 하는 상황이 자주 발생한다. 또한 외부 Dockerfile을 사용할 때도 마찬가지로 구문을 외우지 않고 있다면 검색에 의존하게 되는 경우가 매우 많다. 때문에, 이번 포스팅은 도커 사용 시 자주 사용되는 명령어들을 정리하고 나중에 참고하고자 작성한다.


Docker Commands

도커 전체 초기화 코드

더보기
# 시스템의 모든 컨테이너 삭제
docker rm -f $(docker ps -a -q)

# 시스템의 모든 볼륨 삭제
docker volume rm -f $(docker volume ls -q)

# 시스템의 커스텀 네트워크 삭제(기본 네트워크 제외)
docker network rm -f $(docker network ls -q)

# 빌드 캐시 정보 삭제
docker builder prune -a -f

# 시스템의 모든 이미지 삭제
docker rmi -f $(docker images -q)

# 0 출력 시 초기화 성공
docker system df

도커 이미지 목록 확인

더보기
docker images

 

컨테이너 생성 및 시작

더보기
# docker run 사용 시 이미지를 pull(다운로드) 하지 않은 경우 도커가 자동으로 해당 이미지를 다운로드 받아 설치한다.
docker run [이미지 파일 이름]

# nginx 컨테이너를 생성하고 실행하는데 nginx 이미지가 없을 경우 자동으로 다운로드 받는다.
# -d: 백그라운드에서 동작
# --name: 실행되는 컨테이너 이름 지정
docker run -d --name test nginx

컨테이너 시작/정지

더보기
# 컨테이너 시작(중지된 컨테이너)
docker start [컨테이너 ID 또는 식별자]

# 컨테이너 중지
docker stop [컨테이너 ID 또는 식별자]

컨테이너 접속

더보기
# 실행중인 컨테이너 접속(쉘)
docker attach [컨테이너 ID 또는 식별자]

컨테이너 삭제

더보기
# 컨테이너 강제 삭제
docker rm -f [컨테이너 ID 또는 식별자]

# 컨테이너 강제 삭제 및 할당된 볼륨 삭제
docker rm -f -v [컨테이너 ID 또는 식별자]

컨테이너 실행 상태 유지하기(sleep)

더보기
# sleep 상태 유지
docker run -d [이미지 이름] sleep infinity

컨테이너 정보 조회

더보기
# Path, Args, State 등 세부 정보 출력
docker inspect [컨테이너 이름 또는 식별자 ID]

# 특정 정보 출력
docker inspect [컨테이너 이름 또는 식별자 ID] -f '{{json .Path}}'

컨테이너 로그 정보 조회

더보기
# 특정 컨테이너 로그 정보 출력
docker logs [컨테이너 이름 또는 식별자 ID]

# 타임스탬프와 함께 로그 정보 출력
docker logs -t [컨테이너 이름 또는 식별자 ID]

# 실시간 로그 정보 출력
docker logs -f [컨테이너 이름 또는 식별자 ID]

# --since Xs: 특정 x초 전 부터의 로그 정보 출력(해당 컨테이너에 로그 정보가 많을 경우 사용)
docker logs -f --since 20s [컨테이너 이름 또는 식별자 ID]

# --until Xs: 현재 시간을 기준으로 X초 전 까지의 로그 정보 출력 
docker logs --until 10m [컨테이너 이름 또는 식별자 ID]

# 20분 전 부터 시작하여 ~ 10분 동안의 로그 정보 출력
docker logs -f --since 20m --until 10m [컨테이너 이름 또는 식별자 ID]

# 특정 시간대 로그 정보 출력
docker logs -f --since=2024-01-10T00:00:00Z --until=2024-01-20T00:00:00Z [컨테이너 이름 또는 식별자 ID]

컨테이너 재시작 정책

더보기
# 컨테이너 오류가 발생해 종료 되더라도 다시 실행시키기 위해 재시작 정책을 사용한다.
# 수동으로 정지하지 않는 이상 오류 발생 시 계속 재시작을 수행한다.(--rm 옵션 사용 불가)
docker run -d --restart always [이미지 이름] sleep 1

# 컨테이너 내부의 init 프로세스가 성공적으로 종료(exit 0)된게 아닌 경우 게속 재시작
docker run -d --restart on-failure [이미지 이름] sleep 5

# 위와 동일하나 최대 재시작 횟수를 지정한다.
docker run -d --restart on-failure:2 [이미지 이름] sh -c 'sleep 1; exit 1'

# always 옵션과 동일하나 차이점은 도커 데몬이 시작되더라도 재시작 되지 않는다.
docker run -d --restart unless-stopped [이미지 이름] sleep 2

Volume 생성/조회/삭제

더보기
# docker run으로 실행할 때, -v 옵션을 지정하지 않으면 익명 볼륨으로 생성된다.

# 영구 볼륨 생성
docker volume create [볼륨 이름]

# 볼륨 정보 조회(실제 데이터가 저장되는 경로 확인 가능하다.)
docker volume inspect [볼륨 이름]

# 볼륨 삭제
docker volume rm [볼륨 이름]

커스텀 Network 설정

더보기
# 커스텀 네트워크를 사용하는 경우 컨테이너 이름으로 IP를 대신할 수 있다.
# 커스텀 네트워크 생성
docker network create [네트워크 이름]

# 컨테이너 실행 시 커스텀 네트워크 지정
docker run -d --network naro [이미지 파일 이름]

# 각각의 컨테이너를 커스텀 네크워크로 구성하고 동일 별칭을 사용하면, 로드 밸런싱 용도로 사용할 수 있다.
docker run --rm -d --name test1 --network naro --network-alias [별칭] [이미지 이름]
docker run --rm -d --name test2 --network naro --network-alias [별칭] [이미지 이름]

자주 사용되는 명령어 모음

더보기
# run: Apache 이미지가 없을 경우 자동으로 이미지를 pull(다운로드)하고 빌드 후 컨테이너를 실행한다.
# --rm : run으로 수행된 명령어(컨테이너 실행) 종료 시 자동으로 컨테이너를 삭제한다.(운영 환경 사용 금지)
# -d : 컨테이너를 백그라운드에서 동작시킨다.
# -p : 포트 지정한다. 8080은 호스트 환경에서 접근하는 포트이고, 80은 도커 내부에서 접근하는 포트이다.
# --name: 컨테이너 식별 이름을 지정한다.
# httpd : 이미지 이름이며, 2.4는 버전 정보이다. 참고로 버전 정보 미 기입 시 latest 버전으로 다운로드 및 실행된다.
docker run --rm -d --name httpd -p 8888:80 httpd

# -v: .(현재 디렉터리)와 컨테이너 내부 경로(/usr/local/apache2/htdocs/)를 연결 한다.(마운트 기능으로, 파일과 폴더 공유가 가능하다.), ro: 읽기 속성 부여 
docker run --rm -d --name httpd -p 8888:80 \
    -v .:/usr/local/apache2/htdocs/:ro \
    httpd:2.4

# 커스텀 볼륨 생성
docker volume create mysqlvolume1

# -v: 생성한 mysqlvolume1 영구 볼륨과 MySQL 데이터 저장 경로(/var/lib/mysql/data)를 연결한다.
# -e: 환경 변수 지정(여기서는 DB 패스워드)
docker run --rm -d --name mysqldb \
    -v mysqlvolume1:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root mysql:8.0


# Dockerfile이 현재 경로에 위치한다고 가정
# .(현재 경로)를 기준으로 Dockerfile에 작성된 명령을 실행해 test 이라는 이름의 이미지를 생성한다.
# 현재 경로가 아닌 다른 경로일 경우 해당 파일이 위치한 경로를 지정해주면 된다.
# 추가로, GitHub 레포에 공유되는 Dockerfile을 사용하는 경우, 참조 파일들이 존재할 수 있기 때문에 Dockerfile만 가져오면 안되고 프로젝트 전체를 clone해야 한다.(종속성 문제가 있음)
docker build -t test .

# IMAGE_VERSION : 버전 정보를 지정한다.
docker build -t test --build-arg IMAGE_VERSION=10 .

# 현재 동작중인 컨테이너의 환경 변수 확인
docker exec [컨테이너 ID 또는 식별자] env

# 현재 동작중인 컨테이너 쉘 연결
docker exec -it [컨테이너 ID 또는 식별자] bash

Dockerfile 구성 요소

더보기
FROM
: 빌드할 이미지를 지정한다. 이미지가 로컬에 없으면 도커 허브에서 해당 이미지를 검색해 다운로드 받는다. ex) FROM httpd:latest
RUN
: 컨테이너에서 실행할 명령어를 지정한다. 보통 컨테이너에 필요한 라이브러리를 다운받는 명령어나 디렉토리를 만드는 명령어를 지정한다. ex) RUN apt-get update
ADD
: 컨테이너에서 배치할 파일이나 디렉토리를 지정한다. ex) ADD ./test /test : 현재 디렉토리에 위치한 test 파일을 컨테이너의 루트 디렉터리에 test 이름으로 배치한다.
CMD
: 컨테이너가 시작할 때 실행할 명령어를 지정한다. RUN은 이미지를 빌드할 때 실행되고 CMD는 이미 빌드된 이미지(컨테이너)가 시작할 때 실행된다. CMD가 여러 개일 경우 마지막 CMD만 실행된다.
ENTRYPOINT
: CMD와 동일하다. 다만, CMD에서는 param값을 대체할 수 있지만 ENTRYPOINT는 불가능하다. ENTRYPOINT와 CMD는 같이 쓰이면서 CMD는 default값을 가진 param을 갖는 명령어를 지정할 때 쓰이고 ENTRYPOINT는 그렇지 않을 때 쓰인다. 또한 CMD와 마찬가지로 ENTRYPOINT가 여러 개일 경우 마지막 ENTRYPOINT만 실행된다.
LABEL
: key-value 형식의 메타데이터를 이미지에 추가한다.
ENV
: LABEL과 동일하지만 메타데이터 대신 환경변수를 설정한다.
VOLUME
: 컨테이너 내의 특정 디렉터리를 지정한다. 지정한 디렉터리를 외부 경로와 마운트되어 컨테이너가 삭제 되더라도 해당 디렉토리의 정보는 삭제되지 않고 보존 할 수 있다. 여기서 말하는 외부 경로는 호스트의 /var/lib/docker/volumes 경로를 의미한다.
profile

naroSEC

@naroSEC

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...