본문 바로가기

AWS 교육/Docker-AWS (월)

240930_Docker 컨테이너, 네트워크

728x90

Docker Image 관련 명령어 Workflow

해당 workflow를 위한 CLI 

 

test Docker 에 접속하여

08. Docker 컨테이너 관리를 위한 CLI.pdf
0.51MB

 

컨테이너 명령 테스트를 위한 이미지 파일 제작

ㄴlisten  : 포트열고 기다린다는 의미(아우터의 22번 포트에서 6060포트로)

ㄴ서버 접속 시 로그에 console.log의 내용이 입력되고 그후 HostName이 적힌 후 로그에 2번째 console.log 내용 입력

 

 

홈페이지 제작 시 html로 제작하나 해당 html은 정적임

프론트앤드                                                백앤드

Client                                                        Server  DB

 

HTML                                                        Java, JSP

JavaScript                                                ASP, C#, PHP

CSS

 

클라이언트가 서버에 접속해서 화면에 보이는 걸 개발하는 게 프론트앤드 개발자

웹페이지에서 소스보기(or F12) 하면 나오는 것들

 

서버 속에서 사용하는 프로그램을 만드는 게 백앤드 개발자

 

html이 정적이기에 동적으로 운용하기 위해서 만들어진 JavaScript

서버측으로 JavaScript를 웹브라우저로 입력 시 웹브라우저가 해석해서 출력

웹브라우저가 해석해서 출력하다보니 다른 환경이 필요하여 만들어진 node.js

runapp.js(JavaScript)
실행 (런타임)
Node.js
설치 (런타임 환경)
운영체제

 

지금 만들려는 것은 runapp이 동작하는 도커이미지

해당 도커이미지를 만들기 위해 운영체제와 Node.js를 가져와야 함

FROM  : 베이스 이미지 => node:20-alpine3.17을 가져와서 다운로드

RUN  : 실행 명령어 => tini, curl 패키지 설치 실행, apk=패키지 관리자, add=install, --no-cache=설치 후 필요없는 파일 전부 삭제

WORKDIR  : 작업 디렉터리 설정(cd 와 동일) =>접속 시 관리자 계정(/root)이기에 변경 필수

COPY  : 복사 => 호스트PC인 우분투의 runapp.js 를 게스트인 도커이미지 .(여기=설정한 디렉터리) 으로 복사

 ㄴ내컴퓨터=호스트PC, 도커우분투=게스트(가상머신) => 우분투=호스트, 도커이미지=게스트

  ㄴ상대적 기준이기에 우분투에서 도커이미지를 만들려는 내용임을 인식

EXPOSE  : 외부에 노출할 포트 설정

ENTRYPOINT  : 컨테이너에서 실행  => 프로세스 초기화

CMD  : 컨테이너에서 실행  => node환경에서 runapp.js를 실행

 

 ㄴ도커파일을 통한 이미지 생성 명령어

  ㄴ도커파일을 다운받아 현재 디렉터리에 복사 noderun 1.0 이라는 이미지파일로 붙여넣기

 

만들어진 이미지 파일의 history를 확인 시

이전에 만든 도커파일 내용이 역순으로 진행된 내용 확인됨

 

docker run [옵션] --name=[컨테이너 이름] [이미지파일] : 이미지 파일로 컨테이너 실행 명령어

noderun:1.0 파일 다운로드와 해당 이미지로 컨테이너를 생성(docker create) 후 실행(docker start)하는 내용을 한 명령어로 실행

ㄴ도커 run(등 컨테이너) 명령어 옵션

--name  : 컨테이너 이름 실행되는 컨테이너에 이름 부여(미지정시 자동으로 부여됨:딕셔너리 워드 랜덤 선택)
-p 호스트_포트번호:컨테이너_포트번호 , --publish  : 호스트 포트와 컨테이너 포트 연결
-P, --publish-all=[true | false]  : 컨테이너 내부의 노출된(expose) 포트를 호스트 임의의 포트에 게시
-v 호스트경로:컨테이너 경로, --volume  : 호스트 경로와 컨테이너 경로의 공유 볼륨 설정
--net=네트워크_이름  : 컨테이너를 네트워크에 연결함
-e 환경변수_이름=값, --env  : 컨테이너의 환경변수 지정 (—env-file은 여러 환경 변수를 파일로 생 성하여 지정하는 방법)
-d, --detach  : 백그라운드에서 컨테이너 실행하고 컨테이너 ID 등록
-i, --interactive  : 대화식 모드 열기
-t, --tty  : TTY(단말 디바이스) 할당, 터미널
-h  : 컨테이너의 호스트명 지정 (미 지정시 컨테이너 ID가 호스트명으로 등록)
--rm  : 컨테이너 종료 시 자동으로 컨테이너 제거
--restart  : 컨테이너 종료 시 적용할 재시작 정책 지정.(no | on-failure | onfailure:회수n | always])
-w, --workdir  : 컨테이너 내부의 작업 경로(디렉터리)

 

~/sources$ docker run -itd -p 6060:6060 --name=node-run -h node-run noderun:1.0

 ㄴ -i -t -d 이나 생략하고 합침

ㄴnoderun:1.0파일로 컨테이너를 제작함에 있어 대화식 모드로 연 후 TTY 할당하고 백그라운드에서 실행하고 ID등록한 후 포트 6060과 호스트포트 6060을 연결하고 이름을 node-run으로 설정하고 해당 이름을 호스트명으로 등록

 

CLI 환경에서는 실행 중 다음 명령어를 실행할 수 없음

 

~/sources$  docker exec -it node-run hostname    : node-run 출력됨

ㄴ실행중인 컨테이너 접속하여 hostname 확인

도커에게 실행(exec)하는 데 대화식 터미널 창에서 hostname이라는 명령어를 전송

 

~/sources$ docker top node-run

ㄴtop 명령어 : 작업관리자의 자세히 내용과 동일, 프로세스, 메모리, cpu 등을 확인 가능(q 입력 시 종료)

 

~/sources$ docker port node-run      : 동작중인 포트 확인 명령어

호스트(우분투) 포트

게스트(컨테이너) 포트

실행 확인

접속 시 res.write 내용을 출력하며 console.log 내용을 남김

 

~/sources$ sudo netstat -nlp | grep 6060   : 우분투의 네트워크 상태 확인 중 6060이라는 단어가 들어간 내용 출력

 

서비스 동작 시 포트 뒤에 서비스가 대기해야 하기에

어떤 프로세스가 접속 시 대기하던 프로세스가 만들어지며 만들어질 때마다 프로세스 id가 새롭게 생성되어 서비스를 제공

 

ps -ef   : 프로세스 확인 명령어

 

~/sources$ docker stats node-run    : 리소스 통계 확인

종료 시 Ctrl + c 몇번 입력

ㄴ해당 내용이 텍스트로 출력되기 때문에 구글제공 이미지 활용

docker run \ --restart=always \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=9559:8080 \ --detach=true \ --name=cadvisor \ --privileged \ --device=/dev/kmsg \ gcr.io/cadvisor/cadvisor:latest

ㄴcadvisor을 다운하여 해당 내용이 백그라운드에서 종료된 경우 항상 restart 하라

ㄴvolume 은 호스트와 게스트의 내용을 공유(게임을 예시로 들자면 열심히 레벨을 올렸는데 종료 시 올린레벨이 없어지지 않도록)

 

해당내용으로 확인 성공 시 웹브라우저에 192.168.56.10:9559 입력 시 네트워크를 이미지화한 내용 확인 가능

여기에 Docker Containers / node-run 으로 들어가서

 

~/sources$ while true; do curl localhost:6060 ; sleep 3; done

ㄴwhile : 반복문 = 참이면 반복됨

ㄴcurl : 앞의 페이지를 가져오는 것

 3초마다 출력 되며 웹 페이지에서도 그래프 확인 가능

이러한 네트워크 상황을 보기 쉽게 출력해주는 것이 cAdvisor 이다.

 

~/sources$ docker logs [옵션] node-run     : 입력 시 node-run에서 작동되었던 로그 내역 확인

ㄴ여기서 옵션 -f 를 추가 시 로그내역을 실시간 확인 가능

 

로그가 저장된 곳 확인 후

json : 정보를 주고 받기 위한 파일 형태

 

~/sources$ sudo vim /etc/docker/daemon.json

내용 입력하여 최대 사이즈 및 파일 수 조정 : json 파일로 설정 및 파일 최대 사이즈 30메가바이트, 최대 파일 갯수 10개

ㄴ로그내용이 너무 많을 경우 에러의 원인이 될 수 있기에 사용

 

수정 완료 후 재시작

입력 완료 후 제대로 입력되고 있는 지 확인 가능

q 키로 종료 가능

 

개별 컨테이너 단위로 하는 법

~/sources$ docker run -itd -p 6062:6060 --name=node-run2 \ -h node-run --log-driver json-file --log-opt max-size=30m --log-opt max-file=10 \ noderun:1.0

ㄴ --log-opt에서 s 가 빠진 이유 : 옵션 하나씩 따로 지정했기 때문(영어 단수, 복수 느낌)

 

포트번호 안주는 이유 : mysql은 포트가 필요없기 때문

포트를 주는 이유 : 서비스를 주기 때문에

date base 는 포트 연결 안함, 외부로 연결되면 안되기에 외부접속 포트가 필요없음, 호스트네임도 굳이 안해도 됨

 ㄴ정보들이 들어있기에 외부접속 통로 존재 시 해킹 위험 존재

 

생성완료 시

Exited = 정지 상태

 

해당 mydb 의 log 확인 시

데이터가 초기화 되지 않았음 확인되며 환경변수 값을 입력 후 실행하라는 내용 확인됨

ㄴ셀 = 패스워드가 리눅스에서 명령어를 가져가서 해석하여 실행

 

그렇기에 해당 내용을 확인 하기 위해

ls 의 위치를 확인 후 해당 위치의 파일확인

 

ㄴ명령어 입력  시 찾아보는 경로 > 콜론을 통해 구분

bin = 사용자가 사용하는 명령어

sbin = 시스템 명령어

 

 

[환경변수]

 

리눅스 사용 환경변수는 대부분 이름을 대문자로 표기 및 띄어쓰기 없음

변수 = 값

$변수 = 사용하는 값을 출력

작업하는 데 필요한 값들을 환경변수에 입력해놓은 상태

 

 

mydb의 log에서 입력해야 하는 환경변수를 입력 시

mydb라는 컨테이너가 있다는 내용을 확인 가능

 

~$ docker rm mydb

실행 중일 경우 삭제가 되지 않기에 -f 를 추가하여 삭제

 

삭제 완료 후 재입력 하여 생성 하고 ~$ docker ps -a 통해 생성된 컨테이너 확인

 ㄴ컨테이너 내용 확인 : 내부로 진입하여 (bash=셀)셀 호출

이제 컨테이너 안에서 명령어 입력 가능

 

호스트 ---- docker exec -it [컨테이너 이름] [명령] ----> 컨테이너  : 해당 컨테이너에서 명령에 따른 결과 출력

 

 

runapp.js를 수정하여 변경하기

먼저 정지된 node-run을 재시작 한 후 (docker start 명령어)

~$ vi runapp.js                : 내용 수정( i 활용)

수정 후 

~/sources$ docker cp runapp.js node-run:/app/runapp.js

수정한 파일을 node-run의 파일로 덮어쓰기

 

여기서 컨테이너를 restart 해줘야 적용됨

(Session 통해 다른 도커 창을 만들어서 ~$ docker logs -f node-run 입력 시 우측 내용 바로 확인 가능)

 

 

< 도커 네트워크 >

09. Docker network.pdf
1.00MB

lo:   = 루프백 or 로컬호스트 = 자기자신

 

client 가 호스트ip:포트 로 접속 시 docker-proxy 가 해당 컨테이너(node-run)으로 연결

curl localhost:6060  =>  자신의 컴퓨터의 6060포트로 접속 (or 127.0.0.1:6060)

 

enp0s3  : nat

NAT (Network Address Translation)  = 네트워크 주소변환 (공인 IP <=> 사설 IP)

 

enp0s8  : 내부의 네트워크를 외부와 연결해주는 역할

 

docker0  : 엔진 제작 시 자동생성되는 브릿지(nat 역할)

ㄴ컨테이너가 호스트로 나가기 위한 브릿지

 

veth~~  : 가상 랜카드 = 컨테이너 랜카드 > 설치된 컨테이너 하나당 랜카드 하나씩 존재,

ㄴip가 없는 이유 : mac통신을 하는 브릿지에 연결되어 있기 때문에(컨테이너와 한 쌍으로 제공)

 ㄴ$ docker rm -f cadvisor 실행 시 1개의 가상랜카드가 없어지는 걸 확인 가능

 

 

10/100/1000 Base T

숫자  : 최대속도

Base (baseband)  : 디지털 신호

T  : twist 케이블  ( F  : 광케이블)

 

◇네트워크 장비

리피터  : 거리 연장기 = 신호 증폭기 > 이동 중 신호 감쇠되어 주파수가 적어지기 때문

허브  : 분배기 => 스위칭허브=최대속도로 균일분배(여러포트여도 최대 500M면 500M속도제공) , 더미허브=최대속도를 균등분배(10개의 포트일경우 최대 500M이면 50M씩 분배)

브리지  : 2계층장치로서 네트워크 연결 기능 제공-mac 계층(IP 필요 X)

  ㄴ트래픽을 검사하여 동적으로 학습되는 mac주소 기반 트래픽(통신 양) 전송

라우터  : 네트워크와 네트워크를 연결(=게이트웨이:3계층)

 

◇거리에 따른 네트워크 분류

LAN (local area network)  : 근거리 통신망

MAN (metropolitan area network)  : 도시망

WAN (Wide Area Network)  : 원거리 통신망

 

방화벽의 기본 룰  : 전부 닫고 필요한 것만 열기(포트)

인가 : 사용권한 / 인정 : 식별 ID가 있나 없나

공인 IP로는 구분 가능하나 사설 IP로는 구분 불가

포트, 네트워크, MAC 주소 등 으로 구분 가능

4계층 까지 막을 수 있음

 

IPS (Intrusion Prevention System)  : 침입 방지 시스템

바이러스 들이 7계층에 붙어서 오기에 해당내용을 막는 시스템

 

PC 에서 제어판 \ 시스템 및 보안 \ ~~방화벽

인바운드 규칙

ㄴ외부에서 ping 수신 거부 = 파일 및 프린터공유(에코요청*) / 프로필 개인 / 미사용  : 수신 시 해킹 위험 존재

 

 

bridge  : 컨테이너와 mac 통신하는 것

host  : 우분투로 들어오면 바로 컨테이너로 연결하는 것

null  : 네트워크 주지 않는 것

 

$ sudo apt install bridge-utils -y     : 브릿지 작업 위한 유틸 설치

 ㄴ설치 후 확인위한 명령어

728x90