Getting started with docker

English (N/A)

Docker 시작하기

현대의 대부분의 소프트웨어는 클라우드 환경에서 동작하게 되고, 서비스를 잘게 나누어 다양한 클라우드 환경에서 쉽게 배포하고 운영하기 위한 컨테이너 기술의 필요성이 대두되었다. 도커는 운영체제 위에서 프로세스를 독립적으로 실행가능하게 만들어 주는 리눅스 컨테이너 기술이다.

기본적으로 container 라는 환경을 구성하고 그 안에서 docker image를 실행시키는 방식이다.

여기서 docker image는 실행에 필요한 코드 및 패키지 등 모든 필요사항을 가진다.

도커는 운영체제 위에서 동작하며 같은 커널에서 어플리케이션이 동작하지만 메모리나 OS 등이 완벽하게 격리될 수 있다.

Installation

아래와 같이 brew 로 docker 를 설치하고, 권한을 할당하여 sudo 없이 docker 를 실행 할 수 있게 해준다.

brew install docker docker-compose docker-machine &&
sudo chmod 666 /var/run/docker.sock

Colima

Colima란?

Colima 는 macOS와 Linux에서 컨테이너 런타임을 실행할 수 있게 해주는 오픈소스 도구다. 내부적으로 Lima VM 위에서 Docker(또는 containerd)를 실행하는 방식으로 동작한다.

Docker Desktop이 일정 규모 이상의 기업에서 유료화되면서, 무료 대안으로 Colima가 주목받게 되었다. 가볍고 CLI 기반이라 리소스 사용량이 적고, 기존 Docker CLI와 완벽하게 호환된다.

설치

brew install colima docker docker-compose

Colima만 설치하면 Docker 데몬을 대체할 수 있다. docker, docker-compose 는 CLI 클라이언트로, Colima가 제공하는 Docker 소켓에 연결되어 동작한다.

기본 사용법

# Colima 시작 (기본 설정: 2 CPU, 2GB 메모리, 60GB 디스크)
colima start

# 리소스를 지정해서 시작
colima start --cpu 4 --memory 8 --disk 100

# 아키텍처 지정 (Apple Silicon에서 x86 이미지 실행 시)
colima start --arch x86_64

# 상태 확인
colima status

# 중지
colima stop

# 삭제 (VM 자체를 제거)
colima delete

Colima가 시작되면 Docker 소켓이 자동으로 설정되어, 기존에 사용하던 docker 명령어를 그대로 사용할 수 있다.

# Colima 시작 후 기존 docker 명령어 그대로 사용
docker ps
docker build -t myapp .
docker run -p 8080:80 myapp
docker compose up -d

여러 인스턴스 실행

Colima는 프로필을 통해 여러 VM 인스턴스를 동시에 실행할 수 있다.

# 기본 인스턴스 시작
colima start

# 별도 프로필로 추가 인스턴스 시작
colima start --profile dev --cpu 2 --memory 4
colima start --profile test --cpu 1 --memory 2

# 특정 프로필 상태 확인
colima status --profile dev

# 프로필 목록 확인
colima list

Colima는 macOS 전용이다

Colima는 macOS에서 Docker를 쓰기 위해 내부적으로 Linux VM을 띄워주는 도구다. Linux 서버에서는 Docker Engine이 커널 위에서 네이티브로 동작하기 때문에 Colima를 쓸 필요가 없다.

Docker Desktop 유료화 이슈도 Docker Desktop(GUI 앱)에만 해당하고, Linux에서 사용하는 Docker Engine(CE)은 무료다.

환경권장
macOS (개발)Colima + Docker CLI
Linux 서버Docker Engine 직접 설치

Linux 서버에서 Colima를 쓰면 불필요한 VM 오버헤드만 추가되므로, apt 또는 yum 으로 Docker Engine을 바로 설치하면 된다.

Colima vs Docker Desktop 성능 비교

macOS 기준으로 Colima는 Docker Desktop 대비 전반적으로 더 나은 성능을 보여준다.

메모리 사용량

  • Docker Desktop: idle 상태에서 2GB+
  • Colima: idle 상태에서 ~400MB
  • Colima가 약 5배 가볍다

실제 테스트 수행 시간 (M1 Pro, VirtioFS 기준)

런타임API 테스트Moose 테스트
Docker Desktop (gRPC-FUSE)117.5s305s
Docker Desktop (VirtioFS)54.7s92.9s
Colima (VirtioFS)43.7s82.2s

VirtioFS 기준으로 Colima가 Docker Desktop보다 10~20% 정도 빠르다. 파일 I/O 읽기 성능에서는 더 큰 차이를 보이기도 한다.

체감 차이가 가장 큰 부분은 유휴 메모리 사용량과 시작 속도다. 성능이 최우선이라면 OrbStack 도 고려해볼 만하지만, 유료 플랜이 있다.

Docker Desktop에서 Colima로 전환

Docker Desktop을 사용하고 있었다면, Docker Desktop을 종료한 뒤 Colima를 시작하면 된다. 기존 Docker 이미지와 컨테이너는 별도의 환경이므로, 필요한 이미지는 다시 pull 해야 한다.

# 1. Docker Desktop 종료
# 2. Colima 시작
colima start

# 3. 정상 동작 확인
docker info

먼저 도커를 실행하면 도커 엔진이 실행되며 도커 이미지를 도커 엔진이 실행하면 컨테이너가 생성된다.

먼저 container를 설정하기 위해서 우리는 dockerfile을 작성해야 하는데 기본적인 dockerfile의 형태는 다음과 같다.

Dockerfile

# set node.js environment
FROM node:8-alpine

# set working directory
WORKDIR /user/src/app

# 앱 의존성 설치
COPY package*.json ./

# docker image안에 앱의 소스코드를 넣음
COPY . .

RUN npm install

# Make port 80 available to the world outside this container
EXPOSE 8080

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["npm","start"]


# RUN chmod +x ./docker-entry.sh
# ENTRYPOINT "./docker-entry.sh"

그 뒤에 다음 명령어를 통해 docker image를 만들어 준다.

docker build -t test . // image의 별명을 입력받아 docker image를 만들어 준다.
docker image ls // 이미지의 목록을 불러온다.

앱 실행하기

다음 명령어를 통해 해당 machine의 4000번 포트를 외부 80번 포트에 연결해 준다.

docker run -p 4000:80 -d test # test 라는 이미지를 실행한다.

Docker container 중지하기

docker container stop __container_name_or_id__

docker 로그인 하기

docker login

Docker image 배포하기

# docker image tag 붙이기
docker tag image username/repository:tag
# docker 배포하기
docker push username/repository:tag

도커 허브의 이미지 받아서 실행하기

docker run -p 4000:80 username/repository:tag

지우기

docker container rm __image_id__

모든 도커 컨테이너 삭제

docker rm $(docker ps -a -q)

모든 도커 이미지 삭제

docker rmi $(docker images -q)

실행중인 컨테이너의 쉘에 접근

docker exec -it container_id /bin/bash

docker 실행하면서 bash 실행하기

docker run -p 80:80 -it {컨테이너 이름} /bin/bash

Docker network

아래 옵션을 주면 네트워크 포트가 매핑된다.

하지만 아래와 같은 host 네트워크는 리눅스 운영체제에서만 동작하고 mac 이나 window 환경에서는 호스트의 포트에 매핑이 되지 않으니 주의하여야 한다.

docker run --network host

Docker Compose

container 내에서 여러개의 image가 돌아야 하고 서비스가 복잡해 질수록 많은 이미지들을 관리해야할 필요가 생기게 된다. 여기서 docker-compose.yml을 사용한다.

즉, docker compose 는 여러개의 도커 컨테이너가 동작하기 위한 방법을 기술한 것이다.

Docker-compose.yml 파일은 docker container가 배포 환경에서 어떻게 동작해야 할지 명시한다.

docker compose의 동작 순서는 다음과 같다.

  1. dockerfile 과 함께 어플리케이션의 환경을 정의하여 어디에든 배포할 수 있도록 설정한다.
  2. docker compose 파일에 서비스들을 정의하여 독립된 환경에서 함께 실행될 수 있도록 한다.
  3. docker compose 를 실행시킨다.

docker-compose example

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"
docker swarm init
docker stack deploy -c docker-compose.yml getstartedlab
doocker service ls

앱과 swarm을 내리기

docker stack rm getstartedlab
docker swarm leave --force

여기서 swarm 이란 여러 서버에서 동작하는 앱처럼 분산환경에서 배포하기 위한 것이다. 여러 대의 machine을 swarm 이라 불리는 dockerized cluster로 합쳐준다.

swarm을 실행하면 전체 노드들의 관리자로써 swarm을 통제할 수 있게 된다.

다음은 해당 machine을 swarm의 관리자로 임명하고 초기화하는 명령어이다.

docker swarm init

Docker-machine을 통해 virtual machine을 생성할 수 있는 hypervisor를 만들 수 있다.

아래 명령어를 docker-machine을 통해 vm들을 생성하는 명령어이다.

docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
docker-machine ls

다음 명령어를 통해 특정 vm이 swarm의 manager가 되도록 한다.

docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"

특정 vm이 swarm에 참여하도록 하려면 다음 명령어를 수행한다.

docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:2377"

swarm에 포함된 node 들을 보는 명령어는 다음과 같다.

docker-machine ssh myvm1 "docker node ls"

참고