Leeyebin의 블로그
[2017.04.27~2017.04.28] DevOpse with Docker 1/2 본문
[Docker 이해 및 환경 구성]
도커는 무엇인가
!리눅스컨테이너 기술을 이용해 애플리케이션 !패키징, !배포를 지원하는 !경량의 !가상화 오픈소스 프로젝트
Go 언어로 개발(가장 성공한 Go언어로 만든 프로그램)
왜 도커를 써야 할까
https://www.slideshare.net/Docker/docker-lpc-2014cristian
예: 맥에서 아파치 톰캣을 설치하는 방법과, 윈도우에서 설치하는 방법이 다름
도커를 이용해서 깔면 한줄이면 끝남
Container vs Hypervisor
이미지 출처 : https://www.docker.com/what-docker
도커는 가볍다.
VM에 비해 이미지 파일 크기가 작아서 빠르게 이미지를 만들고 실행할 수 있다.
Immutable Infrastruture
이미지 기반의 애플리케이션 배포 패러다임
많은 서버를 동적으로 관리하는 클라우드 환경에서 효과적이고 유연한 배포 방식
관리 가능하고
stateless하고
scalabe한
이미지 기반의
애플리케이션 배포
http://www.slideshare.net/continuousphp/lets-code-our-infrastructure
리눅스 컨테이너(LXC, Linux Container)
- 단일 리눅스 호스트상에서 여러개의 격리된 리눅스 시스템을 실행하기 위한 OS수준의 가상화
- Libvirt
- 가상 호스트를 관리하는 툴킷
- https://libvirt.org
- OpenVZ(openvz.org)
- Imctfy(google/Imctfy)
- Warden(cloudfoundry/warden(지금은 garden))
- libContainer(docker 기본)
Everything at google runs in container
참고 : https://speakerdeck.com/jbeda/containers-at-scale
[도커는 왜 성공했을까?]
리눅스 컨테이너는 소개된지 10년이 지난 기술이지만 설정이 복잡하고 사용하기 어려워 널리 사용되지 못함.
"도커는 사용하기 쉽다."
[도커의 시작]
dotCloud의 PyCon2013에서 처음 공개
The future of Linux containers
$ docker run busybox echo 'Hello World'
- 로컬에 busybox 이미지 확인
- 없으면 dockerhub에서 다운로드
- busybox 이미지로 새 컨테이너 생성
- 컨테이너 실행
- TTY로 'Hello World' 출력
- 출력된 결과를 유닉스 소켓을 통해 클라이언트로 전송
*위에 과정을 명령어 하나로 끝낼 수 있다.
[도커 구성요소]
Community Edition - 무료, 최신 버전, 클라이언트 위주
Enterprise Edition
Docker Client
- 도커 엔진과 통신하는 프로그램
- 윈도우/맥/리눅스 지원
- Kitemetic
- Docker CE for Linux
- Docker CE for Mac
- whyve/bhyve를 기반으로 하는 HyperKit을 임베디드 하이퍼바이저로 사용한다.
- Docker CE for Window
- 윈도우에 내장된 Hyper-V 기술을 기반으로 한다.
Kitemetic
템플릿 기반으로 도커 컨테이너를 관리할수 있게 해주는 GUI 도커 클라이언트
Docker Host OS
도커 엔진을 설치할 수 있는 환경, 64비트 리눅스 커널 버전 3.10 이상 환경
Docker Engine
- 애플리케이션을 컨테이너로 만들고 실행하게 해주는 데몬
- Swarm 통합
- Clientdocker CLI(REST API(server docker daemon))
윈도우는 도커 호스트 OS일까?
Docker for Windows will not run Linux images -MS(2017년도 부터는 가능해짐)
윈도우는 리눅스 커널이 없지만 될 수 일을 듯
Docker Machine
로컬, 리모트 도커 엔진을 프로비저닝 해주는 클라이언트
Docker Hub(https://hub.docker.com)
도커 이미지를 관리하는 저장소
오픈소스 공식 이미지 고나리
공개(무료), 비공개(유료)
DTR
Docker Trusted Registry
도커 이미지 저장소를 구축할 수 있다.
설치형, 인증 지원
Registry(무료), DTR(유료-EE버전에 있다.)
DUCP
Docker Universal Control Plan
도커 클러스터 관리도구
설치형(유료)
Docker Data Center
DUCP + DTR
http://blog.docker.com/2016/02/docker-datacenter-caas
Docker Cloud
도커 이미지, 컨테이너 관리를 지원
공개/비공개 클라우드 관리 가능
tutum을 인수해서 통합
[도커 어디까지 왔나]
ms 4bilion 제시 안팔았음
Docker Conference
전세계 도커들의 축제, 미국/유럽에서 매년 개최
매년 1000퍼센트씩 성장
(2017.04.27 새로 나온 기술)
SwarmKit
moby project(전체 운영체제 서버를 컨테이너 같이 사용하는 것, 서버를 하나의 컴포넌트같이 사용하는 것)
왜 도커를 사용하는가
https://www.docker.com/survey-2016
도커 컨테이너 평균 지속시간 2.5일(vm은 15일)
https://datadoghq.com/docker-adoption/
도커 아키텍처
이미지 출처 : https://dnplas.gitbooks.io/yocto-project-crops/content/chapter1.html
기반 기술
Namespaces(프로세스별 리소스 격리)
- 가벼운 프로세스 가상화 기술
- 격리된 작업공간(컨테이너)을 구성해준다.
- 1992: "The Use of Name Spaces in Plan 9"
- 유형(mnt(mount points, 파일 시스템), uts(hotsname), pid, user(UIDs), net, ipc)
Control groups(==cgroups)(리소스 관리)
- 실행중인 애플리케이션이 원하는 만큼 리소스를 사용하게 한다.
- 특정 컨테이너가 지정한 만큼 리소스를 쓰도록 제한한다.
Union Filesystem
- 다른 파일 시스템을 Union mount 하도록 해주는 리눅스 파일 시스템 서비스
- 브랜치라고 하는 여러개 나누어진 파일 시스템을 하나의 파일 시스템처럼 사용할 수 있게 해준다.
- read-only 레이어들의 통합
권한수준
root 사용자와 동일한 수준의 권한이 필요
docker 데몬을 실행하기 위해 root사용자 필요
TCP 포트가 아닌 Unix 소켓과 데몬이 바인딩 하기 때문
컨테이너가 붕어빵이면 이미지는 틀
도커 이미지
-컨테이너를 만들기 위한 것
-레이어 파일 시스템으로 각 파일시스템이 곧 이미지
-읽기전용 파일시스템으로 도커가 애플리케이션을 배포하는 단위
Base Image
bootfs: 도커 시스템이 사용하는 파일시스템
union mount
Read-only layer
베이스이미지
- 이미지의 부모가 되는 이미지
- 공식 베이스이미지는 ubuntu였지만, alpine으로 변경되었음
- alpine + docker
Image Layers
-도커 이미지를 비주얼하게 보여준다.
https://imagelayers.io/
어떻게 변경된 부분만 저장하는가
http://slides.com/vichoward/docker-hackathon#/0/5
dockerfile
도커 이미지를 만들기 위해 설치할 sw, 필요한 설정을 정의하는 파일
-프로비저닝 역할
-이미지 제작 과정을 기록
//https://hub.docker.com/r/docker/whalesay/ kosta@DESKTOP-6B01TQ1 MINGW64 ~ $ docker search whalesay //official이거나 automated 등 확인하여 믿고 쓰자 //whalesay 설치 kosta@DESKTOP-6B01TQ1 MINGW64 ~ $ docker pull docker/whalesay //설치 확인(이미지 확인) kosta@DESKTOP-6B01TQ1 MINGW64 ~ $ docker images //whalesay 이미지를 실행한다. kosta@DESKTOP-6B01TQ1 MINGW64 ~ $ docker run docker/whalesay cowsay boo //unix 유틸중에 cowsay를 사용해서 실습용 이미지(toy) _____ < boo > ----- \ \ \ ## . ## ## ## == ## ## ## ## === /""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/ kosta@DESKTOP-6B01TQ1 MINGW64 ~ $ docker ps //이미지가 실행됬다가 멈춘 것 $ docker ps -a //멈춘 이미지까지 보인다. //이미지 만들기 //docker-whale 이미지를 위한 Dockerfile을 만든다. //윈도우의 경우에는 관리자권한 문제로 홈디렉토리나 바탕화면에는 하지 않도록 한다. //이미지를 만들 경로로 가서 //확장자 없이 파일을 만든다. //Dockfile FROM docker/whalesay:latest RUN apt-get -y update && apt-get install -y fortunes CMD /usr/games/fortune -a | cowsay //docker이미지가 실행될때 사용한다. 따로 다시찾기 //문제가 생기면 RUN의 update부분은 빼자 //docker-whale 이미지를 빌드한다. kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker build -t docker-whale . //docker-whale 이미지를 실행한다. kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker run docker-whale
Dockerfile Cheat Sheet
- From 베이스 이미지를 저장한다.
- RUN 리눅스 명령어를 실행한다.
- CMD 이미지를 실행하는 명령을 지정한다.
- EXPOSE 공개하는 포트를 정의한다.
- ENV 환경변수를 정의한다.
- ADD, ADD 파일을 복사한다.
- ENTRYPOINT 이미지 실행 명령을 재정의 한다.
- VOLUEM 바인딩 디렉토리를 정의한다.
- USER 사용자를 지정한다.
- WORKDIR 작업위치를 지정한다.
- ONBUILD 이미지 빌드후 실행되는 명령을 지정한다.
//docker-whale 이미지를 삭제한다. kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker rmi docker-whale Error response from daemon: conflict: unable to remove repository reference "docker-whale" (must force) - container 67c1bbcba886 is using its referenced image 497fd838c75d //컨테이너가 쌓여서 지울수 없다는 오류 //이미지에 참조되고 있는 것 찾기 kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 67c1bbcba886 docker-whale "/bin/sh -c '/usr/..." 9 minutes ago Exited (0) 9 minutes ago eloquent_mayer 5d904d63ae77 6b362a9f73eb "/bin/sh -c 'apt-g..." 12 minutes ago Exited (100) 12 minutes ago heuristic_curran 19e7374f973d docker/whalesay "cowsay aaa" 21 minutes ago Exited (0) 21 minutes ago nifty_curie bd3cf00f0ddb docker/whalesay "cowsay boo" 23 minutes ago Exited (0) 23 minutes ago happy_haibt //지우는 명령어 $ docker rm "container id" //싹다 지우기 kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker rm $(docker ps -aq) //다시 시도 kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker rmi docker-whale Untagged: docker-whale:latest Deleted: sha256:497fd838c75d887feb2c768495950471d13acf6c73b954b414e8f75a5a3addda Deleted: sha256:21a8c823ff690975e7c73f1e8b7c2a20a3440674658be81f5a98ef1a7318cc63 Deleted: sha256:b0b113f2278e96815cfb1831abf947c04a0cf276d308fa0a6ee686ccb4bf75a0
도커 이미지 크기를 줄이는 방법
- 가벼운 베이스 이미지를 사용한다.
- Dockerfile 명령을 체인으로 사용한다.(&& 연결, 적절히 레이어를 사용)
- 빌드 도구를 설치하지 않는다.
- 패키지 관리자를 정리한다.
참고 : http://pragmaticstory.com/?cat=3&paged=3
도커 컨테이너
- 이미지를 실행한 상태
- 읽기/쓰기가 가능한 파일 시스템
- 실행된 독립 애프리케이션
컨테이너는 가상서버가 아니다.
DB컨테이너 실행
mysql 컨테이너를 실행한다.
kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker search mysql $ docker run mysql error: database is uninitialized and password option is not specified You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD //패스워드 설정해야한다. kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker run -e MYSQL_ROOT_PASSWORD='password1' -d //-d옵션은 데몬모드로 띄운다.(계속 실행중이도록), -e 는 환경변수 설정 nginx 컨테이너 실행 kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker run --name myweb -d -p 80:80 nginx //컨테이너에 정의되어있는 포트 $ docker run --name myweb -d nginx //바인딩 안된건 외부에서 들어올 수가 없다. //-p 포트를 외부에 오프한다. - 자동 바인딩은 -P //왼쪽이 호스트 '옵션' 컨테이너라고 이해 //nginx 컨테이너를 원하는 설정에 맞춰 실행한다.(볼륨 바인딩) docker run --name myweb -v /home/docker/nginx.conf:/etc/nginx/nginx.conf -d -p 80:80 nginx //nginx 컨테이너를 띄울 때 디폴트설정이 아닌 내가 설정한 설정파일을 이용해서 띄울수 있다. //윈도우는 /home/docker가 위치가 다를수 있으니 수정 필요. //컨테이너 로그 확인하기 //멈춰있는 경우에는 docker ps -a 옵션으로 확인후 아이디를 따서 "docker logs 아이디" 사용한다. docker logs -f "" //로그를 연속해서 보여준다. //컨테이너 상세 내용을 확인한다. kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker inspect "NAMES" //결과값은 go언어로 되어있음 1. nginx 컨테이너와 jenkins 컨테이너를 연결 kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker run -d -p 8080:8080 -p 5000:5000 --name myjenkins jenkins //8080,5000 포트 바인딩하고 이름은 myjenkins로 jenkins를 run한다 http://192.168.99.100/ https://trello.com/b/mQ0oj2Ih/devops-with-docker 2. nginx 컨테이너를 실행하면서 jenkins 컨테이너를 연결 $ docker run -p 80:80 -v /home/docker/nginx.conf:/etc/nginx/nginx.conf --link myjenkins:jenkins -d nginx 클라이언트에서 docker host로 파일 옮기는 방법 //NAME 확인 $ docker-machine ls //파일 옮기기 kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker-machine scp nginx.conf default:~/ //서버 보기 kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker-machine ssh default ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| Boot2Docker version 17.04.0-ce, build HEAD : c69677f - Thu Apr 6 16:26:16 UTC 2017 Docker version 17.04.0-ce, build 4845c56 docker@default:~$ ls log.log nginx.conf
US1:독립된 로컬 개발환경
로컬 설정에 영향을 받지 않는 독립된 개발환경을 구성. Vagrant, Docker Machine을 이용하면 일관된 인터페이스로 구성이 가능
Vagrant Docker provider
(http://docs.vagrantup.com/v2/docker)
US2:VM기반의 도커 Host
VM서버로 도커 Host 구성한다. Host에는 한개 컨테이너만 운영하는게 효과적이다. VM 유형, 환경에 상관없이 배포가 가능하다.
Docker Machine
(https://github.com/docker/machine)
US3:싱글서버 도커 Host
물리서버 1대로 도커 Host를 구성한다.
여러 컨테이너를 운영할 수 있어서 효율적이다. 구성이 단순하여 관리가 용이하지만 서버 에러에 대한 위험성이 크다.
Your Datacenter or VPC
https://greatwhitetec.files.wordpress.com/2016/09/tfdx_docker.jpg?w=700
초반에는 오른쪽(안정적)같이 썼으나 왼쪽으로 쓰는 추세(효율성)
US4:도커 Host 클러스터
여러 도커 Host 서버를 하나의 Host처럼 관리하기 위해 클러스터를 구성한다.
fleet, swarm 등이 있다.
컨테이너 데이터 백업
http://www.it20.info/2012/12/vcloud-openstack-pets-and-cattle/
mysql 컨테이너 데이터를 호스트 디렉토리 mysqldata에 저장한다.(바인딩한다.)
kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker run -d -e MYSQL_ROOT_PASSWORD='password1'--name mydb -d -v /mysqldata:/var/lib/mysql //-v 옵션 볼륨 바인딩 //데이터 컨테이너 //다른 컨테이너에게 볼륨을 공유한다. kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker run --name mydata -v /data/app1 busybox true //mydata 컨테이너를 참조하는 컨테이너를 만든다.(설정파일이라던가 share하기위해 readonly로 하는게 좋다.) kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker run -it --volumes-from mydata //옵션 -it 인터렉티브 모드(컨테이너 안에)
Docker Machine
이미지 출처 : https://devopscube.com/
-가상서버에 도커엔진을 설치할수 있게 도와주는 도구
유스케이스
-로컬에 도커엔진 설치
-리모트 서버에 도커엔진 설치
boot2docker
- 도커 컨테이너를 실행하기 위한 가벼운 리눅스 배포판
- Tiny Core lunux 기반
- docker machine의 기본설정
- https://github.com/boot2docker/boot2docker
//생성된 서버를 조회한다. kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker-machine ls //my-dev 서버를 생성한다.(하이퍼바이저) kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker-machine create --driver virtualbox my-dev //서버 정보 확인 kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker-machine env my-dev export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.101:2376" export DOCKER_CERT_PATH="C:\Users\kosta\.docker\machine\machines\my-dev" export DOCKER_MACHINE_NAME="my-dev" export COMPOSE_CONVERT_WINDOWS_PATHS="true" # Run this command to configure your shell: # eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env my-dev) //현재 쉘에 서버 연결정보를 설정한다.(myy-dev로) kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ eval $(docker-machine env my-dev) //my-dev 서버 정보에 ssh를 연결한다. kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ docker-machine ssh my-dev
도커 머신 Drivers
-AWS, AZURE 등등
Docker Compose
여러개 컨테이너로 구성된 애플리케이션을 만들고 관리할 수 있게 해주는 도구(미리 띄우는 설정을 .yml에 세팅해놓는다.)
-웹 프론트엔드
-사용자 관리
-결재
-데이터 베이스
설치하기
docker-compose 사이트
docker-compose.yml
애플리케이션을 만드는 서비스를 정의하는 yaml 파일
docker-compose.yml Cheat Sheet
- image build할 이미지를 지정한다.
- build 빌드에 적용할 옵션을 설정한다.
- links 다른 서비스에 컨테이너를 연결한다.
- external-links 현재 docker-compose.yml 외부에서 시작된 컨테이너를 연결한다.
- ports 포트를 드러낸다.
- expose 호스트 바인딩없이 포트를 드러낸다.
- volumes 호스트와 컨테이너 특정 패스를 마운트한다.
- volumes_from 다른 서비스나 컨테이너로부터 볼륨을 마운트한다.
- environment 환경변수를 정의한다.
- env_file 호나경변수를 정의하는 파일을 지정하낟.
- extends 다른 서비스 설저을 상속받는다.
- net 네트워크 모드
- dns 사설 dns 서버를 지정한다.
- dns_search 사설 dns 서버를 도메인으로 지정한다.
도커 컴포즈 주요 명령어
docker-compose up -d
docker-compose up 옵션
docker-compose rm
등
link의 원리
link를 걸면 도커 엔진이 컨테이너에 환경 변수로 필요한 정보를 주입 시킨다.
mysql.yml 파일을 정의한다.
//default 이름으로 하지말고 이름을 지정하자(실수 줄일기) kosta@DESKTOP-6B01TQ1 MINGW64 ~/Downloads/yblee/Dockerfile $ vi mydb.yml mydb: image: mysql environment: - MYSQL_ROOT_PASSWORD='password1' ports: - 3306:3306 $docker-compose -f mydb.yml up -d //WAS 스케일아웃 //mywas컨테이너를 3개로 늘린다. $ docker-compose scale mywas=3
'외부 > 교육' 카테고리의 다른 글
[2017.05.15~2017.05.19] 자료구조 1/5 (0) | 2017.05.15 |
---|---|
[2017.04.27~2017.04.28] DevOpse with Docker 2/2 (0) | 2017.04.28 |
[2017.03.27~2017.03.30]데이터베이스 분석 및 개선을 통한 성능 확보 교육 4/4 (0) | 2017.03.31 |
[2017.03.27~2017.03.30]데이터베이스 분석 및 개선을 통한 성능 확보 교육 3/4 (0) | 2017.03.30 |
[2017.03.27~2017.03.30]데이터베이스 분석 및 개선을 통한 성능 확보 교육 2/4 (0) | 2017.03.28 |