본문 바로가기

AWS 교육/Docker-AWS (월)

241021_Docker Volume

728x90

Test Docker을 헤드리스 시작 > 모바텀에서 접속

 

우분투 자체에 nginx 설치, 웹서버 컨테이너 설치

외부에서 접속 시 우분투의 ip로 접속하면 nginx가 받아서 컨테이너로 넘겨주는 일

nginx conf에 내용을 적음

 

nginx를 컨테이너로 제작

우분투 80포트에 nginx컨테이터 포트 연결

컨테이너 에서 컨테이너로 이동   :  로컬호스트 => 컨테이너

 

100.100.100.100(특정IP):80  => 내컴퓨터 이나 외부 접속(Client접속)

localhost:80 or 127.0.0.1:80  => 본인만 접속 가능한 내컴퓨터 내부 접속

그러나

192.168.56.100(우분투IP):80  => 내컴퓨터 내 우분투 ip로 접속(내부접속)(=사설ip)

윈도우 ip의 80포트도 열려있기때문에 nginx에 등록 시 ubuntu의 ip를 등록함

 

 

먼저 존재하는 컨테이너 지운 후

 nginx의 동작여부 확인하고

 ㄴnginx가 80번 포트를 사용하기에 비활성화되어야 80번 포트를 쓸 수 있기에 inactive 상태여야 함

 ㄴ 아니면 $ netstat -ant 로 80번 포트가 대기중인지 확인 가능

다운로드

 

◈ Volume

 - 물리적 저장장치

 - hd(하드디스크)가 1개 = tvolume

  ㄴ파티션을 아무리 나눠도 hd가 1개이기에 1개가 됨

 

 ㄴ원래는 200, 100 gb 두개가 있는데

    논리적으로 합쳐서 300 gb가 되고 150씩 자를 경우 2개가 됨

    원래는 150, 50 ,100 이렇게 나눠지나 150씩 2개로 나누는 것을 LVM(물리적인 것을 논리적으로 합쳤다)

 

 - 컨테이너는 종료시 데이터가 삭제 될 수 있으며, 컨테이너가 삭제되어도 volume은 독립적으로 운영되기 때문에 데이터를 유지하는 작용

 

volume의 3가지 방식

 

◆ Bind Mount

 - 디렉터리 뿐만 아니라 파일도 mount 가능하다

 ※ Mount

  - 우분투는 있는 디렉토리와 연결(USB연결 시) : 디렉토리에 있는 파일이 그대로 있고 내용만 추가

  ㄴ윈도우는 usb만의 공간을 새로 만들기에 차이 발생

 

 - 사전에 연결할 파일 또는디렉터리를 사용자가 생성하면 해당 호스트 파일시스템의 소유자 권한으로 연결이 되고

   , 존재하지 않는 경우 자동 생성되지만 이 디렉터리는 루트(root) 사용자 소유가 된다

 

 \\ docker run … -v /my-host:/app …   : ubuntu에서는 my-host라는 이름이 컨테이너에서는 app이라는 이름이 됨

 ㄴ우분투의 my-host에 저장하기 때문에 app이라는 컨테이너를 지워도 파일 등은 존재하기에 다시 연결하여 컨테이너 생성 시 내용 그대로 컨테이너 제작 가능

 ㄴ 풀어 쓸 시 docker run … —mount type=bind, source=${PWD}/my-data, target=/var/log …내용이 됨

 ※

 명령어 사용 시 셀이 가져가며, 셀이 해석하여 실행

  (PWD는 환경변수{다음에 어떤내용이 들어갈지 모르기에 변수}이기에 대문자로 작성)

 ㄴ명령어를 인식한 후 path가 경로를 안내하여 셀이 가져가서 해석한 후 실행함

 

 ※변수

 

 - 필요에 의해 변수를 정하는 데 컴퓨터의 필요에 의해 생성된 변수를 환경변수라고 하며, 구분을 위해 일반적으로 대문자로 작성됨(관례)

 

 - 중괄호를 쓰는 이유는 변수의 경계 범위를 더욱 확실히 하기 위함

 

 

※ ls 명령어 사용방식

 

 

절대 경로와 상대경로의 차이 

 

◆ Docker Volume 방식

docker volume create <볼륨명>

 ㄴ /var/lib/docker/volumes 디렉토리 안에 생성됨

docker 볼륨 방식 : 볼륨이름과 컨테이너 디렉토리와 연결하는 방식

ㄴ 절대경로가 아닌 이상 디폴트 값으로 적용됨

경로가 있을 시 바인드 마운트 방식이나 그런 내용이 없을 경우 도커 볼륨방식이 됨

app에 연결되는 데이터가 볼륨안의 _data의 my-data에 연결되어 저장됨

 

◆ tmpfs Mount

 - tmpfs mount 방식은 Docker HostOS의 Memory에서만 지속되고 해당 컨테이너가 중지되면 tmpfs mount 연결 해제와 함께 기록된 데이터도 사라진다

 - 임시로 사용하고 기록되지 않아야 되는 파일, 데이터 등을 사용할 경우에 유용하다

 - 이 방식은 컨테이너 간의 공유 설정은 안되고 Linux 기반 Docker에서만 지원된다

앞의 호스트가 필요없음(메모리를 사용하기 때문)

 

docker run -v /my-host:/app           : 바인드 방식

docker run -v my-host:/app            : 도커 볼륨 방식

docker run -tmpfs /app                   : tmpfs 방식

 

 ◇ Bind Mount 연결

 ㄴ 문자열을 입력하여 출력할 때 출력하지 않고 해당 내용을 파일로 저장

  ㄴ 리디렉션 :  > 은 내용을 지우고 입력한 내용만 추가, >>는 기존내용이 있으면 밑줄에서부터 추가

   ㄴ echo나 cat을 활용하여 많이 사용함

 

$ sudo apt install tree -y             : tree라는 프로그램 설치

. = 현재 디렉토리

디렉토리 내용 등 내용을 확실하게 확인 가능한 명령어

 

하드디스크 용량, 상태 확인용 명령어

ㄴ 리눅스는 파티션을 디렉토리 형태로 나눔

 ㄴ s (= SCSI, SATA) ,  d (= Device) ,  a (= 첫번째 볼륨{= 첫번째 하드디스크})

 

sda1 = /

sda2 = /home

sda3 = swap

sda4 = /boot

 

 

 

10-01. bind mount.pdf
0.16MB

ㄴ 이름이 bind-monut인 컨테이너를 만들 때 ubuntu의 14.04버전의 이미지파일을 다운로드하고 /home/ubuntu/bind01디렉토리를 /bind01과 연결(-v)하고 현재디렉토리의 bind02를 /bind02로 연결(-v)하고 대화식 터미널(-it)을 열어서 bash 명령어 실행

 ㄴ쉘이 명령어를 입력받는 상태로 호출

 

*docker run => 컨테이너 생성 후 명령어 실행 : 컨테이너 작동과 연동된 작업창 실행 (종료시 컨테이너도 종료)

*docker exec => 작동중인 컨테이너에 명령어 실행 : 작동중인 컨테이너 외 작업창 실행 (종료시 컨테이너 지속)

 

# df -ha     : 명령어로 마운트된 내용 확인 시

sda3에 bind가 연결된 내용 확인 가능

 

컨테이너 안에서 내용을 수정하면

컨테이너 밖에서도 내용이 수정된 내용을 확인 할 수 있으며,

컨테이너 지우고 bind01안의 내용 확인해도 내용이 그대로 남아있는 것을 확인 할 수 있다

 

 ㄴ $(명령어) / ${변수} 의 차이  : 괄호는 명령어만 입력가능하고 중괄호는 변수를 입력해야 제대로 출력된다

 ㄴ ro = 읽기전용으로 연결

 ㄴ rw = 읽고 쓰기 전용으로 연결

ㄴ마운트 했을 때 bind01은 읽기 전용, bind02는 읽고 쓰기 가능으로 등록했으며, 에러발생 시 둘 다 읽기 전용으로 됨

 

 ◇ Bind mount 설정 파일 공유

컨테이너 제거 후

 ㄴ 엔퍼센트 2개는 앞의 명령어 실행 후 뒤 명령어 실행의 의미

  ㄴ 달러기호에 언더스코어는 앞의 명령어로 만들어진 내용 가져오기

 ㄴ curl은 뒷내용 다운로드

- Redis : 메모리에 저장하는 데이터 베이스

 

$ vim redis.conf

내용 오타 없이 작성 : 비번 설정

 

docker run -itd --name=redis-container -p 6379:6379 -h redis-db -v ./data:/data -v ./redis.conf:/usr/local/conf/redis.conf \
redis:7 redis-server /usr/local/conf/redis.conf

ㄴ 레디스 파일을 이용해서 레디스 서버를 동작하는 데 컨피그파일의 위치가 이곳이라는 것을 알림

 

커맨드 라인 인터페이스 : 같은 계층끼리 정보를 주고받는 것을 인터페이스라고 함

1~4계층(하위) 정보 => Head 

인증할 수 없다 = 패스워드 없음으로 확인 불가

외부에서 패스워드 등록 및 입력하여 접속하면 입력완료가 확인된다

 

data 디렉토리는 999라는 사용자가 주인인데 /etc/passwd에는 없다고 나온다

컨테이너 내부로 접속하여 사용자 확인하면 redis가 소유자임을 알 수 있다

 

$ docker run -it -v ~/.bash_history:/root/.bash_history --rm centos:8 /bin/bash

 ㄴ컨테이너 이름 랜덤

 ㄴ --rm : 사용 후 종료 시 삭제

안에서 명령어들을 입력하고 history내역확인 시 내역이 없으나 컨테이너 종료 후 우분투에서 확인하니 확인되는 것을 볼 수 있다

 

 ◇ 시간 동기화를 위한 File Bind mount

 ※ UTC = 국제 표준 시간, 그리니치 평균 시 (영국표준시)

  ㄴ KST = 한국 표준 시간 (UTC + 9시간)

 

  - 내컴퓨터와 컨테이너의 시간이 일치해야 시간적인 오류가 발생하지 않기에 중요

 - 컨테이너 상의 기본 시간은 UTC로 적용되어 있는데 내 컴퓨터의 시간으로 컨테이너의 시간을 동기화

  ㄴ 그러나 run 할 때마다 동기화 하는 것은 비효율적

## 그래서 docker image를 생성하는 Dockerfile에 timezone을 설정하는 방법을 권장

FROM ubuntu:latest
RUN apt-get update && apt-get install -y tzdata
ENV TZ Asia/Seoul
RUN ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

 ㄴ ln = 바로가기 아이콘 느낌

 ㄴ Dockerfile에 vim으로 입력

 

 ◇ docker volume 생성과 연결

10-02. docker volume.pdf
0.33MB

  ㄴ 아직 만든 내용이 없기에 _data의 내용 없음

 

$ docker run -d --name=mydb -e MYSQL_ROOT_PASSWORD=password1 -e MYSQL_DATABASE=busanit \

-v mydb-data:/var/lib/mysql mysql:5.7-debian

  로 컨테이너 제작 시

  없던 파일들이 생성된 걸 확인할 수 있다

  컨테이너 내부의 mysql 내용을 확인하면

  mydb-data와 /var/lib/mysql의 내용이 정상적으로 연동된 것을 확인 할 수 있다

 

  에서 처음 생성할 때 등록한 비밀번호 입력 시 접속 가능

  데이터 베이스를 추가한 후 확인하면 잘 생성된 것을 볼 수 있으며,

  데이터에서도 확인된다

  ㄴ도커 컨테이너를 삭제해도 동일한 데이터가 남아있음을 알 수 있다

 

  다시 한번 이전명령어 그대로 컨테이너 생성 후 exec ~ bash로 접속하여 # mysql -uroot -ppassword1을 입력하고

  확인 시 따로 등록하지 않았지만 데이터베이스가 그대로 등록되어 있음을 알 수 있다

 

  컨테이너와 볼륨 삭제 시

  볼륨의 디렉토리와 내용도 삭제된 것을 확인 가능

  ㄴ여기에 16진수로 된 긴 숫자는

   ㄴ원래 컨테이너 제작 시 볼륨연결할 때 볼륨명을 미입력 시 연결된 호스트 볼륨이 없기에 에러를 내는 게 정상이나

       

$ docker run -d --name=mydb -e MYSQL_ROOT_PASSWORD=password1 -v /var/lib/mysql mysql:5.7-debian

을 입력 시

  16진수 볼륨이 추가된 것을 확인 할 수 있다

  $ docker inspect mydb  하여 중간 쯤에 연결된 볼륨을 볼 수 있다

 

 

 

★ 볼륨을 사용하는 이유  :  컨테이너의 데이터를 보존하기 위함

 ㄴ볼륨의 종류 중 차이점

Bind Mount 디렉토리나 파일을 마운트
Docker Volume /var/lib/docker/volume 디렉토리에 volume 생성 후 마운트
tmpfs Mount 메모리를 저장장치로 사용하여 마운트

 

 

☆ docker run -e {환경변수명}={값} [이미지 명]

   ㄴ옵션을 사용하여 컨테이너 내 환경변수 값을 지정하여 설정

    ㄴ기본값을 지정하거나 여러 환경변수나 환경변수 파일을 활용하여 지정 가능

 

☆ docker run -v {호스트 디렉토리/호스트 볼륨명}:{컨테이너 디렉토리} [이미지 명]

   ㄴ옵션을 사용하여 호스트와 컨테이너의 디렉토리 등을 연동(마운트)하는 옵션

728x90