
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:latestMySQL 데이터베이스 컨테이너 생성
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 환경에서 핵심적인 역할을 수행합니다.
'IT기술 > 도커 (docker)' 카테고리의 다른 글
| Docker 다중 컨테이너 연동 완벽 가이드: WordPress와 MySQL 구축하기 (2) | 2025.07.07 |
|---|---|
| Docker WordPress와 MySQL 연동 완벽 가이드: 컨테이너 기반 웹사이트 구축 (2) | 2025.07.06 |
| Docker 이미지 삭제 완벽 가이드: 효율적인 스토리지 관리 방법 (2) | 2025.07.04 |
| Docker Apache 컨테이너 완벽 가이드: 웹 서버 설정부터 외부 통신까지 (2) | 2025.07.04 |
| 도커 컨테이너의 생성, 실행, 정지, 삭제 방법 정리 (6) | 2025.04.30 |