Docker Image 관련 명령어 Workflow
해당 workflow를 위한 CLI
test Docker 에 접속하여
컨테이너 명령 테스트를 위한 이미지 파일 제작
ㄴ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 입력 시 우측 내용 바로 확인 가능)
< 도커 네트워크 >
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 : 브릿지 작업 위한 유틸 설치
ㄴ설치 후 확인위한 명령어
'AWS 교육 > Docker-AWS (월)' 카테고리의 다른 글
241014_connect 명령어, 프록시 (0) | 2024.10.14 |
---|---|
241007_Docker Network 브릿지, namespaces, DNS서버, 지정 (0) | 2024.10.07 |
240925_네트워크 축약 (0) | 2024.09.25 |
240923_Docker image 기본 (0) | 2024.09.23 |
240909_Docker 기초 (0) | 2024.09.10 |