5. 2019.05.25
염근철(GeunSam2)
1. 도커란?
2013년 3월에 열린 Pycon Conference에서 Solomon Hykes가
The future of Linux Containers 라는 세션으로 처음 세상에 알려짐
이 발표 이후 도커 인기가 급상승
회사 이름도 dotCloud → Docker lnc.
현재 전세계적으로 큰 인기를 끌고 있음
(2016년에 MS에서 4조원에 인수하려고 했었다는 기사도…)
현 Docker lnc. 의 CTO Solomon Hykes
9. 2019.05.25
염근철(GeunSam2)
2. 컨테이너?
컨테이너가 없는 개발 환경
Web Server 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅁ나유ㅜ차ㅓ
User DB 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅁ퓨ㅣ나ㅓㅇㅊ
Web Fronte 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅈ두라ㅓㅍ
Queue 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅓㅈ다ㅚㅊ벼ㅓ
Analytics DB 직접 설치 또 직접 설치 또또 직접 설치 으아아아 비ㅁ나ㅓ욒
내 컴퓨터 니 컴퓨터 QA 테스팅 환경 스테이징 서버 프로덕션 운영환경
15. 2019.05.25
염근철(GeunSam2)
2. 컨테이너?
기존의 가상화 : 하이퍼바이저 기반 = Guest OS가 필요함 = 오버헤드
Hardware
Hypervisor
Guest OS
Bins/Libs
App A
Guest OS
Bins/Libs
App B
Hardware
Hypervisor
Host OS
Bins/Libs
App A
Bins/Libs
App B
Guest OS Guest OS
Type 1
(베어메탈 방식 가상화)
Type 2
(호스트 방식 가상화)
오버헤드
17. 2019.05.25
염근철(GeunSam2)
2. 컨테이너?
컨테이너 방식 : 단순 프로세스 격리 = 성능손실 거의(거어어어어어어어의) 없음
Hardware
Hypervisor
Host OS
Bins/Libs
App A
Bins/Libs
App B
Guest OS Guest OS
Docker 기존의 가상화
Hardware
Docker Engine
Host OS
Bins/Libs
App A
Bins/Libs
App B
18. 2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
사실 컨테이너 기술은 docker에서 처음 발표한 기술이 아님
LXC
(LinuX Container)
Linux
Jail
FreeBSD
Solaris Zones
Solaris
심지어 docker는 LXC기반으로 시작했음
LXC는 cgroups, namespace 등의 명령어를 활용하는 리눅스 자체기능
물론… 0.9버전 부터는 자체적인 기술(libcontainer)을 사용하다가 runC에 합쳐졌다고함
22. 2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
뒤에서 설명하겠지만…
비유하자면, image=실행파일. container=프로세스
정리하자면, image=컨테이너 실행에 필요한 파일, 설정 값 등을 포함하고 있는 덩어리
Dockerfile
build
DockerImage
run
DockerContainer
28. 2019.05.25
염근철(GeunSam2)
4. 도커를 설치하자
운영체제 지원(Desktop 기준)
자세한 지원 환경은 링크 참조( https://docs.docker.com/v17.12/install/ )
Linux는 당연히 가능
Windows는 10 Pro 이상(Docker for Windows 설치 가능) / Windows7 이상(Docker Toolbox설치)
Mac OS 10.10 이상(Docker for Mac 설치 가능) / 10.10이하 (Docker Toolbox 설치)
29. 2019.05.25
염근철(GeunSam2)
4. 도커를 설치하자
docker의 Windows, Mac OS 지원방법
VS
Docker for ~ Docker Toolbox
Mac OS : xhyve을 사용하면서 부터
Windows : Hyper-V 사용하면서 부터
virtualbox에 Guest OS로 linux를 올려서
docker의 Host OS로 사용하는 방식
30. 2019.05.25
염근철(GeunSam2)
4. 도커를 설치하자
docker의 Windows, Mac OS 지원방법
VS
Docker for ~ Docker Toolbox
성능상으로는 Docker for ~ 시리즈가 우위에 있음
Docker for ~ 시리즈는 운영체제 내장의 가상화 기능을 활용하기 때문에 VirtualBox or Vmware
등의 가상화 프로그램을 동시에 운용할 수 없음 -> 필자는 Docker Toolbox 방식을 선호
(사실 Mac OS 환경에서 docker를 운용해 본적이 없어서 해당 내용이 틀릴 수도 있으니, 만약 그렇다면 주저 말고 제보 부탁 함)
31. 2019.05.25
염근철(GeunSam2)
4. 도커를 설치하자
Linux docker설치
# curl –fsSL https://get.docker.com/ | sudo sh
sudo 없이 사용하기
# sudo usermod -aG docker $USER // 현재 접속중인 사용자에게 권한주기
# sudo usermod -aG docker your-user // your-user 사용자에게 권한주기
docker는 기본적으로 root권한이 필요
일반 사용자가 sudo 없이 사용하기 위해서는 해당 사용자를 docker 그룹에 추가
32. 2019.05.25
염근철(GeunSam2)
Docker Toolbox를 설치하면 설치되는 항목들
- 도커 엔진이 이미지 및 컨테이너를 생성할 수 있도록 해주는 Docker Client
- 도커 엔진 명령어를 이용하게 해주는 Docker Machine
- Docker Compose 기능
- 도커 GUI 도구 Kitematic
- 도커 명령어 입력이 가능한 Docker QickStart Shell
- Oracle VM VirtualBox
4. 도커를 설치하자
Windows/Mac OS docker 설치
본 자료에서는 범용적으로 사용 가능한 Docker Toolbox를 설치하여 사용(설치는 링크 참조)
- Windows 설치법 : https://docs.docker.com/toolbox/toolbox_install_windows/
- Mac OS 설치법 : https://docs.docker.com/toolbox/toolbox_install_mac/
- toolbox 링크 : https://github.com/docker/toolbox/releases
34. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
GUI 도구 Kitematic
누구나 쉽게 클릭만으로 환경을 가져와서 설치하고 사용할 수 있게 Docker Hub와 연동되어 있음
왼쪽 하단의 DOCKER CLI를 클릭하여 명령 행 창을 실행할 수도 있음 (생각보다 편리하다)
36. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
CLI 도구 Docker Quickstart Terminal
ls 명령어를 쳐보니 내 로컬 환경이 나오고 있지만, 도커가 바로 실행되었다고 착각해선 안됨. VirtualBox를
켜보면, default라는 VM이 실행 중(도커 클라이언트만 네이티브 바이너리, 도커 서버는 가상머신 안에서 실행)
37. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
도커 기본 명령어
- Docker Hub에서 이미지를 검색
# docker search 검색할 이미지
# docker search ubuntu
- 설치된 도커의 버전정보를 보여줌
# docker version
# docker –v
38. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
- # docker ubuntu images와 같은 형태로 입력 시 같은 이름이지만 태그가 다른 이미지 출력
- [이미지 이름]부분을 생략하고 입력 시 모든 이미지 목록을 출력
# docker [이미지 이름] images
# docker ubuntu images
- Docker Hub에서 local로 이미지를 다운로드
- 이미지 이름에서 geunsam2/ubuntu와같은 형태는 사용자가 올린 이미지(공식 이미지는사용자명이붇지않음)
- 태그에는 보통 version을 명시, latest를 설정하면 최신 버전을 다운로드
# docker pull 이미지이름:태그
# docker pull ubuntu:latest
도커 기본 명령어
39. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
- 이미지를 컨테이너로 실행하는 명령어
- 자주 사용하는 옵션
[-d] : detached mode (백그라운드 모드)
[-p] : 외부포트와 컨테이너의 포트를 연결 (포워딩)
(-p 외부포트 : 컨테이너 포트)
[-rm] : 프로세스 종료시 컨테이너 자동 제거
[--link] : 컨테이너 연결 [컨테이너명:별칭]
# docker run [OPTIONS] 이미지이름[:TAG|@DIGEST] [COMMAND] [ARG…]
# docker run –-name ubuntu –d –it ubuntu:latest /bin/bash
[-v] : 호스트와 컨테이너의 디렉토리를 연결 (마운트)
[-e] : 컨테이너 내에서 사용할 환경변수 설정
[-it] : -i–t를 동시에 사용한 것, 터미널 입력을 위한 옵션
[--name]: 컨테이너 이름 설정
도커 기본 명령어
40. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
- 실행중인 컨테이너를 중지
- 컨테이너 아이디 전체길이는 64자리, 명령어 인자로 줄 때는 식별해줄 수 있을 때 까지만 입력해도 됨.
# docker stop [OPTIONS] 컨테이너이름 [컨테이너이름…]
# docker stop 52a516f87cd
- 현재 실행중인 컨테이너 목록을 보여줌
- [-a]옵션을 주면, 종료된 컨테이너도 보여줌
# docker ps [OPTIONS]
# docker ps -a
도커 기본 명령어
41. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
- 이미지를 완전히 삭제
# docker rmi [OPTIONS] 이미지이름 or ID [이미지이름…]
# docker rmi 52a516f87cd
- 종료된 컨테이너를 완전히 제거
# docker rm [OPTIONS] 컨테이너이름 [컨테이너이름…]
# docker rm 52
도커 기본 명령어
42. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
- run과 유사하지만 다름
- run : 새로 컨테이너를 만들어서 실행 / exec : 실행중인 컨테이너에 명령을 내림
# docker exec [OPTIONS] 컨테이너이름 COMMAND [ARG…]
# docker exec -it ubuntu /bin/bash
- 컨테이너에서 실행한 로그를 화면으로 출력함
- [-f] : 실시간 로그 확인 / [--tail] : 마지막 10줄만 확인
# docker logs [OPTIONS] 컨테이너이름
# docker logs –f 52
도커 기본 명령어
43. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
- 컨테이너의 수정 된 내용을 반영하여 이미지로 생성함
- [-a] : 제작자 서명을 이미지에 반영함 ex) geunsam2<rootiron96@gmail.com>
[-m] : 수정 내용 등의 커밋 메시지를 기록함
# docker commit [OPTIONS] 컨테이너이름 이미지이름
# docker commit -a geunsam2(>_<) -m “add index.html” ubuntu apache:0.1
도커 기본 명령어
44. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
이미지 만들고 배포하기
Dockerfile
build
DockerImage
run
DockerContainer
… 아까 말했던 뒤에서 설명하겠다고 했던 그 내용이 맞음
이미지를 만들어서 배포하기 위해서는 Dockerfile을 작성해야함
46. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
Dockerfile 작성에 앞서서
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
(React나 Node.js 가 무엇인지 몰라도 전혀 상관없으니 우선 따라 해 보자)
• 해당 실습을 진행하기 위해서는 local PC에 nodejs가설치되어 있어야 한다 (https://nodejs.org)
47. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
Dockerfile 작성에 앞서서
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
- Nodejs를 설치하면서 함께 설치된 ‘npm’패키지 설치 매니저를 활용
- create-react-app이라는 react 프로젝트 환경을 손쉽게 세팅할 수 있는 명령어를 설치
# npm install –g create-react-app
- 방금 설치한 create-react-app 명령어를 이용하여 hello-react 라는 프로젝트를 생성
- 방금 생성한 hello-react 프로젝트는 docker 이미지를 빌드할 때 옮겨 담을 것이다
# create-react-app hello-react
48. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
Dockerfile을 작성해보자
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
FROM node:latest
MAINTAINER GeunSam2 <rootiron96@gmail.com>
RUN mkdir –p /app
WORKDIR /app
ADD . /app
RUN npm install
ENV NODE_ENV development
EXPOSE 3000 80
CMD [“npm”, “start”]
~/hello-react/Dockerfile
# 이미지 제작 전(前)
# 이미지 제작 중(中)
# 이미지 제작 후(後)
49. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
# 어떤 이미지로부터 새로운 이미지를 생성할지 지정
FROM node:latest
# Dockerfile을 생성/관리하는 사람의 정보
MAINTAINER GeunSam2 <rootiron96@gmail.com>
해석
Dockerfile을 작성해보자
50. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
# /app 디렉토리 생성
RUN mkdir –p /app
# /app 디렉토리를 WorkDir로 설정
WORKDIR /app
# Dockerfile이 있는 경로의 모든 파일을 /app에 복사
ADD . /app
# npm install 명령 실행
RUN npm install
해석
Dockerfile을 작성해보자
51. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
# 컨테이너에서 사용할 환경변수 설정
ENV NODE_ENV development
# 컨테이너 포트 3000 -> 로컬 환경 포트 80 포워딩
EXPOSE 3000 80
# 컨테이너 실행 이후, #npm start 명령 실행
CMD [“npm”, “start”]
해석
Dockerfile을 작성해보자
52. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
- PATH 디렉토리(예제의 경우 ‘.’ 현재 디렉토리) 안에 있는 Dockerfile을 기준으로 이미지를 빌드함
- 옵션은 이미지 이름을 지정하기 위한 [-t(--tag)] 옵션만 알면 충분(-t 는 그냥 고정 옵션으로 생각하자)
이미지를 Build 해보자!
# docker build –t 사용자명/이미지명:태그 PATH | URL | -
# docker build –t geunsam2/hello-react:0.1 .
53. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
만든 이미지를 run 해보자!
# docker run [OPTIONS] 이미지이름[:TAG|@DIGEST] [COMMAND] [ARG…]
# docker run ~~~~~~~~ 직접 작성해 보세요 ~~~~~~~~~~
문제 :
- 방금 만든 이미지를
- ‘my-first-react’ 라는 컨테이너 이름으로
- 외부포트 8080에서 run 한 뒤
- 접속해 보자
54. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
만든 이미지를 run 해보자!
# docker run [OPTIONS] 이미지이름[:TAG|@DIGEST] [COMMAND] [ARG…]
# docker run –-name my-first-react -d –p 8080:3000 geunsam2/hello-react:0.1
문제 :
- 방금 만든 이미지를
- ‘my-first-react’ 라는 컨테이너 이름으로
- 외부포트 8080에서 run 한 뒤
- 접속해 보자
55. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
만든 이미지를 push 해보자!
# docker login
Username : geunsam2
Password :
- Docker Hub에 로그인
- 기존의 이미지에 새로운 이미지이름과 태그를 부여할 수 있음(링크 생성의 개념)
- DockerHub에 PUSH할 때는 반드시 username 부분이 나의 계정명과 일치해야 함
# docker tag SOURCE_IMAGE[:tag] TARGET_IMAGE[:tag]
# docker tag geunsam2/hello-react:0.1 geunsam2/hello-react:0.2
56. 2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
만든 이미지를 push 해보자!
- 1: digest: sha256:~~~~~ 와 같은 메시지가 뜨면 성공!
# docker push [저장소이름/] 이미지이름 [:테그]
# docker push geunsam2:0.1
58. 2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
도커의 기본적인 네트워크 환경 구조
eth0 eth0 eth0
Container 1 Container 2 Container 3
veth001 veth002 veth003
docker0
eth0
Linux
bridge
my-bridge
iptables docker-proxy
60. 2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
도커의 기본적인 네트워크 환경 구조
docker는 독립적인 네트워크 환경을 위해 4가지의 주요 기능을 이용함
- network namespace :
컨테이너에 생성되는 NIC, 이와 바인딩 되면서 host에 생성 되는 VNIC(vethxxx)를 구성하는데 사용
- linux bridge :
컨테이너 간의 통신을 위한 가상의 네트워크를 제공, 기본적으로 docker0 이 존재함
- iptables :
컨테이너가 외부 네트워크와 통신하기 위해서 사용
- docker-proxy :
localhost(127.0.0.1)에서 컨테이너에 통신할 때, iptables가 불능일때 사용
61. 2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
도커의 네트워크 타입
docker는 기능에 따라 4개의 네트워크 타입을 제공함
- bridge(Default) :
컨테이너를 브릿지 네트워크에 연결하여 사용하는 방식
- host:
호스트의 네트워크 환경을 컨테이너에서 그대로 사용하는 방식
- container :
다른 컨테이너의 네트워크 환경을 공유하는 방식
- none :
네트워크 설정이 전혀 되지 않은 방식
62. 2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
bridge 네트워크
- 기본적으로 사용되는 docker0 브릿지 이외의 브릿지를 생성할 수 있음
# docker network create --driver bridge 브릿지이름
# docker network create --driver bridge my-bridge
- 별도의 --net 옵션을 주지 않으면, docker0 브릿지로 바인딩 되는 브릿지 네트워크 설정을 사용하게 됨
- 브릿지 네트워크는 격리된 공간이기 때문에, -p 옵션을 통해 외부로 포트포워딩을 해주어야 함
이렇게 포워딩 된 포트는 내부적으로 iptables와 docker-proxy의 기능을 이용하여 구현 됨
# docker run --net 브릿지이름 [other Options] 이미지이름
# docker run --net my-bridge --name react -it -d -p 8080:3000 hello-react:0.3
63. 2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
host 네트워크
- 네트워크를 호스트로 설정하면, 호스트의 네트워크 환경을 그대로 이용함
(말 그대로 호스트OS의 네트워크 설정을 가감 없이 그대~로 공유하는 설정)
- 이 방식을 사용하면, 별도의 포트포워딩 없이 내부 어플리케이션들을 서비스 할 수 있음
# docker run --net host [Options] 이미지이름
# docker run --net host --name react -d hello-react:0.3
64. 2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
container 네트워크
- 네트워크를 container로 설정하면, 대상이 되는 컨테이너의 네트워크 환경을 그대로 이용함
# docker run --net container:다른컨테이너이름 [Options] 이미지이름
# docker run --net container:ubuntu --name react -d hello-react:0.4
65. 2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
none 네트워크
- 네트워크를 none 으로 생성하면, 격리된 네트워크 영역을 가지기는 하지만 인터페이스가 없는 상태로
컨테이너가 시작됨. (loopback 인터페이스는 존재)
- 인터페이스를 직접 커스터마이징 하여 사용할 수 있도록 제공되는 네트워크로 추측
# docker run --net none [Options] 이미지이름
# docker run --net none --name react -d hello-react:0.5
67. 2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
Docker Toolbox 환경 구성도
main OS
* docker 기준의 host OS(linux)와 실제 host OS가 공존하므로 편의상 host OS(windows/mac)를 main OS로 지칭 하겠음
Linux VM
NAT host-only
docker
terminal
192.168.99.100
NIC
68. 2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
Docker Toolbox를 사용하게 되면
docker engin이 Linux(가상환경) 위에서 동작하게 됨 (이모 이럼 느려지잖아요…)
Hardware
Hypervisor
Host OS
Bins/Libs
App A
Bins/Libs
App B
linux kernel
Docker Engine
따라서, docker 내부적으로 host와 포트포워딩의
과정을 거치더라도 그 대상은 Linux(가상환경)임
72. 2019.05.25
염근철(GeunSam2)
추가로 공부해야 하는 내용
지금까지의 내용을 모두 이해했다면,
Docker라는 컨테이너 플랫폼이 어떤 형태로 동작하는지 느낌은 왔을 것이라고 생각된다.
분량과 시간 관계상 아래 내용까지는 PPT에 담지 못하였지만
블로그를 통해 더 많은 내용을 다룰 예정이니 관심 있는 사람들은 참고하면 좋을 듯 하다.
• Docker compose 파일 이해하기
• Docker volume 이해하기
• 컨테이너 링크의 개념 이해하기
• 모두의 근삼이
(https://ykarma1996.tistory.com/)