AWS에 처음부터 배포하기 4) docker volume의 필요성

Yeshin Lee
5 min readAug 29, 2024

--

Jenkins 환경을 설치하기 전에 겪었던, 어쩌면 이미 기억하고 있었다면 겪지 않았을 상황에 대해 적어본다.

Jenkins 환경을 설정하기 위해 현재 도커 상태를 확인한다.

# Only running container
docker ps

# All containers include stopped container
docker ps -a
종료 상태다

docker run jenkins/jenkins-lts 명령어로 컨테이너를 실행하려는데, 뜬금없이 Jenkins 초기 설정을 안내한다.

이틀 전에 다 설정했었는데?

도커를 사용하여 Jenkins와 같은 애플리케이션을 실행할 때, 컨테이너 내부의 데이터는 기본적으로 휘발성이기 때문에, 컨테이너가 중지/삭제되면 그 안에 저장된 데이터도 함께 사라지는 것이다. 이를 방지하기 위해 사용하는 것이 도커 볼륨(Docker Volume)이다.

  • 볼륨(volume): 도커가 관리하는 디렉토리
  • 도커 볼륨(docker volume): 도커 컨테이너가 종료/삭제되어도 데이터를 유지할 수 있다.(컨테이너와 호스트 시스템 사이에서 데이터를 지속적으로 저장)

또한 컨테이너와 독립적으로 존재해서 인스턴스의 IP가 변경되어도 볼륨에 저장된 데이터는 유지된다. 이 부분을 좀 더 들여다보면,

  • 데이터의 영속성: 도커 볼륨은 컨테이너와 별개로 호스트 시스템(AWS EC2)의 파일 시스템에 저장(리눅스 기준, /var/lib/docker/volumes/)되므로 컨테이너의 상태에 영향을 받지 않는다. 즉, 해당 시스템의 디스크에 저장된 볼륨 데이터는 그대로 유지된다.

일단 docker volume ls로 볼륨이 존재하는지 확인해보자.

있네

이전에 실행했던, 컨테이너 실행 명령어에서 -v jenkins_home:/var/jenkins_home부분이 jenkins_home라는 볼륨을 사용해서 컨테이너를 실행하라는 것이고, 그 중 -v 옵션은 마운트(연결)하라는 의미다.

docker run -d -p 8080:8080 -p 50000:50000 --name jenkins --restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts

이전 포스트에서 해당 옵션을 ‘호스트(EC2)의 jenkins_home 디렉터리’라는 표현을 사용했는데, 호스트의 특정 경로(/home/ec2-user/jenkins_home)를 컨테이너의 경로와 연결하는 것이 아니므로 잘못된 표현이다.

다시 볼륨 화면으로 돌아와서, ‘136d’으로 시작하는 긴 이름을 가진 볼륨은 왜 생긴걸까?

docker run jenkins/jenkins_lts 명령어로 볼륨을 지정하지 않고 컨테이너를 실행하면, 도커는 익명 볼륨(Anonymous Volume)을 만든다.

  • 직접 생성한 볼륨(jenkins_home): 여러 컨테이너 간에 데이터를 공유할 수 있다.
  • 익명 볼륨(136d): 특정 컨테이너 내에서만 사용하는 데이터나, 로그 파일이나 캐시 데이터 와 같이 임시(지속성이 요구되지 않는) 데이터를 관리할 때 사용한다. 또한 도커가 자동으로 관리하므로 사용자가 관리하지 않아도 된다.

그래서 Jenkins가 초기 설정을 요구한 것이다. docker ps -a로 컨테이너 목록을 확인해보면 happy_bouman이라는 새로운 컨테이너가 보인다. 이 것 역시 docker run jenkins/jenkins-lts 명령어로 만들어진, jenkins/jenkins-lts 이미지로 새롭게 생성된 컨테이너인 것이다.

결론적으로, 도커 컨테이너를 실행할 때 실행 환경과 설정을 명확하게 지정해주는 것이 중요하다. 어떤 포트에 연결할거고 어떤 컨테이너를 사용할지, 포트 매핑, 볼륨 마운트, 컨테이너 이름, 이미지 등을 말이다.

이제 원인을 알았으니, 사용하지 않는 컨테이너와 익명 볼륨은 삭제해주자.

# Delete container
docker rm happy_bouman

# Delete volume
docker volume rm 136d808db49d673a27e4349644c4201166e1fc9558896c494baf94c98277c032

그러고 이미 만들어진 jenkins_home 볼륨으로 jenkins 컨테이너를 재시작하자.

docker start jenkins

이 쯤 되면 runstart 명령어가 헷갈릴 수 있다.

이전에 사용했던 docker run명령어로 실행하니, ‘동일한 이름의 컨테이너를 생성할 수 없다’는 에러 메시지를 봤기 때문이다. 지금 상황에서는 이미 만들어진 도커 컨테이너(jenkins)를 실행시키는 것이므로 start 명령어를 사용해야 한다.

  • docker run: 새로운 컨테이너를 생성하고 실행한다(새로운 설정과 함께 새로운 Jenkins 인스턴스를 생성)
  • docker start: 이미 존재하는, 종료된 컨테이너를 다시 시작한다(이전에 사용한 Jenkins 인스턴스를 다시 시작)
  • docker exec: 이미 실행중인 컨테이너에 명령을 전달한다

이번 이슈는 도커 볼륨과 실행 명령어에 대해 확실하게 기억할 수 있는 계기가 되었다.

그럼 다음에는 진짜 Jenkins 환경 설정하는 것으로 찾아온다.

--

--

Yeshin Lee
Yeshin Lee

No responses yet