도커에서 주로 사용되는 명령어 정리
# docker ps
# docker attach [container_name]
# docker inspect [container_name]
도커 컨테이너에서 실행되는 애플리케이션 레벨에서 로그가 기록되도록 개발해 별도의 로깅 서비스를 쓸 수도 있지만 도커는 컨테이너의 표준 출력(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/{CONTAINER_ID}-json.log
컨테이너 내부의 출력이 너무 많은 상태로 방치하면 json 파일의 크기가 계속해서 커져 호스트의 저장 공간을 전부 사용 할 수 있음
이것을 방지하기 위해 --log-opt 옵션으로 컨테이너 json 로그 파일의 최대 크기를 지정 가능.
# docker run -it \
--log-opt max-size=10k --log-opt max-file=3 \
--name log-test ubuntu:14.04
# docker run -d --memory="[limit]" --name [container_name] [image_name]
# docker run -d --memory="1g" --name memory_1g nginx
# 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]
# 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
# 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
# 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
# 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 캐시 미스 또는 컨텍스트 스위칭과 같은 성능을 하락시키는 요인을 최소화할 가능성이 높아지기 때문이다.
컨테이너를 생성할 때 아무런 옵션도 설정하지 않으면 컨테이너 내부에서 파일을 읽고 쓰는 대역폭에 제한이 설정되지 않는다. 하나의 컨테이너가 블록 입출력을 과도하게 사용하지 않게 설정하려면 run 명령어에서 옵션을 지정해 입출력을 제한할 수 있다.
단, Direct I/O의 경우애만 블록 입출력이 제한되며, Buffered I/O 는 제한되지 않는다.
// 초당 쓰기 작업의 최대치를 1MB 로 제한하는 명령
# docker run -it --device-write-bps /dev/xvda:1mb ubuntu:14.04
# docker update [변경할 자원 제한] [container_name]
# docker update --cpuset-cpus=1 centos ubuntu
$ docker cp [host_path] [Container_id]:[Container_path]
$ docker container prune
$ docker container rm -f $(docker container ls -aq)
# docker search [imanage_name]
# docker search [ubuntu]
# docker commit [option] CONTAINER [REPOSITORY[:TAG]]
# docker commit -a "alicek106" -m "my first commit" commit_test commit_test:first
# docker history [image_name:version]
# docker history [myasql:8]
# 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
# docker export -o [binary_filename] [container_name]
# docker export -o rootFS.tar mycontainer
# docker import rootFS.tar myimage:0.0
이미지를 단일 파일로 저장하는 것은 효율적인 방법이 아니다.
추출된 이미지는 레이어 구조의 파일이 아닌 단일 파일 이미 때문에 여러 버전의 이미지를 추출하면 이미지 용량을 각기 차지하게 되기 때문
이미지 배포를 위한 2가지 방법
# docker commit [continer_name] [registry_name/image_name:image_version]
# docker commit commit_container1 alicek107/my-image-name:0.0
# 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
# docker rmi [image_name:image_version]
# docker rmi commit_test:first
# docker images -f dangling=true // 댕글링 이미지 확인
# docker image prune // 댕글링 이미지 한꺼번에 삭제
$ docker image rm -f $(docker image ls -q)
# 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"
# 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)