[Docker] 2. Docker
도커 (Docker) : 컨테이너 기반 가상화 (Container-based Virtualization)

Q. 도커를 쓰는 이유? : 비교적 효율적인 가상화 방식 + 통일된 개발 환경 + 배포의 동시성
Virtualization: 응용 프로그램 실행 시 운영체제 수준 가상화 방식이 성능 손실이 더 적고 빠르게 동작한다.Development: 운영체제에 상관없이 같은 환경에서 개발할 수 있게 해준다.Deployment: 서비스 환경과 응용 프로그램을 같이 배포할 수 있게 한다.
- 분산 어플리케이션을 클라우드 환경으로 이주한다고 가정하면,
IaaS: 서비스로서의 인프라
- 어플리케이션을 구성하는 각 컴포넌트가 모두 가상 머신에서 독립적으로 동작
- 이주 과정은 쉽지만, 가상 머신의 성능을 모두 활용하지 못하며 운영비가 비쌈
PaaS: 서비스로서의 플랫폼
- 어플리케이션을 구성하는 각 컴포넌트가 클라우드 서비스 제공자의 매니지드 서비스에 종속
- 운영비가 저렴하고 관리가 쉬우나, 이주 과정이 복잡함
… 도커를 활용한다면? : 각 컴포넌트를 컨테이너로 이주하고, 쿠버네티스 등으로 전체 어플리케이션 관리 가능
- 공식 홈페이지에서
.dmg파일을 다운로드 후 설치 - 터미널 창에 다음 명령어를 입력해 도커가 정상적으로 설치되었는지 확인
docker version // 현재 도커의 버전 확인
Client:
Cloud integration: ~
Version: ~
API version: ~
Go version: ~
Server: ~
Engine:
Version: ~
API version: ~
Go version: ~
Q. 클라이언트와 서버의 버전 정보가 따로 구성되어 있는 이유?
- 도커가 클라이언트와 서버의 역할을 각각 수행할 수 있음
- 리눅스 터미널에 도커 명령어를 입력하면 도커 클라이언트가 도커 서버로 명령을 전송하고 결과를 출력
도커 컴포넌트 (Docker Component) : 도커 엔진을 중심으로 여러 컴포넌트를 조합해 구성
-
도커 엔진 (
Docker Engine) : 도커 이미지를 생성하고 컨테이너를 관리- 로컬 이미지 캐시 담당 : 새로운 이미지가 필요할 때 이미지를 다운로드하거나, 기존 이미지를 사용
Docker API을 통해 맡은 기능 수행 → 도커 명령행 인터페이스 (Docker CLI)에서 도커API호출
-
도커 레지스트리 (
Docker REgistry) : 도커 이미지를 공개하고 공유Docker공식 레지스트리 서비스로Docker Hub가 있음- 클라우드 사업자 또한
AWS ECR,GCP Artifact Registry등의 컨테이너 레지스트리 제공
-
도커 컴포즈 (
Docker Compose) : 여러 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리- 여러 개의 컨테이너 구성 정보를 코드로 정의한 파일을 읽어 컨테이너를 순차적으로 생성
-
도커 머신 (
Docker Machine) : 가상 호스트에 도커 엔진을 설치하여 호스트를 관리- 여러 운영체제나 클라우드 환경에서 도커를 동일하게 실행하기 위해 도커의 실행 환경을 자동으로 생성
-
도커 스왐 (
Docker Swarm) : 여러 도커 호스트를 클러스터화해 관리Manger가 클러스트를 관리하거나API를 제공하고,Node가 컨테이너를 실행
도커 명령어 (Docker Command) : docker <command> 형식으로 구성
- 리눅스 터미널에 도커 명령어를 입력하면 도커 서버에서 이에 해당되는 작업 수행
- 항상
root권한으로 실행되기에$ sudo를 앞에 붙어야 함
sudo usermod -aG docker $USER # 현재 사용자를 docker 그룹에 추가
| docker 명령어 | 명령어 형식 | 명령어 설명 | ||||||||||||||||||
| docker search | $ docker search [이미지] | 도커 허브에서 이미지 검색 | ||||||||||||||||||
| docker pull | $ docker pull [사용자명/] 이미지 [:태그] | 도커 허브에서 이미지 다운로드 사용자명을 지정해 도커 허브에서 해당 사용자가 올린 이미지을 다운로드 태그로 버전을 지정해 다운로드 (latest : 최신 버전) |
||||||||||||||||||
| docker images | $ docker images | 사용 가능한 모든 이미지 목록 확인 | ||||||||||||||||||
| docker rmi | $ docker rmi 이미지 [:태그] | 다운로드한 이미지 삭제 태그로 버전을 지정해 다운로드 (latest : 최신 버전) |
||||||||||||||||||
| docker run | $ docker run [옵션] [실행할 이미지] | 이미지를 컨테이너로 생성한 뒤 컨테이너 실행 입력받은 이미지가 현재 없다면, 해당 이미지를 도커 허브에서 다운로드 실행할 파일을 지정해 직접 실행 가능 (여기서 빠져나오면 컨테이너가 정지)
|
||||||||||||||||||
| docker ps | $ docker ps [옵션] | 실행중인 모든 컨테이너 목록 확인 -a 옵션으로 정지된 컨테이너까지 모두 검색 |
||||||||||||||||||
| docker start | $ docker start [컨테이너 이름 | 컨테이너 ID] | 정지된 컨테이너 재시작 | ||||||||||||||||||
| docker stop | $ docker exec [컨테이너 이름 | 컨테이너 ID] | 실행 중인 컨테이너 정지 | ||||||||||||||||||
| docker attach | $ docker attach [컨테이너 이름 | 컨테이너 ID] | 실행 중인 컨테이너에 접속 | ||||||||||||||||||
| docker exec | $ docker exec [컨테이너 이름 | 컨테이너 ID] [명령] [매개 변수] |
컨테이너 외부에서 컨테이너 내의 명령 실행 | ||||||||||||||||||
| docker diff | $ docker diff [컨테이너 이름 | 컨테이너 ID] | 컨테이너가 실행되면서 변경된 파일 목록 확인 A : 추가된 파일 C : 변경된 파일 D : 삭제된 파일 |
||||||||||||||||||
| docker cp | $ docker cp [컨테이너 이름 | 컨테이너 ID] [:컨테이너 경로] [호스트 경로] |
컨테이너의 파일을 호스트의 디렉토리로 복사 | ||||||||||||||||||
| docker attach | $ docker attach [컨테이너 이름 | 컨테이너 ID] | 실행 중인 컨테이너에 접속 | ||||||||||||||||||
| docker rm | $ docker exec [컨테이너 이름 | 컨테이너 ID] | 생성된 컨테이너 삭제 | ||||||||||||||||||
| docker commit | $ docker commit [옵션] [컨테이너 이름 | 컨테이너 ID] [이미지 이름] [:태그] |
컨테이너를 이미지 파일로 생성 | ||||||||||||||||||
| docker build | $ docker build [옵션] [도커 파일 경로] [--tag 이미지 이름 : 이미지 태그] |
도커 파일에 설정된 내용대로 도커 이미지 생성 --tag 뒤에 이미지 이름와 이미지 태그를 설정할 수 있음 |
||||||||||||||||||
| docker history | $ docker history [이미지 이름 | 이미지 ID] [:태그] | 도커 파일에 설정된 내용대로 이미지 히스토리 생성 | ||||||||||||||||||
| docker inspect | $ docker inspect [이미지나 컨테이너 이름 | 이미지나 컨테이너 ID] |
이미지나 컨테이너의 세부 정보 출력 |