Leeyebin의 블로그

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

외부/교육

[2017.04.27~2017.04.28] DevOpse with Docker 2/2

안되면될때까지 2017. 4. 28. 13:14

실습한 부분에 대해서는 빠진부분이 있어 따로 추가할 예정


도커허브

  • 도커허브 이미지 공개 저장소
  • Root 공식저장소, official 마크
  • user:repository:tag

Docker repository에 pull


Docker hub에 있는 이미지 가져오기


레지스트리(Registry) - 저장소

  • 도커 이미지를 저장하고 공유할수 있는 서버
  • 오픈소스, 아파치 라이센스
  • v1, v2가 호환되지 않는다.
  • 클라우드: DockerHub
  • 인트라넷:DTR
//Private Registry 실행
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -d -p 5000:5000 --name myregistry registry:2


이미지 데이터를 어디에 저장할 것인가?

  • Local
  • Storage Drivers(https://docs.docker.com/registry/storage-drivers)
    • s3
    • azure
    • swift
    • oss
    • gcs


레지스트리 - 보안

  • TLS, 도메인 지원
    • Let's Encrypt 추천
  • 접근권한 관리
    • 인증: nginx를 활용한 basic auth
    • 이미지 무결성: ssh 사이닝

레지스트리 보안 모델

다시 작성하기.


레지스트리 - 팁

  • 네이밍 기준: 루트, Repo 명
  • 이미지 데이터 관리: gc 필요
  • 성능 이슈


docker-compose로 registry 실행

1. registry.yml작성

2. docker-compose로 실행

$ docker-compose -f registry.yml up -d

(https://docs.docker.com/registry/deploying/#/running-a-domain-registry)



**개발 환경 구성

https://hub.docker.com/r/amesken/cd-tool-stack/

//도커머신 생성
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker-machine create -d virtualbox docker-ci

//docker-ci 머신을 연결
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ eval $(docker-machine env docker-ci)

//github 레파지토리 연결
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ git clone https://github.com/marcelbirkner/docker-ci-tool-stack.git

//tool-stack 실행
kosta@DESKTOP-6B01TQ1 MINGW64 ~/docker-ci-tool-stack (master)
$ docker-compose up -d

GitLab

  • GitLab은 이슈관리, 코드리뷰, CI/CD를 지원하는 통합 개발환경 서버
  • 라이센스: CM버전은 무료, 엔터프라이즈 유료, 클라우드(무료, 유료)


gitlab-ce 설치 및 실행


gitlab이 업그레이드 되면 어떻게 하나요?

-데이터는 다 따로 빠져있고, yml 파일이 있다면 다시 띄우면 된다.


yona


gogs

  • go로 개발된 git 서비스, 가볍고 !빠르다.
  • 웹 콘솔 지원
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run --name=gogs-data \
> --entrypoint /bin/true \
> gogs/gogs

kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -d --name=gogs \
> --volumes-from gogs-data \
> -p 3000:3000 \
> gogs/gogs

Nexus Repo. OSS

-다양한 형식의 컴포넌트 레파지터리 매니저

kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -d --name nexus-data sonatype/nexus echo "data-only container for Nexus"

kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -d -p 8081:8081 \
> --volumes-from nexus-data \
> sonatype/nexus

nGrinder

  • 서버에 대한 성능 테스트를 위한 오픈소스
  • 성능테스트를 위한 웹UI
  • Agent와 Controller
//ngrinder 컨트롤러 생성
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -d -v ~/.ngrinder:/root/.ngrinder -p 80:80 -p 16001:16001 -p 12000-12009:12000-12009 ngrinder/controller:3
.3
//ngrinder 에이전트 생성
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -d -e \
> 'CONTROLLER_ADDR=controller_ip:80' ngrinder/agent:3.3

//Redmine 설치 및 실행
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -d -P --name myredmine redmine


MediaWiki

-위키피디아 같은 오픈소스 위키

-PHP로 개발


github & DockerHub

github와 DockerHub를 이용한 자동빌드 환경 구성

http://www.google.co.kr/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&ved=0ahUKEwjg6dm2n8bTAhUBFJQKHYUkB80QjxwIAw&url=http%3A%2F%2Fwww.marshalling.net%2Fyard%2Fwordpress%2F%3Fp%3D110&psig=AFQjCNEIlydgT4l4EWfrwDt2hivg4rcQXg&ust=1493437783140614&cad=rjt


DockerHub Automated Build

이미지 출처 : DockerHub.com


1. github에 도커 이미지 빌드를 위한 소스파일 추가

2. dockerhub에서 'Create Automated Build'

3. github 레파지터리에 연결

4. 빌드 트리거 실행


Jenkins & Docker

US1 : 도커 이미지를 빌드/테스트/배포하는데 Jenkins를 활용한다.

US2 : Jenkings Master & Slave를 도커로 실행한다.


*US1

일반 CI환경

user ---commit---> repo ---trigger---> CI server


Docker CI 환경

repo--trigger-->CI server(compile, test, build image)--push-->DockerRegistry(image)--pull--> Host


pipeline Stages

https://slideshare.net/Docker/build-publish-deploy-and-test-docker-images-and-containers-with-jenkins-workflow


Docker in Docker

  • Docker컨테이너가 Docker 명령어를 실행할 수 있게하려면
  • Docker 소켓 파일에 대한 접근권한
  • Docker 클라이언트, 실행 권한
  • 컨테이너에 root권한을 줌(--previledge but 보안적으로 안좋다.)
  • etc 볼륨바인딩으로 가능(안되는 경우 있음, ubunt, centos)
//docker 이미지 빌드용 jenkins 컨테이너 실행
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -d \
> --name jenkins \
> -p 8080:8080 \
> -v /var/run/docker.sock:/var/run/docker.sock \
> jenkins:latest

//jenkins 처음 접속시 비밀번호 찾기
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

//jenkins 들어가서 git연결하고 execute shell 커맨드 입력
docker build -t docker-whale:${TAG}
//docker build -t docker-whale .

*US2: Jenkins Master & Slave

-다양한 환경의 빌드 진행이 가능

-오래 걸리는 빌드를 슬레이브에 위임 가능

-Jenkins를 여러개 사용하는 것에 비해 관리가 용이


slave 빌드

다시 작성


Docker 볼륨과 네트워킹(멀티 호스트를 위한 기본 지식)

컨테이너볼륨

Volume 장점

  • 컨테이너와 데이터 분리
  • 컨테이너와 데이터 공유
  • I/O 성능 향상
  • 호스트와 컨테이너간 파일 공유

Volumen 관리 유형

  • 케이스1 : 컨테이너 내부에 저장한다.
  • 케이스2 : 도커 UFS에 저장한다.(도커 데몬이 관리하는 데이터 영역에 데이터를 저장, 도커 데몬 죽으면 사라짐)
  • 케이스3 : 도커 호스트 파일 시스템 볼륨 마운트
  • 케이스4 : Volume-driver를 이용해 네트워크로 연결된 장치에 저장한다.

케이스4 : 외부 Volume이 필요할까

https://clusterhq.com/2015/12/09/difference-docker-volumes-flocker-volumes/


컨테이너 Volume 공유 사례


Volume 주요 명령어

create

ls

// volume 생성
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker volume create --name test1
test1

// 생성 확인
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker volume ls

kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -it -v test1:/www/test1 ubuntu

//volume 만들어 gogs에 직접 붙이기
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker volume create --name gogs-data

kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -d \
> --name=gogs \
> -p 3000:3000 \
> -v gogs-data:/data \
> gogs/gogs


컨테이너 네트워킹

Networking Model

  • 도커가 시작될때 호스트 머신에 docker0라고 부르는 가상 인터페이스를 생성한다.
  • docker0에 사설 IP가 랜덤하게 배정된다.

Network 주요 명령어

  • create
  • ls
  • inspect
  • rm
  • connect(네트워크를 붙인다.)
  • disconnect(네트워크를 뗀다.)
//docker0 확인
//docker 호스트 서버로 들어간다.
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker-machine ssh default

//network를 조회한다.
kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0efe457d5b39        bridge              bridge              local
2b4cd194714b        host                host                local
0ba6cd88c407        none                null                local

network 유형

bridge: docker0 같은 네트워크

overlay: 멀티 호스트간에 연결해주는 네트워크


bridge network

-컨테이너는 동일 호스트내에 위치해야 한다.

-사용자 정의 bridge 네트워크에 포함된 컨테이너는 컨테이너 이름으로 통신 가능

kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker network create red

kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker network create blue

kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker run -itd --net=red --name ubuntu1 ubuntu
$ docker run -itd --net=red --name ubuntu3 ubuntu
$ docker run -itd --net=blue --name ubuntu2 ubuntu
$ docker run -itd --net=blue --name ubuntu4 ubuntu

ubuntu4에서
root@dbde333c0751:/# apt-get update
root@dbde333c0751:/# apt-get install inetutils-ping

kosta@DESKTOP-6B01TQ1 MINGW64 ~
$ docker network disconnect blue ubuntu1

overlay network

오버레이 네트워크 요건

  • key-value 스토어: Consul,etcd,zookeeper
  • key-value 스토어에 연결된 호스트 클러스터
  • 커널 버전 3.16이상
  • 각 호스트 도커 엔진 설정


overlay network

  • -다른 도커 호스트에서 각각 실행중인 컨테이너 들이 서로 통신할 수 있게 해준다
  • -도커 엔진은 overlay 네트워크 드라이버를 통해 멀티 호스트 네트워크 지원

Swarm Manager

-Swarm Manager를 통해서 여러개의 컨테이너를 마음대로 배치 할 수 있다.


Swarm mode

  • -도커 엔진에 클러스터 관리가 통합된 보드
    • --조건 : 엔진 v1.12.0 이상

특징

  • 멀티 호스트 네트워킹 : 분산 환경에서 여러개 노드를 하나의 네트워크로 묶은 것
  • 서비스 디스커버리 : 멀티 호스트 환경에서 실행된 컨테이너 정보를 제공
  • 로드 밸런싱 : 대용량 트래픽을 분산해 주는  것
  • 롤링 업데이트 : 새로운 이미지를 순차적으로 업데이트 해 주는 것
  • Health Check : 서비스가 정상 상태인지 확인
  • 스케일 아웃 : 컨테이너를 원하는 상태로 관, Desired state reconciliation
  • 로깅
  • 모니터링
  • HA


롤링업데이트를 확용한 프랙티스는?

BlueGreen Deployment

https://martinfowler.com/bliki/BlueGreenDeployment.html


Swarm mode 중요 개념

  • Swarm 클러스터
    • Swarm을 이용해 구축한 클러스터
    • aka Swarm
  • Node: swarm 클러스터에 참여하는 도커 엔진 인스턴스
    • Manager Node
      • swarm 클러스트 상태를 관리하는 노드, 오케스트레이션
      • swarm 매니저가 실행된다.
      • service 정의, task 할당
  • Service
    • 배포의 단위
    • 한개 서비스는 여러개의 태스크를 갖는다.
    • 보통 1개 이미지를 이용해 동일한 타입의 컨테이너를 여러개 실행한다.
    • global services
      • 클러스터에 있는 모든 노드에서 실행되는 서비스
    • replicated services
      • 스케일 아웃을 위해 특정 노드에서 실행하는 서비스
  • Task
    • 컨테이너 배포 단위, 도커 컨테이너와 컨테이너에서 처리하는 명령어

p.s

-Macvlan driver



Docker Security

  • 도커 호스트 안전
  • 도커 데몬은 root 권한으로 실행된다.
  • 도커 데몬은 신뢰할 수 있는 사용자만 접근가능해야한다.
  • REST API는 TCP 소켓대신 UNIX 소켓을 사용한다.
  • 도커 호스트 서버에 어드민 관리 도구를 실행하지 마라.(어드민 도구를 설치하지 않는게 좋다. 나중에 서버 탈취되면 큰일!)


컨테이너가 해킹당하면

  • 컨테이너에서 실행되는 프로세스는 다른 컨테이너의 프로세스에 영향을 줄 수 없다.
  • 컨테이너는 자신만의 네트워크 스택을 갖는다.
    • 브릿지


컨테이너가 폭주하면

  • 컨테이너는 메모리, CPU, I/O 자원을 공유한다.
  • 컨테이너는 호스트 서버 모든 자원을 소진할 수 없다.
  • KERNAL PANIC과 DOS방지


Docker Security Scanning

레지스트리에 애드온되어 이미지 보안 취약점을 스캔해서 알려준다.

https://cloud.docker.com/swarm/leeyebin/settings


Docker Bench

도커 호스트와 컨테이너에 대한 보안 취약점을 체크해준다.

https://github.com/docker/docker-bench-security

blog.docker.com/2015/05


DevOps 환경을 위한 시스템

-나중에 ELK까지 쓰면 좋다.


DevOps는 무엇인가

-서비스나 제품의 릴리즈를 위해서 개발/운영/QA 활동 등이 서로 협업하여 장애없이 서비스나 어플리케이션을 빠르게 릴리즈 하는 방법


Agile, DevOps

지향하는바는 똑같다.

http://collab.net/solutions/devops

어디에 더 무게중심을 두었냐 수행주체가 누구냐

Kent Back형님

Deployment Pipeline


Etsy 회사

Etsy Deploy Stats 2012


필요한것들

  • 자동화(Provisioning, Deployment, Test Automation)
  • 문화(Cross functional team)
  • 개인(프로그래밍 능력)



Comments