Docker - 이미지 생성/배포하기

목차


이전 포스트에서 도커 이미지는 컨테이너를 생성하고 실행하기 위해 필요한 요소라고 했습니다.

이번 포스트에서는 도커 이미지를 직접 생성하고 배포하는 것을 해보겠습니다.


배포할 도커 이미지 생성하기

아직 도커를 어떻게 쓰면 좋을지 모르기 때문에 을 참고하여 이미지를 생성해보았습니다.

우분투를 설치해서 ubuntu 환경에 변경사항을 만들고 이를 이미지로 생성해보겠습니다.

적용할 변경사항은 아래와 같습니다.

  • apt-get 업데이트
  • git 설치하기
  • github 프로젝트 clone 하기

먼저 우분투를 이미지를 설치하겠습니다.

1
$ docker pull ubuntu

컨테이너를 생성하겠습니다.

컨테이너와 호스트OS간 82번 포트로 마주보는 “custom_ubuntu”라는 이름의 컨테이너를 생성했습니다.

1
$ docker create -it --name myubuntu -p 82:82 ubuntu 

이제 생성한 컨테이너를 실행하고, bash shell 모드로 컨테이너 내부로 들어가겠습니다.

1
2
$ docker start custom_ubuntu
$ docker exec -it custom_ubuntu bash

혹시 여기서 -it 의 의미가 기억나지 않으신다면 여기서 다시 확인하실 수 있습니다 ​​🙂


지금부터는 컨테이너 내에 변경사항을 만드는 작업입니다. 이 부분을 건너뛰고 바로 이미지 생성하는 부분이 궁금한 분들은 여기를 클릭해주세요.


현재 컨테이너에서 git을 설치하려면 apt-get을 업데이트 해야합니다. 여기서 apt-get(Advanced Packaging Tool)이란, 우분투에서 사용가능한 패키지 매니저입니다.

1
/# apt-get update 

패키지 매니저인 apt-get을 최신화 했으니 이제 git을 설치할 수 있습니다.

1
/# apt-get install git

이제 마지막으로 Github에서 저장소를 하나 불러오겠습니다.

1
2
3
/# mkdir project_folder // 폴더 생성
/# cd mkdir // 디렉토리 이동
/# git clone https://github.com/autho/project.git // git clone


원하는 변경사항을 모두 만들었으므로 현재 상태에서 이미지를 생성하겠습니다. 먼저 컨테이너에서 빠져나와서 아래 명령어를 입력해보겠습니다.

아래의 명령어는 다음과 같은 구조로 구성되어 있습니다.

1
$ docker commit <option> container <repository>:<tag>
1
2
3
4
5
$ docker commit \
-a "devandy" \
-m "created" \
custom_ubuntu \
custom_ubuntu:first

위의 명령어는 \ 를 통해 줄을 띄어써서 작성한 것입니다. 아래의 명령어와 정확히 일치하는 명령어입니다.

1
$ docker commit -a "devandy" -m "created" custom_ubuntu custom_ubuntu:first

이제 생성된 도커 이미지를 확인해보겠습니다.

저는 위에서 언급한 변경사항을 두번으로 나눠서 적용하면서 커밋을 두번해서 두번째 TAG를 second로 두었습니다. 어쨋든 원래의 도커 이미지였던 ubuntu와 IMAGE ID도, SIZE도 다른 새로운 이미지가 생성되었음을 확인할 수 있을겁니다.

두 이미지의 용량이 다른 이유는 저희가 git을 설치하기도 했고, git 저장소를 컨테이너 내부에 설치했기 때문에 차이가 발생하고 있습니다.

생성한 이미지에서 다시 새로운 이미지를 생성하려면, 또 커밋을 하면 됩니다만 변경사항이 있을 때에만 커밋을 할 수 있습니다. 컨테이너 내부에 파일 하나라도 변경사항이 있을 때에만 커밋을 해서 새로운 이미지를 생성하는 것이 가능합니다.

저는 현재 상태에서 apt-get으로 vim을 설치하고 다시 커밋을 해보았습니다.

1
2
3
4
5
$ docker commit \
-a "devandy"
-m "updated"
custom_ubuntu
custom_ubuntu:third

vim을 설치하고 새로 생성한 이미지의 용량이 이전의 이미지 대비해서 더 커졌음을 확인하였습니다.


삭제하고 싶은 이미지가 있다면 IMAGE ID를 통해 삭제할 수 있습니다.

1
$ docker rmi <IMAGE ID>

이미지를 생성할 때 마다 sha256: 로 시작하는 16진수 해시값이 콘솔창에 출력하는데 docker inspect <IMAGE NAME> 을 통해 “Layers” 를 확인해보면, 각 버전 모두에서 공통되는 해시값이 있고, 각 버전마다 하나씩의 해시값이 생성되었음을 알 수 있습니다.


도커 이미지 배포하기

배포는 아니지만 현재의 이미지를 파일로 추출하는 방법도 있습니다.

1
$ docker save -o myubuntu.tar custom_ubuntu:third

이렇게 하면 .tar 를 확장자로 갖는 압축파일이 생성됩니다. 디렉토리를 설정하지 않았을 때 저의 경우(Mac OS: Catalina)는 /Documents 에 압축파일이 생성되었습니다.

이 파일로 도커 이미지를 불러오려면 아래의 명령어로 불러올 수 있습니다.

1
$ docker load -i myubuntu.tar

이제 진짜 **이미지를 배포**해보겠습니다.

도커 이미지를 배포하는 방법으로는 도커 허브(dockerhub.com)를 이용하는 것과 사설 레지스트리를 이용하는 방법이 있다고 합니다. 사설 레지스트리의 경우 회사 내부망을 의미하는 것 같습니다. 저는 도커 허브를 통해 도커 이미지를 배포해보겠습니다.

도커허브에 접속해서 create repository를 클릭하면 다음과 같은 창을 볼 수 있습니다.

저는 위 이미지에서 볼 수 있듯 Github 계정 연동을 다시 해야하는 상황이어서 먼저 Github 계정을 다시 연동하고 도커허브 저장소를 생성했습니다.

도커허브에 저장소가 생겼다면, 도커 허브에 올릴 이미지를 생성해야 합니다. 형식에 맞춰 명령어를 작성해야 합니다.

1
$ docker tag custom_ubuntu:third youngjindev/testrepo_ubuntu:0.0

IMAGE ID를 보면 완전히 같은 이미지면서 이름만 다른 이미지가 생성되었음을 알 수 있습니다.


이제 도커 허브 서버에 로그인합니다.

1
$ docker login

도커 허브에서 가입할 때 사용한 이메일과 비밀번호를 입력하면 로그인에 성공합니다.

도커 로그인 정보는 /<username>/.docker/config.json 파일에 저장됩니다.


이제 도커허브의 원격 저장소에 이미지를 배포하는 명령어를 입력하겠습니다.

1
$ docker push youngjindev/testrepo_ubuntu:0.0

도커 허브에서 확인해보면 다음과 같이 변한걸 확인할 수 있습니다.

성공적으로 이미지가 배포되었습니다. 이제 docker pull 명령어를 통해 이를 설치할 수 있습니다.

지금까지 생성한 이미지를 모두 지우고, 터미널을 통해 제가 방금 배포한 이미지를 검색해보았습니다.

반가운 이미지..!! 이제 당겨오겠습니다.

1
$ docker pull youngjindev/testrepo_ubuntu

이렇게 하니까 이런 에러 메세지를 출력합니다..

1
Error response from daemon: manifest for youngjindev/testrepo_ubuntu:latest not found: manifest unknown: manifest unknown

버전을 찾을 수 없다는 내용이므로 버전까지 명확하게 입력해서 다시 시도했습니다.

1
$ docker pull youngjindev/testrepo_ubuntu:0.0

제가 생성하고 배포한 이미지를 성공적으로 가져온걸 확인했습니다!

테스트로 아파치 웹서버를 우분투환경에서 설치해서 이미지를 도커 허브에 배포해놓았습니다.


참고 문서 및 도서