Docker는 편리하지만, Dockerfile 내부에서 인터넷을 참조하게 된다면, 유의가 필요해보입니다.
인터넷에 자유로운 DockerImage를 통채로 제공하는 건 어떨까요?
개요
과거에 개발되었던 프로젝트를 셋팅하던 와중에, Dockerfile 내부에서 패키지를 설치하는 부분이 있었습니다.
하지만, 해당 이미지에 설치된 리눅스는 이미 공식 지원이 종료되어, 패키지 저장소가 사라진 상태였습니다.
ChatGPT의 도움을 받아, 패키지 레포지토리를 통채로 교체하는 작업을 진행하여, 일부 패키지는 받을 수 있었지만, 근본적으로 연관된 모든 패키지를 받기에는 어려움이 많았습니다.
운이 좋게도, 이미 해당 프로젝트를 Docker 컨테이너로 가지고 계신 제이슨이 있었습니다.
Docker는 컨테이너로 올린 현재 상태를 스냅샷을 떠서 이미지로 만들고, 이를 tar형태로 추출하여, 다른 사람에게 현재 가동중인 컨테이너 환경을 공유할 수 있었습니다.
저도 이번에, 이런 Docker의 기능을 사용하여, 성공적으로 제 로컬 환경에서도 Docker개발환경을 구동할 수 있었습니다.
docker commit 명령
해당 명령어는 현재 가동중인 Docker Container를 스냅샷을 떠서, Image 형태로 변환하는 명령입니다.
명령어의 형태는 다음과 같습니다.
docker commit {컨테이너명} {이미지명}
Docker
복사
•
컨테이너명에는 현재 가동중인 Docker Container의 NAME을 입력합니다.
•
이미지명에는 추출하길 바라는 이미지명을 입력합니다. → 여기서 이미지명은 본인이 원하는대로 지정할 수 있습니다.
•
docker ps 명령을 작성했을 위와 같이 뜨게 되는데, 이 때, NAMES에 해당하는 명칭이 바로 컨테이너명입니다.
•
해당 컨테이너의 현 상태를 그대로 스냅샷을 떠서, dev_iniwedding_image 이렇게 만들어볼까요?
docker commit dev_iniwedding dev_iniwedding_image
Docker
복사
•
그렇게 되면, dev_iniwedding 이라는 컨테이너는, dev_iniwedding_image 라는 이름의 Image로 변환될 수 있습니다.
•
이제 다음의 명령을 통해, 이미지가 생성되었는지 확인합니다.
docker images
Docker
복사
•
dev_iniwedding_image 라는 도커이미지가 추가된 것을 확인할 수 있을겁니다.
docker save 명령
해당 명령어는 현재 본인의 docker에 가지고 있는 image를 공유하기 위해서 tar파일 형태로 추출하는 명령입니다. docker system에서는 image를 가지고는 있지만, 이를 다른 docker에 이식해야 하므로, 이를 파일로 관리할 수 있도록 추출합니다.
docker save -o {파일명}.tar {이미지명}
Docker
복사
•
tar파일을 저장하고 싶은 위치까지 cd로 이동한 이후에, 위의 명령을 작성하거나, 파일명에 절대/상대 경로를 포함하여 실행합니다.
docker save -o dev_iniwedding_image.tar dev_iniwedding_image
Docker
복사
•
이렇게 실행하면, docker system에서 가지고 있는 dev_iniwedding_image를, 파일 형태인,
dev_iniwedding_image.tar 형태로 내보낼 수 있게 됩니다.
•
이제 이 파일을 패키지 설치 때문에 고생하고 있는 팀원에게 공유해줍시다!
docker load 명령
•
docker image를 전달 받았다면, 이를 본인의 docker system에 불러와야 합니다. 이 때 사용하는 명령이 docker load 입니다.
docker load -i {파일명}.tar
Docker
복사
•
tar파일을 docker system에 불러오도록 합니다.
docker load -i dev_iniwedding_image.tar
Docker
복사
•
이제 docker images 를 작성하여 확인하면, 본인 컴퓨터에도 신규 이미지가 추가된 것을 확인할 수 있습니다.
이미지 실행.
•
기존에 docker-compose.yml 로 docker image를 실행하고 있었다면, 이미지는 위의 이미지로 교체해서 실행하면 됩니다.
•
Dockerfile 자체로 실행하는 것이었다면, 바로 불러온 이미지로 docker run을 수행하도록 합니다.
•
여기서, 환경변수는 어떻게 해야하는지? 의문점이 있을 수도 있을 건데요, 새롭게 이미지를 만들었다고 해도, 근본적으로는 BASE IMAGE에 있는 환경변수를 그대로 사용할 수 있습니다.
•
그래서, 환경변수도 그대로 넣고 실행하시면 됩니다.
•
다만, DB와 같이 볼륨이 있는거였다면, 볼륨은 별도로 추출해서 경로를 이식해야 하므로, 이는 여기서 논외입니다.
명령어 3줄 요약
docker commit {컨테이너명} {이미지명}
docker save -o {파일명}.tar {이미지명}
docker load -i {파일명}.tar
Docker
복사
•
이렇게 3줄 이면, 도커 컨테이너 환경을 그대로 스냅샷을 떠서 다른 팀원들에게 제공해줄 수 있습니다!
마무리
Docker는 편의성이 매우 좋은 도구이지만, 내부에 인터넷에 의한 의존성이 있었다면, 완벽하게 Dockerfile만으로는 같은 환경을 구축하기 어려울 수 있습니다.
복잡하게 추가적으로 설치가 필요한 내용들이 Dockerfile내용에 포함되어 있다면, 이를 제공하는 것이 아닌,
이미 완성된 DockerImage 형태로 제공하는 것이, 훨씬 인터넷에 의존하는 환경보다 안정적입니다.
물론, 추가적인 pakage설치가 필요하다면, 근본적으로는 버전업을 고려해야 할 수도 있을 것으로 생각합니다.
글 읽어주셔서 감사합니다.


