초창기 Docker 명령어들은 docker --help 입력 시 그룹화 없이 쭉 나열해 보여줬다.
때문에 처음 봤을 때 보기 어려울 뿐만 아니라 내가 사용한 명령어임에도 불구하고 기억에 잘 남지 않았다.
Docker 개발자들도 이를 인지했는지 Docker 1.13 버전부터 Management Commands라는 것을 발표했다.
Docker Command가 제공하는 기능들을 conatiner, image, network, service, volume, system 등으로 Top-Level에서 분류하고, 각 하위 명령어가 관련 명령어들을 포함하는 기능이다.
기존 사용자를 위해 예정 명령어들도 그대로 유지하는 것 같다.
그러나 실제로 사용해보니 Management Commands를 사용한 지 얼마 안 되었음에도 예전 방식보다 더 체계적이고, 직관적으로 다가와서 기억에 잘 남았다. 따라서 이 문서에서는 Management Commands를 기준으로 작성할 것이다.
Docker 정보 확인
Docker 버전 확인
$ docker version
Docker 실행 환경 확인
$ docker system info
Docker 디스크 사용 현황 확인
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 10 10 846.2MB 48.41MB (5%)
Containers 20 0 6.019kB 6.019kB (100%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
Docker Image
Image 조회하기
$ docker search nginx
Image 가져오기
$ docker image pull nginx:latest
Local에 존재하는 Image 목록 확인
$ docker image ls
Image 상세 정보 확인
$ docker image inspect nginx:latest
$ docker image inspect --format="{{ .Os}}" nginx:latest
linux
Image에 Tag 설정
$ docker image tag nginx hyunto/webserver:0.1
Docker Hub에 Image 업로드
###
# Docker Hub 로그인
###
$ docker login
###
# Docker Hub에 이미지 업로드
###
$ docker image push hyunto/webserver:0.1
Image 삭제
###
# 특정 이미지 삭제
###
$ docker image rm ubuntu:latest
###
# 사용하지 않는 이미지 모두 삭제
###
$ docker image prune
Image Export / Import
###
# Docker Image를 tar 파일로 저장
###
$ docker image save -o export.tar nginx:latest
###
# tar 파일로 저장된 Image를 읽어오기
###
$ docker image load -i export.tar
Docker Container
Conatiner 생성 및 실행
컨테이너 생성 및 실행 시 다양한 추가 옵션이 존재한다. 필요에 맞게 추가해 사용한다.
- CPU, Memory 사용량
- 로컬 디렉토리를 컨테이너의 특정 경로와 공유 (Volume)
- DNS 서버, IP 주소, MAC 주소, Hostname
- Network 타입
- /etc/hosts 파일에 내용 추가
- 포트 매핑, 노출
- 백그라운드(Detach 모드) 사용 여부
- 환경변수, 사용자, Working Directory
- Read Only 여부
###
# 생성 후 실행
###
$ docker container create --name webserver -p 10080:80 nginx:latest
$ docker container start webserver
###
# 생성과 실행을 한 번에
###
$ docker container run --name webserver2 -d -p 10081:80 nginx:latest
###
# 일시정지 및 해제
###
$ docker container pause webserver
$ docker container unpause webserver
###
# 재실행
###
$ docker container restart webserver
###
# 종료
###
$ docker container stop webserver
###
# 컨테이너 생성 및 Interactive 실행
# - 컨테이너 생성, 실행 후 bash 쉘 실행
###
$ docker container run -it --name test ubuntu:latest /bin/bash
Container 목록과 상태 확인
###
# 아래의 명령어는 모두 List Containers 기능을 수행한다.
###
$ docker container ls
$ docker container ps
$ docker container list
Container 시스템 자원 사용 현황 확인
$ docker container stats webserver
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b90ed107fa90 webserver 0.00% 1.867MiB / 1.952GiB 0.09% 1.42kB / 1.27kB 0B / 0B 2
Container에서 실행 중인 프로세스 확인
$ docker container top webserver
PID USER TIME COMMAND
3473 root 0:00 nginx: master process nginx -g daemon off;
3513 101 0:00 nginx: worker process
Container 포트 사용 현황 확인
$ docker container port webserver
80/tcp -> 0.0.0.0:10080
Container 로그 출력
$ docker container logs webserver
172.17.0.1 - - [16/Nov/2019:13:53:40 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.1" "-"
Container 안의 파일 복사
###
# Container -> Host
###
$ docker container cp webserver:/etc/nginx/nginx.conf /tmp/nginx.conf
###
# Host -> Container
###
$ docker container cp ./nginx.conf webserver:/etc/nginx/nginx.conf
Container 생성 이후 변경점 확인
컨테이너가 생성된 이후 부터 컨테이너 안에서 직접 변경/조작을 한 내용을 출력한다.
$ docker container diff webserver
실행 중인 Container를 Export / Import
###
# 실행 중인 Container의 디렉토리와 파일들을 모아 tar 파일로 생성
###
$ docker container export webserver > webserver.tar
###
#
###
$ cat webserver.tar | docker image import - hyunto/webserver:1.0
Container 접속
$ docker container exec -it webserver /bin/bash
root@b90ed107fa90:/#
Container 삭제
###
# 정지 중인 특정 컨테이너 삭제
###
$ docker container rm webserver
###
# 정지 중인 모든 컨테이너 삭제
###
$ docker container prune
Docker Network
네트워크 목록 확인
도커 컨테이너 실행시 네트워크를 명시적으로 지정하지 않으면 기본값인 "bridge" 네트워크로 설정된다.
(docker container inspect 명령어로 확인 가능)
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
0152ec479c2f bridge bridge local
eceaa9fe24e5 host host local
19e8ff8eb010 none null local
네트워크 생성
--drive 옵션으로 "bridge", "overay" 또는 커스텀 네트워크 드라이브를 선택할 수 있다.
사용자 정의 네트워크를 사용하는 컨테이너들은 dockerd 내부 DNS 서버에 의해 Name Resolve가 된다.
따라서 사용자 정의 네트워크 내에 생성된 컨테이너들 간에 컨테이너 이름 또는 --net-alias 옵션으로 설정된 앨리어스 이름으로 쉽게 통신할 수 있다.
반면 기본 브릿지 네트워크는 자동으로 Name Resolve를 할 수 없기 때문에 docker container run 명령어 실행시 --link 옵션을 추가하여 컨테이너 내 /etc/hosts 파일에 등록해야 한다.
$ docker network create --driver=bridge custom-network
cc2a78046af11c2c91f6a2c9755749589da49751649af2587c20e5e391ab766f
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
0152ec479c2f bridge bridge local
cc2a78046af1 custom-network bridge local
eceaa9fe24e5 host host local
19e8ff8eb010 none null local
네트워크 연결
###
# 생성된 컨테이너에 custom-network 연결
###
$ docker network connect custom-network webserver
###
# 컨테이너 시작 시 custom-network 지정
###
$ docker container run -itd --name webserver --net=custom-network nginx:latest
###
# 네트워크 연결 해제
###
$ docker network disconnect custom-network webserver
네트워크 상세 정보 확인
$ docker network inspect custom-network
네트워크 삭제
$ docker network rm custom-network
Docker 관리
불필요한 이미지와 컨테이너 일괄 삭제
$ docker system prune --all
'IT 인프라 > DevOps' 카테고리의 다른 글
Docker 이미지 용량을 줄이는 Tip (0) | 2019.11.19 |
---|---|
나만의 Docker Compose Cheat Sheet (0) | 2019.11.18 |
나만의 Dockerfile Cheat Sheet (0) | 2019.11.18 |
일반 계정으로 docker 명령어 사용하기 (0) | 2019.11.16 |
git-secret (0) | 2019.11.16 |