Docker & OpenShift 3 락플레이스미들웨어기술본부양희선
Contents 1. Docker Container 개요 2. 이미지다운로드및관리 3. 이미지를이용한어플리케이션생성 4. JBoss EAP 이미지설명 5. Application 을위한 Resources 구조 6. 배포및롤백 7. 서비스확장 ( 오토스케일링 )
1. Docker Container 개요 Docker Image 란? Image & Container VM & Container Image 생성및활용 Docker & Kubernetes of Openshift
Docker & LXC Container Host 로부터격리되어독립적환경의이미지파일로부터실행되는프로세스 Linux LXC OS 내에서작동하는경량화된 VM 의구현이목적 개발자들이다양한 OS 에서작동하는동일한개발환경을구현하는것이목적 참고 2000 FreeBSD Jails 2004 Solaris Zones
Docker Image 실행에필요한모든것을포함하여 Docker Format 의파일로생성 App code, runtime, system tools, system libraries Image Container Container Container
Docker Image vs Container Image Container Container Container An instance of an image is called container
VM vs Docker Container Guest OS 에서사용되는리소스불필요 Hypervisor 로인한오버헤드감소
Docker Hub https://hub.docker.com/explore/
Docker Hub https://hub.docker.com/explore/
HTTPD 이미지실행방법 [root@ip-10-10-99-31 ~]# docker run -d httpd nable to find image 'httpd:latest' locally... latest: Pulling from docker.io/library/httpd... Command line: 'httpd -D FOREGROUND' 이미지다운로드및컨테이너실행 [root@ip-10-10-99-31 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED 189c74f48d77 httpd "httpd-foreground" 12 seconds ago [root@ip-10-10-99-31 ~]# docker inspect 189c74f48d77 grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "172.17.0.3", 실행중인컨테이너조회 컨테이너 IP 조회 [root@ip-10-10-99-31 ~]# curl 172.17.0.3 <html><body><h1>it works!</h1></body></html> 컨테이너에서실행중인 HTTPD 호출
Dockerfile 을이용하여 HTTPD 이미지생성 Apache Image 생성 Apache Container 실행 Port Forwarding [root@master ~]# cat Dockerfile FROM docker.io/centos USER root RUN yum clean all \ && yum repolist \ && yum -y install httpd \ && yum clean all 베이스이미지 RPM 을이용하여 HTTPD 설치 EXPOSE 80 사용할포트 CMD ["/usr/sbin/apachectl","-k","start","-d","foreground"] 실행할파일
Docker Build [root@master ~]# docker build -t myhttpd. [root@master ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE myhttpd latest 07afc88a9eb7 7 seconds ago 250.1 MB docker.io/centos latest d123f4e55e12 9 days ago 196.6 MB # Container 실행및 Port Forwarding [root@master ~]# docker run -d -p 80:80 h myhttpd myhttpd 3a655225e667c549c27572195cd0b9696c85e60bc30fa517f53bf1225f55054d
Apache Webserver 컨테이너접속 # 실행중인컨테이너조회 [root@master ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3a655225e667 myhttpd "/usr/sbin/apachectl " 53 seconds ago Up 52 seconds 0.0.0.0:80->80/tcp serene_shirley # 컨테이너내부로접속 [root@master ~]# docker exec -ti 3a655225e667 /bin/bash [root@myhttpd /]# [root@myhttpd /]# hostname myhttpd
Docker Working flow web.rockplace.co.kr Host 52.78.245.72:80 Port Forwarding web.rockplace.co.kr Apache Container: 172.30.35.131:80
Docker and Kubernetes of Openshift 내부 DNS web.rockplace.co.kr 172.30.35.131:80 HAProxy 52.78.245.72:80 Openshift Node Openshift Route ( 내부 Service 위치확인 ) web.rockplace.co.kr Load Balancer: 172.30.35.131:80 Service (Load Balancing) Apache Apache Container/Pod: Container/Pod: 10.0.10.11:80 10.0.10.11:80 Pod (Container)
Docker and Kubernetes of Openshift Docker 만사용하여컨테이너서비스 Kubernetes 를사용하여컨테이너서비스 Port Forwarding Route web.rockplace.co.kr Service (LB) 172.30.35.131 Container Container / Pod Container / Pod 10.1.2.10:80, 10.1.3.13:80
Container Management by Openshift Route: web web.rockplace.co.kr 외부로부터의진입점 service: web 172.30.176.102 Cluster IP (VIP) 를통한 Loadbalancing Docker Image Pod Kubernetes 는 Container 를 Pod 에담아서관리 ReplicationController 지정된개수의 Pod 가잘돌고있는지 DeploymentConfig 몇개의 Pod 를만들지 어떻게 Pod 를배포할지
2. 이미지다운로드및관리 Image Registry Image Download & Push Openshift Image Stream
Image Registry Docker Image 는 Image Registry 에저장된다. Docker 명령을이용하여 Image Registry 로부터이미지를받을수있다. 폐쇄망에서는내부에 Private Image Registry 를구성할수있다. Openshift Pull Image Redhat Redhat Image Registry new-app Dockerhub Image Registry Images Private Image Registry ( 폐쇄망환경 )
Image Push & Download Admin 이외부 Registry 로부터받거나자체제작한이미지를 Image Registry 에올린다. 내부의 Openshift 에서 Image Registry 로부터이미지를받아갈수있다. User Docker Image Push Image Download Docker Image Registry Jboss-eap7-openshift:1.4 Jboss-eap7-openshift:1.5 Openshift Jboss-eap7-openshift:1.4 ImageStream
Openshift Image Stream Openshift 에서는 ImageStream 형태로이미지를관리한다. 하나의 ImageStream 에는 Tag 가다른여러개의이미지가있고각각 ImageStreamTag 와 Image Metadata 로구별될다. ImageStream Jboss-eap7-openshift ImageStreamMapping ImageStreamTag 1.4 1.5 jboss-eap@sha256:474.. jboss-eap@sha256:312.. Image Metadata.. Image Metadata... 이미지다운로드위치및상세정보 이미지 Tag ( 버전정보 ) ImageStreamImage 이미지 ID
3. 이미지를이용한어플리케이션생성 일반이미지를이용한어플리케이션생성 어플리케이션소스업데이트방법 Build 방식 S2I Builder 이미지작동방식
Application 생성방법 외부 Registry 로부터받거나자체제작한이미지를 Image Registry 에올린다. Openshift 에서 Image Registry 로부터이미지를받아어플리케이션생성. User Docker Image Push Docker Image Registry Tomcat7:latest Openshift Tomcat7:latest ImageStream
소스업데이트방법 1 업데이트된이미지를 Image Registry 에다시올리고 Openshift 내부에서이미지를다시 Import 하고재배포한다. User Docker Image Push Docker Image Registry Tomcat7:latest 이미지재생성 Openshift Import Image Tomcat7:latest ImageStream 재배포
소스업데이트방법 2 Openshift 의 Build 기능을이용하여업데이트된소스로이미지를자동으로재생성하고배포한다. 이를위해서 Base 이미지, 소스의위치와빌드방식을미리정의해야한다. User Openshift 소스업데이트 Git 소스복사 Build Tomcat7 Base Tomcat7:latest 소스가없는 Base 이미지 최종이미지
Build 오픈시프트에서 Build 는어플리케이션소스가업데이트된이미지를생성하는것을의미 Openshift 는이미지 Build 를자동화하기위한기능을제공 Build 방식은용도에따라아래와같은방식사용가능 방식특징비고 Docker Build Dockerfile 이용하여어플리케이션배포및 Build 수행 Docker Build 를 Openshift 에서그대로사용할수있도록기능제공 S2I Build 쉘스크립트 (assemble) 파일이용하여 Build 수행 이미지내부에어플리케이션배포및 Build 를위한스크립트구성 ( 이미지별도작성필요 ) Pipeline Jenkins 의 Pipeline Job(Jenkinsfile) 을이용해서 Build 수행 Jenkins 를이용하므로보다복잡한테스트및코드검사 (Sonarqube 이용 ) 등의부분도관리가능 Git 연동 Git 연동 Git, Jenkins 연동
Docker Build Docker build 에서는다운로드받은 Dockerfile 을이용하여 Build 를수행한다. User Openshift 1) 업데이트 Git 2) 복사 Jboss-EAP-S2I 3) Docker Build (Dockerfile) Jboss-APP:latest 소스가없는 Base 이미지 소스포함최종이미지 Application 소스 Dockerfile
S2I Build S2I build 에서는이미지에내장되어있는 Script File (/usr/local/s2i/assemble) 을이용하여 Build 를수행한다. User Openshift 1) 업데이트 Git 2) 복사 Jboss-EAP-S2I 3) S2I Build (/usr/local/s2i/assemble) Jboss-APP:latest 소스가없는 Base 이미지 소스포함최종이미지 Application 소스
Pipeline Build Pipeline build 에서는다운로드받은 Jenkinsfile 파일을이용하여 Jenkins 에서 Build 를수행한다. Jenkins 의 Pipeline Job 을이용하여 Code Inspection 및 Coverage Analysis 등의작업을추가할수있다. Jenkinsfile 에서 CLI 를사용하면 Dev 프로젝트에배포후 Stage 및 Prod 프로젝트로자동배포를구성할수있다. User Openshift 1) 업데이트 Git 2) 복사 Jenkins Jboss-EAP-S2I 3) Pipeline Build (Jenkinsfile) Jboss-APP:latest 소스가없는 Base 이미지 소스포함최종이미지 Application 소스 Jenkinsfile
S2I Builder 이미지란? 일반적으로 Java WAS 이미지는 OS Libs, JDK, WAS Engine, Application 으로이루어진다. 이미지에서변경이지속적으로일어나는부분은 Application 이다. Builder Image 에는 Application 을다운받아 Build 할수있는 Builder 가들어있다. (S2I: Source To Image) Builder Image 는 Application 이포함된새로운이미지를만드는역할을한다. 일반 Image S2I Builder Image Source Download & Build Application WAS Engine JDK OS Libs S2I Builder WAS Engine JDK OS Libs
S2I Builder 이미지작동방식 Openshift 에서 Build 를실행하면 Application 을다운로드받아새로운이미지를만든다. S2I Builder Image S2I Builder 새로운이미지생성 Application Image S2I Builder Application Git WAS Engine JDK OS Libs WAS Engine JDK OS Libs
S2I Builder 이미지작동방식 Builder Image 는 Git 서버로부터 Application 을받아새로운 Application Image 를생성한다. 새로운 Application Image 는 Openshift 내부에 Openshift Container Registry 에저장된다. 각 Node 로 Application Image 를배포한다. Openshift Infra Node1 Builder Image Application Image Build Node2 Openshift Container Registry Application Image 배포 Application Image
4. JBoss EAP 이미지 Openshift 용 JBoss EAP 이미지의특징 JBoss EAP 이미지작동방식
EAP7 for Openshift 이미지특징 구분운영모드 Admin Console JBOSS_HOME 실행스크립트 OS Version Session Clustering 내용 Standalone 없음 /opt/eap /opt/eap/bin/openshift-launch.sh Red Hat Enterprise Linux Server release 7.3 (Maipo) Kube-Ping 모듈을통해클러스터링가능
JBoss EAP7 S2I 이미지작동방식 2. /tmp/src 의파일을 /$HOME/source 로복사 1. git 서버로부터받은파일을이미지내부의 /tmp/src 로복사 3. /$HOME/source 아래의디렉토리별로 JBoss 관련위치로복사 Openshift Infra jboss-eap7-openshift (APP 미포함 ) APP Build jboss-eap7-openshift (APP 포함 ) Node jboss-eap7-openshift (APP 포함 ) /$HOME/source 하위디렉토리 configuration deployments modules
S2I 이미지내부스크립트실행순서 순번 스크립트파일 용도 1 /usr/local/s2i/assemble 소스및설정파일을 JBoss 내부로복사 2 /usr/local/s2i/run openshift-launch.sh 실행 3 /opt/eap/bin/openshift-launch.sh EAP 기동
Git vs Container 파일위치 Git 서버의각디렉토리파일들은아래와같이컨테이너디렉토리로복사된다. 구분 Git Directory 파일 Container Directory APP( 소스 ) / war ear rar jar $JBOSS_HOME/deployments/ /deployments/ war ear rar jar $JBOSS_HOME/deployments/ 설정파일 /configuration/ 모든파일 (standalone-openshift.xml) $JBOSS_HOME/configuration/ Module /modules/ 모든파일 $JBOSS_HOME/modules/
5. Application 을위한 Resources 구조 Openshift Resource 구조 Build Git
Openshift Resources 구조 접속주체별로 User 생성 Application 그룹또는 Resource 제한단위 개별 Application Route Service User Project Application Pod User 단위로접속 User 별권한부여 Project 별 Resource 제한가능 (CPU, Memory 포함 ) Deployment Config BuildConfig
Build, Deployment, Pod app.cloud.rp.com Route 현재실행중인 APP Pod 14 번째배포이미지사용중 172.17.10.23 Service Node 로배포된내역 Application Pod Deployment Config BuildConfig 소스빌드내역 (Master)
BuildConfig BuildConfig 는설정된내용을기반으로 Build 를실행하는역할을한다. 가져올 Application 정보 사용할 Image / 결과 Image Git Repository URL: http://gitlab.test.rp.co.kr/root/ncis-eap70.git Git Reference: master Context Dir: simple-app Build From : openshift/ncis-eap70-openshift:1.4 Push To: myproject/ncis-eap70-openshift:latest
Git OCP Builder 는원격지의소스를가져오기위한방법으로 Git 서버를사용한다. Branch Reference 는 master, Context 는 / 로설정하면 git clone 시 Git 서버의모든히스토리까지받게되므로소스의용량이커지고오래걸린다. 용량을줄이려면아래와같이 Git Reference 를빈칸으로남겨둬야한다. 소스와전체히스토리복사 Git Repository URL: http://gitlab.test.rp.co.kr/root/ncis-eap70.git Git Reference: master Context Dir: / 소스와최종히스토리만복사 (--depth=1) Git Repository URL: http://gitlab.test.rp.co.kr/root/ncis-eap70.git Git Reference: Context Dir: /
6. 배포및롤백 Deployment Rollback
Deployment Deployment 는 Build 에의해생성된이미지를 Node 로배포하여실행시키는것을말한다. 배포할 Image 배포방법 Image Stream Tag: myproject/ncis:latest Image 가변경되면자동으로배포 : yes 설정이바뀌면자동으로배포 : yes Strategy Type: Rolling Max Num Unavailable Pods: 25% ( ¼ 씩 Rolling 배포 ) Replicas: 4 ( 동시에유지할 Pod 개수 )
Rollback Rollback 은기존에배포됐던특정시점으로어플리케이션을다시배포하는것을말한다. Openshift 는기존 Deployment 이미지를그대로유지하고있으므로쉽게 Rollback 이가능하다. 배포내역
7. 서비스확장 Manual Scale-Out Resource Limits Auto-Scaler
Manual Scale-out 실행될 Pod 의개수를화살표로조정할수있다.
Resource Limit 컨테이너가최대로사용할수있는 CPU 와 Memory 를지정할수있다.
Auto-Scaler 지정된 CPU 사용율에따라 Pod 의개수가자동으로증가또는감소하게설정가능하다.
EAP7 Application
감사합니다 midware@rockplace.co.kr