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
ㄴ 이름이 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 생성과 연결
ㄴ 아직 만든 내용이 없기에 _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 -p 에 password1을 입력하고
확인 시 따로 등록하지 않았지만 데이터베이스가 그대로 등록되어 있음을 알 수 있다
컨테이너와 볼륨 삭제 시
볼륨의 디렉토리와 내용도 삭제된 것을 확인 가능
ㄴ여기에 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 {호스트 디렉토리/호스트 볼륨명}:{컨테이너 디렉토리} [이미지 명]
ㄴ옵션을 사용하여 호스트와 컨테이너의 디렉토리 등을 연동(마운트)하는 옵션
'AWS 교육 > Docker-AWS (월)' 카테고리의 다른 글
241104_도커 - 파일 최적화, 컴포즈 (0) | 2024.11.04 |
---|---|
241028_Data Container, Build, Dockerfile, 이미지 경량화 (0) | 2024.10.28 |
241014_connect 명령어, 프록시 (0) | 2024.10.14 |
241007_Docker Network 브릿지, namespaces, DNS서버, 지정 (0) | 2024.10.07 |
240930_Docker 컨테이너, 네트워크 (0) | 2024.09.30 |