
출처: https://blog.naver.com/pjt3591oo
도커 프로세스

개발자 -docker+명령어-> 도커 클라이언트(도커 프로그램)
도커 클라이언트 -소켓(프로그램 접점)-> 도커 데몬(백그라운드)
도커데몬 서비스 실행 및 자동실행 설정
service docker start
service docker stop
systemctl enable docker
(강사님 피드백 반영)
데몬: 시스템 부팅되면서 최초로 실행되며 종료될 때까지 백그라운드로 동작되는 프로세스 -> 서비스 등록을 통해 원하는 프로세스를 데몬으로 띄움
PPID가 1 또는 2
소켓: 프로세스간 통신을 위해 연결 종단점으로 사용

시스템(OS or 프로그램) 단위 가상화
완벽한 독립(OS) <-> 적은 용량 및 부담(프로그램)
가상머신(VM): OS 격리
하이퍼바이저(커널 스위칭)로 가상화
switching이 클수록, overhead 커짐
도커(Docker): 프로그램 격리
커널(OS)은 공유 + 프로그램을 이미지(파일화)로 가상화
커널? 네트워크 및 파일 관리
운영체제 수준의 가상화
빠른 속도와 효율성
높은 이식성(portability)
상태를 가지지 않음(stateless)

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

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

컨테이너: 도커 이미지에 적합한 독립공간 생성
side effect o & dependency x
도커옵션 설명
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]
컨테이너 조회

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 파일경로]

컨테이너화(도커철학)
컨테이너 간 독립성 보장 + 한 컨테이너에 한 프로세스만 실행
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: 호스트 디렉터리와 공유
이미지 생성
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 파일을 만들어 제외
이미지 커밋
docker commit [options] <CONTAINER NAME> <IMAGE NAME>:<TAG>
docker commit -m “” test.container.1 my_ubuntu:0.1
dockfile 작성 추천 (간결하지만 버전관리 힘듦)
도커허브: 깃허브처럼 도커 이미지 버전관리를 목적으로 사용
1. https://hub.docker.com/
2. 로그인 및 저장소 생성
3. 이미지 태깅(tag)
4. 이미지 업로드(push)
• 중지된 모든 컨테이너 삭제
• 이름없는 모든 이미지 삭제
• 사용되지 않는 모든 네트워크 삭제
• 사용되지 않는 모든 볼륨 삭제
• 중지된 모든 컨테이너, 사용되지 않는 모든 네트워크, 하나 이상의 컨테이너에서 사용되지 않는 모든 이미지 삭제
$ docker container prune
$ docker image prune
$ docker network prune
$ docker volume prune
$ docker system prune -a