본문 바로가기

Server

도커

컨테이너

컨테이너란 호스트 OS상에 논리적인 구획(컨테이너)을 만들고, 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션 등을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것

도커

Docker(도커)는 애플리케이션의 실행에 필요한 환경을 하나의 이미지로 모아두고, 그 이미지를 사용하여 다양한 환경에서 애플리케이션 실행 환경을 구축 및 운용하기 위한 오픈소스 플랫폼. 내부에서 컨테이너 기술을 사용하고 있는 것이 특징

 

도커는 인프라 환경을 컨테이너로 관리한다. 애플리케이션의 실행에 필요한 모든 파일 및 디렉토리들을 컨테이너로서 모아버린다. 컨터이너의 바탕이 되는 Docker 이미지를 Docker Hub와 같은 리포지토리에서 공유한다.

도커의 특징 - 확장성/이식성

  • 도커가 설치되어 있다면 어디서든 컨테이너를 실행할 수 있음
  • 특정 회사나 서비스에 종속적이지 않음
  • 쉽게 개발 서버를 만들 수 있고 테스트 서버 생성도 간편함

도커의 특징 - 표준성

  • 컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포과정이 동일해짐

도커의 특징 - 이미지

  • 이미지에서 컨테이너를 생성하기 때문에 반드시 이미지를 만드는 과정이 필요
  • Dockerfile을 이용하여 이미지를 만들고 처음부터 재현 가능
  • 빌드 서버에서 이미지를 만들면 해당 이미지를 이미지 저장소에 저장하고 운영서버에서 이미지를 불러옴

도커의 특징 - 환경변수

  • 설정은 보통 환경변수로 제어함
  • MYSQL_PASS = password와 같이 컨테이너를 띄울 떄 환경변수를 같이 지정
  • 하나의 이미지로 환경변수에 따라 동적으로 설정파일 생성 가능

도커의 특징 - 자원관리

  • 컨테이너는 삭제 후 새로 만들면 모든 데이터가 초기화됨
  • 업로드 파일을 외부 스토리지와 링크하여 사용하거나 S3같은 별도의 저장소가 필요
  • 세션이나 캐시를 memcashed나 redis와 같은 외부로 분리

스케줄링

  • 컨테이너를 적당한 서버에 배포해 주는 작업
  • 여러 대의 서버 중 가장 할일 없는 서버에 배포하거나 그냥 차례대로 배포 또는 아예 랜덤하게 배포
  • 컨테이너 개수를 여러 개로 늘리면 적당히 나눠서 배포하고 서버가 죽으면 실행 중이던 컨테이너를 다른 서버에 띄워줌

클러스터링

  • 여러 개의 서버를 하나의 서버처럼 사용
  • 여기저기 흩어져 있는 컨테이너도 가상 네트워크를 이용하여 마치 같은 서버에 있는 것처럼 쉽게 통신

서비스 디스커버리

  • 서비스를 찾아주는 기능
  • 클러스터 환경에서 컨테이너는 어느 서버에 생성될지 알 수 없고 다른 서버로 이동할 수도 있음 따라서 컨테이너와 통신을 하기 위해서 어느 서버에서 실행중인지 알아야 하고 컨테이너가 생성되고 중지될 때 어딘가에 IP와 Port같은 정보를 업데이트해줘야 함
  • 키-벨류 스토리지에 정보를 저장할 수도 있고 내부 DNS 서버를 이용

도커 컨테이너 명령어

docker run

도커 이미지를 사용하여 컨테이너를 만드는 동시에 컨테이너를 실행한다.

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

옵션 설명
-d 컨테이너를 백그라운드로 실행하며, 실행할 때 container Id를 출력한다.
-h 호스트 이름을 설정한다.
-p 컨테이너 내부 포트와 외부 포트를 매핑하여 포트 포워딩을 한다.
-v 호스트와 컨테이너의 디렉토리를 연결
-e 환경 변수를 설정한다.
--name 컨테이너 이름을 설정한다.
--restart 컨테이너가 있으면 재시작한다.
--rm 컨테이너를 종료한 후 자동으로 컨테이너를 삭제한다.
-it -i 와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
--network 네트워크 연결

docker ps [OPTIONS]

실행 중인 컨테이너 리스트를 출력한다.

-a 옵션을 추가하면 종료 상태의 컨테이너 리스트까지 출력한다.

docker stop [CONTAINER ID or NAME]

실행 중인 컨테이너를 종료 상태로 만든다.

docker start [CONTAINER ID or NAME]

종료 상태인 컨테이너를 실행 상태로 만든다.

docker kill [CONTAINER ID or NAME]

컨테이너를 강제 종료한다.

docker rm [CONTAINER ID or NAME]

컨테이너를 지운다.

docker exec -it [CONTAINER ID or NAME] bash

실행 중인 도커 컨테이너에 접속한다.

도커 이미지 관련 명령어

docker images

도커 호스트 머신에 있는 도커 이미지 리스트들을 확인한다.

docker rmi [option] IMAGE [image ID]

로컬 호스트 머신에 있는 도커 이미지를 삭제한다. 삭제할 도커 이미지 ID를 인자로 입력하고 만약 삭제하려는 이미지가 다른 이미지에 사용되고 있다면 삭제할 수 없다.

-force 옵션으로 강제로 삭제 가능

docker pull [image name]:[tag name]

도커 이미지 저장소에서 이미지 이름, 태그와 매칭 되는 도커 이미지를 로컬 호스트 머신으로 복사한다.

만약 tag name을 생략하면 자동으로 최신(latest) 태그로 복사한다.