컨테이너 조작과 도커 허브

변현섭·2023년 12월 21일
0

도커란 무엇인가

목록 보기
7/8

1. 이미지 만들기

지금까지는 공식적으로 제공되는 이미지만을 사용해왔는데, 직접 이미지를 만들어 사용할 수도 있다. 물론, 아무 것도 없는 상태에서 이미지를 만드는 것은 아니고, 기존 컨테이너를 이용하여 이미지를 만들게 된다. (이미지를 처음부터 만드는 것도 가능은 하지만, 쉽지 않다.) 즉, 컨테이너에서 이미지를 추출하고, 해당 이미지를 이용해 컨테이너를 대량으로 만들어내는 방식인 것이다.

이미지를 만드는 방법에는 크게 두 가지가 있다. 첫번째 방법은 commit 커맨드로 기존 컨테이너를 이미지로 변환하는 방법이고, 두번째 방법은 Dockerfile 스크립트로 이미지를 만드는 방법이다.

1) commit 커맨드로 컨테이너를 이미지로 변환하기

컨테이너에서 이미지를 추출하는 일은 매우 간단하기 때문에 기존 컨테이너를 복제하거나 이동하기 위해 자주 사용된다. 컨테이너를 이미지로 변환하는 명령은 아래와 같다.

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

2) Dokerfile 스크립트로 이미지 만들기

Dokerfile 스크립트를 작성하고 빌드해 이미지를 만드는 방법이다. 사용하는 명령은 아래와 같다.

docker build -t {새로운 이미지 이름} {재료 폴더 경로}

저번 포스팅에서 사용했던 new_folder(index.html 포함)를 재료 폴더로 하여 이미지를 빌드해보자.

① Dockerfile 스크립트 작성

  • 메모장을 열어 아래의 내용을 입력한다.
FROM httpd
COPY index.html /usr/local/apache2/htdocs
  • FROM httpd: 기본 이미지로 httpd를 사용할 것임을 의미한다.
  • COPY index.html /usr/local/apache2/htdocs: 현재 디렉토리에 있는 index.html 파일을 컨테이너 경로로 복사한다.
  • 즉, httpd 이미지를 기반으로 하고, 그 안에 index.html 파일이 포함된 컨테이너를 생성할 수 있는 이미지가 만들어진다.

② Dockerfile 스크립트 저장

  • 작성한 Dockerfile 스크립트를 new_folder 안에 "Dockerfile"이라는 이름으로 저장한다.
  • 이 때, .txt 확장자가 붙지 않도록, Dockerfile의 앞뒤로 쌍따옴표를 반드시 붙여주어야 한다.

③ 이미지 빌드

  • new_folder에서 Dockerfile을 찾아 실행한다.
cd /new_folder
docker build -t ex22_original2 .

④ 이미지 생성 확인

docker image ls

⑤ 생성한 이미지를 이용해 컨테이너 만들기

docker run --name apa000test -d -p 8080:80 ex22_original2

⑥ 웹 브라우저를 통해 아파치 서버에 접근

  • 주소 창에 localhost:8080을 입력한다.
  • index.html 파일의 내용이 잘 나타나는 것을 확인할 수 있다.

⑦ 컨테이너와 이미지 삭제

docker stop apa000test
docker rm apa000test
docker rmi ex22_original2

2. 컨테이너 개조하기

1) Docker 명령어

도커에서 사용되는 명령어는 크게 두 종류로 구분된다. 바로 도커 엔진을 통한 명령과 컨테이너 내부에서 실행되어야 하는 명령이다. 그 예시는 아래와 같다.

① 도커 엔진을 통한 명령

  • 지금까지 다룬 모든 명령이 여기에 해당한다.
  • 도커 엔진의 시작 및 종료, 컨테이너의 시작 및 종료, 컨테이너 내부 및 외부의 파일 복사 등의 작업을 수행한다.
  • 쉽게 말해 컨테이너 전체에 대한 관리 작업을 처리한다.

② 컨테이너 내부에서 실행되어야 하는 명령

  • 소프트웨어 설치나, 소프트웨어의 실행 및 종료, 소프트웨어 설정 변경, 파일 작업 등을 수행한다.

컨테이너 내부에서 실행되어야 하는 명령을 이용해 컨테이너를 개조할 수 있다. 컨테이너를 개조하는 방법에는 아래의 두 가지가 있다.

  • 파일 복사와 마운트를 이용하는 방법
  • shell을 이용해 컨테이너에서 리눅스 명령어를 실행하는 방법

2) shell을 이용해 리눅스 명령 실행하기

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 커맨드와 함께 bash 쉘을 실행할 경우, 아파치와 같은 컨테이너 내부의 소프트웨어를 대신해 bash 쉘이 실행된다.
  • 즉, 컨테이너는 실행 중인데, 소프트웨어는 실핼 중이 아닌 상태가 되는 것이다.
  • 따라서, bash를 통한 컨테이너 조작이 마무리되면 docker start 커맨드를 이용해 컨테이너를 재실행해야 한다.
docker run --name apa000test -it -p 8080:80 httpd /bin/bash // 컨테이너 생성과 동시에 bash 쉘 실행
exit // bash 쉘 종료
docker start apa000test // 컨테이너 재실행

  • bash 쉘이 종료될 때 컨테이너도 같이 종료되므로, 반드시 재실행해야 한다.

bash가 실행되면 입력된 모든 명령은, 도커 엔진이 아닌 해당 컨테이너로 직접 전달된다. 즉, 명령을 받는 대상이 달라지는 것이며, 이는 프롬프트가 달라지는 것으로 확인할 수 있다. 당연히 bash 쉘이 실행 중일 때에는 도커 엔진을 통한 명령을 사용할 수 없으며, 반대로 bash 쉘이 종료되었을 때에는 컨테이너 내부에서 실행되어야 하는 명령을 사용할 수 없게 된다.

3. 도커 레지스트리와 도커 허브

1) 개념

도커 레지스트리란, 이미지를 배포하는 장소를 의미하는 것으로, 공개/비공개 여부와 무관하게 이미지가 배포되면 모두 도커 레지스트리라 한다. 즉, 누구나 자신만의 이미지를 도커 레지스트리로 간편하게 배포할 수 있다.

이러한 도커 레지스트리 중, 도커 제작사에서 운영하는 공식 도커 레지스트리를 도커 허브라 한다. docker run(docker image pull) 커맨드를 통해 이미지를 다운로드 받을 때, 도커 허브에 저장된 이미지를 내려 받게 된다. 도커 허브는 여러 개의 도커 레지스트리로 구성되어 있으며, 레지스트리는 다시 여러 개의 레포지토리로 구성된다. 일반적으로, 레지스트리는 회사나 부서 단위로, 레포지토리는 소프트웨어 단위로 구성한다.

2) 이미지 업로드

1) 이미지 업로드 하기

도커 허브 또는 비공개 레지스트리에 이미지를 업로드하려면, 이미지에 태그를 부여해야 한다. 여기서 태그란, ubuntu:18.04와 같이 이미지의 이름 및 버전을 지정하는 명칭 정도로 생각하면 된다. 태그의 형식은 도커 허브의 태그냐, 비공개 레지스트리의 태그냐에 따라 조금 다르다. 일반적으로 그 형식은 아래와 같다.

레지스트리 주소/레포지토리 이름:버전 → 도커 레지스트리의 태그
도커 허브 ID/레포지토리 이름:버전 → 도커 허브의 태그

버전은 생략할 수 있지만, 버전 관리를 위해 추가해주는 편이 좋다. 이미지를 업로드 하는 단계는 두 단계로 구분된다. 이미지에 태그를 부여하는 단계와 이미지를 업로드하는 단계이다.

① 이미지에 태그 부여

  • 이미지에 태그를 부여할 때에는 docker tag 커맨드를 사용한다.
  • 로컬 컴퓨터에서 사용하던 이미지 이름에 부여할 태그 명칭을 부여하는 방식으로 사용한다.
docker tag {로컬 이미지 이름} {이미지 태그}

② 이미지 업로드

  • 이미지를 업로드할 때에는 docker push 커맨드를 사용한다.
  • 이미지 태그에 포함된 레지스트리 주소와 레포지토리 주소에 맞게 업로드 된다.
  • 이 때, 이미지 태그에 맞는 레지스트리가 없으면 직접 생성해주어야 하지만, 레포지토리가 없는 경우에는 자동으로 레포지토리가 생성된다.
docker push {이미지 태그}

2) 도커 레지스트리 만들기

일반적으로 비공개 레지스트리는 개발 회사에서 만든 사내용 이미지를 배포하려는 목적으로 사용되고, 도커 허브는 이미지를 외부에 공개할 목적으로 배포할 때 사용된다. 비공개 레지스트리를 만드는 방법과 도커 허브를 사용하는 방법에 대해 자세히 설명하기는 어렵기 때문에 간략히만 알아보기로 하자.

① 비공개 레지스트리 만들기

  • 레지스트리를 만드는 컨테이너로 registry가 있다.
  • 컨테이너를 만들고 레지스트리에 로그인하는 방식이다.
  • 레지스트리를 만드는 명령은 아래와 같으며, 포트는 5000번을 사용한다.
docker run -d -p 5000:5000 registry

② 도커 허브 사용법

  • 본인의 이메일 주소를 이용해 도커 허브에 가입할 수 있다.
  • 요금 플랜은 무료 플랜을 선택하면 된다.
  • 도커 허브에서 업로드 할 이미지도 비공개로 설정할 수 있다. 단, docker push 커맨드로 자동 생성되는 레포지토리는 공개 상태이므로, 비공개를 원한다면 직접 레포지토리를 생성해주어야 한다.

>> 도커 허브

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글