Docker에 대해서

마이구미·2025년 9월 25일

CS스터디

목록 보기
2/3
post-thumbnail

Docker란 무엇인가?

컨테이너라는 개념을 사용해 각각의 프로그램을 분리된 환경에서 테스트, 배포, 실행 및 관리할 수 있도록 해주는 오픈 소스 플렛폼이자 기술입니다. 도커 컨테이너는 이미지를 통해 각 버전의 프로그램을 실행하는 데 필요한 정보를 모두 가지고 있음으로 다양한 환경에서 일관된 실행을 보장해줍니다.

개발할 때도 도커를 사용해야 할까요?

프로젝트에 따라 다를거라는 생각은 드나 배포를 해야하는 상황, 현업, 팀 프로젝트의 경우에서는 도커를 쓰는 게 좋을 것 같다고 생각합니다.

그 이유는 다음과 같습니다.

1. 동일한 실행 환경 보장
배포를 해야하는 프로젝트의 경우 우리 로컬 서버에서는 잘 작동을 했지만 실제 배포를 하고 서버에서 실행을 했을 때는 제대로 동작하지 않는 경우가 있습니다. 이때 도커를 사용하게 되면 개발자마다 다른 OS와 라이브러리의 버전 문제를 잡아주어 서버에서도 로컬과 같은 실행 환경을 보장할 수 있습니다. 이는 다른 pc와 서버에서 제대로 동작하지 않는 경우를 줄여줍니다.

2. 개발 과정의 빠른 합류
새로운 팀원이 합류하거나 다른 작업으로 프로젝트 개발 단계에 늦게 합류하는 경우 프로젝트를 위한 개발 환경 구축에서도 많은 시간을 잡아 먹을 수 있게 됩니다. 이때 docker를 사용하게 되면 빠르게 환경을 설치할 수 있게 해주고 실수로 다른 버전을 설치하거나 환경 설정 과정에서 필요한 요소를 누락하는 상황을 줄여 불필요하게 낭비되는 개발 시간을 줄일 수 있으며, 나비효과로 발생할 오류도 방지할 수 있습니다.

3. 설치 시간 감소
만약 도커가 없다면 Redis, MYSQL 등 다양한 애플리케이션을 사용하는 경우 각각에 대해서 직접 정보를 찾아 설치를 해야합니다. 만약 팀 프로젝트의 경우 팀원들과 상의하여 같은 버전을 설치하는 것도 중요합니다. 하지만 도커가 있다면 이런 과정은 전부 생략하고 그냥 버전을 정해 이미지를 다운 받아 컨테이너를 띄우면 됩니다.

컨테이너 하나에는 프로세스 하나만 넣어야 할까?

도커 공식 문서에서는 "하나의 컨테이너는 하나의 책임을 가진다"라는 원칙으로 관심사의 분리를 강조합니다.

도커에서 관심사의 분리를 강조하는 이유는 각각의 컨테이너에 하나의 프로세스를 분리하면 유지 보수나 확장, 장애 대응이 쉬워지기 때문입니다. 만약 서로 다른 프로세스를 하나의 컨테이너에 넣어놓게 되면 프로세스 하나의 오류로 인해 다른 프로세스까지 중단 될 수 있으며, 하나의 프로세스 업데이트에 다른 프로세스의 운영도 영향을 받게 됩니다.

하지만 현실적인 문제로 도커 하나에 여러 프로세스를 넣어야 하는 경우가 있을 수 있습니다. 그 중 하나가 주 프로세스와 보조 프로세스의 동반 실행입니다. 웹 서버와 로그 수집기나 데이터 베이스와 백업 스케줄러 같은 경우가 이에 해당합니다. 또한 리소스가 제한된 환경에서는 컨테이너를 여러개 돌리는 것이 부담이 될 수도 있습니다. 이런 경우는 컨테이너 하나에 여러 프로세스를 실행하기도 합니다.

하지만 규모가 커지고 리소스에서 감당을 할 수 있는 경우가 된다면 각각의 컨테이너로 분리하는 것이 장기적으로 더 좋다고 생각됩니다.

Docker 사용하면 보안이 위험할까?

특정 상황에서는 Docker를 사용하는 것이 보안 위협을 받을 수 있습니다.

1. 컨테이너 탈출
만약 컨테이너를 일반 사용자가 아닌 root 권한으로 실행을 시킬 때 컨테이너 탈출이 일어나게 되면 호스트에 대한 전체 권한을 가질 수 있으며, DB 컨테이너에 저장된 중요한 정보에 접근할 수도 있게 됩니다. 또한 악성 코드를 설치하여 서버 전체를 마비 시킬수도 있습니다.

2. 커널 공유 구조
컨테이너는 VM과 달리 호스트의 OS 커널을 같이 사용하기 때문에 커널에 보안적인 문제가 있으면 모든 컨테이너가 위험해지는 문제점이 있습니다.

3. 설정 실수
"privileged" 옵션을 잘못 사용하거나 호스트의 중요한 폴더를 -v로 연결한 경우 컨테이너를 통해서 호스트의 컴퓨터에 직접 영향을 줄 수 있기 때문에 보안적으로 위험에 처하게 됩니다.

이를 해결하기 위해 도커에서 rootless 모드를 통한 SELinux 보안 체계를 이용해서 컨테이너간의 접근 제한을 사용하는 방법이 있습니다. 하지만 도커에서는 여전히 도커 데몬을 사용하고 도커 데몬은 항상 열려있기 때문에 데몬을 통해 전체 컨테이너가 장악당할 위험이 있습니다.

이런 보안의 위험을 해결해 줄 수 있는 대안이 Podman입니다. Podman은 도커와 같은 역할을 하나 보안 면에서 조금 더 좋은 모습을 보여줍니다. 특히 Podman은 기본적으로 rootless 구조에 데몬이 없어 위의 데몬이 노출될 위협이나 컨테이너 탈출 시 루트 계정 탈취의 위협으로부터 도커보다 안전합니다.

따라서 저는 편의성면에서는 도커가 좋지만 보안이 조금 더 중요하다면 Podman을 공부해서 사용해보는 것도 좋다고 생각합니다.

profile
개발 입문한 초보입니다

0개의 댓글