같이보기

규칙

  • commit 이나 기타 이미지 선택할 때 이미지의 tag를 지정할 수 있다
    <이미지명>:<테그>
    • 동명의 이미지를 생성 하고 태그를 다르게 해서 버전을 관리한다
  • 원격저장소 이미지 이름 규칙:
    • <hub아이디>/이미지명
  • 태그 규칙:
    • 아무것도 지정안하면 latest
    • 태그는 hub에서는 커밋로그 임. 버전관리를 확실히 할려면 태그를 붙이는게 좋다
  • 명령 구문 여러게 주기
    • bash -c “명령어1 && 명령어2”

기본 사용법

컨테이너 생성 & 실행

# 이미지를 Docker Hub 에서 내려 받기
docker pull <이미>
 
# 이미지 목록 확인
docker images 
 
# 해당 이미지 id 로 컨테이너를 실행하고 bash 를 활성화하여 접속
docker run -it <이미지id>

컨테이너 종료

  • 컨테이너의 접속 중인 상태라면

    • exit 쳐서 나오기
    • ctrl+d로 나오기
  • 컨테이너가 백그라운드 상태라면

    # 컨테이너 목록 확인
    docker ps -a 
     
    docker stop <컨테이너id>
     
    # 강제종료
    ===
    docker kill <컨테이너id>
    ===

컨테이너 다시 실행

# 컨테이너 목록 확인
docker ps -a 
 
# 컨테이너 재시작
docker restart <컨테이너 ID>
 
# 컨테이너 진입 (attach 사용) 
docker attach <컨테이너 ID>
 
# 컨테이너 진입 (exec 사용)
docker exec -it <컨테이너 ID> /bin/bash
  • attach: 이전과 동일한 쉘 세션에 진입
    • 만일 이전에 /home/test 에 접속되있던 상태였다면 똑같이 거기로 진입됨
  • exec: 새로운 쉘 세션을 생성하여 진입
    • 그냥 putty를 하나 더 켜서 같은 사용자에 접근 했다 보면 됨

컨테이너 & 이미지 삭제

  • 컨테이너가 종료되있다 가정
  • 참고로 실행중인 컨테이너의 이미지를 삭제 하고 싶다고 -f 옵션을 붙어 강제 삭제 한다고 해도 걍 테크만 없어지는 거지 디스크에서 삭제되는건 아니기에 삭제할 이유가 없다
# 컨테이너 id 확인 
docker ps -a
 
# 컨테이너 삭제
docker rm <컨테이너 id>
 
# 이미지 id 확인
docker images
 
# 이미지 삭제
docker rm <컨테이너 id>

컨테이너를 종료하지 않고 쉘 빠져 나오기

(Ctrl + P) + Q 단축키 입력

Docker Hub 에 로그인

  • private 저장소 pull 받거나 push 할때 필요
docker login

Docker Hub에 이미지 push 하기

  • 위에 로그인이 되어있어야
  • 태그는 안 붙이면 latest
  • 이미 원격저장소에 있는 상태이고 새로운 커밋을 작성할 시
    • 저장소 이미지 이름이랑 commit 된 이미지 이름이 같아야함
    • 단 태그는 달라도 무관
    • 같은 태그면 해당 태그의 커밋이 바뀐다
# 원하는 컨테이너 커밋
docker commit <컨테이너id> <hub 아이>/<저장할이미지>:<태그 | null>
 
# 만일 이미지 이름이 원격이랑 안맞는 경우
# 이미지 이름 바꾸기
===
docker tag <이미지id> <hub아이>/<저장할이미지>:<태그 | null>
===
 
# Docker Hub에 push
docker push <컨테이너>

이미지, 컨테이너 저장 & 불러오기

사실 이 방법 보다 Dockerfile 쓰는게 더 좋긴 하다

  • 이미지 저장 & 불러오기

    # 이미지 tar로 저장
    docker save -o <파일>.tar <이미지id>
     
    # 이미지 불러오기 
    docker load -i <파일>.tar
  • 컨테이너 저장 & 불러오기
    (여기서 함정은 불러오기 하면 이미지로 불러와지는)

    # 컨테이너 tar로 저장
    docker export -o <파일>.tar <컨테이너id>
     
    # 저장한 컨테이너를 이미지로 불러오기
    # cat 으로 tar 모두 읽어서 파이프 라인으로 하는 방법
    cat <파일>.tar | docker import - <이미지>

백그라운드 실행

  • attach 를 쓰는 방법

    # 표준 입/출력 콘솔 활성화 하고 백그라운드로 실행한다
     docker run -it -d <이미지id> <>
     
    # 진행중인 쉘에 진입
    docker attach <컨테이너id>
    • 컨테이너가 실행중 일때만 사용가능하다
    • 다만 이 방법은 기존에 진행중이던 로그는 체크하지 못한다
    • 표준 입력이 필요한 상황에서는 해당 방법을 써야 함
  • logs를 쓰는 방법

    # 표준 입/출력 콘솔 활성화 하고 백그라운드로 실행한다
     docker run -it -d <이미지id> <>
     
    # 컨테이너 진행 로그를 실시간으로 출력
     docker logs -f <컨테이너id>
    • 컨테이너가 종료되었을 경우에도 사용가능하다
    • 다만 표준 입력은 처리하지 못한다
    • 대신 모든 진행 로그를 볼 수있다
  • 포그라운드 실행 후 백그라운드로

    # 포그라운드로 실행
     docker run -it <이미지id> <>
     
    # 이후 종료하지 않고 쉘에 빠져 나오기
    (Ctrl + P) + Q  단축키 입력
    • 이렇게 실행해놓고 위 2가지 방법 중 하나로 로그를 보면 된다

백그라운드 종료 방지

  • 명령이 종료되면 자동으로 컨테이너가 중지한다
  • 명령에 sleep infinity를 추가해 컨테이너를 유지 시킨다
# sleep infinity 만 사용
 docker run -i -d 35a88802559d sleep infinity
 
# 다른 커멘드와 사용
docker run -i -d 35a88802559d bash -c "apt update && sleep infinity"

Dockerfile로 이미지 빌드하기

크로스 플렛폼

  • arm, x86 등 여러 플렛폼 지원 가능하기 빌드하기
    # 베이스 이미지의 지원 플렛폼 보기
    # 당연한말 이지만 베이스 이미지가 지원하는 플렛폼만 가능하니까 
    docker buildx imagetools inspect <베이스이미>
     
    # platform 값을 원하는 플렛폼 만큼 추가 하여 빌드
    # --load 를 --push로 바꾸면 바로 원격에 push 하는것도 가능
    docker buildx build --platform linux/amd64,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x --load -t <이미지:테> .
처음 빌드 할때 작업
  1. containerd 활성화 하기

    # /etc/docker/daemon.json 파일 만들기
     sudo [편집기] /etc/docker/daemon.json 
     
    	#해당 파일에 이렇게 입력하고 저장
    	{
    	  "features": {
    	    "containerd-snapshotter": true
    	  }
    	}
     
    #docker 재시작
    systemctl restart docker
  2. builder 생성하기

    • 기본 builder 는 크로스 플렛폼 미지원이라 docker-container 드라이버로 builder 생성
    # platform 값을 원하는 플렛폼 만큼 추가 하여 빌드
    docker buildx create --name multi-arch-builder --platform linux/amd64,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x --driver docker-container --bootstrap --use
(참고) builder 기본값으로 되돌리기
# 빌더 목록 보기
docker buildx ls
 
# default 빌더로 되돌리기
docker buildx use default
 
# 만든 빌더 삭제
docker buildx rm <생성한 빌더이>

단일 플렛폼

일관성을 위해 docker buildx build 사용

  • arm, x86등 그 중 하나만 빌드가능 (PC 따라감)

    # --load 를 --push로 바꾸면 바로 원격에 push 하는것도 가능
    docker buildx build --load -t <이미지이름:테> .

빌드이후 정리

docker buildx prune -f --all && docker rm -f buildx_buildkit_multi-arch-builder0 && docker rmi moby/buildkit:buildx-stable-1
  • 이게 방식이 임시 컨테이너인 moby/buildkit 을 pull 을 받아 거기서 작업하는거라 빌드 완료 후 에도 컨테이너가 남아있음

케시제거

# 대부분의 케시 제거
docker system prune -a
 
# 빌드 케시 제거
docker buildx prune -f --all
 
==혹시나 정리했는데도 과하게 용량이 적은경우==
==이거 하면은 기존 컨테이너 사용불가==
sudo rm -rf /var/lib/docker/overlay2
# 서비스 재시작
sudo systemctl stop docker
sudo systemctl start docker

Docker Compose

Compose 기본 옵션

# 파일 경로 또는 파일명이 docker-compose.yml 이 아닌경우
docker compose -f <yml파>
 
# 프로젝트 이름 지정
docker compose -p <프로젝트>

Compose 컨테이너 생성 & 삭제

# 컨테이너 빌드 & 생성(재생성) 하고 실행
docker compose up -d
 
#특정 작업만(yml 에 services에 정의된) 실행
docker compose run --rm <작업> <명령|null>
 
# 프로젝트, yml 파일 지정 예
===
docker -f test.yml -p my-project compose up
===
 
# 컨테이너 삭제 볼륨, 네트워크, 이미지 삭제
docker compose down --rmi all

Compose 컨테이너 실행 & 중지

# compose 컨테이너 실행
docker compose start
 
# 프로젝트 지정 예
===
docker -p my-project compose start
===
 
# compose 컨테이너 중지
docker compose stop

Compose 상태 관리

# Compose 프로젝트 목록 보기
docker compose ls --all
 
# Compose 프로젝트 실행 상태 보기
docker compose ps --all
 
# Compose 로그 출력
docker compose logs -f

Docker Network 제어

# 네트워크 목록 보기
docker network ls
 
# 네트워크 세부 정보
docker network inspect <네트워크ID>
 
# 네트워크 생성
docker network create --driver=<드라이버> <네트워크>
 
# 컨테이너의 네트워크 연결
docker network connect <네트워크> <컨테이너id>
 
# 컨테이너와 네트워크 연결 끊기
docker network disconnect <네트워크> <컨테이너id>
 
# 네트워크 제거
docker network rm <네트워크ID>

호스트 > 컨테이너 간 파일 전송

호스트 컨테이너

docker cp <호스트파일경> <컨테이너이>:<컨테이너 내부>

컨테이너 호스트

docker cp <컨테이너이>:<컨테이너 내부> <호스트파일경> 

명령어 정리

docker pull <이미지>

허브 에서 이미지 pull 하기

docker run <옵션> <이미지id> <명령 | null>

컨테이너 생성 & 실행

  • 명령어를 지정하지 않으면 대부분 bash
  • 컨테이너 생성시 지정한 옵션값은 변경 불가

docker run -it <이미지id>

컨테이너를 터미널을 사용하여 진입한다

  • bash 사용시 -it 옵션 안하면 컨테이너가 자동으로 종료된다

옵션

  • --name [컨테이너 이름]
    • 컨테이너 이름지정 (이름을 컨테이너 식별값으로 사용가능)
  • -p [호스트포트]:[컨테이너포트]/[tcp/udp | null]
    • 컨테이너 포트 포워딩 & 포트 개방
    • 여러개 개방 하고 싶으면 -p 를 여러번 쓰면 됨
  • -d
    • 컨테이너를 백그라운드 모드로
  • -i
    • 표준입력을 열어둔다
  • -t
    • 터미널을 할당한다
  • --rm:
    • 컨테이너가 종료된 이후에 자동삭제
    • 명령을 지정한경우 해당 명령어 실행하면 자동 삭제
  • --gpus [gpu]:
    • all: 모든 gpu 사용
    • 호스트 pc에 엔비디아 그래픽 드라이버 설치 작업 필요
  • --network [네트워크 이름]:
    • 연결할 네트워크 지정
  • -v [볼륨|폴더경로:마운트될 위치]:
    • 볼륨 마운트 또는, 폴더 마운트
    • 이때 폴더를 마운트 하면 컨테이너에서 파일을 건들면 호스트 PC에 파일도 수정된다
  • --hostname [호스트 이름]:
    • 쉘 호스트 이름 변경

docker create <옵션> <이미지id> <명령 | null>

컨테이너를 실행하지 않고 생성

  • 명령어를 지정하지 않으면 대부분 bash
  • 컨테이너 생성시 지정한 옵션값은 변경 불가

옵션

run 과 동일

docker container restart <컨테이너id | 컨테이너 이름>

컨테이너 재시작 및 시작

  • 컨테이너 생성 시 입력한 명령이 있으면 그거 또 다시 실행 하는거

docker attach <컨테이너id | 컨테이너 이름>

실행중인 컨테이너의 쉘에 접속

  • 정확히 말하면 표준 입/출력 신호를 전달
  • attach의 경우 이전과 동일한 쉘 세션에 진입
    • 만일 docker run -d로 백그라운드 실행 시 포그라운드 전환 하는게 가능하다
    • 이전 진행 로그를 볼수는 없기 때문에 조금 불편하긴하다
      다만 표준 입력이 있는 프로그램 이렇게 진행 할 수밖에 없다

docker exec <옵션> <컨테이너id | 컨테이너 이름> <명령>

실행중인 컨테이너의 명령전달

docker exec -it <컨테이너id | 컨테이너 이름> /bin/bash

실행중인 컨테이너의 쉘에 접속

  • exec의 경우 새로운 쉘을 생성하여 접속됨
    • 별일 없으면 attach 로 접속함
    • 그러나 기본 쉘이 서버를 굴리고 있어서 무한대기 상태인 경우에는 해당 명령으로

옵션

  • -d:
    • 백그라운드로 명령 전달

docker ps -a

컨테이너 목록 확인

docker images

이미지 목록 확인

docker stop <컨테이너id | 컨테이너 이름>

컨테이너 종료

sudo docker kill <컨테이너id | 컨테이너 이름>

컨테이너 강제 종료

docker rm <컨테이너id | 컨테이너 이름>

컨테이너 삭제

docker rmi ubuntu <이미지>

이미지 삭제

docker logs -f <컨테이너id | 컨테이너 이름>

실시간으로 컨테이너 로그 출력

  • 만약 한번만 출력하려면 -f 빼면됨

docker commit <옵션> <컨테이너id | 컨테이너 이름> <저장 이미지 명>

컨테이너의 작업한 모든 사항을 이미지로 만들기

  • 만들어진 이미지는 docker images를 통해 볼 수 있음
  • 저장 이미지 명=이미지:태그 (태그 다는법)

옵션

  • -m: 커밋 메시지

docker tag <이미지id> <바꿀 이미지 명>

이미지에 태그, 이미지 이름 변경

  • 사실 바꾸는게 아니라 이미지가 복제 되는것
  • 태그 따로 설정안하면 latest
  • 저장 이미지 명=이미지:태그 (태그 다는법)

docker buildx build <옵션> <경로>

Dockerfile 빌드하여 이미지로 만들기

  • 최신 버전인 buildx 로 사용함
  • 경로에 경우 현제 경로면 .
  • --load, --push 옵션 중 하나는 무조건 필수

옵션

  • --load:
    • 빌드 이후 이미지 목록에 불러오기
  • --push:
    • 빌드 이후 원격에 push 하기
  • --platform [플렛폼1],[플렛폼2]...:
    • 크로스 플렛폼 지원
  • -f [파일명]:
    • 파일명이 Dockerfile 아닌경우
  • t [tag]:
    • 생성되는 이미지에 태그 달기
  • --build-arg ["키=값"]:
    • Dockerfile ARG 변수의 값 전달

docker image history <이미지id>

이미지 history 보기

docker image inspect <이미지id>

이미지 정보 보기

docker container inspect <컨테이너id | 컨테이너이름>

컨테이너 정보 보기