Portainer: 브라우저로 컨테이너 관리하기
웹 컨테이너 관리 패널을 설치하는 방법, 편리한 이유, 보호 없이 인터넷에 노출하면 안 되는 이유를 알아봐요.
업데이트 2026년 8월 23일
Portainer는 Docker용 웹 인터페이스예요. 컨테이너 목록, 로그, 컨테이너 콘솔, 볼륨, 네트워크, Compose 스택을 볼 수 있어요. "뭐가 죽었는지" 확인하려고 매번 SSH로 접속하기 싫을 때 편리해요.
설치
docker volume create portainer_data
docker run -d \
--name portainer \
--restart unless-stopped \
-p 127.0.0.1:9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:2.21.4
포트는 로컬 인터페이스에 바인딩돼요. SSH 터널을 통해 제어판을 열 수 있어요.
ssh -L 9443:127.0.0.1:9443 root@<machine-address>
그다음 브라우저에서 https://localhost:9443을 열어요. 인증서가 자체 서명이라서 브라우저가 경고를 띄울 거예요. 터널을 통해 접속할 때는 정상이에요.
첫 번째 관리자는 제어판을 가장 먼저 연 사람이 만들어요. 포트를 인터넷에 노출해 두고 차라도 마시러 갔다 오면, 관리자는 내가 아니게 돼요. Portainer는 시작 후 몇 분이 지나면 등록을 닫지만, 그걸 믿으면 안 돼요. 계정을 바로 만드세요.
왜 위험하고 무엇을 해야 하나요
제어판은 /var/run/docker.sock을 마운트해요. 이 소켓에 접근하는 건 머신의 root 권한과 같아요. 이걸 통해 호스트 root를 마운트한 컨테이너를 시작할 수 있거든요. 그래서 규칙이 있어요.
- 포트를 인터넷에 노출하지 마세요. SSH 터널을 쓰거나, 인증서와 2단계 인증을 갖춘 웹 서버를 사용하세요.
- 관리자 비밀번호는 길고 고유하게 만드세요. 머신의 root 비밀번호와 같으면 안 돼요.
- 공용 로그인 대신 사람마다 권한이 제한된 개별 계정을 주세요.
- 제어판이 거의 필요 없다면 컨테이너를 중지 상태로 두고 필요할 때 시작하세요:
docker start portainer.
무엇이 편리한가요
- 로그 — 검색과 강조 표시가 있어서 80×24 텍스트 콘솔에서
docker logs를 쓰는 것보다 빨라요. - 컨테이너 콘솔 — 브라우저에서 바로 들어갈 수 있어요.
- 스택 —
compose.yaml내용을 붙여넣고 배포를 누르면 돼요. 일회성 서비스에는 좋지만, 상시 서비스라면 파일을 디스크에 두고 버전 관리를 하는 게 나아요. 제어판에서 만든 스택은 재설치할 때 잃어버리기 쉬워요. - 볼륨과 이미지 — 무엇이 얼마나 공간을 차지하는지 볼 수 있어요. 공간 부족 문제를 해결할 때 도움이 돼요.
여기서 하면 안 되는 것
- 서비스 정의의 유일한 사본을 여기에 두는 것. 디스크의 디렉터리에 있는
compose.yaml파일이 제어판보다 오래 살아남아요. - 볼륨에 무슨 일이 생길지 이해하지 못한 채 "recreate" 버튼으로 컨테이너를 업데이트하는 것. 컨테이너 업데이트를 참고하세요.
- 모니터링의 대체품으로 여기는 것. Portainer는 현재 상태만 보여주고 이력은 보여주지 않으며 알림도 보내지 않아요. 그게 필요하면 Uptime Kuma를 쓰세요.
리소스
컨테이너는 메모리를 약 100 MB 사용하고 어떤 티어에서도 돌아가요. 데이터는 portainer_data 볼륨에 저장돼요. 계정, 설정, 스택이 여기에 들어가요. 백업에 포함하거나, 제어판을 다시 설정할 각오를 하세요.
흔한 실수
- 제어판이 이 머신만 관리한다는 걸 잊는 것. 두 번째 머신도 관리할 수 있지만, 그 머신에 에이전트가 있어야 하고 둘 사이에 포트가 열려 있어야 해요.
- 제어판 자체에
latest태그를 쓰는 것. 메이저 업데이트는 데이터 형식을 바꿔요. 버전을 고정하세요. - 정리를 통해 "사용하지 않는" 볼륨을 삭제하는 것. Portainer가 경고는 하지만, 사람들은 읽지 않고 버튼을 눌러요. 데이터베이스가 있는 볼륨은 컨테이너가 중지된 동안 사용하지 않는 것처럼 보여요. 볼륨을 참고하세요.