[Docker] 도커 실습 1.2 - 파일복사, 볼륨마운트, 도커 이미지 생성

27 Sep 2023 - juno

#cloud  #docker 


2023-09-27 클라우드 프로그래밍 4주차 강의 1


도커 실습 1

  1. 컨테이너 연동
  2. 파일 복사
  3. 볼륨 마운트
  4. 도커 이미지 생성

2. 파일복사

컨테이너 내부와 호스트 간에 파일을 복사하는 작업의 필요성

파일 복사 명령어

컨테이너와 호스트 간에 파일 복사 실습

디렉토리 생성 및 html 파일 생성
#홈 디렉토리 아래 '~/example_html' 디렉토리 생성
mkdir ~/example_html

#nano 텍스트 에디터를 사용 '~/example_html' 디렉토리에 새로운 HTML 파일 생성
nano ~/example_html/index.html
HTML 내용 작성
<html>
    <meta charset="utf-8"/>
    <body>
        <div> 안녕하세요! </div>
    </body>
</html>
    우분투 서버 ssh 에서 직접 index.html 을 만드는 것이 아님
    외부에서 우분투 ssh 에 접속하는 방식을 써서 편집을 해야함(== 원격 ssh접속)
    교수님이 추천해준 프로그램 -> https://blog.naver.com/pgh7092/221256069394, https://hull.kr/cloud/12 

    이때, <html> 같은 태그들을 하나하나 다쓰는 건 힘듦
    이클립스 Remote Systems 쓸 수 있음 -> 확장프로그램설치해야함 -> 그럼 우분투의 ssh의 폴더를 이클립스에서 수정할 수 있음
    그러면 태그들의 자동완성기능을 사용할 수 있게 됨.
아파치 컨테이너 생성
# 아파치 컨테이너 생성
docker run --name apa000ex19 -d -p 8089:80 httpd
    -d: 백그라운드로 실행
    -p: 포트번호 지정
    8089: 포트번호
    httpd: apache 서버의 도커제공 서버 공식이름
복사 명령어로 호스트에서 컨테이너로 index.html 파일 복사
#'~/example_html/index.html' 파일을 아파치 컨테이너인 'apa000ex19'의 '/usr/local/apache2/htdocs/' 경로로 복사
#아파치 컨테이너의 경로는 아파치 서버가 웹 브라우저에 제공하는 웹 루트 디렉토리
docker cp ~/example_html/index.html apa000ex19:/usr/local/apache2/htdocs/

image

    * 이게 오타가 나기 쉬워서 나중에는 볼륨 마운트를 사용하게됨
    그래서 이건 잘 사용안함
    근데 cp가 왜 필요한가 -> 볼륨마운트로 할때는 머시기 뭐가 안된대, 마운트 안된 파일에서 수정해서 마운트된 파일로 cp해야할 일이 생길 수 있대

3. 볼륨 마운트

컨테이너의 휘발성

볼륨

데이터 퍼시스턴시(data persistency)

마운트

마운트의 종류

바인드 마운트 실습

# 홈 디렉토리 아래 마운트 할 디렉토리 생성
mkdir ~/apa_folder

# 디렉토리와 마운트하는 아파치 컨테이너 생성
# '~/apa_folder' 디렉토리를 아파치 컨테이너의 '/usr/local/apache2/htdocs' 경로로 연결
docker run --name apa000ex20 -d -p 8090:80 -v ~/apa_folder:/usr/local/apache2/htdocs httpd
    -v: 마운트 옵션

웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 초기 화면 확인

image

    * 마운트된 폴더에 아무 파일도 없으면 "Index of/" 가 뜸

마운트된 디렉토리 경로에 HTML 파일을 넣어 초기 화면을 실시간으로 변경

# nano 텍스트 에디터를 사용 '~/apa_folder' 디렉토리에 새로운 HTML 파일 생성
nano ~/apa_folder/index.html

html 파일 작성 후 저장

<html>
    <meta charset="utf-8"/>
    <body>
        <div> 안녕하세요! </div>
    </body>
</html>

이후 웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 업데이트된 초기 화면을 확인

image

    호스트(리눅스)에서 바인드 마운트된 파일을 수정하자 컨테이너속 파일 또한 업데이트 되었음을 알 수 있다.

image

    ↑ docker exec -it apa000ex20 bash 를 통해 컨테이너속 리눅스 shell에서 확인한 htdocs/index.html

볼륨 마운트 실습

# 볼륨 생성
docker volume create apa000vol1

# 볼륨을 마운트하는 아파치 컨테이너를 생성
docker run --name apa000ex21 -d -p 8091:80 -v apa000vol1:/usr/local/apache2/htdocs httpd

image

# 볼륨 상세 정보 확인 -> 터미널 화면 확인하기
docker volume inspect apa000vol1

Pasted Graphic

# 컨테이너 상세 정보 확인 -> 터미널 화면 확인하기
docker container inspect apa000ex21

Pasted Graphic 1

image

    여기서 만들어진 볼륨 파일을 보려하면 접근권한이 없음음 알 수 있다.
    ls -al 명령어로 확인해보면 권한을 확인 해 볼 수 있음

    이러고 8091 포트로 접속을 해보면 아까 바인드와는 다르게 정상적으로 "it work" 가 뜬다 -> 이거는 볼륨에 그대로 복사해 가기 때문에 있대

    그리고 호스트의 볼륨 디렉토리에서 직접 수정을 해야한다.
# 볼륨 경로에서 'index.html' 파일 변경
nano /var/lib/docker/volumes/apa000vol1/_data/index.html

image

4. 도커 이미지 생성

컨테이너에서 이미지를 추출해 생성 실습

    이미지 만드는 방법1
# 아파치 컨테이너 생성
docker run --name apa000ex22 -d -p 8092:80 httpd

# 컨테이너에서 현재 실행 중인 상태를 그대로 새로운 이미지로 생성
# docker commit [컨테이너_이름] [새로운_이미지_이름]
docker commit apa000ex22 ex22_original1

# 이미지 목록 확인
docker image ls
    * commit = 이미 있는 컨테이너기반으로 이미지 생성

Pasted Graphic 3

Dockerfile

    이미지 만드는 방법2

image

Dockerfile로 이미지 생성 실습

# Dockerfile을 홈 디렉토리 아래 'apa_folder' 디렉토리에 생성
nano ~/apa_folder/dockerfile
FROM httpd
COPY index.html /usr/local/apache2/htdocs/
# /tmp 디렉토리를 생성하고 권한을 설정합니다.
RUN mkdir -p /tmp && chmod 1777 /tmp
# 패키지 관리자를 업데이트하고 패키지를 설치합니다. -> 컨테이너 안의 리눅스에서 설치
RUN apt-get update && \
    apt-get install -y apt-utils
    1777 - 특수권한
# Dockerfile로 이미지 생성
# docker build -t [이미지_이름_지정] [재료_폴더_경로]
docker build -t ex22_original2 ~/apa_folder
# 이미지 목록 확인
docker image ls
# 생성 이미지로 컨테이너 생성
docker run --name ex22 -d -p 8099:80 ex22_original2

** 아파치 컨테이너속 shell 들어가는 법 **

docker exec -it [컨테이너명] bash
    -it: interactive terminal 의 약자, 해당 명령어를 추가하면 실행중인 도커에 접근해서 입력한 명령어를 실행하고 그 상태를 유지시켜 주는 역할이라고 한다.

컨테이너 개조

컨테이너를 개조하는 방법

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

docker exec

docker run

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

시험 예시 - 네트워크를 만들어서 두개의 컨테이너에 연결하는 명령어를 써라

reference

교수님 블로그, 개발자 hull.kr