[팀 개발 문화 발전시키기] 도커 컨테이너 관리

Hadooboo·2022년 12월 10일
0
post-thumbnail

도커 컨테이너 관리를 해야겠다고 마음먹은 이유

sudo docker network inspect ... sudo docker container exec ...

도커 명령어를 매번 직접 입력하여 어떻게 운영되고 있는지 확인하는 것은 상당히 지루하고 복잡한 일이다. alias를 지정해 명령어의 길이를 조금 줄여볼 수는 있겠지만 터미널에서 보이는 문자들로만 운영 상황을 확인하는 것은 한계가 있다. 그래서 간단히 사용 가능한 시각화 툴이 있다면 사용해보고 싶다는 마음이 들었고, portainer라는 툴을 발견하여 적용해보게 되었다.

개선한 방향

Portainer 설치

도커 컨테이너를 관리하기 위한 Portainer 툴도 도커를 이용하여 설치할 수 있다.

linux에 설치하는 방법은 링크에서 더 자세히 살펴볼 수 있다.

$ docker volume create portainer_data
$ docker run -d -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

우선 컨테이너가 삭제되는 상황에서도 데이터를 보존하기 위한 docker volume을 생성하여 이후에 /data 디렉터리와 마운트한다.

다음으로 실제 컨테이너를 실행한다. Portainer web UI를 접근하기 위해서 9443번 포트를 열어 두었다. 8000번은 http 접속을 위한 포트이고, 9000번 포트는 legacy를 위한 포트라서 열어두지 않았다.

또한, local 도커에 연결하기 위해 socket 파일을 볼륨 마운팅으로 연결하여 컨테이너 내부에서도 접근할 수 있게 하였다. 이는 portainer 구동을 위해 필수적이다.

https://<ip>:9443 으로 접속하면 기본적으로는 portainer가 자체적으로 생성한 ssl 인증서를 사용하기 때문에 보안 관련 경고가 뜰 수 있다. 무시하고 진행할 수도 있고, 컨테이너를 생성할 때 ca로부터 인증받은 인증서를 연결할 수 있다.

create admin user

설치 후 가장 처음으로 할 일은 admin 계정을 세팅하는 것이다.

admin 유저에 할당할 비밀번호를 2번 입력하면 생성이 완료된다.

choose docker environment

처음 환경을 셋업하는 상황이므로 Get Started로 진행한다.

다음 화면에서 바로 local environment를 확인할 수 있다.

local environment로 들어가면 container, image 등의 개수를 확인할 수 있고, 각각을 누르면 더 자세한 정보를 확인할 수 있다.

container, image, volume, network는 docker 명령어 뒤에 붙이기도 하는 docker 구성 요소이기 때문에 무엇인지 바로 알 수 있었다. 그러나 stack이 무엇인지는 생소했는데, docker compose를 이용하여 실행한 컨테이너 모음을 말하는 것이라고 확인할 수 있었다.

docker.sock 이란?

portainer에서는 /var/run/docker.sock 파일의 볼륨 마운트만으로 도커의 운영 상황을 모두 확인할 수 있었다. 따라서 이 docker.sock 파일이 무엇인지 잠시만 짚어보고 넘어가기로 한다.

우선 .sock 이라는 확장자에서 알 수 있듯 socket 파일이다. 보안을 위해 기본적으로 unix socket으로 만들어지지만 tcp, fd socket으로 만들 수도 있다. 해당 파일에 접근하기 위해서는 root 권한 또는 docker group 권한을 필요로 한다.

docker daemon은 docker.sock 파일로 오는 요청들을 listening 하고 있다. 그래서 docker cli를 사용하든, 외부에서 docker API를 이용하든 결국 docker.sock 파일을 거쳐가게 된다. 따라서 portainer도 마찬가지로 docker daemon과 직접 통신을 하기 위해서 docker.sock 파일이 필요했던 것이다.

이런 상황을 나타내는 개념이 DInD(docker in docker)이다. 도커 컨테이너로 실행하는 서비스들 중에서도 도커 서비스를 조작해야 하는 요구가 있을 수 있다. 일반적으로 도커 컨테이너 안에서는 호스트 머신의 어떤 것도 접근할 수 없다. 따라서 docker.sock 파일을 볼륨 마운팅하여 컨테이너 안에서도 접근할 수 있게 해 두고 docker API를 이용하면 된다.

회고

아직까지 portainer의 다양한 기능을 써 볼 기회는 없었다. 물론 정교하게 도커 명령어를 실행하고 관리하는 것에는 cli가 여전히 좋을 것이다. 그러나 어떤 컨테이너들이 실행 중인지를 시각적으로 한 눈에 확인할 수 있게 된 점 등은 유지보수에 큰 도움이 되리라 생각한다.

profile
'왜'를 궁금해하는 개발자

0개의 댓글