도커는 애플리케이션 뿐만 아니라 실행에 필요한 시스템 환경을 모아서 컨테이너(*Container*)로 관리합니다. 이렇게 만든 것을 도커 이미지(*Docker Image*)라고 하는데 이 이미지로 만든 컨테이너는 도커가 설치된 곳이라면 어디든 똑같이 동작합니다. 그곳이 Windows 든, macOS 든, Linux 든 상관이 없고 온프레미스(*On-premise*)든 클라우드든 상관 없습니다. 이를 이용하면 개발자가 커밋을 할 때마다 [Jenkins](https://jenkins.io/) 와 같은 지속적인 통합(*Continuous Integration, CI*) 툴에서 해당 소스를 도커 이미지로 빌드하고 이미지 리파지토리에서 이미지를 버전 별로 관리할 수 있습니다. 해당 이미지를 어느 환경이든 배포만 하면 독립적으로 동작하기 때문에 지속적인 딜리버리(*Continuous Delivery, CD*)가 가능합니다. 도커는 특히 분산 환경을 쉽게 구축할 수 있는 클라우드 서비스와 잘 맞습니다. 그래서 주요 클라우드 프로바이더들은 모두 컨테이너 실행 환경을 쉽게 관리할 수 있는 서비스를 제공합니다.
도커를 구성하는 컴포넌트

- Docker Engine : 도커 이미지를 생성하고 컨테이너를 실행하는 핵심 기능.
- Docker Registry : 도커 이미지 공개 및 공유. 도커 허브도 도커 레지스트리를 사용.
- Docker Compose : 여러 컨테이너를 관리하기 위한 툴.
- Docker Machine : 로컬의 VirtualBox 나 퍼블릭 클라우드에 도커 실행 환경을 구축하는 툴.
- Docker Swarm : 여러 도커 호스트를 마스터(Master)와 노드(Node) 구조로 클러스터화하는 툴. 쿠버네티스와 비슷한 기능.
도커 기본동작
"도커 이미지"는 해당 파일 실행에 모든 것을 담고있고, "도커 컨테이너"는 이미지를 부분별로 쪼개서 담아둔 뒤 실행하는 역할을 한다.

Build - 이미지 만들기

- 도커는 애플리케이션과 실행에 필요한 라이브러리, 미들웨어, OS, 네트워크 설정 등 필요한 모든 파일을 모아서 도커 이미지로 만든다.
- 도커 이미지는 명령어를 이용해 수동으로 만들 수도 있지만 자동으로 빌드와 배포를 하는 CI/CD 환경에서는 도커 설정 파일(Dockerfile)을 이용해 자동으로 만들 수 있다.
Ship - 이미지 공유

- 도커 이미지를 업로드해서 공유하는 저장소를 도커 레지스트리(Docker Registry)라고 부름.
- 대표적으로는 도커의 공식 레지스트리인 Docker Hub 가 있습니다. 도커 허브에서는 업체에서 제공하는 공식 이미지를 받을 수 있다.
- 이런 베이스 이미지를 활용하면 환경을 빠르고 안전하게, 그리고 자동으로 구축할 수 있다
- Github 와 같은 형상관리툴과 연동해서 Dockerfile 을 관리하고 도커 이미지를 자동으로 빌드해서 도커 허브로 배포도 가능함
Run - 컨테이너 동작
- 도커는 도커 이미지를 가지고 컨테이너를 생성해서 동작시킨다
- 하나의 이미지를 가지고 여러 개의 컨테이너를 만들어낼 수도 있다. 도커는 컨테이너를 생성하고 관리하기 위한 여러 명령을 제공함
- 실제 업무에서는 보통 한 대의 호스트에 모든 컨테이너를 동작시키는 것이 아니라 여러 호스트로 된 분산 환경인 경우가 많다. 이런 분산 환경에서 여러 노드의 컨테이너를 관리하기 위해 쿠버네티스(Kubernetes, k8s)와 같은 컨테이너 오케스트레이션 툴(Container Orchestration Tool)을 주로 사용한다.
기본 명령어
- search : 이미지 검색
->
docker search <이미지 이름>
- pull : 이미지를 받음
->
docker pull <이미지 이름>:<태그>
- images : 이미지 목록 출력
->
docker images
- run : 컨테이너로 생성한 이미지를 이용하여 Bash Shell 실행
->
docker run <옵션> <이미지 이름> <실행할 파일>
- 옵션
- -d : 백그라운드에서 실행
- -name : 컨테이너에 이름 부여
- -p : 호스트와 컨테이너 간의 포트 배포/바인드를 위해 사용
- 4567 포트로 리스닝하고 있는 HTTP서버를 호스트 컴퓨터에서 80번 포트로 접속 가능
- ex) docker run -p 4567:80 -d nginx:latest → 127.0.0.1:4567 접속
- ps : 모든 컨테이너 목록을 출력
->
docker ps
- start : 정지한 컨테이너를 시작
->
docker start <컨테이너 이름>
- restart : OS 재부팅처럼 컨테이너를 재시작함
->
docker restart <컨테이너 이름>
- attach : 컨테이너에 접속
->
docker attach <컨테이너 이름>
- exec : /bin/bash를 통하지 않고 외부에서 컨테이너 안의 명령을 실행
->
docker exec <컨테이너 이름> <명령> <매개 변수>
- stop : 컨테이너를 정지함
->
docker stop <컨테이너 이름>
- rm : 컨테이너 삭제 / rmi : 이미지 삭제
->
docker rm <컨테이너 이름> / docker rmi <이미지 이름>:<태그>
- 시스템 상의 모든 컨테이너 삭제
→
$ docker rm -f $(docker ps -aq)
- 시스템 상의 모든 이미지 삭제
→
$ docker rmi $(docker images -q)
Share article