도커란?
- 컨테이너 기반의 오픈소스 가상화 플랫폼
- 다양한 운영체제와 시스템 환경 상에서, 서버 셋업을 위한 작업이 각각 다르고 복잡한데, 도커를 이용하여 해당 컨테이너를 실행하면 동일한 서버를 셋업할 수 있다.
가상머신(VM)과 도커의 차이
가장 큰 차이점은 게스트 OS의 유무이다.
가상머신에는 게스트 OS가 설치되어 있어 상당량의 자원을 필요로 하지만, 컨테이너에는 게스트 OS가 없기 때문에 자원 면에서 훨씬 효율적이다.
그렇다면 반드시 컨테이너가 좋을까? 그렇지는 않다.
가상머신은 다른 게스트 OS와 분리 독립된 공간과 자원을 할당받아 사용되기 때문에, 보안성 측면에서 효율적이라고 할 수 있다.
도커의 주요 구성 요소
도커 엔진(docker engine)
- 도커는 서버/클라이언트 구조로 이루어져 있다.
- 서버는 도커 daemon process 형태로 동작한다. (→ 백그라운드에서 계속 실행 중)
- 이 도커 daemon process에 요청하기 위해 프로세스 간 통신 기법으로 Rest API를 사용한다
도커 이미지(docker image)
- 도커 컨테이너를 생성하기 위한 명령들을 가진 템플릿(스크립트의 집합)
- 여러 이미지들을 Layer로 쌓아서, 원하는 형태의 이미지를 만드는 것이 일반적임
특징
- 도커 이미지의 용량은 수백MB ~ 수GB에 달하지만, 가상머신의 이미지에 비하면 굉장히 적은 용량이다.
- 이미지는 상태 값을 가지지 않고 변하지 않는다. (immutable)
- 하나의 이미지는 여러 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.
- 도커는 Dockerfile이라는 파일로 이미지를 만든다. Dockerfile에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하기 쉽도록 명시되어 있다. (그래서 누구나 이미지 생성과정을 확인할 수 있고, 수정도 가능하다.)
도커 컨테이너(docker container)
- docker image가 리눅스 컨테이너 형태로 실행한 상태(인스턴스)로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 또는 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술
특징
- 컨테이너는 이미지 Layer에 읽기/쓰기(read and write) Layer를 추가하는 것으로 생성 및 실행된다. 따라서 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용되며, 바뀐 부분을 읽기/쓰기 Layer에 적게 된다.
- 컨테이너는 종료되었다고 메모리에서 삭제되지 않고 남아있다. 삭제하기 위해서는 명시적으로 삭제해야하며, 즉 종료가 되어도 컨테이너와 읽기/쓰기 Layer는 그대로 존재하기 때문에 다시 시작할 수 있다.
- 따라서 컨테이너를 삭제했다는 것은 컨테이너에서 생성한 파일이 사라졌다는 의미랑 동일하다.
도커 기본 명령어
도커 기본 명령
도커 명령어는 CLI의 형태로 수행된다.
docker 명령 옵션 선택자(이미지 ID/컨테이너 등)
도커를 실행하는 명령어
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
컨테이너 목록 확인하기: ps
docker ps [OPTIONS]
OPTIONS를 주지 않으면 현재 실행중인 컨테이너 목록만을 보여주고, 옵션으로 -a 또는 —all 를 주게 되면 e실행되었다가 종료된 컨테이너도 추가로 보여준다.
이는 컨테이너는 종료되어도 삭제되지 않고 남아있는 것을 보여주는 예시인데, 종료된 컨테이너는 다시 실행할 수 있고 컨테이너의 읽기/쓰기 Layer는 그대로 존재한다. 명시적으로 삭제를 해주어야 컨테이너가 깔끔하게 제거된다.
컨테이너 중지하기: stop
docker stop [OPTIONS] CONTAINER [CONTAINER...]
중지하려면 docker stop 뒤에 도커 ID를 입력하면 되는데, 도커 ID의 길이는 64자리다. 명령어의 인자로 사용할 때는 이 ID값을 전부 다 입력할 필요가 없으며, 다른 ID와 겹치지 않는 앞자리의 최소자리만 입력해도 된다.
ex) docker ID: abcdefg… → abc 만 입력해도 괜찮다.
컨테이너 제거하기: rm
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm -v $(docker ps -a -q -f status=exited 명령어를 입력하면 중지된 컨테이너 ID를 한번에 가져와서 일괄적으로 삭제할 수 있다
이미지 목록 확인하기: images
docker images [OPTIONS] [REPOSITORY[:TAG]]
이미지 다운로드하기: pull
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
이미 이미지를 다운받은 상태에서 업데이트가 이루어지면 pull을 통해서 업데이트할 수 있다.
이미지 삭제하기: rmi
docker rmi [OPTIONS] IMAGE [IMAGE...]
가지고 있는 MySQL 이미지를 위와 같이 삭제할 수 있다. 위에 언급했다시피 ID값을 모두 입력하지 않아도 중복되지 않는 최소 ID값만 입력하더라도 명령어 인자로 사용할 수 있다.
한번 실행해보기!
예시 - 우분투 20.04 컨테이너
도커 실행 후 docker run ubuntu: 20.04 를 입력하면 다음과 같이 우분투 20.04 이미지가 다운로드되고 컨테이너가 실행된다. 정상적으로 잘 실행되었지만 컨테이너 생성 후 어떤 행위에 대한 명령을 내리지는 않았기 때문에 컨테이너가 생성되자마자 종료된다.
이후 docker run —rm -it ubuntu:20.04 /bin/bash 명령어를 통해 컨테이너를 실행할 수 있다.
- —rm : 프로세스 종료 시 컨테이너 자동 삭제
- -it : bash 쉘에서 키보드 입력을 하기 위함
예시 2 - MySQL 컨테이너
docker pull -platform linux/amd64 mysql:8.0.28 명령어를 통해 이미지를 다운 받을 수 있다.
docker images 명령어를 통해 성공적으로 다운받아진 것을 확인할 수 있다. 물론 애플리케이션의 이미지 탭에서도 확인 가능하다.
도커 컴포즈(Docker Compose)
- 도커를 커맨드라인에서 명령어로 작업하는 것이 아니라, YAML방식의 설정파일을 이용한 Docker Compose라는 툴을 제공한다.
- 여러 개의 컨테이너가 유기적으로 묶여서 하나의 어플리케이션으로서 동작이 필요할 경우 유용하게 사용할 수 있는 기능이다.
- 리눅스 환경의 경우 별도로 설치해주어야 하지만, macOS 또는 Windows에서는 최초 설치 시 같이 설치되므로 따로 설치해줄 필요가 없다.
도커 컴포즈는 컨테이너의 설정이 정의된 YAML 파일을 읽어 도커 엔진을 통해 컨테이너를 생성한다.
따라서, docker-container.yml 파일을 작성한 후 compose 명령어를 통해 사용할 수 있다.