컨테이너 기본값 재정의하기
컨테이너 기본값 재정의하기
Docker 컨테이너는 이미지의 기본 설정으로 실행되지만, docker run 명령의 플래그를 사용해 네트워크 포트, 환경 변수, 리소스 한도, 기본 명령(CMD/ENTRYPOINT) 등을 필요에 맞게 재정의할 수 있어요. 이 가이드에서 그 방법을 하나씩 배워요.
출처: 문서
본문
설명
Docker 컨테이너가 시작되면 애플리케이션이나 명령을 실행해요. 컨테이너는 이 실행 파일(스크립트나 파일)을 이미지의 구성에서 얻어요. 컨테이너에는 보통 잘 동작하는 기본 설정이 있지만, 필요하면 변경할 수 있어요. 이런 조정은 컨테이너의 프로그램이 정확히 원하는 방식으로 실행되도록 도와줘요.
예를 들어 표준 포트에서 수신 대기하는 기존 데이터베이스 컨테이너가 있고, 같은 데이터베이스 컨테이너의 새 인스턴스를 실행하고 싶다면, 새 컨테이너가 수신 대기할 포트 설정을 변경해 기존 컨테이너와 충돌하지 않게 하고 싶을 거예요. 때로는 프로그램이 무거운 작업량을 처리하는 데 더 많은 리소스가 필요할 때 컨테이너에 사용 가능한 메모리를 늘리고 싶을 수도 있고, 프로그램이 제대로 기능하는 데 필요한 특정 구성 정보를 제공하려고 환경 변수를 설정하고 싶을 수도 있어요.
docker run 명령은 이러한 기본값을 재정의하고 컨테이너의 동작을 원하는 대로 조정할 수 있는 강력한 수단을 제공해요. 이 명령은 즉석에서 컨테이너 동작을 커스터마이즈할 수 있는 여러 플래그를 제공해요.
이를 달성할 수 있는 몇 가지 방법을 소개할게요.
네트워크 포트 재정의
때로는 개발과 테스트용으로 별도의 데이터베이스 인스턴스를 사용하고 싶을 수 있어요. 이 데이터베이스 인스턴스들을 같은 포트에서 실행하면 충돌할 수 있어요. docker run의 -p 옵션을 사용해 컨테이너 포트를 호스트 포트에 매핑하면 충돌 없이 컨테이너의 여러 인스턴스를 실행할 수 있어요.
$ docker run -d -p HOST_PORT:CONTAINER_PORT postgres
환경 변수 설정
이 옵션은 컨테이너 안에 값이 bar인 환경 변수 foo를 설정해요.
$ docker run -e foo=bar postgres env
다음과 같은 출력이 보여요.
HOSTNAME=2042f2e6ebe4
foo=bar
Tip
.env파일은 Docker 컨테이너의 환경 변수를 설정하는 편리한 방법이에요. 수많은-e플래그로 명령줄을 어지럽히지 않아도 되죠..env파일을 사용하려면docker run명령에--env-file옵션을 전달하면 돼요.$ docker run --env-file .env postgres env
컨테이너의 리소스 소비 제한
docker run 명령에서 --memory와 --cpus 플래그를 사용하면 컨테이너가 사용할 수 있는 CPU와 메모리를 제한할 수 있어요. 예를 들어 Python API 컨테이너의 메모리 한도를 설정해 호스트의 과도한 리소스 소비를 막을 수 있어요. 명령은 이래요.
$ docker run -e POSTGRES_PASSWORD=secret --memory="512m" --cpus="0.5" postgres
이 명령은 컨테이너 메모리 사용량을 512MB로 제한하고 CPU 쿼터를 0.5(코어 반 개)로 정의해요.
실시간 리소스 사용량 모니터링
docker stats명령으로 실행 중인 컨테이너의 실시간 리소스 사용량을 모니터링할 수 있어요. 이는 할당된 리소스가 충분한지, 조정이 필요한지 이해하는 데 도움을 줘요.
이 docker run 플래그들을 효과적으로 사용하면 컨테이너화된 애플리케이션의 동작을 구체적인 요구 사항에 맞게 조정할 수 있어요.
직접 해보기
이 실습 가이드에서는 docker run 명령으로 컨테이너 기본값을 재정의하는 방법을 살펴봐요.
- Docker Desktop을 다운로드하고 설치해요.
Postgres 데이터베이스의 여러 인스턴스 실행
- Postgres 이미지로 다음 명령을 사용해 컨테이너를 시작해요.
이 명령은 Postgres 데이터베이스를 백그라운드에서 시작하고, 표준 컨테이너 포트$ docker run -d -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres5432에서 수신 대기하며 호스트 머신의 포트5432에 매핑해요. - 다른 포트에 매핑된 두 번째 Postgres 컨테이너를 시작해요.
이 명령은 컨테이너에서는 표준 postgres 포트$ docker run -d -e POSTGRES_PASSWORD=secret -p 5433:5432 postgres5432에서 수신 대기하지만 호스트 머신의 포트5433에 매핑되는 또 다른 Postgres 컨테이너를 백그라운드에서 시작해요. 호스트 포트를 재정의해 새 컨테이너가 기존 실행 중인 컨테이너와 충돌하지 않도록 한 거예요. - Docker Desktop 대시보드의 Containers 뷰로 이동해 두 컨테이너가 실행 중인지 확인해요.
통제된 네트워크에서 Postgres 컨테이너 실행
기본적으로 컨테이너는 실행할 때 브리지 네트워크(bridge network)라는 특수 네트워크에 자동으로 연결돼요. 이 브리지 네트워크는 가상 브리지처럼 작동해, 같은 호스트의 컨테이너들이 서로 통신할 수 있게 하면서 외부 세계와 다른 호스트로부터는 격리되게 해요. 대부분의 컨테이너 상호작용을 시작하기에 편리한 지점이에요. 하지만 특정 시나리오에서는 네트워크 구성을 더 세밀하게 통제하고 싶을 수 있어요.
여기서 커스텀 네트워크가 등장해요. docker run 명령에 --network 플래그를 전달해 커스텀 네트워크를 만들 수 있어요. --network 플래그가 없는 모든 컨테이너는 기본 브리지 네트워크에 연결돼요.
다음 단계에 따라 Postgres 컨테이너를 커스텀 네트워크에 연결하는 방법을 볼게요.
- 다음 명령으로 새 커스텀 네트워크를 만들어요.
$ docker network create mynetwork - 다음 명령을 실행해 네트워크를 확인해요.
이 명령은 새로 만든 "mynetwork"를 포함한 모든 네트워크를 나열해요.$ docker network ls - 다음 명령으로 Postgres를 커스텀 네트워크에 연결해요.
이 명령은 Postgres 컨테이너를 백그라운드에서 시작하고, 호스트 포트 5434에 매핑하며$ docker run -d -e POSTGRES_PASSWORD=secret -p 5434:5432 --network mynetwork postgresmynetwork네트워크에 연결해요.--network파라미터를 전달해 컨테이너를 커스텀 Docker 네트워크에 연결함으로써 컨테이너 기본값을 재정의해, 더 나은 격리와 다른 컨테이너와의 통신을 확보했어요.docker network inspect명령으로 컨테이너가 이 새 브리지 네트워크에 연결됐는지 확인할 수 있어요.기본 브리지와 커스텀 네트워크의 주요 차이점
- DNS 해석: 기본적으로 기본 브리지 네트워크에 연결된 컨테이너는 서로 통신할 수 있지만 IP 주소로만 가능해요. (레거시로 간주되는
--link옵션을 사용하지 않는 한요.) 다양한 기술적 단점 때문에 프로덕션 사용에는 권장되지 않아요. 커스텀 네트워크에서는 컨테이너가 이름이나 별칭으로 서로를 해석할 수 있어요. - 격리:
--network를 지정하지 않은 모든 컨테이너는 기본 브리지 네트워크에 연결되므로, 서로 관련 없는 컨테이너들도 통신할 수 있게 되어 위험이 될 수 있어요. 커스텀 네트워크를 사용하면 해당 네트워크에 연결된 컨테이너만 통신할 수 있는 범위가 정해진 네트워크를 제공해 더 나은 격리를 보장해요.
- DNS 해석: 기본적으로 기본 브리지 네트워크에 연결된 컨테이너는 서로 통신할 수 있지만 IP 주소로만 가능해요. (레거시로 간주되는
리소스 관리
기본적으로 컨테이너는 리소스 사용에 제한이 없어요. 하지만 공유 시스템에서는 리소스를 효과적으로 관리하는 게 중요해요. 실행 중인 컨테이너가 호스트 머신의 메모리를 너무 많이 소비하게 두면 안 돼요.
여기서 다시 docker run 명령이 빛을 발해요. 컨테이너가 사용할 수 있는 CPU와 메모리를 제한하는 --memory와 --cpus 같은 플래그를 제공해요.
$ docker run -d -e POSTGRES_PASSWORD=secret --memory="512m" --cpus=".5" postgres
--cpus 플래그는 컨테이너의 CPU 쿼터를 지정해요. 여기서는 CPU 코어 반 개(0.5)로 설정됐어요. 반면 --memory 플래그는 컨테이너의 메모리 한도를 지정해요. 이 경우 512MB로 설정됐어요.
Docker Compose에서 기본 CMD와 ENTRYPOINT 재정의
때로는 특히 Docker Compose를 사용할 때 Docker 이미지에 정의된 기본 명령(CMD)이나 진입점(ENTRYPOINT)을 재정의해야 할 수 있어요.
- 다음 내용으로
compose.yml파일을 만들어요.
이 Compose 파일은 공식 Postgres 이미지를 사용하는services: postgres: image: postgres:18 entrypoint: ["docker-entrypoint.sh", "postgres"] command: ["-h", "localhost", "-p", "5432"] environment: POSTGRES_PASSWORD: secretpostgres라는 서비스를 정의하고, 진입점 스크립트를 설정하며, 비밀번호 인증으로 컨테이너를 시작해요. - 다음 명령을 실행해 서비스를 시작해요.
이 명령은 Docker Compose 파일에 정의된 Postgres 서비스를 시작해요.$ docker compose up -d - Docker Desktop 대시보드로 인증을 확인해요. Docker Desktop 대시보드를 열고 Postgres 컨테이너를 선택한 후 Exec를 선택해 컨테이너 셸로 들어가요. Postgres 데이터베이스에 연결하려면 다음 명령을 입력하면 돼요.
# psql -U postgresNote PostgreSQL 이미지는 로컬에서 trust 인증을 설정하므로, localhost(같은 컨테이너 안)에서 연결할 때는 비밀번호가 필요하지 않을 수 있어요. 하지만 다른 호스트/컨테이너에서 연결하면 비밀번호가 필요해요.
docker run으로 기본 CMD와 ENTRYPOINT 재정의
다음 명령으로 docker run 명령에서 직접 기본값을 재정의할 수도 있어요.
$ docker run -e POSTGRES_PASSWORD=secret postgres docker-entrypoint.sh -h localhost -p 5432
이 명령은 Postgres 컨테이너를 실행하고, 비밀번호 인증을 위한 환경 변수를 설정하며, 기본 시작 명령을 재정의하고 호스트 이름과 포트 매핑을 구성해요.
추가 자료
다음 단계
컨테이너 기본값 재정의에 대해 배웠으니, 이제 컨테이너 데이터를 유지하는 방법을 배울 차례예요. 컨테이너 데이터 유지하기