용어집 · CI/CD와 DevOps
Docker 컨테이너
영어: Docker container
다른 이름: 도커 컨테이너, 컨테이너, Docker, 도커
정의
앱이나 서비스를 의존성과 함께 패키징한 Docker 이미지의 격리된 실행 인스턴스로, 노트북에서도 CI에서도 똑같이 동작합니다.
Docker 컨테이너(Docker container)는 Docker 이미지에서 시작되어 머신의 나머지 부분과 격리된 프로세스입니다. 자체 파일 시스템, 네트워크 인터페이스, 프로세스 목록을 가지지만 호스트의 커널은 공유합니다. 이미지는 읽기 전용 템플릿(OS 베이스 레이어, 런타임, 애플리케이션)이고, 컨테이너는 그 이미지의 실행 인스턴스입니다. 하나의 이미지로 여러 컨테이너를 시작할 수 있고, 다 쓰면 버리면 됩니다.
예시
로컬 테스트 실행용으로 일회용 Selenium Chrome 노드와 Postgres 데이터베이스를 시작합니다.
docker run --rm -d --name chrome -p 4444:4444 --shm-size=2g selenium/standalone-chrome:latest
docker run --rm -d --name db -p 5432:5432 -e POSTGRES_PASSWORD=test postgres:16-alpine
docker ps # list running containers
docker logs db # read a container's output
docker stop chrome db
--rm은 컨테이너가 멈추면 삭제하고, -d는 백그라운드에서 실행하며, -p host:container는 포트를 공개합니다. 실제 프로젝트에서는 latest 대신 이미지 태그를 고정해서(예: postgres:16.4-alpine) 업스트림의 새 릴리스가 하룻밤 사이에 테스트 환경을 바꾸지 않도록 합니다.
테스터가 컨테이너를 쓰는 이유
- 재현 가능한 환경. 모든 노트북과 CI 러너에서 같은 이미지가 실행되므로 “내 컴퓨터에서는 되는데” 유형의 실패가 통째로 사라집니다.
- 일회용 의존성. 테스트 실행마다 새 데이터베이스를 쓰면 어제 실행에서 남은 데이터가 없습니다.
- 병렬 브라우저. Selenium Grid와 브라우저 이미지로 명령 하나에 노드를 늘리고 줄일 수 있습니다.
- 테스트 스위트 자체 실행. Playwright는 브라우저와 시스템 라이브러리가 미리 설치된 공식 이미지를 제공하므로 CI 에이전트에서 의존성 누락 오류를 피할 수 있습니다.
가상 머신과의 차이
가상 머신(VM)은 자체 커널을 가진 전체 머신을 에뮬레이션하므로 더 무겁고 시작이 느립니다. 컨테이너는 호스트 커널을 공유해 몇 초 만에 시작되고 메모리도 훨씬 적게 씁니다. 대신 격리 수준이 약한데, 이는 보안 경계에서는 중요하지만 테스트 환경에서는 거의 문제가 되지 않습니다.
흔한 실수
테스트 데이터를 컨테이너 안에 저장해 놓고 재시작 후에도 남아 있기를 기대하는 것(볼륨을 쓰세요), latest 태그를 쓰는 것, 브라우저 컨테이너에 --shm-size를 빠뜨려 부하가 걸리면 Chrome이 크래시되는 것입니다.