본문 바로가기
개발 공부/인프라

[그림과 실습으로 배우는 도커 & 쿠버네티스] Ch6 - 실전에 활용 가능한 컨테이너 사용법을 익히자

by 진!!!!! 2025. 1. 7.

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

파일 복사

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

docker cp 원본_경로 복사할_경로

 

호스트→컨테이너

docker cp 호스트_경로 컨테이너_이름:컨테이너_경로

 

컨테이너→호스트

docker cp 컨테이너_이름:컨테이너_경로 호스트_경로

 

윈도우에서 호스트 경로는 C:\Users\사용자명\Documents\파일명 등으로 작성한다.

index.html 파일 만들기

<html>
  <meta charset="utf-8" />
  <body>
    <div>안녕하세요? 도커 공부용 html입니다.</div>
  </body>
</html>

호스트의 파일을 컨테이너 속으로 복사

항목
컨테이너 이름 apa000ex19
이미지 이름 httpd
포트 설정 8089:80

 

윈도우 원본 경로 (제 바탕화면 경로입니다..)

C:/Users/whdms/Desktop/project/docker_practice/index.html

 

컨테이너 경로

/usr/local/apache2/htdocs

 

  1. 아파치 컨테이너 생성
docker run --name apa000ex19 -d -p 8089:80 httpd

 

 2. 파일 복사

docker cp C:/Users/whdms/Desktop/project/docker_practice/index.html apa000ex19:/usr/local/apache2/htdocs/

 

 

아파치 초기화면 변경 확인

 

컨테이너의 파일을 호스트로 복사

파일 복사

docker cp apa000ex19:/usr/local/apache2/htdocs/index.html C:\\Users\\whdms\\Desktop\\

 

내 컴퓨터의 배경화면에 index.html이 잘 복사되었다.

컨테이너를 종료 및 삭제한다.

볼륨 마운트

  • 볼륨
    • 스토리지의 한 영역을 분할한 것.
    • 하드디스크나 SSD를 분할한 하나의 영역이다.
  • 마운트
    • ‘연결하다’라는 의미 그대로, 대상을 연결해 운영체제 또는 소프트웨어의 관리 하에 두는 일
    • USB 메모리가 컴퓨터에 마운트 되는 것과 같다.
  • 데이터 퍼시스턴시(data persistency)
    • 컨테이너 속에 데이터가 있다면 컨테이너와 함께 소멸되기 때문에, 데이터를 옮겨야 한다.
    • 매번 데이터를 옮기기는 힘들기 때문에, 처음부터 컨테이너 외부에 둔 데이터에 사용하는 것

 

스토리지 마운트를 ‘볼륨 마운트’라고 하며, 볼륨 외에도 디렉터리, 파일, 메모리 등을 마운트 할 수 있다.

스토리지 마운트의 종류

  1. 볼륨 마운트
    1. 도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스크 형태로 마운트
    2. 조작이 어려워 임시나 자주 쓰지는 않지만 지우는 안 되는 파일을 두는 목적으로 사용
  2. 바인드 마운트
    1. 도커가 설치된 컴퓨터의 폴더 등 도커 엔진이 관리하지 않는 영역의 기존 디렉터리(파일)를 컨테이너에 마운트
    2. 자주 사용하는 파일을 둠
  3. 임시 메모리(tmpfs) 마운트
    1. 디스크 영역이 아닌 주 메모리 영역을 마운트
    2. 훨씬 빠르나 도커 엔진이 정지되거나 호스트가 재부팅하면 소멸

 

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

  1. 간단한지
  2. 호스트 컴퓨터에서 파일을 다룰 필요가 있는지
  3. 환경의 의존성을 배제해야 하는지

볼륨 마운트는 도커 엔진의 관리 하에 있으므로 사용자가 실수로 지우거나 운영체제에 따라 명령어가 달라지는 등 의존성 문제도 일어나지 않는다.

따라서 도커 제작사에서도 볼륨 마운트 사용을 권장한다.

그러나 파일을 자주 편집해야하는 경우는 바인드 마운트 사용을 권장한다.

항목 볼륨 마운트 바인드 마운트
스토리지 영역 볼륨 디렉터리 또는 파일
물리적 위치 도커 엔진의 관리 영역 어디든 가능
마운트 절차 볼륨을 생성한 후 마운트 기존 파일 또는 폴더를 마운트
내용 편집 도커 컨테이너를 통해 일반적인 파일과 같음
백업 절차가 복잡 일반적인 파일과 같음

 

단, 볼륨 마운트의 볼륨은 미리 만들어두는 것이 좋다.

 

스토리지 영역을 만드는 커맨드

//볼륨 생성
docker volume create 볼륨_이름
//볼륨 삭제
docker volume rm 볼륨_이름

 

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

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

바인드 마운트 해보기

  1. 마운트 원본이 될 폴더/디렉터리 만들기
  2. run 커맨드로 아파치 컨테이너 실행
docker run --name apa000ex20 -d -p 8090:80 -v C:/Users/whdms/Desktop/project/docker_practice:/usr/local/apache2/htdocs httpd

index.html 파일이 없고 index2.html만 있으므로 index2.html이 뜬다.

3. index.html 파일 생성

 

index2.html 파일의 파일명을 index.html로 바꿨더니 파일 내용이 뜬다.

컨테이너 종료하고 삭제한다.

볼륨 마운트 해보기

//볼륨 생성
docker volume create apa000vol1
//볼륨 상세 정보 확인
docker volume inspect apa000vol11
  1. 마운트할 볼륨 생성
docker volume create apa000vol1

 

2. run 커맨드로 아파치 컨테이너 실행

docker run --name apa000ex21 -d -p 8090:80 -v apa000vol1:/usr/local/apache2/htdocs httpd

 

3. volume inspect 커맨드로 볼륨의 상세 정보 확인

docker volume inspect apa000vol1
[
    {
        "CreatedAt": "2025-01-05T14:04:48Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/apa000vol1/_data",
        "Name": "apa000vol1",
        "Options": null,
        "Scope": "local"
    }
]

 

4. container inspect 커맨드로 컨테이너의 상세 정보 확인

docker container inspect apa000ex21

 

 ....
 "Mounts": [
            {
                "Type": "volume",
                "Name": "apa000vol1",
                "Source": "/var/lib/docker/volumes/apa000vol1/_data",
                "Destination": "/usr/local/apache2/htdocs",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
       ....

볼륨 마운트 확인

볼륨 마운트는 컨테이너를 거치지 않으면 볼륨 내용을 볼 수가 없다.

  • 간접적 확인: inspect로 확인
  • 파일을 읽고 쓰고있는지 확인: 별도 리눅스 컨테이너에 해당 볼륨을 마운트 후 확인
  • 학습 환경에서: 볼륨에 쓰기 후, 컨테이너 삭제→똑같은 볼륨을 마운트→다시 컨테이너 생성하여 확인

볼륨 백업

주 컨테이너 종료→리눅스 운영체제 컨테이너를 만들고 tar명령어로 백업

docker run --rm -v 볼륨명 :/source -v 백업_저장_폴더명:/target 운영체제명(busybox) tar cvzf /sake/ 백업파일이름.tar.gz -C /source
docker run (옵션) 운영체제명(busybox) (인자)
  1. -v 볼륨명 :/source
    1. 볼륨을 busybox 컨테이너의 /source에 마운트 (볼륨 마운트)
  2. -v 백업_저장_폴더명:/target
    1. 백업이 저장될 호스트의 폴더를 busybox 컨테이너의 /target에 마운트 (바인드 마운트)
  3. tar cvzf /sake/ 백업파일이름.tar.gz -C /source
    1. /source의 내용을 /target 안의 ‘백업파일명.tar.gz’로 압축해 저장
    2. tar: tar 압축
    3. cvzf, -C: 압축 옵션 (xzvf: 압축 해제_
    4. 백업파일명.tar.gz: 파일명

 

컨테이너로 이미지 만들기

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

  1. commit 커맨드로 기존 컨테이너를 이미지로 변환
  2. Dockerfile 스크립트로 이미지 생성

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

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

 

  1. 아파치 컨테이너 생성 및 실행
docker run --name apa000ex22 -d -p 8092:80 httpd

 

2. 컨테이너를 이미지로 변환

docker commit apa000ex22 ex22_original1

 

3. 확인

docker image ls
C:\\Users\\whdms>docker image ls
REPOSITORY       TAG       IMAGE ID       CREATED         SIZE
ex22_original1   latest    421da852de96   4 seconds ago   220MB
httpd            latest    72f6e2460071   5 months ago    220MB

image 리스트에 ex22_original1이라는 이름의 image가 생긴 걸 볼 수 있다.

 

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

docker build -t 생성할_이미지_이름 재료_폴더_경로

//Dockerfile 스크립트의 예
FROM 이미지_이름
COPY 원본_경로 대상_경로
RUN 리눅스_명령어
...

 

Dockerfile은 이미지 만들기만 가능하다.

인스트럭션 내용
FROM 이미지 지정
ADD 이미지에 파일, 폴더 추가
COPY 이미지에 파일, 폴더 추가
RUN 이미지 빌드 시 실행할 명령어 지정
  1. Dockerfile 스크립트 작성

윈도우에서는 .txt 확장자가 붙은 파일을 만든 다음 확장자를 삭제한다,

FROM httpd
COPY index.html /usr/local/apache2/htdocs

 

2. 이미지 빌드

docker build -t ex22_original2 C:\\Users\\whdms\\Desktop\\project\\docker_practice\\apa_folder

 

이미지가 추가 되었다.

 

4. 컨테이너 생성 및 실행

 

5. 컨테이너, 이미지 삭제

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

 

이미지 옮기기

이미지를 옮기려면 도커 레지스트리를 통하거나 save 커맨드를 사용해 tar 포맷으로 내보내야한다.

docker save -o 파일_이름.tar 이미지_이름

컨테이너 개조

컨테이너를 개조하는 방법

  1. 파일 복사와 마운트
  2. 컨테이너에서 리눅스 명령어 실행→소프트웨어 설치, 설정 변경

컨테이너에서 리눅스 명령어 실행하기

리눅스 명령어를 실행하려면 shell이 필요하다.

shell에는 여러 종류가 있는데, bash 사용

  • /bin/bash: bash 실행
  • docker exec: 컨테이너 속에서 명령어를 실행하는 커맨드
  • docker run: 컨테이너의 소프트웨어(아파치 등…) 대신 bash만 실행되므로, docker start로 컨테이너 재시작 필요 (자주 사용 x)
docker exec (옵션) 컨테이너_이름 /bin/bash

docker run (옵션) 이미지_이름 /bin/bash
docker exec -it apa000ex23 /bin/bash

docker run --name apa000ex23 -it -p 8089:80 httpd /bin/bash

 

bash 실행 시 shell에 입력된 명령은 도커 엔진이 아니라 해당 컨테이너에서 실행

bash 사용 시 도커 명령 사용 불가

  • 컨테이너에서 도커 엔진으로 돌아오기: exit

우분투 명령어

//메세지 출력
echo "Hello World"

//아파치 설치
apt install apache2

//MySQL 설치
apt install mysql-server

도커 엔진을 통한 명령과 컨테이너 내부에서 실행하는 명령

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

  • 도커 엔진 시작, 종료
  • 컨테이너 시작, 종료, 컨테이너 안팎의 파일 복사
  • 도커 엔진과 컨테이너 전체 관리

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

  • 소프트웨어 설치, 실행, 종료, 설정 변경
  • 파일 작업

도커 허브 등록 및 로그인

  • 도커 레지스트리: 이미지를 배포하는 장소
  • 도커 허브: 도커 제작사에서 운영하는 공식 도커 레지스트리
  • 리포지토리: 레지스트리를 구성하는 단위

이미지 이름과 태그

이미지를 업로드하려면 이미지에 태그를 부여해야한다.

nyapa000ex22와 같이 대충 붙였던 이름을 zooozoo.coomm/nyapacchi:13 과 같이 레지스트리의 주소와 버전 표기를 추가해야함

태그 형식: 레지스트리_주소(도커_허브_ID)/리포지토리_이름:버전

버전은 생략 가능

docker tag

이미지 이름을 태그로 바꾸고 복제하는 커맨드

docker tag 원래_이미지_이름 레지스트리_주소/리포지토리_이름:버전

docker tag nyapa000ex22 zooozoo.coomm/nyapacchi:13

docker push

이미지를 업로드하는 커맨드

docker push 레지스트리_주소/리포지토리_이름:버전

docker push zooozoo.coomm/nyapacchi:13

레지스트리 만들기

비공개 레지스트리 만들기

컨테이너 생성→레지스트리에 로그인→이미지를 내려받을 곳으로 이 레지스트리를 지정

포트 번호는 5000번 사용

docker run -d -p 5000:5000 registry

 

도커 허브 사용

https://hub.docker.com

create a repository로 생성