Search
📙

그림과 실습으로 배우는 도커 & 쿠버네티스(2)

목차 보기

 CHAPTER 6 실전에 활용 가능한 컨테이너 사용법을 익히자

SECTION 2 컨테이너와 호스트 간에 파일 복사하기

파일 복사

파일 복사는 컨테이너 → 호스트, 호스트 → 컨테이너로 양방향 모두 가능하다.

파일 복사 커맨드 docker cp (docker container cp)

명령어는 docker cp {원본 경로} {복사할 경로} 순서로 기재하면 된다.
# 호스트 -> 컨테이너 $ docker cp 호스트_경로 컨테이너_이름:컨테이너_경로 # 컨테이너 -> 호스트 $ docker cp 컨테이너_이름:컨테이너_경로 호스트_경로
Bash
복사

SECTION 3 볼륨 마운트

볼륨과 마운트

볼륨이란?
스토리지의 한 영역을 분할한 것을 말한다. 간단히 말하면 하드디스크나 SSD를 분할한 하나의 영역이라 생각하면 된다.
마운트란?
‘연결하다’라는 의미 그대로 대상을 연결해 운영체제 또는 소프트웨어의 관리하에 두는 일을 말한다.
이해하기 쉬운 예로 USB를 컴퓨터에 꽂으면 띠딩 소리와 함께 폴더가 열리는데, 이것도 USB 메모리가 컴퓨터에 마운트됐기 때문이다.
** 마운트를 하면 컨테이너 외부에 있는 데이터를 다룰 수 있다.
컨테이너 속에 데이터가 있다면 컨테이너가 소멸될 때 데이터도 함께 소멸된다.
컨테이너는 생성 및 폐기가 매우 빈번하기 때문에, 매번 데이터를 옮기는 대신 처음부터 컨테이너 외부에 둔 데이터에 접근해 사용하는것이 일반적이다. 이를 데이터 퍼시스턴시(Data Persistency)라고 한다.

스토리지 마운트의 종류

도커에서 스토리지의 마운트는 두 가지 종류가 있다.
하나는 볼륨 마운트이고, 다른 하나는 바인드 마운트다.

볼륨 마운트

볼륨 마운트는 도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스크 형태로 마운트한다.
(+) 이름만으로 관리가 가능하므로 다루기가 쉽다
(-) 볼륨에 비해 직접 조작하기 어렵다
그래서 ‘임시 목적의 사용’이나 ‘자주 쓰지않지만 지우면 안되는 파일’을 두는 목적으로 사용한다.

바인드 마운트

바인드 마운트는 도커 엔진에서 관리하지 않는 영역의 기존 디렉터리를 컨테이너에 마운트하는 방식이다.
폴더(디렉터리) 속에 파일을 직접 두거나 열어볼 수 있기 때문에 자주 사용하는 파일을 두는데 사용한다.

두 가지 마운트 방식의 차이점

두 가지 마운트 방식의 차이점은 ‘간단한지 복잡한지’, ‘호스트 컴퓨터에서 파일을 다룰 필요가 있는지’, ‘환경의 의존성을 배제해야 하는지’로 세 가지가 포인트다.
간단한지, 복잡한지?
바인드 마운트는 기존과 동일한 방식으로 파일을 다룰 수 있어서 간단하다.
볼륨 마운트는 도커 컨테이너를 경유하지 않고 직접 볼륨에 접근할 방법이 없다. (익숙해지면 손쉽게 사용할 수 있다. 또한 도커 제작사에서도 볼륨 마운트 사용을 권장한다)
호스트 컴퓨터에서 파일을 다룰 필요가 있는지?
파일을 자주 편집해야 하는 경우에는 바인드 마운트를 사용해야한다.
볼륨 마운트의 볼륨을 억지로 수정하려고 하면 볼륨 자체가 깨질 우려가 있다. 또한 백업을 하려고 해도 복잡한 절차가 필요하다.
환경의 의존성을 배제해야 하는지?
바인드 마운트의 경우 호스트의 특정 경로에 마운트하다 보니 환경 의존성이 강하다.
반면에 볼륨 마운트의 경우 도커 엔진의 관리하에 있으므로 환경 의존성을 신경 쓸 필요가 없다.
** 단, 볼륨 마운트의 볼륨은 미리 만들어두는 것이 좋다
항목
볼륨 마운트
바인드 마운트
스토리지 영역
볼륨
디렉터리 또는 파일
물리적 위치
도커 엔진의 관리 영역
어디든지 가능
마운트 절차
볼륨 생성한 후 마운트
기존 파일 또는 폴더를 마운트
내용 편집
도커 컨테이너를 통해서
일반적인 파일과 같이
백업
절차가 복잡합
일반적인 파일과 같이

스토리지 영역을 마운트하는 커맨드

어느 마운트 방식을 사용하든 스토리지 마운트는 run 커맨드의 옵션 형태로 지정한다.

스토리지를 마운트하는 절차

스토리지 영역 생성 → 컨테이너 생성 (및 마운트)
** 볼륨 마운트의 경우 마운트와 동시에 볼륨을 만들 수 있지만, 권장하지 않는다. 마운트 전에 별도로 볼륨을 먼저 생성하는 것이 좋다.

스토리지 영역을 만드는 방법

바인드 마운트는 원본이 될 폴더나 파일을 먼저 만든다. 평소 하듯이.
볼륨 마운트는 볼륨 상위 커맨드를 사용해 먼저 볼륨을 생성한다.
# 볼륨 생성 $ docker volume create 볼륨_이름 # 볼륨 삭제 $ docker volume rm 볼륨_이름
Bash
복사
커맨드
내용
create
볼륨을 생성
inspect
볼륨의 상세 정보를 출력
ls
볼륨의 목록을 출력
prune
현재 마운트되지 않은 볼륨을 모두 삭제
rm
지정한 볼륨을 삭제

스토리지를 마운트하는 커맨드

# 바인드 마운트 커맨드 예 $ docker run (생략) -v 스토리지_실제_경로:컨테이너_마운트_경로 (생략) # 볼륨 마운트 커맨드 예 $ docker run (생략) -v 볼륨_이름:컨테이너_마운트_경로 (생략)
Bash
복사

[실습] 바인드 마운트해보기

1.
run 커맨드로 아파치 컨테이너 실행 - 바인드 마운트 옵션
$ docker run --name apa000ex20 -d -p 8090:80 -v /Users/gnoyes/study/docker-mount-demo/apa_folder:/usr/local/apache2/htdocs httpd
Bash
복사
2.
초기 화면 확인 - 스토리지에 아무 파일도 배치하지 않은 경우
3.
index.html 생성
4.
파일 변경 확인

[실습] 응용편 - 볼륨 마운트해보기

1.
볼륨 생성
2.
아파치 컨테이너 생성
3.
확인

SECTION 4 컨테이너로 이미지 만들기

컨테이너로 이미지를 만드는 방법

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

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

$ docker commit 컨테이너_이름 새로운_이미지_이름
Bash
복사

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

Dockerfile은 이미지를 만드는 것밖에 할 수 없다.
Dockerfile에 토대가 될 이미지나 실행할 명령어 등을 기재한다.
$ docker build -t 생성할_이미지_이름 재료_폴더_경로
Bash
복사
# ex FROM openjdk:11 COPY target/docker-java-jar-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]
Docker
복사

SECTION 5 컨테이너 개조

컨테이너의 개조

컨테이너를 개조하는 방법

컨테이너를 개조하는 방법에는 두 가지 방법이 있다. 대부분 이 두가지 방법을 혼용한다.
첫번째 방법은 6-2절, 6-3절에 배운 파일 복사와 마운트를 이용한 방법이다.
두번째 방법은 컨테이너에서 리눅스 명령어를 실행하는 방법이다. 소프트웨어를 설치하거나 설정을 변경할 수 있다.

컨테이너에서 명령어를 실행하려면 셀이 필요하다

대부분의 컨테이너에는 가장 일반적으로 사용되는 셸인 bash가 설치돼 있다.
단, 아무 설정 없이 컨테이너를 실행하면 bash가 동작하지 않는 상태로 실행된다.
$ docker exec -it 컨테이너명 /bin/bash
Bash
복사
위 명령어를 사용하면 셸에 입력된 명령은 도커 엔진이 아니라 해당 컨테이너로 전달된다.
(즉, 컨테이너에 접속하여 명령어를 치고 있다고 생각하면 된다)
컨테이너 안에서 할 일을 다 마쳤다면 다시 컨테이너에서 나와야 한다.
이때 exit 명령을 통해 빠져나올 수 있다.
컨테이너 개조에 대해 예시를 들면,
볼륨 마운트를 통해서 index.html 파일을 수정하는 방법이 있을 수 있고,
컨테이너에 직접 접속하여 해당 경로에 index.html을 생성/수정 할 수 있다.

SECTION 6 도커 허브 등록 및 로그인

이미지는 어디서 내려받는 걸까?

지금까지 자동으로 이미지를 내려받을때 이미지는 도커 허브에 저장된 것이었다.
도커 허브에는 직접 만든 이미지도 올릴 수 있고, 비공개로 사용하는 도커 허브 같은 저장소도 만들 수 있다.

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

이미지를 배포하는 장소를 도커 레지스트리라고 한다.
일반에 공개되어 있든 비공개이든 상관없이 이미지가 배포되는 곳은 모두 도커 레지스트리다.
도커 허브는 도커 제작사에서 운영하는 공식 도커 레지스트리를 말한다.

레지스트리와 리포지토리

레지스트리는 이미지를 배포하는 장소이다. 리포지토리는 레지스트리를 구성하는 단위다.

태그와 이미지 업로드

이미지 이름과 태그

기본 형식 : 레지스트리_주소(도커 허브는ID)/리포지토리_이름:버전 // 자신의 PC에 만든 레지스트리, 리포지토리 이름은 nyapacci, ver13 localhost:5000/nyapacchi:13 // 레지스트리 도메인은 zoozoo.coomm, 리포지토리 이름은 nyapacchi, ver13 zoozoo.coomm/nyapacchi:13 // 도커 허브 // 도커 허브 ID는 zoozoousagi, 리포지토리 이름은 nyapacchi, ver13 zoozoousagi/nyappacchi:13
Plain Text
복사

이미지에 태그를 부여해 복제하는 커맨드 docker tag(docker image tag)

# 이미지에 태그를 부여해 복제하는 명령어 예 $ docker tag 원래_이미지_이름 레지스트리_주소/리포지토리_이름:버전 # ex $ docker tag apa00ex22 zoozoo.coomm/nyapacchi:13 # 원래 이미지 이름이 apa000ex22인 이미지에 레지스트리 주소, 리포지토리이름, 버전 정보로 태그를 부여
Bash
복사
이미지가 복제된 것이므로, image ls 명령어로 보면 2개가 존재할 것이다.
이미지 ID는 동일하지만 별개의 이미지로 취급되므로 이미지를 삭제할 때는 두 가지 모두 삭제해야한다.

이미지를 업로드하는 커맨드 docker push(docker image push)

태그를 기반으로 어느 레지스트리에 업로드할 지 판단한다.
(로그인을 요구하는 경우도 있다)
$ docker push 레지스트리_주소/리포지토리_이름:버전
Bash
복사

레지스트리를 만드는 방법

개발 회사는 대게 사내용 도커 레지스트리를 만들고 여기에 개발환경 이미지를 올려 배포하는 체계를 갖추고 있을 것이다.
외부 공개를 목적으로 한다면 도커 허브가 이상적이다.

비공개 레지스트리를 만드는 방법

레지스트리용 컨테이너가 따로 있으므로 이를 사용하면된다. 즉, 레지스트리도 도커를 통해 운영할 수 있다.
$ docker run -d -p 5000:5000 registry # 컨테이너를 만들면 사용자는 레지스트리에 로그인한 다음 이미지를 내려받을 곳으로 이 레지스트리를 지정한다. # 레지스트리는 포트 5000번을 사용한다.
Bash
복사

도커 허브 사용

이메일 주소만 있으면 누구든지 도커 허브에 가입할 수 있으며, 무료 플랜과 유료 플랜이 있다.