Leeyebin의 블로그
[2017.04.27~2017.04.28] DevOpse with Docker 2/2 본문
실습한 부분에 대해서는 빠진부분이 있어 따로 추가할 예정
도커허브
- 도커허브 이미지 공개 저장소
- 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)
- 개인(프로그래밍 능력)
'외부 > 교육' 카테고리의 다른 글
[2017.05.15~2017.05.19] 자료구조 2/5 (0) | 2017.05.16 |
---|---|
[2017.05.15~2017.05.19] 자료구조 1/5 (0) | 2017.05.15 |
[2017.04.27~2017.04.28] DevOpse with Docker 1/2 (0) | 2017.04.27 |
[2017.03.27~2017.03.30]데이터베이스 분석 및 개선을 통한 성능 확보 교육 4/4 (0) | 2017.03.31 |
[2017.03.27~2017.03.30]데이터베이스 분석 및 개선을 통한 성능 확보 교육 3/4 (0) | 2017.03.30 |