IT기술/도커 (docker)

Docker 컨테이너 유형별 완벽 가이드: 운영체제부터 데이터베이스까지

후스파 2025. 7. 5. 11:44
반응형

IT 분야에서 컨테이너는 소프트웨어의 배포와 관리를 용이하게 해주는 중요한 기술입니다. 이번 블로그 포스트에서는 다양한 유형의 컨테이너와 그 생성 방법에 대해 알아보겠습니다.


다양한 유형의 컨테이너

컨테이너 종류는 소프트웨어의 종류만큼 많습니다. 여기에는 운영 체제가 담긴 컨테이너, 웹서버 및 데이터베이스 서버용 컨테이너, 프로그램 실행을 위한 런타임 컨테이너, 그 외 다양한 소프트웨어 컨테이너 등이 포함됩니다.

리눅스 운영체제가 담긴 컨테이너

리눅스 운영체제 컨테이너는 컨테이너 내부의 파일 시스템을 다루기 위해 쉘 명령어를 사용할 수 있어야 합니다. 이를 위해 -it 옵션을 사용하여 컨테이너를 실행합니다. 다음은 주로 사용되는 리눅스 배포판입니다:

  • Ubuntu (우분투): 사용자 친화적인 데스크톱 및 서버용 배포판
  • CentOS (센트오스): 엔터프라이즈급 안정성을 제공하는 배포판
  • Debian (데비안): 안정성과 보안에 중점을 둔 배포판
  • Fedora (페도라): 최신 기술을 빠르게 도입하는 배포판
  • BusyBox (비지박스): 임베디드 시스템용 경량 배포판
  • Alpine Linux (알파인 리눅스): 보안과 경량화에 특화된 배포판

리눅스 컨테이너 생성 예시:

# Ubuntu 컨테이너 생성 및 접속
docker run -it --name ubuntu-container ubuntu:22.04 /bin/bash

# Alpine Linux 컨테이너 생성 (경량화)
docker run -it --name alpine-container alpine:latest /bin/sh

# CentOS 컨테이너 생성
docker run -it --name centos-container centos:7 /bin/bash

리눅스 컨테이너를 생성할 때는 -d 없이 -it 옵션만 사용하고, 인자로는 /bin/bash와 같은 쉘 명령어를 지정합니다.

웹서버/데이터베이스 서버용 컨테이너

웹서버는 웹 서비스를 제공하기 위해 필수적이며, 통신을 위해 포트 지정을 해야 합니다. 예를 들어 -p 8080:80 옵션을 사용하여 호스트와 컨테이너의 포트를 연결합니다.

데이터베이스 서버는 데이터베이스 관리를 위한 소프트웨어로, 기본적으로 루트 패스워드를 옵션을 통해 지정해야 합니다. 주요 웹서버 및 데이터베이스 서버는 다음과 같습니다:
웹서버:

  • httpd (아파치 웹서버): 가장 널리 사용되는 오픈소스 웹서버
  • nginx (엔진엑스 웹서버): 고성능 웹서버 및 리버스 프록시

데이터베이스:

  • mysql (MySQL 데이터베이스): 가장 인기 있는 오픈소스 관계형 데이터베이스
  • postgres (PostgreSQL 데이터베이스): 고급 기능을 제공하는 객체-관계형 데이터베이스
  • mariadb (마리아 데이터베이스): MySQL의 오픈소스 포크

모든 웹서버 및 데이터베이스 서버는 -d 옵션을 사용하여 백그라운드에서 실행됩니다. 데이터베이스 서버의 경우 -e 옵션을 통해 루트 패스워드를 지정할 수 있습니다.

프로그램 실행을 위한 런타임과 그 외 소프트웨어

특정 프로그램을 실행하기 위해서는 해당 언어의 실행 환경이 필요합니다. 다음은 주요 런타임 환경과 그 사용법입니다:

  • openjdk: 자바 런타임, java 명령을 사용
  • python: 파이썬 런타임, python 명령을 사용
  • php: PHP 런타임, 웹서버 포함과 명령만 있는 것으로 구분
  • ruby: 루비 런타임, 웹서버 포함과 명령만 있는 것으로 구분
  • perl: 펄 런타임, perl 명령을 사용
  • gcc: C/C++ 컴파일러, gcc 명령을 사용
  • node: Node.js, app 명령을 사용

그 외에도 registry, wordpress, nextcloud, redmine 등의 다양한 소프트웨어 컨테이너가 있으며, 이들은 모두 -d 옵션을 통해 백그라운드로 실행됩니다.


여러 개의 컨테이너 실행

여러 개의 컨테이너를 생성할 때는 호스트의 포트 번호가 중복되지 않도록 주의해야 합니다. 컨테이너 포트 번호는 중복되어도 무관하지만, 컨테이너 이름은 중복될 수 없습니다.

여러 개의 컨테이너 생성 예시

# 첫 번째 Apache 컨테이너
docker run --name apaex10 -d -p 8080:80 httpd

# 두 번째 Apache 컨테이너
docker run --name apaex11 -d -p 8081:80 httpd

# 세 번째 Apache 컨테이너
docker run --name apaex12 -d -p 8082:80 httpd

컨테이너 목록 및 상태 확인

컨테이너의 상태를 확인하기 위해 docker ps -a 명령어를 사용할 수 있습니다:

docker ps -a

출력 예시:

CONTAINER ID   IMAGE   COMMAND              CREATED              STATUS        PORTS                  NAMES
d1b8663fdc9f   httpd   "httpd-foreground"   About a minute ago   Up About a minute   0.0.0.0:8082->80/tcp   apaex12
ae55c774cea4   httpd   "httpd-foreground"   About a minute ago   Up About a minute   0.0.0.0:8081->80/tcp   apaex11
f0e1262665fd   httpd   "httpd-foreground"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   apaex10

컨테이너 종료, 삭제, 목록 확인

컨테이너를 종료할 때는 docker stop 명령어를 사용, 삭제할 때는 docker rm 명령어를 사용합니다:

# 컨테이너 종료
docker stop apaex10 apaex11 apaex12

# 컨테이너 삭제
docker rm apaex10 apaex11 apaex12

# 한 번에 종료 및 삭제
docker rm -f apaex10 apaex11 apaex12

컨테이너 아이디 사용

컨테이너 생성 시 --name 옵션을 통해 이름을 지정할 수 있지만, 생성 시 출력되는 난수를 통해서도 제어가 가능합니다. 그러나 컨테이너 이름을 사용하는 것이 더 편리합니다.

Nginx 웹 서버 컨테이너 생성

Nginx 웹 서버 컨테이너를 생성하는 방법은 다음과 같습니다:

docker run --name nginx-server -d -p 8090:80 nginx:latest

실행 결과:

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
7ce705000c39: Already exists 
b3e9225c8fca: Pull complete 
2b39a3d0829e: Pull complete 
6d24e34787c7: Pull complete 
066d623ff8e6: Pull complete 
49486a4a61a6: Pull complete 
34d83bb3522a: Pull complete 
Digest: sha256:0a399eb16751829e1af26fea27b20c3ec28d7ab1fb72182879dcae1cca21206a
Status: Downloaded newer image for nginx:latest

MySQL 데이터베이스 컨테이너 생성

MySQL 컨테이너를 생성하려면 반드시 인자를 사용해야 하며, 루트 패스워드를 설정해야 합니다:

docker run --name mysql-server -p 3306:3306 -d \
  -e MYSQL_ROOT_PASSWORD=mysqladmin \
  -e MYSQL_DATABASE=testdb \
  -e MYSQL_USER=testuser \
  -e MYSQL_PASSWORD=testpass \
  mysql:8.0

고급 MySQL 설정 예시:

# 볼륨 마운트를 통한 데이터 영속성
docker run --name mysql-persistent -d \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=mysqladmin \
  -v mysql_data:/var/lib/mysql \
  mysql:8.0

# 커스텀 설정 파일 사용
docker run --name mysql-custom -d \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=mysqladmin \
  -v /path/to/my.cnf:/etc/mysql/my.cnf \
  mysql:8.0

실무 활용 팁

Docker Compose를 활용한 다중 컨테이너 관리

# docker-compose.yml
version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html

  database:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: mysqladmin
      MYSQL_DATABASE: webapp
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"

volumes:
  mysql_data:

컨테이너 헬스체크 설정

# 헬스체크가 포함된 MySQL 컨테이너
docker run --name mysql-health -d \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=mysqladmin \
  --health-cmd="mysqladmin ping --silent" \
  --health-interval=30s \
  --health-timeout=10s \
  --health-retries=3 \
  mysql:8.0

리소스 제한 설정

# CPU와 메모리 제한
docker run --name limited-container -d \
  --cpus="1.5" \
  --memory="1g" \
  --memory-swap="2g" \
  nginx:latest

마무리

위와 같이 다양한 컨테이너를 생성하고, 필요한 설정을 통해 각종 서비스를 실행할 수 있습니다. 컨테이너 기술을 활용하면 개발 및 배포가 훨씬 효율적이므로, 이러한 기술을 적극적으로 활용해 보시기 바랍니다.
핵심 포인트:

  • 컨테이너 유형별 적절한 옵션 사용으로 효율적인 실행 환경 구축
  • 포트 매핑과 환경 변수 설정을 통한 서비스 커스터마이징
  • 볼륨 마운트 활용으로 데이터 영속성 보장
  • Docker Compose 활용으로 다중 컨테이너 관리 자동화
  • 리소스 제한과 헬스체크 설정으로 안정적인 운영 환경 구축

Docker 컨테이너 기술을 통해 다양한 소프트웨어 스택을 빠르고 일관되게 배포할 수 있으며, 마이크로서비스 아키텍처와 DevOps 환경에서 핵심적인 역할을 수행합니다.

반응형