[0724] ICT COG 블록체인 테크니컬 트랙

장 창영·2021년 7월 24일
post-thumbnail

출처: https://blog.naver.com/pjt3591oo

0.

도커구조

도커 프로세스

개발자 -docker+명령어-> 도커 클라이언트(도커 프로그램)
도커 클라이언트 -소켓(프로그램 접점)-> 도커 데몬(백그라운드)

도커데몬

도커데몬 서비스 실행 및 자동실행 설정

service docker start
service docker stop

systemctl enable docker

(강사님 피드백 반영)
데몬: 시스템 부팅되면서 최초로 실행되며 종료될 때까지 백그라운드로 동작되는 프로세스 -> 서비스 등록을 통해 원하는 프로세스를 데몬으로 띄움
PPID가 1 또는 2
소켓: 프로세스간 통신을 위해 연결 종단점으로 사용

1. Docker 아키텍처 및 설치

1-1. 도커개념

1-1-1. 가상머신 vs 도커


시스템(OS or 프로그램) 단위 가상화
완벽한 독립(OS) <-> 적은 용량 및 부담(프로그램)

가상머신(VM): OS 격리
하이퍼바이저(커널 스위칭)로 가상화
switching이 클수록, overhead 커짐

도커(Docker): 프로그램 격리
커널(OS)은 공유 + 프로그램을 이미지(파일화)로 가상화
커널? 네트워크 및 파일 관리

1-1-2. 도커 컨테이너 장점

운영체제 수준의 가상화
빠른 속도와 효율성
높은 이식성(portability)
상태를 가지지 않음(stateless)

1-1-3. 이미지 vs 컨테이너


도커 = 이미지 기반 컨테이너 생성
이미지? 프로그램
컨테이너? 프로세스(프로그램을 실행22)
pull? 이미지를 다운로드
run? 이미지를 컨테이너화

이미지? 프로그램과 유사

레이어 형태: 저장소 / 이름 / 버전
저장소 이름: 이미지가 저장된 장소 + 없으면 도커 허브(Docker Hub)로 인식함
이미지 이름: 이미지의 역할을 나타낼 이름 + 생략 불가능함
이미지 버전: 이미지 버전정보, 생략하면 latest 로 인식함
-> VM의 ISO(실행파일)과 유사함

컨테이너? 프로세스와 유사

컨테이너: 도커 이미지에 적합한 독립공간 생성
side effect o & dependency x

1-2. 이미지 관리 1

도커옵션 설명

docker --help
docker (명령어) --help

설치된 이미지 확인

docker images
docker image inspect [Image ID]

Repository / Tag(=version) / Image ID / Created / Size 순으로 출력

이미지 다운로드(태그 없으면 최신버전) 및 제거

docker pull image:tag
docker rmi [image ID]

2. Docker 이미지, 컨테이너 관리

2-1. 컨테이너 관리

컨테이너 조회

docker ps: 실행 컨테이너
docker ps -a(모두): 모든 컨테이너

ID와 Names는 unique

컨테이너 실행(생성)

docker run 이미지:태그

pull도 함께 진행

실행 옵션

-i: interactive / -t: terminal -> 터미널로 뭔갈 해보겠다

ex)

docker run -i -t --name 이름 ubuntu:버전 /bin/bash
-i: 명령어를 칠 예정(interactive)
-t: 화면에 출력(termianal)
--name: 컨테이너 이름
맥 -> 리눅스 환경이 됨

ubuntu 컨테이너 실행 및 컨테이너에서 터미널 수행함

현재 위치 확인 및 나오기

ls
exit

exit or Ctrl+D: 나오기 + 컨테이너 정지 o
Ctrl+P, Ctrl+Q: 나오기 + 컨테이너 정지 x -> docker start 컨테이너이름으로 살리기

컨테이너 제거 및 정지

docker rm IMAGE
docker stop IMAGE
docker container prune 중지된 모든 컨테이너 삭제
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q) 모든 컨테이너 삭제

up 상태일 경우, stop -> rm

docker exec -i -t [NAMES] [COMMAND]
docker attach [NAMES] [COMMAND]

컴퓨터A -(세션)-> 컴퓨터B
접속 = 세션생성
attach: 접속한 컨테이너를 하나의 세션으로 처리
exec: 접속한 컨테이너를 다중 세션으로 처리

포트포워딩

docker run -i -t --name 컨테이너이름 -p 8888:8080 ubuntu:태그

IP? 컴퓨터 위치
포트? 프로세스(컨테이너) 위치
-> IP + 포트
포워딩? 특정 포트로 전달
포트포워딩? 특정 포트로 들어온 네트워크 트래픽을 특정 포트의 컨테이너로 전달
-> 네트워크 bridge 모드에서 호스트와 컨테이너가 통신하는 방법

네트워크 목록 확인

도커 네트워크는 bridge, host, null, overlay을 제공 (특히 bridge 모드 사용)
bridge 네트워크로 외부 네트워크와 격리 + 컨테이너 간 이름 혹은 IP로 통신 + 외부 네트워크는 브릿지의 포트포워딩으로 전달

컨테이너 생성시 namespace로 격리된 공간을 할당받음
veth(리눅스의 virtual ethernet bridge)
• 브릿지 모드에서는 컨테이너 생성 시 “vethXXX”로 생성
• host 모드에서는 namespace만 생성, veth와 bridge는 존재하지 않음

docker network ls
docker network inspect bridge
네트워크에 할당된 컨테이너를 확인

네트워크 생성 및 연결 및 해제

docker network create 네트워크명
docker network connect 네트워크명 컨테이너명
docker network disconnect 네트워크명 컨테이너명

컨테이너 통신

docker exec -it 컨테이너명 /bin/bash

apt-get update
apt-get install iputils-ping
ping [private ip 또는 컨테이너명]

ifconfig 네트워크 인터페이스 확인

컨테이너는 기본적으로 bridge에 바인딩됨 -> 같은 bridge에 바인딩된 컨테이너는 private ip or 이름으로 서로 통신

네트워크 생성

docker network create 네트워크명

파일복사
호스트 -> 컨테이너로 복사
컨테이너 -> 호스트로 복사

docker cp [host 파일경로] [container name]:[container 내부 경로]
docker cp [container name]:[container 내부 경로] [host 파일경로]

2-2. 도커 앱 배포


컨테이너화(도커철학)
컨테이너 간 독립성 보장 + 한 컨테이너에 한 프로세스만 실행

2-3. 컨테이너 자동화

2-3-1. docker-compose

docker-compose.yaml
version: '2'

 services:
 test.container.1:
 image: 'ubuntu'
 tty: true
 ports:
 - 8545:8545
 - 30305:30305
 environment:
 ENV: "TEST"
 RPCPORT: 8545
 PORT: 30305
 container_name: test.container.1
 command: /bin/bash
 working_dir: /home

컴포즈 파일 실행

docker-compose up
docker-compose up -d 백그라운드 실행
docker-compose up -f 파일

옵션

· services: services 안에 어떤 서비스들을 배포할지에 대한 컨테이너들을 설정
· image: 어떤 이미지를 사용할지 명시
· tty: -i -t 옵션과 같은 의미
· ports: 포트포워딩 명시
· enviroment: 환경변수 명시
· container_name: 컨테이너 이름 명시
· command: 어떤 명령어를 실행할지 명시
· working_dir: 어떤 디렉터리를 기준으로 잡을지 명시 · volumes: 호스트 디렉터리와 공유

2-4. 이미지 관리 2

2-4-1. ? Dockerfile

이미지 생성

docker build --tag <IMAGE NAME>:<TAG> .

Dockfile

FROM 참조할 이미지

RUN 수행할 명령어

WORKDIR /작업 디렉토리(없으면 생성)
COPY 호스트에서 이미지로 파일 복사

ENV PROFILE=local

CMD 명령어
ENTRYPOINT 
-> [ENTRYPOINC COMAND] [CMD COMAND or 입력된 COMAND]

Dockerfile은 빈 디렉터리에 넣어두고 이미지를 생성하는 게 좋음
docker build 명령어는 Dockerfile 파일을 포함한 디렉터리를 모두 docker 데몬에게 전송
빌드과정에서 사용하지 않는 파일이 존재한다면 .dockerignore 파일을 만들어 제외

2-4-2. 컨테이너 이미지화

이미지 커밋

docker commit [options] <CONTAINER NAME> <IMAGE NAME>:<TAG>
docker commit -m “” test.container.1 my_ubuntu:0.1

dockfile 작성 추천 (간결하지만 버전관리 힘듦)

2-4-3. 이미지 공유

도커허브: 깃허브처럼 도커 이미지 버전관리를 목적으로 사용
1. https://hub.docker.com/
2. 로그인 및 저장소 생성
3. 이미지 태깅(tag)
4. 이미지 업로드(push)

2-4-4. 환경정리

• 중지된 모든 컨테이너 삭제
• 이름없는 모든 이미지 삭제
• 사용되지 않는 모든 네트워크 삭제
• 사용되지 않는 모든 볼륨 삭제
• 중지된 모든 컨테이너, 사용되지 않는 모든 네트워크, 하나 이상의 컨테이너에서 사용되지 않는 모든 이미지 삭제
$ docker container prune
$ docker image prune
$ docker network prune
$ docker volume prune
$ docker system prune -a

0개의 댓글