3 분 소요

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

Q. 도커를 쓰는 이유? : 비교적 효율적인 가상화 방식 + 통일된 개발 환경 + 배포의 동시성

  1. Virtualization : 응용 프로그램 실행 시 운영체제 수준 가상화 방식이 성능 손실이 더 적고 빠르게 동작한다.
  2. Development : 운영체제에 상관없이 같은 환경에서 개발할 수 있게 해준다.
  3. 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 run 옵션 옵션 설명
-d 백그라운드 모드 (detached mode)
-p [호스트 포트:컨테이너 포트] 호스트와 컨테이너의 포트를 연결 (port forwarding)
http://호스트 IP:호스트 포트로 컨테이너의 포트 접속
-v [호스트의 디렉터리] 호스트의 디렉터리를 컨테이너의 디렉터리에 연결 (mount)
-e [환경변수] 컨테이너 내에서 사용할 환경변수 설정 (environment variable)
--name [컨테이너 이름] 컨테이너 이름 설정 (container name)
-rm 프로세스 종료 시 컨테이너 자동으로 제거 (remove container)
-link [컨테이너 이름:주소] 컨테이너와 컨테이너 연결 (link container)
[주소:포트번호]로 컨테이너에 접속
-it 리눅스 터미널 입력을 위한 옵션 (interactive / Pseudo-tty)
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]
이미지나 컨테이너의 세부 정보 출력

태그:

업데이트: