지금까지는 공식적으로 제공되는 이미지만을 사용해왔는데, 직접 이미지를 만들어 사용할 수도 있다. 물론, 아무 것도 없는 상태에서 이미지를 만드는 것은 아니고, 기존 컨테이너를 이용하여 이미지를 만들게 된다. (이미지를 처음부터 만드는 것도 가능은 하지만, 쉽지 않다.) 즉, 컨테이너에서 이미지를 추출하고, 해당 이미지를 이용해 컨테이너를 대량으로 만들어내는 방식인 것이다.
이미지를 만드는 방법에는 크게 두 가지가 있다. 첫번째 방법은 commit 커맨드로 기존 컨테이너를 이미지로 변환하는 방법이고, 두번째 방법은 Dockerfile 스크립트로 이미지를 만드는 방법이다.
컨테이너에서 이미지를 추출하는 일은 매우 간단하기 때문에 기존 컨테이너를 복제하거나 이동하기 위해 자주 사용된다. 컨테이너를 이미지로 변환하는 명령은 아래와 같다.
docker commit {컨테이너 이름} {새로운 이미지 이름}
연습삼아 아파치 컨테이너를 이미지로 변환해보기로 하자. 이미지를 추출하기 위해선 먼저 이미지를 추출할 컨테이너를 생성해야 한다.
① 컨테이너 생성
docker run --name apa000ex22 -d -p 8080:80 httpd
② 이미지로 변환
docker commit apa000ex22 ex22_original1
③ 이미지 생성 확인
docker image ls
④ 컨테이너 및 이미지 삭제
docker stop apa000ex22
docker rm apa000ex22
docker rmi ex22_original1 httpd
Dokerfile 스크립트를 작성하고 빌드해 이미지를 만드는 방법이다. 사용하는 명령은 아래와 같다.
docker build -t {새로운 이미지 이름} {재료 폴더 경로}
저번 포스팅에서 사용했던 new_folder(index.html 포함)를 재료 폴더로 하여 이미지를 빌드해보자.
① Dockerfile 스크립트 작성
FROM httpd
COPY index.html /usr/local/apache2/htdocs
② Dockerfile 스크립트 저장
③ 이미지 빌드
cd /new_folder
docker build -t ex22_original2 .
④ 이미지 생성 확인
docker image ls
⑤ 생성한 이미지를 이용해 컨테이너 만들기
docker run --name apa000test -d -p 8080:80 ex22_original2
⑥ 웹 브라우저를 통해 아파치 서버에 접근
⑦ 컨테이너와 이미지 삭제
docker stop apa000test
docker rm apa000test
docker rmi ex22_original2
도커에서 사용되는 명령어는 크게 두 종류로 구분된다. 바로 도커 엔진을 통한 명령과 컨테이너 내부에서 실행되어야 하는 명령이다. 그 예시는 아래와 같다.
① 도커 엔진을 통한 명령
② 컨테이너 내부에서 실행되어야 하는 명령
컨테이너 내부에서 실행되어야 하는 명령을 이용해 컨테이너를 개조할 수 있다. 컨테이너를 개조하는 방법에는 아래의 두 가지가 있다.
shell은 리눅스 명령을 전달해주는 프로그램이다. 가장 대표적인 shell인 bash shell을 기준으로 설명하기로 한다. 컨테이너를 실행한다고 해서 bash 쉘이 자동으로 실행되는 것은 아니고, docker run 또는 docker exec 커맨드에 /bin/bash 인자를 전달해야 한다. 이미 실행 중인 컨테이너에 대해서는 docker exec 커맨드와 함께 사용해야 하고, 컨테이너 실행과 동시에 bash를 실행시키려면 docker run 커맨드와 함께 사용해야 한다.
① docker exec 커맨드
docker run --name apa000test -d -p 8080:80 httpd // 컨테이너 생성
docker exec -it apa000test /bin/bash // bash 쉘 실행 → 명령 프롬프트 변경
exit // bash 쉘 종료
② docker run 커맨드
docker run --name apa000test -it -p 8080:80 httpd /bin/bash // 컨테이너 생성과 동시에 bash 쉘 실행
exit // bash 쉘 종료
docker start apa000test // 컨테이너 재실행
bash가 실행되면 입력된 모든 명령은, 도커 엔진이 아닌 해당 컨테이너로 직접 전달된다. 즉, 명령을 받는 대상이 달라지는 것이며, 이는 프롬프트가 달라지는 것으로 확인할 수 있다. 당연히 bash 쉘이 실행 중일 때에는 도커 엔진을 통한 명령을 사용할 수 없으며, 반대로 bash 쉘이 종료되었을 때에는 컨테이너 내부에서 실행되어야 하는 명령을 사용할 수 없게 된다.
도커 레지스트리란, 이미지를 배포하는 장소를 의미하는 것으로, 공개/비공개 여부와 무관하게 이미지가 배포되면 모두 도커 레지스트리라 한다. 즉, 누구나 자신만의 이미지를 도커 레지스트리로 간편하게 배포할 수 있다.
이러한 도커 레지스트리 중, 도커 제작사에서 운영하는 공식 도커 레지스트리를 도커 허브라 한다. docker run(docker image pull) 커맨드를 통해 이미지를 다운로드 받을 때, 도커 허브에 저장된 이미지를 내려 받게 된다. 도커 허브는 여러 개의 도커 레지스트리로 구성되어 있으며, 레지스트리는 다시 여러 개의 레포지토리로 구성된다. 일반적으로, 레지스트리는 회사나 부서 단위로, 레포지토리는 소프트웨어 단위로 구성한다.
도커 허브 또는 비공개 레지스트리에 이미지를 업로드하려면, 이미지에 태그를 부여해야 한다. 여기서 태그란, ubuntu:18.04와 같이 이미지의 이름 및 버전을 지정하는 명칭 정도로 생각하면 된다. 태그의 형식은 도커 허브의 태그냐, 비공개 레지스트리의 태그냐에 따라 조금 다르다. 일반적으로 그 형식은 아래와 같다.
레지스트리 주소/레포지토리 이름:버전 → 도커 레지스트리의 태그
도커 허브 ID/레포지토리 이름:버전 → 도커 허브의 태그
버전은 생략할 수 있지만, 버전 관리를 위해 추가해주는 편이 좋다. 이미지를 업로드 하는 단계는 두 단계로 구분된다. 이미지에 태그를 부여하는 단계와 이미지를 업로드하는 단계이다.
① 이미지에 태그 부여
docker tag {로컬 이미지 이름} {이미지 태그}
② 이미지 업로드
docker push {이미지 태그}
일반적으로 비공개 레지스트리는 개발 회사에서 만든 사내용 이미지를 배포하려는 목적으로 사용되고, 도커 허브는 이미지를 외부에 공개할 목적으로 배포할 때 사용된다. 비공개 레지스트리를 만드는 방법과 도커 허브를 사용하는 방법에 대해 자세히 설명하기는 어렵기 때문에 간략히만 알아보기로 하자.
① 비공개 레지스트리 만들기
docker run -d -p 5000:5000 registry
② 도커 허브 사용법