클라우드과정보충자료 2019.6 윤형기 (hky@openwith.net)
평가및과제 Review
문제 1. Docker 컨테이너 (container) 의역할에대한설명으로잘못된것은? a. 컨테이너는자기완결적이어서한 Docker 기반환경에서운영되면다른어디에서도이용가능하다. b. 자체환경및클라우드환경어디에나적용가능하다. c. immutable 이어서중복사용, 공유가능한경량급 (lightweight) 개발 / 운영환경을제공한다. d. 기존의개발환경과는단절되어완전히새로운 toolchain 이필요하다. 답 d.
문제 2. Docker 이미지 (image) 에대한설명중잘못된것을고르세요. a. 하나의 tarball 파일이다. b. 이미지는가상머신의일종이며운영체제와개발프레임워크까지하나의파일로간직하며따라서그크기가매우크다. c. 자체의파일시스템을가진다. d. Container 를생성할수있는일종의틀 (template) 역할을한다. 답 b.
문제 3. Docker 에대한설명중잘못된것을고르세요. a. Container 는 Readonly 타입의파일이다. b. Docker Image 파일은 Copy-on-write 전략을채택하였다. c. Graph driver 를통해 layer 구조의이미지파일을공유할수있게되었다. d. Docker for Windows 는유료제품으로서반드시라이선스구입하여야한다. 답 d
문제 4. Dockerfile 작성방법에대한것입니다. 올바르게기술한것은? a. Run 은 Linux 명령어뿐만아니라 C 나 Java 프로그램도실행가능하다. b. 작업공간 (Working directory) 을지정하는명령어는 WORKDIR 이다. c. COPY 는 ADD 의기능에압축해제기능을추가한것이다. d. Dockerfile 이외에도얼마든지다른이름의파일을이용할수있다. 답 d.
문제 5 foo:1.0 라는이름의 docker image 를 Docker Hub 의개인계정 (myname) 에 push 하려합니다. 맞는것은?? 1. $ docker container push foo:1.0 2. $ docker image tag foo:1.0 myname/foo:1.0 $ docker image push myname/foo:1.0 3. $ docker login -u myname -p <your password> $ docker image tag foo:1.0 myname/foo:1.0 $ docker image push myname/foo:1.0 4. $ docker login -u myname -p <your password> $ docker container tag foo:1.0 myname/foo:1.0 $ docker container push myname/foo:1.0 5. $ docker login -u myname -p <your password> $ docker image push foo:1.0 myname/foo:1.0 ( 답 ) 3
문제 6 Docker 가사용하는 container runtime 의이름은? a. runc b. virtualize c. shim d. cgroup ( 답 ) a ( 해설 ) $ docker info grep I runc
문제 7 다음명령을수행하면어떤결과가발생하는가요? $ docker run p 80-87:80 --name nginx3 d nginx a. container 내에서 80 port 와 87port 가열리고이들두가지가 host 의 80 port 와 mapping 된다. b. host 의 80 port 가 container 의 80 과 87 에 mapping 된다 c. container 의 80 port 가 host 의 80 부터 87 까지모두열리고 mapping 된다 d. 에러메시지가발생된다. ( 답 ) c.
문제 8 Docker image 의크기와각 layer 를조사하려면어떤명령어가필요한가요? a. $ docker images --layers <<image-id>> b. $ docker layers <<image-id>> c. $ docker history <<image-id>> d. a 와 b ( 답 ) c
문제 9 다음명령수행시 /bin/sh 의 PID 는몇번인가요? $ docker run -it alpine /bin/sh a. PID 1 b host에서의 docker process와같은 PID c. PID 0 d. 답없음 ( 답 ) a
문 10 다음명령을실행하면 myubuntu 컨테이너는어떤네트워크에 attach 되나요? $ docker run d --name myubuntu Ubuntu /bin/sh c whle true; do echo current date and time: $(date); sleep 10; done a. Bridge network b. Overlay network c. Custom network d. host network ( 답 ) a
[ 주관식 ] ( 문제 1) Alpine linux 이미지를수행시키면서 my-product 라는디렉토리를 read-only mode 로 container folder (/data) 에 mount 하는방법을기술하세요. ( 답 ) 다음명령을수행합니다. $ docker container run -it --rm \ -v my-products:/data:ro \ alpine /bin/sh
( 문제 2) 분산클러스터에서의컨테이너관리를위한 Docker Swarm 과관련하여다음을각각 1 줄로설명하세요. a. Swarm manager 의 consensus 프로토콜 b. service 와 stack 의정의 c. container 들사이의통신방식 ( 답 ) a. master node 인 manager 를 leader 와 follower 로나누고이들사이에 raft store 를동기화시키는방식으로다수결결정하는것 b. service 는희망하는상태 (desired state) 를기술한것, stack 은서로관련있는 (related) 서비스의집합 c. vxlan tunnel 을이용한 overlay network
( 문제 3) abcd1234 라는 id 를가지는 Docker container 를수행하고있습니다. stop 한후다시 start 시키는명령은각각무엇인가요? 답 $ docker stop abcd1234 $ docker restart abcd1234
( 문제 4) Docker Compose 와 Docker Swarm 을 3 줄이내로비교해주세요. ( 답 ) Single Host for Docker-Compose vs. Multi-host cluster for Swarm Dockfile vs. YAML 파일 Service 중심 vs. Server + Stack 으로의확장
( 문제 5) Orchestration 소프트웨어의기능을생각나는대로나열해주세요 ( 답 ) Reconsiling the desired state Replicated and Global servcies Service discovery Routing & Load balancing
( 과제 1) JAVA 개발자로서다음의프로그램을 Docker container 로만들어서배포하고자합니다. (a) 이를위한 Dockerfile 을작성하세요. (b) 위의 Dockerfile 을수행하는명령어를작성하세요. (-t tomcat_app 으로 tag 를주세요 ) 여기에는이미지 build 와 container run 을포함합니다. [ 조건 ] (1) 운영체제는 Ubuntu 16.04 로하되자동 OS update 를한다. (apt-get update) (2) JAVA 는 Oracle Java version 7 을이용하되 JAVA_HOME 을 /usr/lib/jvm/java-8-oracle 로지정한다. (3) Apache Tomcat version 8.5.35-jre10 를이용한다. (4) /usr/local/tomcat 을 CATALINA_HOME 으로지정하고프로그램전체의 working directory 로도이용한다. (4) 개발자가작성한 web 프로그램은 Host 컴퓨터현행디렉토리기준으로./webapp 에있다.
./webapp/index.jsp 의내용 <!doctype html> <h1>it works!</h1> <% for (int i = 0; i < 5; ++i) { out.println("<p>hello, world!</p>"); } %> 이를 Container 의 /usr/local/tomcat/webapps/webapp 에복사하여실행한다. 단개발된프로그램중압축된것은자동으로압축해제한다. (5) 컨테이너가실행될때 port 는 8080 을열어준다. (6) 컨테이너가실행되는즉시위의복사된실행파일내의 catalina.sh 을실행토록하되이를위해서 catalina.sh 을 chmod +x 로실행모드로바꾸어준다.
답 FROM tomcat:8.5.35-jre8-ubuntu ADD./webapp /usr/local/tomcat/webapps/webapp EXPOSE 8080 CMD chmod +x /usr/local/tomcat/bin/catalina.sh CMD ["catalina.sh", "run"] ENV CATALINA_HOME /usr/local/tomcat ENV PATH $CATALINA_HOME/bin:$PATH RUN mkdir -p "$CATALINA_HOME" WORKDIR $CATALINA_HOME $ docker build -t tomcat_app. $ docker run -it -p 8787:8080 tomcat_app
( 과제 2) 다음 c++ 파일을 docker container로만드는 dockerfile을작성하세요 my_test.cpp #include <iostream> int main(int argc, char const *argv[]) { std::cout << "Hello Docker container!" << std::endl; return 0; } 조건 a. 컴파일러는 gcc version 4.9로한다. b. container의 working directory는 /usr/src/dockertest로한다. c. 서버의 current directory에존재하는위의소스프로그램을위의 container working directory에복사. d. Container가수행될때 g++ 로컴파일하여 my_prog라는이름의 binary 파일을생성한다. e. 컴파일된실행파일 (my_prog) 을즉시실행한다.
답 # Get the GCC preinstalled image from Docker Hub FROM gcc:4.9 # Copy the current folder which contains C++ source code to the Docker image under /usr/src COPY. /usr/src/dockertest1 # Specify the working directory WORKDIR /usr/src/dockertest1 # Use GCC to compile the Test.cpp source file RUN g++ -o Test Test.cpp # Run the program output from the previous step CMD ["./Test"]`` $ docker build -t test_cpp.
과제 3) 다음조건을만족시키는 docker compose yaml 파일을작성하세요. (1) version: 3 (2) services 에는다음의 2 개서비스를지정 (2-1) nginx 서비스로서 host 의 /home/user/nginx-configuration 를 container 상의 /etc/nginx 에 mapping 하여 mount port open 은 host 와 container 모두 80 (2-2) Maria DB 를가져와서 root password = my-password 로설정
답 version: '3' services: nginx: image: nginx:latest volumes: - /home/user/nginx-configuration:/etc/nginx ports: - 80:80-443:443 mydb: image: mariadb environment: - MYSQL_ROOT_PASSWORD=my-password
( 과제 4) wordpress 서비스를 docker container 로진행하고자합니다. 이를위한 docker-compose 용 yaml 파일을작성하세요. ( 요청사항 ) database: mysql 최신버전 mysql root password: secret mysql 생성하는 database 명 : wordpress_db mysql user: test mysql user password: secret2 wordpress: wordpress 최신버전 depend on: - db port mapping: 호스트의 8000 번을 container 의 80 번에 map 환경변수 wordpress_db_host: db:3306 wordpress_db_user: test wordpress_db_password: secret
version: '3' 답 services: db: image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: hugesecret MYSQL_DATABASE: wordpress MYSQL_USER: test MYSQL_PASSWORD: secret wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: on-failure environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: test WORDPRESS_DB_PASSWORD: secret
yaml 파일
일반 YAML 은 case sensitive, 확장자는.yaml Indentation & Separation Indent 시 tab 은인정되지않음 Indentation of whitespace 을통해 structure 표현 spaces are allowed instead Multiple documents with single streams 은 3 hyphen (---) 이용 List List members are denoted by a leading hyphen (-). List members are enclosed in square brackets and separated by commas. Associative arrays colon ( : ) 으로 key value pair 구분 enclosed in curly braces {}.
YAML 파일의요소 Conventional Block Format List 의시작은 hyphen+space --- # Favorite movies - Casablanca - North by Northwest - The Man Who Wasn't There Inline Format delimited with comma and space and the items are enclosed in JSON. --- # Shopping list [milk, groceries, eggs, juice, fruits] Folded Text Newline 은 space 로변환하고 leading whitespace 는제거 - {name: John Smith, age: 33} - name: Mary Smith age: 27
a: b: - c - d - e f: "ghi" men: [John Smith, Bill Jones] women: - Mary Smith - Susan Williams
Collection 과 Structure Collection 에서 Block sequence 는각항목을 dash and space (-) 로표현. Block collection 은 key value pair 가포함되므로다른 scalar quantity 와구별됨. Mapping 은 JSON 구조에서와같이 key value 를나타냄. key value pair 의구별은 colon 과 space (:).
sequence of scalar scalar-to-scalar 의 mapping - Mark Joseph - James Stephen - Ken Griffey hr: 87 avg: 0.298 rbi: 149 scalar-to-sequence 의 mapping European: - Boston Red Sox - Detroit Tigers - New York Yankees national: - New York Mets - Chicago Cubs - Atlanta Braves
Kubernetes
Kubernetes Architecture Nodes Node Status Addresses Conditions Capacity and Allocatable Info Master-Node communication Concepts Underlying the Cloud Controller Manager
Capacity and Allocatable Info Noe 에서의가용자원을표현 : CPU, memory, max number of pods that can be scheduled onto the node. Capacity block 에서의 field 에는 : total amount of resources that a Node has. Allocatable block indicates the amount of resources that on a Node that are available to be consumed by normal Pods. Node 의일반정보표현 kernel version, Kubernetes version (kubelet and kube-proxy version), Docker version (if used), OS name. The information is gathered by Kubelet from the node.
Node Controller = a Kubernetes master component which manages nodes. node 의생애전체를통해여러역할을담당. (i) assign a CIDR block to the node when registered (if CIDR assignment is turned on). (ii) keep the node controller s internal list of nodes up to date with the cloud provider s list of available machines. 실행시조금이라도 node 에문제가있으면 node controller 가확인. (iii) monitor nodes health. responsible for updating NodeReady condition of NodeStatus to ConditionUnknown when a node becomes unreachable (i.e. the node controller stops receiving heartbeats for some reason, e.g. due to the node being down), and then later evicting all the pods from the node (using graceful termination) if the node continues to be unreachable. checks the state of each node every --node-monitor-period seconds.
Self-Registration of Nodes When kubelet flag --register-node is true (default), kubelet will attempt to register itself with the API server. This is the preferred pattern, used by most distros. For self-registration, kubelet is started with following options: --kubeconfig --cloud-provider --register-node --register-with-taints --node-labels --node-status-update-frequency
Management Pod 및 service 와는달리 node 는원래 Kubernetes 자체에규정된개념은아님 is created externally by cloud providers like Google Compute Engine, or it exists in your pool of physical or virtual machines. 따라서 node 를생성하면이에대한 object 가생성됨. 생성후 Kubernetes checks whether the node is valid or not.
DevOps 문제
실습 ( 계획 ) Pod 생성 $ kubectl create f pod.yml $ kubectl get pods pod.yaml
서비스생성 $ kubectl get service $ minikube service ghost svc.yaml
Repliction $ kubectl get pods $ kubectl get rs $ kubectl scale rs rs.yamluv
출처 : https://www.quora.com/what-is-docker-in-devops
출처 : https://www.quora.com/what-is-docker-in-devops
관점 Developer: Build once run everywhere QA/Testing: Reliable and coordinated environments between test and production Sys-admin Config once, run anything Operational team: Unified solution for building, shipping, and scaling software. Enables to focus on features, bugs and shipping better software rather than setting up and maintaining environment and tools.