Docker란?
컨테이너 기반 가상화 도구의 일종이다.
가상화(Virtualization)
물리적인 컴퓨터 자원을 가상으로 분할하여 여러개의 가상 컴퓨터 환경을 만들어 내는 기술.
대표적으로 다음과 같은 종류가 있다.
- Docker에서 사용하는 컨테이너 가상화
- KVM과 같은 hypervisor 가상화
- Virtual Box 같이 host OS에 Guest OS를 올려 사용하는 호스트 가상화
컨테이너(Container)
- 리눅스 커널의 chroot, namespace, cgroup 등의 기능을 기반으로 만들어진, 프로세스 단위의 격리 환경.
- 특정 서비스를 실행하는 데에 필요한 라이브러리, 언어와 같은 종속성 항목을 모두 포함하고 있음.
- VM과 달리 Container와 hostOS는 OS 자원을 공유하며, VM 대비 더 적은 메모리를 사용함.

Base Concept and Commands
- Image
- 특정 프로세스를 실행하기 위한 모든 파일(소스코드, 라이브러리, 컴파일된 실행파일), 종속성, 설정 값을 지니고 있다.
- immutable, 즉 읽기 전용의 템플릿이라 생각하면 된다.
- 이미지는 여러 레이어로 이루어져 있다.
- 이미지끼리 레이어를 공유할 수 있다. 이미지에 변경사항이 생겼을 때 불필요한 재빌드를 하는 것을 막아준다.
- dockerfile(docker image를 생성하기 위한 스크립트)로 관리한다.
//이미지 빌드 명령어
$docker build -t {tag} {location of Dockerfile}
//이미지 목록. 이 커맨드를 통해 image의 id를 확인할 수 있다.
$docker images
//이미지 지우는 명령어.
$docker rmi {image id}
//이미지의 히스토리 확인. 이미지를 생성할 때 실행한 명령어도 확인 가능하다.
$docker image history {image name}
- Container
- 이미지를 실행한 상태, 이미지의 인스턴스.
- 프로그램을 캡슐화 하여 격리된 상태에서 실행시킨 형태. 각 컨테이너는 독립적이다!
- 컨테이너는 커널, 호스트 OS의 자원(시스템 콜)등을 공유한다.
// image-name에 해당되는 이미지로부터 컨테이너를 생성, 실행하는 명령어
option 목록
-d: detached mode. background 실행을 한다.
-it: 컨테이너를 종료하지 않고, 터미널 입력을 계속 전달한다.
-p {host-port}:{containter-port}: host port와 container port를 bind
$docker run {options} {image-name} {commands}
// running중인 컨테이너를 멈추는 명령어
$docker stop {container-id}
// container 삭제 명령어
$docker rm {container-id}
// 컨테이너 목록을 확인하는 명령어
$docker ps
// 컨테이너 목록을 확인하는 명령어. (정지된 컨테이너 포함)
$docker ps -a
- Volume(named)
컨테이너가 삭제 될 때 마다 그 곳에 쓰여진 데이터가 유실되는 것을 방지하기 위해 사용한다.
볼륨을 도커 컨테이너의 특정 디렉토리에 마운팅 하면, 저장된 file이 host에서도 persist(유실되지 않고 지속)하게 된다.
By creating a volume and attaching (often called “mounting”) it to the directory the data is stored in,
we can persist the data. As our container writes to the todo.db file, it will be persisted to the host in the volume.
* 주의점
container를 down 시켜도 volume은 제거되지 않는다.
따라서 연결된 컨테이너가 없는 볼륨을 제거하려면 따로 prune을 사용할 것.
docker volume create {name}
docker run -dp {port}:{port} -v {volume}:{mount dir} {image}
docker volume inspect {volume}
docker volume prune
- Bind mounts
can control mount point in the host -> 호스트 내의 특정 디렉토리를 도커 컨테이너에 마운팅 할 수 있다.
bind mount를 소스코드에 사용하면 코드의 변화를 바로 관찰할 수 있다 dev mode container
When working on an application, we can use a bind mount to mount our source code into the container to let it see code changes, respond, and let us see the changes right away.
For Node-based applications, nodemon is a great tool to watch for file changes and then restart the application. There are equivalent tools in most other languages and frameworks.
bind mount-> docker에서 nodemon 실행(nodemon src/index.js)-> 하위 js code에 변화가 생기면 노드가 재시작
-> change를 끝냈으면 image를 재 빌드 (docker build -t {image tag})
docker run -v {host경로}:{container dir} {image}
docker logs -f {container id}
- Docker daemon (dockerd)

- 도커 엔진의 핵심 구성요소로, 도커 호스트에서 컨테이너를 관리하고 실행한다.
- docker의 client를 통해 개발자가 명령어를 사용하면, 해당 명령은 api로서 dockerd로 보내진다.
- docker daemon은 api를 수신하고, 이미지 / 컨테이너 / 볼륨 / 네트워크와 같은 객체들을 관리한다.
Docker Compose
multi-container docker application을 정의 및 실행하기 위한 도구
컨테이너가 여러 개 있을 때 단순 커맨드로는
컨테이너의 실행 순서, 각 컨테이너의 config를 관리하기가 쉽지 않다. -> 컴포즈를 사용하는 이유!
주로 세 단계로 이루어진다.
- 각 컨테이너의 dockerfile을 작성한다. 만약 사용할 이미지가 이미 있다면 생략 가능!
- docker-compose.yml 파일을 작성하고, 해당 파일 내에 컨테이너 실행 및 구축을 위한 정의를 작성한다.
- docker-compose up 커맨드를 실행하여 컨테이너를 개시한다.
예시
version: "3.9" # optional since v1.27.0
services: # 실행하려는 컨테이너(서비스) 정의
web: # 서비스 이름
build: . # 도커 이미지를 빌드해서 사용할 것이다
ports: # 호스트 포트 : 컨테이너 포트 맵핑
- "8000:5000"
volumes: # 해당 서비스에서 사용할 볼륨 정의
- .:/code
- logvolume01:/var/log
depends_on: # 해당 컨테이너가 실행되면 시작해라
- redis
redis:
image: redis # 레디스 이미지를 사용할 것
volumes:
logvolume01: {}
특징
- multiple isonlated environments on a single host
컴포즈는 프로젝트 네임으로 각 환경들을 구분한다.
따라서 프로젝트끼리 interfere하는 것을 방지할 수 있다.
기본은 디렉토리 이름이지만, -p 옵션이나 COMPOSE_PROJECT_NAME 환경변수로 구분 가능하다.
- preserve volume data when containers are created
compose는 up이 실행될 때 이전 run의 컨테이너들을 찾아내서 volume을 복사해온다.
-> 컴포즈가 볼륨의 관리를 해준다.
- only recreate containers that have changed
컴포즈가 컨테이너를 만들 때 쓰는 configuration을 캐싱한다
-> 변화가 생길 때만 재생성
-variables and moving a composition between environments
커맨드
docker-compose up //run
docker-compose up -f {yml file name} --build //시작 전 이미지를 새로 생성
// -d 서비스 실행 후 콘솔로 빠져나옴
// --force-recreate 컨테이너를 지우고 재생성
docker-compose stop
docker-compose start
docker-compose down //컨테이너와 네트워크를 삭제
docker-compose exec {commands} //실행 중인 컨테이너에서 명령어 실행
docker-compose logs {service name} //서비스의 로그 확인'Backend > devOps' 카테고리의 다른 글
| Terraform 101 (0) | 2022.11.29 |
|---|---|
| 쿠버네티스 101 (0) | 2022.11.23 |
| CI/CD의 개념과 gitHub Actions&gitLab CI/CD (0) | 2022.10.06 |