SlideShare a Scribd company logo
1 of 72
Download to read offline
Docker
2019.05.25
rootrion96@gmail.com
염근철(GeunSam2)
2019.05.25
염근철(GeunSam2)
학습 목표
docker 란 무엇인가? 왜 사용하는가?
어떻게 사용하는가? 에 대해서 알아보자.
2019.05.25
염근철(GeunSam2)
목차
1. 도커란?
2. 컨테이너?
3. 왜 도커인가
4. 도커를 설치하자
5. 도커 실습
6. 도커 네트워크
2019.05.25
염근철(GeunSam2)
1. 도커란?
도커는 컨테이너 기반의 오픈소스 가상화 플랫폼
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
2019.05.25
염근철(GeunSam2)
1. 도커란?
2019.05.25
염근철(GeunSam2)
2016년 기준 90%가 개발에 사용중 이라고 응답함
2019.05.25
염근철(GeunSam2)
2. 컨테이너?
실제 컨테이너의 특징
- 내용물이 무엇이든 동일한 규격의 상자
- 크래인을 통해 쉽게 옮기고, 쌓을 수 있음
- 컨테이너 내부의 물건들이 다른 컨테이너로부터 보호됨
2019.05.25
염근철(GeunSam2)
2. 컨테이너?
도커 컨테이너의 특징
- 어떤 환경이 담겨있든 하나의 명령체계로 설치할 수 있음
- Docker Hub을 통해 쉽게 배포하고 다운받을 수 있음
- 컨테이너 내부의 자원들이 다른 컨테이너로부터 보호됨
2019.05.25
염근철(GeunSam2)
2. 컨테이너?
컨테이너가 없는 개발 환경
Web Server 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅁ나유ㅜ차ㅓ
User DB 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅁ퓨ㅣ나ㅓㅇㅊ
Web Fronte 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅈ두라ㅓㅍ
Queue 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅓㅈ다ㅚㅊ벼ㅓ
Analytics DB 직접 설치 또 직접 설치 또또 직접 설치 으아아아 비ㅁ나ㅓ욒
내 컴퓨터 니 컴퓨터 QA 테스팅 환경 스테이징 서버 프로덕션 운영환경
2019.05.25
염근철(GeunSam2)
2. 컨테이너?
프로젝트가 여러 개 라면?
컨테이너가 없는 개발 환경
2019.05.25
염근철(GeunSam2)
2. 컨테이너?
서버가 여러 개 라면?
서비스 버전을 업데이트 해야한다면?
서버마다 환경이 다르다면?
서버마다 환경이 다르다면?
컨테이너가 없는 개발 환경
2019.05.25
염근철(GeunSam2)
2. 컨테이너?
컨테이너가 있는 개발 환경
Web Server User DB Web Fronte Queue Analytics DB
2019.05.25
염근철(GeunSam2)
2019.05.25
염근철(GeunSam2)
2. 컨테이너?
심지어 하나의 운영환경에서 여러 개의 컨테이너를 동시에 운용가능
port:3000/서버 ver.1
port:3001/서버 ver.2
port:3002/서버 ver.3
port:3003/서버 ver.4
2019.05.25
염근철(GeunSam2)
2. 컨테이너?
컨테이너 환경이 어떻게 가능한 걸까? 기존의 OS가상화 와는 뭐가 다르지?
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
(호스트 방식 가상화)
오버헤드
2019.05.25
염근철(GeunSam2)
2. 컨테이너?
KVM, 반가상화 등의 기술을 이용해 성능을 크게 향상하는데 성공하지만
여전히 느리다!!
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
2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
사실 컨테이너 기술은 docker에서 처음 발표한 기술이 아님
LXC
(LinuX Container)
Linux
Jail
FreeBSD
Solaris Zones
Solaris
심지어 docker는 LXC기반으로 시작했음
LXC는 cgroups, namespace 등의 명령어를 활용하는 리눅스 자체기능
물론… 0.9버전 부터는 자체적인 기술(libcontainer)을 사용하다가 runC에 합쳐졌다고함
2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
그럼에도 docker가 이렇게 핫한 이유는?
2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
우리가 쓰기 좋게 잘 만들었으니까!
- 레이어 저장방식
- 이미지 경로 표현
- Dockerfile
- DockerHub
- Command와 API
- 훌륭한 생태계 및 커뮤니티
- 지속적인 성능/기능 업데이트
2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
잠깐!
컨테이너는 알겠는데… 이미지?
2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
뒤에서 설명하겠지만…
비유하자면, image=실행파일. container=프로세스
정리하자면, image=컨테이너 실행에 필요한 파일, 설정 값 등을 포함하고 있는 덩어리
Dockerfile
build
DockerImage
run
DockerContainer
2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
다시. 우리가 쓰기 좋게 잘 만들었으니까!
- 이미지의 레이어 저장방식
- 손쉬운 이미지 공유
- DockerHub
- Dockerfile
- 훌륭한 생태계 및 커뮤니티
- 지속적인 성능/기능 업데이트
- …
2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
이미지의 레이어 저장방식
이미지 출처 : subicura.com
Layer D Layer E
이미지간의 의존관계를 이용하여, 각각의 이미지들의 용량을 최소화 한다
2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
손쉬운 이미지 공유
GitHub와 같이 간단하고 직관적인 명령어 체계를 이용하여 이미지 공유 가능
# docker push GeunSam2/moduboan # docker pull GeunSam2/moduboan
2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
dockerhub
도커의 이미지가 작은 것도 있지만, 보통 수백메가…
전 세계적으로 핫한 만큼, 트래픽도 어마 무시 할텐데, 이 모든 것이 다 무료!
docker pull hits(2016)
2019.05.25
염근철(GeunSam2)
3. 왜 도커인가?
dockerfile
자체 DSL언어를 이용하여 이미지 생성과정을 명시 -> 누구나 이해 및 수정 가능
문법이 굉장히 간결함(쉘 스크립트와 유사)
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 설치)
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로 사용하는 방식
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를 운용해 본적이 없어서 해당 내용이 틀릴 수도 있으니, 만약 그렇다면 주저 말고 제보 부탁 함)
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 그룹에 추가
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
2019.05.25
염근철(GeunSam2)
5. 도커 실습
이제 진짜 실습을 해보자!
(Docker Toolbox를 기준으로 합니다.)
2019.05.25
염근철(GeunSam2)
5. 도커 실습
GUI 도구 Kitematic
누구나 쉽게 클릭만으로 환경을 가져와서 설치하고 사용할 수 있게 Docker Hub와 연동되어 있음
왼쪽 하단의 DOCKER CLI를 클릭하여 명령 행 창을 실행할 수도 있음 (생각보다 편리하다)
2019.05.25
염근철(GeunSam2)
5. 도커 실습
CLI 도구 Docker Quickstart Terminal
도커의 모든 기능을 이용하고 조작할 수 있는 환경
이곳에서 도커머신으로 접근할 때 사용할 IP주소를 확인할 수 있음
2019.05.25
염근철(GeunSam2)
5. 도커 실습
CLI 도구 Docker Quickstart Terminal
ls 명령어를 쳐보니 내 로컬 환경이 나오고 있지만, 도커가 바로 실행되었다고 착각해선 안됨. VirtualBox를
켜보면, default라는 VM이 실행 중(도커 클라이언트만 네이티브 바이너리, 도커 서버는 가상머신 안에서 실행)
2019.05.25
염근철(GeunSam2)
5. 도커 실습
도커 기본 명령어
- Docker Hub에서 이미지를 검색
# docker search 검색할 이미지
# docker search ubuntu
- 설치된 도커의 버전정보를 보여줌
# docker version
# docker –v
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
도커 기본 명령어
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]: 컨테이너 이름 설정
도커 기본 명령어
2019.05.25
염근철(GeunSam2)
5. 도커 실습
- 실행중인 컨테이너를 중지
- 컨테이너 아이디 전체길이는 64자리, 명령어 인자로 줄 때는 식별해줄 수 있을 때 까지만 입력해도 됨.
# docker stop [OPTIONS] 컨테이너이름 [컨테이너이름…]
# docker stop 52a516f87cd
- 현재 실행중인 컨테이너 목록을 보여줌
- [-a]옵션을 주면, 종료된 컨테이너도 보여줌
# docker ps [OPTIONS]
# docker ps -a
도커 기본 명령어
2019.05.25
염근철(GeunSam2)
5. 도커 실습
- 이미지를 완전히 삭제
# docker rmi [OPTIONS] 이미지이름 or ID [이미지이름…]
# docker rmi 52a516f87cd
- 종료된 컨테이너를 완전히 제거
# docker rm [OPTIONS] 컨테이너이름 [컨테이너이름…]
# docker rm 52
도커 기본 명령어
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
도커 기본 명령어
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
도커 기본 명령어
2019.05.25
염근철(GeunSam2)
5. 도커 실습
이미지 만들고 배포하기
Dockerfile
build
DockerImage
run
DockerContainer
… 아까 말했던 뒤에서 설명하겠다고 했던 그 내용이 맞음
이미지를 만들어서 배포하기 위해서는 Dockerfile을 작성해야함
2019.05.25
염근철(GeunSam2)
5. 도커 실습
Dockerfile
• 이미지 생성을 위한 일종의 배치 파일
• 특정 이미지를 기준으로
• 새로운 이미지 구성에 필요한 명령어들을 저장해 놓은 파일
• 자체 DSL언어를 이용하여 이미지 생성과정을 명시
• 그냥 한번 작성해 보자
2019.05.25
염근철(GeunSam2)
5. 도커 실습
Dockerfile 작성에 앞서서
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
(React나 Node.js 가 무엇인지 몰라도 전혀 상관없으니 우선 따라 해 보자)
• 해당 실습을 진행하기 위해서는 local PC에 nodejs가설치되어 있어야 한다 (https://nodejs.org)
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
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
# 이미지 제작 전(前)
# 이미지 제작 중(中)
# 이미지 제작 후(後)
2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
# 어떤 이미지로부터 새로운 이미지를 생성할지 지정
FROM node:latest
# Dockerfile을 생성/관리하는 사람의 정보
MAINTAINER GeunSam2 <rootiron96@gmail.com>
해석
Dockerfile을 작성해보자
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을 작성해보자
2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
# 컨테이너에서 사용할 환경변수 설정
ENV NODE_ENV development
# 컨테이너 포트 3000 -> 로컬 환경 포트 80 포워딩
EXPOSE 3000 80
# 컨테이너 실행 이후, #npm start 명령 실행
CMD [“npm”, “start”]
해석
Dockerfile을 작성해보자
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 .
2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
만든 이미지를 run 해보자!
# docker run [OPTIONS] 이미지이름[:TAG|@DIGEST] [COMMAND] [ARG…]
# docker run ~~~~~~~~ 직접 작성해 보세요 ~~~~~~~~~~
문제 :
- 방금 만든 이미지를
- ‘my-first-react’ 라는 컨테이너 이름으로
- 외부포트 8080에서 run 한 뒤
- 접속해 보자
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 한 뒤
- 접속해 보자
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
2019.05.25
염근철(GeunSam2)
5. 도커 실습
목표 : React 기반 웹 어플리케이션 환경을 이미지로 만들어 배포해 보자
만든 이미지를 push 해보자!
- 1: digest: sha256:~~~~~ 와 같은 메시지가 뜨면 성공!
# docker push [저장소이름/] 이미지이름 [:테그]
# docker push geunsam2:0.1
2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
이제 도커의 기본적인 사용법을 익혔으니
도커의 네트워크 환경을 살펴보자!
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
2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
Docker Toolbox를 사용하는 경우, 조금의 차이가 있으나,
우선 linux 환경에서의 docker 네트워크부터 이해하고 알아보도록 하자
ㅠ ㅠ
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가 불능일때 사용
2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
도커의 네트워크 타입
docker는 기능에 따라 4개의 네트워크 타입을 제공함
- bridge(Default) :
컨테이너를 브릿지 네트워크에 연결하여 사용하는 방식
- host:
호스트의 네트워크 환경을 컨테이너에서 그대로 사용하는 방식
- container :
다른 컨테이너의 네트워크 환경을 공유하는 방식
- none :
네트워크 설정이 전혀 되지 않은 방식
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
2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
host 네트워크
- 네트워크를 호스트로 설정하면, 호스트의 네트워크 환경을 그대로 이용함
(말 그대로 호스트OS의 네트워크 설정을 가감 없이 그대~로 공유하는 설정)
- 이 방식을 사용하면, 별도의 포트포워딩 없이 내부 어플리케이션들을 서비스 할 수 있음
# docker run --net host [Options] 이미지이름
# docker run --net host --name react -d hello-react:0.3
2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
container 네트워크
- 네트워크를 container로 설정하면, 대상이 되는 컨테이너의 네트워크 환경을 그대로 이용함
# docker run --net container:다른컨테이너이름 [Options] 이미지이름
# docker run --net container:ubuntu --name react -d hello-react:0.4
2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
none 네트워크
- 네트워크를 none 으로 생성하면, 격리된 네트워크 영역을 가지기는 하지만 인터페이스가 없는 상태로
컨테이너가 시작됨. (loopback 인터페이스는 존재)
- 인터페이스를 직접 커스터마이징 하여 사용할 수 있도록 제공되는 네트워크로 추측
# docker run --net none [Options] 이미지이름
# docker run --net none --name react -d hello-react:0.5
2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
아까 Docker Toolbox를 사용하는 경우, 조금의 차이가 있다고 하였으니 알아보도록 하자
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
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(가상환경)임
2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
Virtualbox를 켜면, docker engin의 host 역할을 하는 “default” VM을 확인할 수 있음
2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
해당 VM의 네트워크 설정을 확인하면, 두 개의 NIC가 장착되어 있는 것을 확인할 수 있음
2019.05.25
염근철(GeunSam2)
5. 도커 네트워크
NAT 방식으로 연결된 네트워크 어댑터 1은 포트포워딩을 지원하며, 이곳에 설정을 하여 외부통신이 가능하게 할 수 있음
2019.05.25
염근철(GeunSam2)
추가로 공부해야 하는 내용
지금까지의 내용을 모두 이해했다면,
Docker라는 컨테이너 플랫폼이 어떤 형태로 동작하는지 느낌은 왔을 것이라고 생각된다.
분량과 시간 관계상 아래 내용까지는 PPT에 담지 못하였지만
블로그를 통해 더 많은 내용을 다룰 예정이니 관심 있는 사람들은 참고하면 좋을 듯 하다.
• Docker compose 파일 이해하기
• Docker volume 이해하기
• 컨테이너 링크의 개념 이해하기
• 모두의 근삼이
(https://ykarma1996.tistory.com/)

More Related Content

What's hot

Introduction to docker
Introduction to dockerIntroduction to docker
Introduction to dockerInstruqt
 
What is Docker | Docker Tutorial for Beginners | Docker Container | DevOps To...
What is Docker | Docker Tutorial for Beginners | Docker Container | DevOps To...What is Docker | Docker Tutorial for Beginners | Docker Container | DevOps To...
What is Docker | Docker Tutorial for Beginners | Docker Container | DevOps To...Edureka!
 
Docker introduction
Docker introductionDocker introduction
Docker introductiondotCloud
 
Docker: From Zero to Hero
Docker: From Zero to HeroDocker: From Zero to Hero
Docker: From Zero to Herofazalraja
 
Docker 101 - Nov 2016
Docker 101 - Nov 2016Docker 101 - Nov 2016
Docker 101 - Nov 2016Docker, Inc.
 
Docker introduction &amp; benefits
Docker introduction &amp; benefitsDocker introduction &amp; benefits
Docker introduction &amp; benefitsAmit Manwade
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to DockerLuong Vo
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker IntroductionPeng Xiao
 
Docker 101 : Introduction to Docker and Containers
Docker 101 : Introduction to Docker and ContainersDocker 101 : Introduction to Docker and Containers
Docker 101 : Introduction to Docker and ContainersYajushi Srivastava
 
Docker introduction
Docker introductionDocker introduction
Docker introductionPhuc Nguyen
 
Docker Basic to Advance
Docker Basic to AdvanceDocker Basic to Advance
Docker Basic to AdvanceParas Jain
 
Introduction to docker
Introduction to dockerIntroduction to docker
Introduction to dockerJohn Willis
 
Containerization and Docker
Containerization and DockerContainerization and Docker
Containerization and DockerMegha Bansal
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to DockerAditya Konarde
 
Getting started with Docker
Getting started with DockerGetting started with Docker
Getting started with DockerRavindu Fernando
 
Docker introduction for the beginners
Docker introduction for the beginnersDocker introduction for the beginners
Docker introduction for the beginnersJuneyoung Oh
 

What's hot (20)

Docker Basics
Docker BasicsDocker Basics
Docker Basics
 
Introduction to docker
Introduction to dockerIntroduction to docker
Introduction to docker
 
What is Docker | Docker Tutorial for Beginners | Docker Container | DevOps To...
What is Docker | Docker Tutorial for Beginners | Docker Container | DevOps To...What is Docker | Docker Tutorial for Beginners | Docker Container | DevOps To...
What is Docker | Docker Tutorial for Beginners | Docker Container | DevOps To...
 
Docker, LinuX Container
Docker, LinuX ContainerDocker, LinuX Container
Docker, LinuX Container
 
Docker introduction
Docker introductionDocker introduction
Docker introduction
 
Docker: From Zero to Hero
Docker: From Zero to HeroDocker: From Zero to Hero
Docker: From Zero to Hero
 
Docker 101 - Nov 2016
Docker 101 - Nov 2016Docker 101 - Nov 2016
Docker 101 - Nov 2016
 
Docker architecture-04-1
Docker architecture-04-1Docker architecture-04-1
Docker architecture-04-1
 
Docker in real life
Docker in real lifeDocker in real life
Docker in real life
 
Docker introduction &amp; benefits
Docker introduction &amp; benefitsDocker introduction &amp; benefits
Docker introduction &amp; benefits
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker Introduction
 
Docker 101 : Introduction to Docker and Containers
Docker 101 : Introduction to Docker and ContainersDocker 101 : Introduction to Docker and Containers
Docker 101 : Introduction to Docker and Containers
 
Docker introduction
Docker introductionDocker introduction
Docker introduction
 
Docker Basic to Advance
Docker Basic to AdvanceDocker Basic to Advance
Docker Basic to Advance
 
Introduction to docker
Introduction to dockerIntroduction to docker
Introduction to docker
 
Containerization and Docker
Containerization and DockerContainerization and Docker
Containerization and Docker
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
 
Getting started with Docker
Getting started with DockerGetting started with Docker
Getting started with Docker
 
Docker introduction for the beginners
Docker introduction for the beginnersDocker introduction for the beginners
Docker introduction for the beginners
 

Similar to 왕초보를 위한 도커 사용법

Introduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTIntroduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTHosang Jeon
 
Introduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTIntroduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTLOGISPOT
 
[오픈소스컨설팅]Docker on Kubernetes v1
[오픈소스컨설팅]Docker on Kubernetes v1[오픈소스컨설팅]Docker on Kubernetes v1
[오픈소스컨설팅]Docker on Kubernetes v1Ji-Woong Choi
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래NAVER D2
 
Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1Steve Shim
 
aws/docker/rails를 활용한 시스템 구축/운용 - docker편
aws/docker/rails를 활용한 시스템 구축/운용 - docker편aws/docker/rails를 활용한 시스템 구축/운용 - docker편
aws/docker/rails를 활용한 시스템 구축/운용 - docker편negabaro
 
도커 학습과 Boot2Docker
도커 학습과 Boot2Docker도커 학습과 Boot2Docker
도커 학습과 Boot2Dockerpyrasis
 
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)[오픈소스컨설팅]Docker on Cloud(Digital Ocean)
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)Ji-Woong Choi
 
[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)Ildoo Kim
 
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]David Lee
 
Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기iFunFactory Inc.
 
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Nanha Park
 
docker_quick_start
docker_quick_startdocker_quick_start
docker_quick_startSukjin Yun
 
[OpenStack 하반기 스터디] Docker를 이용한 OpenStack 가상화
[OpenStack 하반기 스터디] Docker를 이용한 OpenStack 가상화[OpenStack 하반기 스터디] Docker를 이용한 OpenStack 가상화
[OpenStack 하반기 스터디] Docker를 이용한 OpenStack 가상화OpenStack Korea Community
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
 
Docker.소개.30 m
Docker.소개.30 mDocker.소개.30 m
Docker.소개.30 mWonchang Song
 

Similar to 왕초보를 위한 도커 사용법 (20)

Introduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTIntroduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOT
 
Introduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTIntroduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOT
 
Docker osc 0508
Docker osc 0508Docker osc 0508
Docker osc 0508
 
[오픈소스컨설팅]Docker on Kubernetes v1
[오픈소스컨설팅]Docker on Kubernetes v1[오픈소스컨설팅]Docker on Kubernetes v1
[오픈소스컨설팅]Docker on Kubernetes v1
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래
 
Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1
 
aws/docker/rails를 활용한 시스템 구축/운용 - docker편
aws/docker/rails를 활용한 시스템 구축/운용 - docker편aws/docker/rails를 활용한 시스템 구축/운용 - docker편
aws/docker/rails를 활용한 시스템 구축/운용 - docker편
 
도커 학습과 Boot2Docker
도커 학습과 Boot2Docker도커 학습과 Boot2Docker
도커 학습과 Boot2Docker
 
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)[오픈소스컨설팅]Docker on Cloud(Digital Ocean)
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)
 
[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)
 
DevOps with Docker
DevOps with DockerDevOps with Docker
DevOps with Docker
 
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
 
Docker Container
Docker ContainerDocker Container
Docker Container
 
Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기
 
[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다
[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다
[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다
 
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
 
docker_quick_start
docker_quick_startdocker_quick_start
docker_quick_start
 
[OpenStack 하반기 스터디] Docker를 이용한 OpenStack 가상화
[OpenStack 하반기 스터디] Docker를 이용한 OpenStack 가상화[OpenStack 하반기 스터디] Docker를 이용한 OpenStack 가상화
[OpenStack 하반기 스터디] Docker를 이용한 OpenStack 가상화
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
Docker.소개.30 m
Docker.소개.30 mDocker.소개.30 m
Docker.소개.30 m
 

왕초보를 위한 도커 사용법

  • 2. 2019.05.25 염근철(GeunSam2) 학습 목표 docker 란 무엇인가? 왜 사용하는가? 어떻게 사용하는가? 에 대해서 알아보자.
  • 3. 2019.05.25 염근철(GeunSam2) 목차 1. 도커란? 2. 컨테이너? 3. 왜 도커인가 4. 도커를 설치하자 5. 도커 실습 6. 도커 네트워크
  • 4. 2019.05.25 염근철(GeunSam2) 1. 도커란? 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 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
  • 7. 2019.05.25 염근철(GeunSam2) 2. 컨테이너? 실제 컨테이너의 특징 - 내용물이 무엇이든 동일한 규격의 상자 - 크래인을 통해 쉽게 옮기고, 쌓을 수 있음 - 컨테이너 내부의 물건들이 다른 컨테이너로부터 보호됨
  • 8. 2019.05.25 염근철(GeunSam2) 2. 컨테이너? 도커 컨테이너의 특징 - 어떤 환경이 담겨있든 하나의 명령체계로 설치할 수 있음 - Docker Hub을 통해 쉽게 배포하고 다운받을 수 있음 - 컨테이너 내부의 자원들이 다른 컨테이너로부터 보호됨
  • 9. 2019.05.25 염근철(GeunSam2) 2. 컨테이너? 컨테이너가 없는 개발 환경 Web Server 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅁ나유ㅜ차ㅓ User DB 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅁ퓨ㅣ나ㅓㅇㅊ Web Fronte 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅈ두라ㅓㅍ Queue 직접 설치 또 직접 설치 또또 직접 설치 으아아아 ㅓㅈ다ㅚㅊ벼ㅓ Analytics DB 직접 설치 또 직접 설치 또또 직접 설치 으아아아 비ㅁ나ㅓ욒 내 컴퓨터 니 컴퓨터 QA 테스팅 환경 스테이징 서버 프로덕션 운영환경
  • 10. 2019.05.25 염근철(GeunSam2) 2. 컨테이너? 프로젝트가 여러 개 라면? 컨테이너가 없는 개발 환경
  • 11. 2019.05.25 염근철(GeunSam2) 2. 컨테이너? 서버가 여러 개 라면? 서비스 버전을 업데이트 해야한다면? 서버마다 환경이 다르다면? 서버마다 환경이 다르다면? 컨테이너가 없는 개발 환경
  • 12. 2019.05.25 염근철(GeunSam2) 2. 컨테이너? 컨테이너가 있는 개발 환경 Web Server User DB Web Fronte Queue Analytics DB 2019.05.25 염근철(GeunSam2)
  • 13. 2019.05.25 염근철(GeunSam2) 2. 컨테이너? 심지어 하나의 운영환경에서 여러 개의 컨테이너를 동시에 운용가능 port:3000/서버 ver.1 port:3001/서버 ver.2 port:3002/서버 ver.3 port:3003/서버 ver.4
  • 14. 2019.05.25 염근철(GeunSam2) 2. 컨테이너? 컨테이너 환경이 어떻게 가능한 걸까? 기존의 OS가상화 와는 뭐가 다르지?
  • 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 (호스트 방식 가상화) 오버헤드
  • 16. 2019.05.25 염근철(GeunSam2) 2. 컨테이너? KVM, 반가상화 등의 기술을 이용해 성능을 크게 향상하는데 성공하지만 여전히 느리다!!
  • 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에 합쳐졌다고함
  • 20. 2019.05.25 염근철(GeunSam2) 3. 왜 도커인가? 우리가 쓰기 좋게 잘 만들었으니까! - 레이어 저장방식 - 이미지 경로 표현 - Dockerfile - DockerHub - Command와 API - 훌륭한 생태계 및 커뮤니티 - 지속적인 성능/기능 업데이트
  • 22. 2019.05.25 염근철(GeunSam2) 3. 왜 도커인가? 뒤에서 설명하겠지만… 비유하자면, image=실행파일. container=프로세스 정리하자면, image=컨테이너 실행에 필요한 파일, 설정 값 등을 포함하고 있는 덩어리 Dockerfile build DockerImage run DockerContainer
  • 23. 2019.05.25 염근철(GeunSam2) 3. 왜 도커인가? 다시. 우리가 쓰기 좋게 잘 만들었으니까! - 이미지의 레이어 저장방식 - 손쉬운 이미지 공유 - DockerHub - Dockerfile - 훌륭한 생태계 및 커뮤니티 - 지속적인 성능/기능 업데이트 - …
  • 24. 2019.05.25 염근철(GeunSam2) 3. 왜 도커인가? 이미지의 레이어 저장방식 이미지 출처 : subicura.com Layer D Layer E 이미지간의 의존관계를 이용하여, 각각의 이미지들의 용량을 최소화 한다
  • 25. 2019.05.25 염근철(GeunSam2) 3. 왜 도커인가? 손쉬운 이미지 공유 GitHub와 같이 간단하고 직관적인 명령어 체계를 이용하여 이미지 공유 가능 # docker push GeunSam2/moduboan # docker pull GeunSam2/moduboan
  • 26. 2019.05.25 염근철(GeunSam2) 3. 왜 도커인가? dockerhub 도커의 이미지가 작은 것도 있지만, 보통 수백메가… 전 세계적으로 핫한 만큼, 트래픽도 어마 무시 할텐데, 이 모든 것이 다 무료! docker pull hits(2016)
  • 27. 2019.05.25 염근철(GeunSam2) 3. 왜 도커인가? dockerfile 자체 DSL언어를 이용하여 이미지 생성과정을 명시 -> 누구나 이해 및 수정 가능 문법이 굉장히 간결함(쉘 스크립트와 유사)
  • 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
  • 33. 2019.05.25 염근철(GeunSam2) 5. 도커 실습 이제 진짜 실습을 해보자! (Docker Toolbox를 기준으로 합니다.)
  • 34. 2019.05.25 염근철(GeunSam2) 5. 도커 실습 GUI 도구 Kitematic 누구나 쉽게 클릭만으로 환경을 가져와서 설치하고 사용할 수 있게 Docker Hub와 연동되어 있음 왼쪽 하단의 DOCKER CLI를 클릭하여 명령 행 창을 실행할 수도 있음 (생각보다 편리하다)
  • 35. 2019.05.25 염근철(GeunSam2) 5. 도커 실습 CLI 도구 Docker Quickstart Terminal 도커의 모든 기능을 이용하고 조작할 수 있는 환경 이곳에서 도커머신으로 접근할 때 사용할 IP주소를 확인할 수 있음
  • 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을 작성해야함
  • 45. 2019.05.25 염근철(GeunSam2) 5. 도커 실습 Dockerfile • 이미지 생성을 위한 일종의 배치 파일 • 특정 이미지를 기준으로 • 새로운 이미지 구성에 필요한 명령어들을 저장해 놓은 파일 • 자체 DSL언어를 이용하여 이미지 생성과정을 명시 • 그냥 한번 작성해 보자
  • 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
  • 57. 2019.05.25 염근철(GeunSam2) 5. 도커 네트워크 이제 도커의 기본적인 사용법을 익혔으니 도커의 네트워크 환경을 살펴보자!
  • 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
  • 59. 2019.05.25 염근철(GeunSam2) 5. 도커 네트워크 Docker Toolbox를 사용하는 경우, 조금의 차이가 있으나, 우선 linux 환경에서의 docker 네트워크부터 이해하고 알아보도록 하자 ㅠ ㅠ
  • 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
  • 66. 2019.05.25 염근철(GeunSam2) 5. 도커 네트워크 아까 Docker Toolbox를 사용하는 경우, 조금의 차이가 있다고 하였으니 알아보도록 하자
  • 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(가상환경)임
  • 69. 2019.05.25 염근철(GeunSam2) 5. 도커 네트워크 Virtualbox를 켜면, docker engin의 host 역할을 하는 “default” VM을 확인할 수 있음
  • 70. 2019.05.25 염근철(GeunSam2) 5. 도커 네트워크 해당 VM의 네트워크 설정을 확인하면, 두 개의 NIC가 장착되어 있는 것을 확인할 수 있음
  • 71. 2019.05.25 염근철(GeunSam2) 5. 도커 네트워크 NAT 방식으로 연결된 네트워크 어댑터 1은 포트포워딩을 지원하며, 이곳에 설정을 하여 외부통신이 가능하게 할 수 있음
  • 72. 2019.05.25 염근철(GeunSam2) 추가로 공부해야 하는 내용 지금까지의 내용을 모두 이해했다면, Docker라는 컨테이너 플랫폼이 어떤 형태로 동작하는지 느낌은 왔을 것이라고 생각된다. 분량과 시간 관계상 아래 내용까지는 PPT에 담지 못하였지만 블로그를 통해 더 많은 내용을 다룰 예정이니 관심 있는 사람들은 참고하면 좋을 듯 하다. • Docker compose 파일 이해하기 • Docker volume 이해하기 • 컨테이너 링크의 개념 이해하기 • 모두의 근삼이 (https://ykarma1996.tistory.com/)