Leeyebin의 블로그

[2017.04.27~2017.04.28] DevOpse with Docker 1/2 본문

외부/교육

[2017.04.27~2017.04.28] DevOpse with Docker 1/2

안되면될때까지 2017. 4. 27. 11:17

[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


Comments