🐋 "Docker" is coming...
글로 배운 도커 🐥
😴 도커가 필요한 순간?! 3가지
🙄 그래서 언제 필요한데? - 1
"아.. Windows에서 Linux로 개발하고 싶다.."
😎 Virtual Machine 저리 가!
- Centos <=> Ubuntu
- Ubuntu:20.04 <=> Ubuntu:16.04
Windows <= ... ... => Linux
🙄 그래서 언제 필요한데? - 2
"이거 안 돌아가잖아.. 너 방금 새로 푸쉬 한 거 맞아?!"
...
🙄 그래서 언제 필요한데? - 2
...
"그게 왜 안 돌아가? 이거 봐! 내 노트북에서는 잘 돌아가잖아!"
😎 운영체제 레벨에서 전체를 백업!
-
나도 모르는 리눅스 명령어를 너무 많이 실행해버린 경우
-
이 프로그램은 관리자 권한으로 XX 명령어를 먼저 수행해야 할 경우
넌 그냥 도커만 해.. 실행은 걔가 보장하니까!!
🙄 그래서 언제 필요한데? - 3
"클라우드 시대.. 내 서버는 얼마나 크게 만들어야 되는거야?!"
😎 서버 자동화는 쿠버네티스로!
Auto Scaling, Load balancing, Parellel operation, Health Check !!
프로세스를 켜고 끄고, 이 노드에서 저 노드로!!
😛 잠깐 숨 한번 돌리고 갈게요!
🙃 도커가 뭔데??
-
호스트 OS'의 커널을 공유하는 게스트 OS
-
컨테이너를 관리해주는 플랫폼
😜 underlying technology, Linux
-
Namespaces
- isolation => pid, net, ipc, mnt, uts
-
Control groups(cgroups)
- sharing hardware resources and enforing limits
-
Union file systems
😗 중간 정리
도커를 쓰면 뭐가 어떻게 되는데?
- 필요한 OS(종류와 버젼)를 실행하여 작업할 수 있다.
- 시스템 설정 파일까지 저장할 수 있다.
- 다양한 버전의 언어로 동시에 개발할 수 있다.
- Vitual Machine은 GB 단위에 수 십 분의 설치 시간 필요
- Docker는 MB 단위로 거의 즉시 실행
- 호스트 OS와 성능 차이 거의 없음 (5% 미만)
😗 중간 정리
그럼 Virtual Machine보다 좋은 기술이네?
- 둘은 역할이 다르다.
- 정확히 말하면 도커로는 OS 계열을 바꿀 수 없다.
- 도커는 windows용과 Linux용이 나누어져 있다.
- Hyper-V 덕분에 Virtual Machine이 없는 것처럼 느끼는 것.
- Isolation도 VM보다 도커는 완전하지 않다.
😗 중간 정리
Kubernetes는 뭔데?
- Docker 덕분에 Application은 죽어도 되는 것이 되었다.
- 하지만 Host OS가 죽어버리면 어떻게 할까?
- Container를 Docker가, Docker는 Kubernetes로 자동화하여 관리할 수 있다.
- 공식 문서를 읽어보면, Kubernetes는 강력한만큼 어렵다고 함
😗 중간 정리
--help
- docker --help
- docker image --help
- docker container --help
- docker volume --help
- (ctl+p) + (ctl+q) : 백그라운드에 켜놓은 상태로 나가기
😋 도커 아키텍쳐
- 클라이언트-서버 아키텍쳐
- 유닉스 소켓 통신 기반의 REST API
🤣 도커 엔진(데몬, 런타임)
- API 요청에 따라 도커 객체(컨테이너, 이미지, 네트워크, 볼륨)을 관리.
😇 도커 클라이언트
- "docker" 명령어를 쓰면 클라이언트가 데몬에 이를 API로 전달.
😆 도커 레지스트리s
- 도커 이미지를 저장하고 있는 곳으로 대표적인 곳은 도커 허브 (사설 가능)
😁 도커 오브젝트
-
이미지 (객체)
- 도커 컨테이너를 생성할 때 필요한 지시사항이 포함된 읽기 전용 파일
-
컨테이너 (인스턴스)
😭 실습 예제는 빠르게 넘어갈게요!!
😩 도커 설치 및 실행
😇 컨테이너 생성 및 실행
-
docker run -it --name con1 ubuntu /bin/bash
-
옵션 it는 interactive와 pseudo-TTY의 약자로 터미널 켤 때 필수
-
컨테이너 이름은 con1이며 ubuntu 이미지를 상속받아서 /bin/bash를 실행하라
-
docker run -d --name myweb -p 80:80 httpd
-
옵션 d는 detach의 약자로 백그라운드 실행하라
-
옵션 p는 publish의 약자로 컨테이너와 호스트의 포트를 지정
-
오른쪽 container의 port는 docker history httpd를 하면 알 수 있다
😊 Dockerfile로 image 생성
- FROM: 원본 이미지 이름 사용(<이미지 이름>:<태그>)
- MAINTAINER: 작성자 이름
- RUN: 이미지를 만드는 과정에서 실행할 Shell Script 명령어
- VOLUME: 컨테이너와 호스트가 공유할 디렉토리
- CMD: Container가 실행되자마자 실행할 실행 파일 혹은 Shell Script
- WORKDIR: CMD에서 설정한 실행 파일이 실행될 Default Directory
- EXPOSE: 호스트와 연결할 포트 번호
🤣 Dockerfile 예제
- FROM ubuntu
- MAINTAINER Sunman Kim
- RUN apt-get install nginx -y
- RUN echo "daemon off;" >> /etc/nginx/nginx.conf
- RUN chown -R www-data:www-data /var/lib/nginx
- WORKDIR /etc/nginx
- CMD ["nginx"]
- EXPOSE 80
😝 docker 이미지 만들고 업로드
DockerFile로 만들 때
- docker build -t sunman/myImage .
사용 중인 Container로 만들 때
- docker commit "현재 이미지" "내 아이디/희망 이름"
작업 후
docker login -u "아이디"
docker push "내 아이디"/"희망 이름"
😛 Data Volume 설정하기
docker volume create convol
docker volume ls
find / -name "convol"
docker run -it --name con1 -v convol:/data alpine
"cd /data"
"touch secret.file"
docker run -it --name con2 -v convol:/data alpine
"/cd data/"
"/ls"
🤗 docker network/port 설정하기
-
docker network create --driver bridge --subnet 10.10.10.0/24 mynet
-
docker run -d --name myweb -p 8080:80 --net mynet httpd
-
기본은 docker0의 virtual bridge
🤫 의문사항
- Docker로 운영체제를 켜면 지원되지 않는 기능이 있는게 맞나?