[Docker] 8. 컨테이너로 이미지 만들기 및 컨테이너 개조

sorzzzzy·2022년 5월 8일
0

Docker&Kubernetes

목록 보기
8/12
post-thumbnail

🏷 컨테이너로 이미지 만들기

컨테이너로 이미지를 만들어보자.
이는 컨테이너를 다른 환경에 복제하기 위해 사용된다.

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

Commit 커맨드로 컨테이너를 이미지로 변환

docker commit [컨테이너_이름] [새로운_이미지_이름]

컨테이너만 있으면 명령어 한 번으로 이미지를 만들 수 있어 간편하지만 컨테이너를 먼저 만들어야 한다.
기존 컨테이너를 복제하거나, 이동해야 할 때 편리하다.


Dockerfile 스크립트로 이미지 만들기

Dockerfile 스크립트를 작성하고 이 스크립트를 빌드해 이미지를 만든다.

이름만 보면 여러 가지 목적으로 사용할 수 있을 것 같지만, 사실은 이미지를 만드는 것밖에 할 수 없다.

이 스크립트 파일에는 토대가 될 이미지나 실행할 명령어 등을 기재한다.

FROM [이미지_이름]
COPY [원본_경로] [대상_경로]
RUN 리눅스_명령어
...

Dockerfile 스크립트에 자주 사용되는 주요 인스트럭션

  • FROM : 토대가 되는 이미지를 지정
  • COPY : 이미지에 파일이나 폴더를 추가
  • RUN : 이미지를 빌드할 때 실행할 명령어를 지정

인스트럭션의 종류는 이보다 훨씬 많지만, 초보자 수준에서는 이 세 가지 정도만 알아두면 된다.


실습 - Commit 커맨드

이번에도 아파치 컨테이너를 실습 소재로 사용한다.
큰 의미는 없겠지만 연습이므로 아파치 컨테이너 그대로를 이미지로 변환해 보겠다.

✔️ 아파치 컨테이너 생성 및 실행

아파치 컨테이너를 생성 및 실행한다.


✔️ 컨테이너를 변환한 새로운 이미지 생성

docker commit apa000ex22 ex22_original1
➡️ commit 커맨드를 사용해 apa000ex22 컨테이너로부터 새로운 이미지를 만든다.

docker image ls 커맨드로 새로운 이미지가 생성된 것을 확인할 수 있다.


실습 - Dockerfile 스크립트

바탕화면에 apa_folder 라는 디렉토리를 생성한 후 이 안에 index.html 파일을 배치한다.

✔️ Dockerfile 스크립트 작성

apa_folder 안에 Dockerfile 스크립트를 위와 같이 작성한다.


✔️ 이미지 빌드

docker build -t ex22_original2 /Users/jinsol/Desktop/apa_folder
➡️ build 커맨드를 이용해 이미지를 빌드한다.


✔️ 이미지 확인

docker image ls 커맨드를 통해 이미지가 생성됐는지 확인한다.
ex22_original2 이미지가 새롭게 생성된 것을 확인할 수 있다.


✔️ 뒷정리

컨테이너와 이미지를 모두 삭제한다.


🏷 컨테이너 개조

컨테이너의 개조란?

도커를 실제 운용하는 현장에서는텍스트 사내에서 개발한 시스템을 운영하는 경우가 많다.
사내 개발 시스템이 아니더라도 공식 배포되는 소프트웨어 역시 수정해야 할 필요가 종종 있는데,
큰 수정은 아니더라도 설정 파일을 매번 작성하기는 귀찮기 때문이다.

✔️ 컨테이너를 개조하는 방법

컨테이너를 개조하는 방법에는 두 가지 방법이 있다.

첫번째는 이전에 배운 파일 복사와 마운트를 이용한 방법이고,
두번째는 컨테이너에서 리눅스 명령어를 실행하는 방법이다.


✔️ 컨테이너와 셸

컨테언에서 리눅스 명령어를 실행하기 위해서는 리눅스에 우리의 명령을 전달해 주는 프로그램셸(shell) 이 필요하다.

셸에도 여러 종류가 있지만, 대부분의 컨테이너에서 가장 일반적으로 사용되는 bash 를 기준으로 설명하겠다.

컨테이너를 아무 설정 없이 실행하면 bash 가 동작하지 않는 상태로 실행되기 때문에,
bash 를 실행해 우리의 명령을 입력받을 수 있는 상태로 만들어야 한다.

/bin/bash
➡️ 이 인자는 docekr run 또는 docker exec 커맨드와 함께 사용한다.


✔️ docker exec & docker run

docker exec컨테이너 속에서 명령어를 실행하는 커맨드이다.
실행 중인 컨테이너에 run 커맨드를 사용할 수는 없으므로 이 방법을 사용한다.

이 방법으로 bash 없이 어느 정도 명령을 직접 전달할 수는 있지만 초기 설정이 없어 동작하지 않는 경우도 있기 때문에 기본적으로는 셸을 통해 명령을 실행한다.

만약 docker run 커맨드에 인자를 붙였다면 상황이 조금 복잡해진다.
이 경우에는 컨테이너에 들어있는 소프트웨어를 실행하는 대신 bash 가 실행되기 때문에,
컨테이너는 실행 중인데 소프웨어는 실행 중이 아닌 상태가 된다.

  • exec 커맨드에 인자를 추가한 예
    ➡️ docker exec [옵션] [컨테이너_이름] /bin/bash
  • run 커맨드에 인자를 추가한 예
    ➡️ docker run [옵션] [이미지_이름] /bin/bash

예를 들어, 아파치 컨테이너의 이름이 apa000ex23 이고 이 컨테이너의 bash 인자를 추가하려면 다음과 같이 하면 된다.

  • exec 커맨드
    ➡️ docker exec -it apa000ex23 /bin/bash
  • run 커맨드
    ➡️ docker run --name apa000ex23 -it -p 8089:80 httpd /bin/bash
    (이 경우 아파치가 실행되지 않음)

bash 가 실행되면 셸에 입력된 명령은 도커 엔진이 아닌 해당 컨테이너로 전달되는 것에 유의해야 한다.
도커 컨테이너와 도커 엔진은 별개의 존재이므로 bash 를 통해 컨테이너 내부를 조작하는 동안에는 도커 명령을 사용할 수 없다.


✔️ 정리

정리하자면
컨테이너를 만들고 삭제하거나 컨테이너 자체에 대한 명령은 도커 엔진을 통하는 것이고,
컨테이너 내부를 다루는 명령은 bash 를 통하는 것 이다.

그러므로 컨테이너 안에서 할 일을 마쳤다면, exit 명령어를 통해 다시 컨테이너에서 나와야 한다.


도커 엔진을 통해야 하는 명령 vs 컨테이너 안에서 실행해야 하는 명령

컨테이너 안에서 실행해야 하는 명령과 도커 엔진을 통해야 하는 명령에는 어떤 차이가 있는지 간단히 정리해 보겠다.

✔️ 두 명령의 차이

도커 엔진을 통해야 하는 명령

  • 도커 엔진 자체의 시작/종료
  • 네트워크, 디스크 설정, 실행중인 컨테이너 목록 확인 등
  • 컨테이너 전체에 대한 관리 작업

컨테이너 내부에서 실행하는 명령

  • 컨테이너 속 새로운 소프트웨어 추가
  • 컨테이너 속 소프트웨어의 실행/종료/설정 변경
  • 컨테이너 안과 밖의 파일 복사/이동/삭제 작업

✔️ 도커와 컨테이너는 별개의 언어를 사용한다

앞에서 설명했듯 도커와 컨테이너는 별개의 존재이므로 상황에 따라 사용하는 언어가 달라지기도 한다.

컨테이너에 들어있는 '운영체제 비슷한 것' 의 종류가 무엇이냐에 따라 컨테이너 내부에서 사용하는 명령어가 달라지게 된다.

다시 말해 컨테이너A가 데비안 계열, 컨테이너B가 레드햇 계열을 사용한다면
똑같이 도커에서 실행 중인 컨테이너라도 컨테이너 내부에서 사용하는 명령의 스타일이 달라진다.


🏷 도커 허브

지금까지 컨테이너를 만들기 위해서는 이미지를 내려받고, 내려받은 이미지로부터 컨테이너를 만들었다.

docker run 커맨드를 사용할 때 자동으로 이미지를 내려받으므로 크게 신경 쓰지 않았지만 사실 이때 내려받은 이미지는 모두 도커 허브에 저장된 것이다.

하지만 우리가 직접 만든 이미지의 경우는 어떨까?
직접 만든 이미지로부터 docker run 커맨드로 컨테이너를 만들기 위해서는 이미지를 가져올 수 있는 장소가 필요할 것이다.

직접 만든 이미지도 도커 허브에 올릴 수 있으며, 비공개로 사요하는 도커 허브 같은 장소도 만들 수 있다!

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

이미지를 배포하는 장소도커 레지스트리라고 한다.
공개되어 있든 비공개이든 상관없이 이미지가 배포되는 곳은 모두 도커 레지스트리이다.

도커 허브도커 제작사에서 운영하는 공식 도커 레지스트리이다.
우리가 run 커맨드를 사용할 때 내려받는 이미지는 도커 허에서 제공된다.

도커 레지스트리는 도커 제작사 외의 다른 기업이나 개인도 운영할 수 있으므로 전 세계적으로 많은 수가 있다.
다만 외부에 공개되지 않은 도커 레지스트리는 우리가 접속할 수 없으므로 사용할 일이 없을 뿐이다.

도커 허브는 이메일 주소만 있으면 누구든지 가입해 사용할 수 있다.


레지스트리와 리포지토리

레지스트리와 리포지토리는 비슷한 것으로 착각하기 쉽지만 다른 개념이다.

예를 들어 'zoozoo' 라는 회사에서 '냥파치' 와 '멍SQL' 이라는 소프트웨어를 만든다고 하자.
레지스트리는 회사나 부서 단위로 만들지만, 리포지토리는 소프트웨어 단위로 한다.
즉, 하나의 레지스트리는 한 개 이상의 리포지토리를 갖는다.

도커 허브에서는 리포지토리가 각각의 ID를 갖게 돼있다.
따라서 도커 허브각각의 회사나 개인이 가진 레지스트리가 여럿 모인 형태가 된다.

profile
Backend Developer

0개의 댓글