Docker 명령어

leesj·2021년 8월 26일
0

Docker

목록 보기
2/5

도커에서 주로 사용되는 명령어 정리

1.Docker container

1)Container list

# docker ps

2)Container handling

  • -i -t 옵션으로 생성된 도커 컨테이너 내부로 진입
# docker attach [container_name]
  • 컨테이너 정보 확인
    - 해당 이미지가 어느 CPU 아키텍처에서 사용되도록 설계됐는지에 대한 정보
# docker inspect [container_name]

3)Container logging

도커 컨테이너에서 실행되는 애플리케이션 레벨에서 로그가 기록되도록 개발해 별도의 로깅 서비스를 쓸 수도 있지만 도커는 컨테이너의 표준 출력(StdOut)고 에러(StdErr) 로그를 별도의 메타데이터 파일로 저장하며 이를 확인하는 명령어를 제공한다.

  • 컨테이너의 로그 확인
# docker logs [container_name]
# docker logs --tail 2 [container_name] // 마지막 2줄의 로그 확인
  • 로그 확인시 추가적인 옵션들
# docker logs --since [Unix time] [container_name] // 특정 시간 이후의 로그를 확인
# docker logs -f -t [container_name] // 로그를 스트림으로 확인

컨테이너 로그는 JSON 형태로 도커 내부에 저장된다.
위치: /var/lib/docker/containers/CONTAINERID/{CONTAINER_ID}/{CONTAINER_ID}-json.log

컨테이너 내부의 출력이 너무 많은 상태로 방치하면 json 파일의 크기가 계속해서 커져 호스트의 저장 공간을 전부 사용 할 수 있음

이것을 방지하기 위해 --log-opt 옵션으로 컨테이너 json 로그 파일의 최대 크기를 지정 가능.

  • max-size: 로그 파일의 최대 크기(기본적으로는 무제한, k,m,g 단위 사용가능)
  • max-file: 로그 파일의 개수
# docker run -it \
--log-opt max-size=10k --log-opt max-file=3 \
--name log-test ubuntu:14.04

Container resource

컨테이너 메모리 제한

  • 입력할 수 있는 단위는 m(megabyte), g(gigabyte)
  • 제한 가능한 최소 메모리는 4MB(할당된 메모리 초과시 컨테이너 자동 종료)
# docker run -d --memory="[limit]" --name [container_name] [image_name]
# docker run -d --memory="1g" --name memory_1g nginx

Swap 메모리의 제한

  • 기본적으로 컨테이너의 Swap 메모리는 메모리의 2배로 설정되지만 별도로 지정할 수 있다.
# docker run -it --name [container_name] --memory=[limit] --memory-swap=[limit] ubuntu:14.04
# docker run -it --name swap_500m --memory=200m --memory-swap=500m [image_name]

Container CPU 제한

  • --cpu-shares: 컨테이너에 가중치를 설정해 해당 컨테이너가 CPU를 상대적으로 얼마나 사용할 수 있는지 나타낸다.(호스트 시스템에 존재하는 CPU를 비중만큼 나눠 쓸 것인지 명시하는 옵션)
    - 상대적인 값을 가지며 아무런 설저 하지 않은경우 1024(1의 비중 의미) 로 설정을 가진다.
# docker run -i -t --name [container_name] --cpu-shares [rate] [image_name]
# docker run -i -t --name cpu_share --cpu-shares 1024 ubuntu:14.04
  • --cpuset-cpu: 호스트에 CPU가 여러 개 있을 때 컨테이너가 특정 CPU만 사용하도록 설정
  • cpu_set: "0,3" 은 1, 4번째 CPU를, "0-2"는 1, 2, 3번째 CPU를 사용하도록 설정
# docker run -d --name [container_name] --cpuset-cpus=[cpu_set] [image_name] stress --cpu 1
# docker run -d --name cpuset_2 --cpuset-cpus=2 alicek106/stress stress --cpu 1
  • --cpu-period, --cpu-quota
    컨테이너의 CFS(Completely Fair Scheduler) 주기는 기본적으로 100ms로 설정되지만 run 명령어 옵션 중 위의 두개를 사용해 이 주기를 변경할 수 있다.
    - --cpu-period: 기본적으로 100000 이며, 이는 100ms를 뜻한다.
    - --cpu-quota: --cpu-period 에 설정된 시간 중 CPU 스케줄링에 얼마나 할당할 것인지를 설정한다.
    - 아래의 예시는 100000 중 25000 만큼을 할당해 CPU 주기가 1/4로 줄었으므로 일반적인 컨테이너보다 CPU 성능이 1/4 정도로 감소한다. 이는 즉 컨테이너는 --cpu-quota 값/--cpu-period 값 만큼 CPU 시간을 할당받는다는 것을 의미한다.
# Docekr run -d --name [container_name] --cpu-period=[period] --cpu-quota=[quota] [image_name] stress --cpu 1
# Docekr run -d --name quota_1_4 --cpu-period=100000 --cpu-quota-25000 alicek106/stress stress --cpu 1
  • --cpus: --cpu-period, --cpu-quota 와 도잉ㄹ한 기능을 하지만 좀 더 직관적으로 CPU의 개수를 직접 지정한다는 점에서 다르다. 예를 들어 --cpus 옵션에 0.5를 설정하면 --cpu-period=100000 또는 --cpu-quota=50000 과 동일하게 컨테이너의 CPU를 제한할 수 있다.
# docker run -d -name [container_name] --cpus=[cpus] [image_name] stress --cpu 1
# docker run -d -name cpus_container --cpus=0.5 alicek106/stress stress --cpu 1

병렬 처리를 위해 CPU를 많이 소모하는 워크로드를 수행해야 한다면 --cpu-share, --cpus, --cpu-preiod, --cpu-quota 옵션보다는 --cpuset-cpu 옵션을 사용하는 것이 좋다.
--cpuset-cpu 옵션을 사용하면 특정 컨테이너가 특정 CPU에서만 동작하는 CPU 친화성(Affinity)을 보장할 수 있고, CPU 캐시 미스 또는 컨텍스트 스위칭과 같은 성능을 하락시키는 요인을 최소화할 가능성이 높아지기 때문이다.

Blcok

컨테이너를 생성할 때 아무런 옵션도 설정하지 않으면 컨테이너 내부에서 파일을 읽고 쓰는 대역폭에 제한이 설정되지 않는다. 하나의 컨테이너가 블록 입출력을 과도하게 사용하지 않게 설정하려면 run 명령어에서 옵션을 지정해 입출력을 제한할 수 있다.
단, Direct I/O의 경우애만 블록 입출력이 제한되며, Buffered I/O 는 제한되지 않는다.

  • --device-write-bps, --device-read-bps: 각기 쓰고 읽는 작업의 초당 제한을 설정하며, kb, mb, gb단위로 제한할 수 있다.
// 초당 쓰기 작업의 최대치를 1MB 로 제한하는 명령
# docker run -it --device-write-bps /dev/xvda:1mb ubuntu:14.04

run 명령어에서 설정된 컨테이너의 자원 제한을 변경

# docker update [변경할 자원 제한] [container_name]
# docker update --cpuset-cpus=1 centos ubuntu 

4) 파일 전송

$ docker cp [host_path] [Container_id]:[Container_path]

5) 컨테이너 삭제

중지/dangling 컨테이너 삭제

$ docker container prune

모든 컨테이너를 삭제 함

$ docker container rm -f $(docker container ls -aq)

2.Docker image

  • 도커 허브에서 도커 이미지 검색
# docker search [imanage_name]
# docker search [ubuntu]

1)Image 생성

  • docker commit 명령어 입력하여 컨테이너를 이미지로 생성
  • -a는 author 를 뜻하며 이미지의 작성자를 나타내는 메타데이터를 이미지에 포함
# docker commit [option] CONTAINER [REPOSITORY[:TAG]]
# docker commit -a "alicek106" -m "my first commit" commit_test commit_test:first

2)Image 구조

  • 이미지의 레이어 구조 확인. 이미지가 어떤 레이어로 생성됐는지 확인 가능
# docker history [image_name:version]
# docker history [myasql:8]

3)Image 추출

  • save: 설정정보 함께 바이너리 파일로 저장
  • -o 옵션은 추출될 파일명을 입력
# docekr save -o [binary_filename] [image_name:image_version]
# docekr save -o ubuntu_14.04.tar ubuntu:14.04

# docker load -i ubuntu_14.04.tar
  • export: 설정정보 없이 컨테이너의 파일 시스템을 .tar 파일로 추출
  • import: 추출된 파일을 이미지로 다시 저장
# docker export -o [binary_filename] [container_name]
# docker export -o rootFS.tar mycontainer

# docker import rootFS.tar myimage:0.0 

이미지를 단일 파일로 저장하는 것은 효율적인 방법이 아니다.
추출된 이미지는 레이어 구조의 파일이 아닌 단일 파일 이미 때문에 여러 버전의 이미지를 추출하면 이미지 용량을 각기 차지하게 되기 때문

4)Image 배포

이미지 배포를 위한 2가지 방법

  • 도커 허브 저장소 사용
  • 사설 레지스트리 사용

도커 허브 저장소

  • 저장소에 올릴 이미지 생성
# docker commit [continer_name] [registry_name/image_name:image_version]
# docker commit commit_container1 alicek107/my-image-name:0.0
  • tag 명령어: 이미지의 이름을 추가. 같은 이미지를 가리키는 새로운 이름이 추가되는 원리
# docker tag [old_image_name] [new_image_name]
# docker tag my-image-name:0.0 alicek107/my-image-name:0.0
  • 도커 저장소 로그인/로그아웃
# docker login
# docker logout
  • 이미지 저장소에 업로드
# docker push [repogitory_name/image_name:image_version]
# docker push alicek107/my-image-name:0.0
  • 이미지 내려받기
# docker pull [registry_name/image_name:image_version]
# docker pull alicek107/my-image-namm:0.0

5) Image 삭제

단일 이미지 삭제.

  • 컨테이너를 삭제 한 후에 이미지를 삭제 해야 함
  • -f 강제 삭제 옵션이 있으나 이미지 레이어 파일 실제 삭제 아닌 이름만 삭제 하므로 컨테이너 삭제 후 이미지 삭제 -> 댕글링(dangling) 이미지화.
# docker rmi [image_name:image_version]
# docker rmi commit_test:first
  • 댕글링 이미지 확인 및 삭제
# docker images -f dangling=true // 댕글링 이미지 확인
# docker image prune // 댕글링 이미지 한꺼번에 삭제
  • 이미지 삭제시에는 삭제되는 부모 이미지가 존재하지 않아야 해당 이미지의 파일이 실제로 삭제됨

시스템 상의 모든 Docker image 삭제

$ docker image rm -f $(docker image ls -q)

3.Image Registry

1)도커 사설 레지스트리

  • 컨테이너 기반 사설 레지스트리 컨테이너 생성
# docker run -d --name myregistry -p 5000:5000 --restart=always registry:2.6
// HTTPS 를 사용하지 않는 레지스트리 컨테이너에 push, pull 할 수 있도록 설정
# docker run -d --name myregistry -p 5000:5000 --restart=always registry:2.6 DOCKER_OPTS="--insecure-registry=192.168.99.101:5000"
  • 사설 레지스트리에 이미지 Push 하기
# docker tag my-image-name:0.0 ${DOCKER_HOST_IP}:5000/my-image-name:0.0
# docker push 192.168.99.101:5000/my-image-name:0.0

참고자료
용찬호, 『시작하세요!도커/쿠버네티스: 친절한 설명으로 쉽게 이해하는 컨테이너 관리』, 위키북스(2020)

0개의 댓글