# \[NHN Cloud] NHN Cloud 교육 정보 공유

\[NHN Cloud 교육] NHN Cloud 교육 정보 및 교육자료(PDF), 클라우드 가이드라인

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**개인정보/보안/해킹 정보 공유 사이트** : <https://sec.skill.or.kr>   &#x20;
{% endhint %}

## NHN Cloud 교육 센터 (<https://www.toast.com/kr/edu>)&#x20;

NHN Cloud 에서 새롭게 홈페이지를 개편하면서 온/오프라인 교육 정보도 올렸습니다.

관심 있 분들은 신청 하셔서 교육을 받아 보시기 바랍니다.

교육 내용은 NHN Cloud 의 전반적인 사용법과 다양한 클라우드에 대한 교육을 하는거 같습니다.

매달 교육 신청을 받고 있으니 주기적으로 방문 하셔서 교육 받으시기 바랍니다.&#x20;

#### &#x20;바로 가기 (<https://www.toast.com/kr/edu/>)

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F8ITxxooLQuK3ZSHQhlzW%2Fimage.png?alt=media&amp;token=439e4a66-a7f2-4b54-b9bc-4d988fc17af8" alt=""><figcaption><p>NHN Cloud EDU</p></figcaption></figure>

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FXXiU2llPH2Lx6FfAVsPB%2Fimage.png?alt=media&amp;token=edeec57d-771d-4346-985d-93c6cbec4ca9" alt=""><figcaption><p>교육 신청 센터 </p></figcaption></figure>

#### 바로 가기 (<https://www.toast.com/kr/edu/>)

\[2022년 5월 31일] On.4 웨비나\
스마트워크 시대의 필수 협업툴 Dooray!&#x20;
------------------------------

### \* 수강 신청 바로가기 : [\[로그인 후 신청 등록\]](https://cloudon.nhn.com/webinar?idx=5)            &#x20;

## \[2022년 5월] 무료 교육 일정&#x20;

![그림. NHN Cloud 무료 교육 일정 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FiIgY7woGeh5lgffRzvuB%2Fimage.png?alt=media\&token=6d7b8ac4-e184-4da9-b766-6d6c580bb87e)

### 1 클라우드 첫 걸음, NHN Cloud로 시작하기 : [신청하기](https://docs.google.com/forms/d/e/1FAIpQLSfststICOjqC3nD4xw0Zq9zVmIz3TEEFNhJ_UbVev8JT_GDhg/viewform)&#x20;

### 2. NHN Cloud Hands on Lab-기본 인프라 서비스 구성 : [신청하기](https://docs.google.com/forms/d/e/1FAIpQLSeZloXqsi0bFdq1u-oN5er_F_DWkzYmhpDKNOQ4FCgcP_M4EQ/viewform)  &#x20;

### 3. 정보보호의 기본 개념과 클라우드 보안 적용 방안 : [신청하기](https://docs.google.com/forms/d/e/1FAIpQLSfemt-cuyWcGJ3gqW5SpkvWVeAtBqJCuaC4mBmGHmOrSmuw-Q/viewform)  &#x20;

### 4. Cloud Native Basic : [신청하기](https://docs.google.com/forms/d/e/1FAIpQLSeVPqENh3ZvbKAfcI9kUNxrpnW0dRtXEAFiJ0cKRmfO-PUIUw/viewform)      &#x20;

## \[NHN커머스] 커머스형 개발자 양성 과정

![그림. \[NHN커머스\] 커머스형 개발자 양성 과정](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FSlghiaVyJP544nMZdcU9%2Fimage.png?alt=media\&token=2ff408cc-af41-49e9-bd91-b148a865cdc4)

### NHN Commerce 신청 사이트 : [- 바로가기 -](https://edu.nhn-commerce.com/lecture/view.php?date=\&no=6029)

## **\[쇼핑몰제작] NHN커머스 초간단 무료 쇼핑몰 만들기**

![그림. \[쇼핑몰제작\] NHN커머스 초간단 무료 쇼핑몰 만들기](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FOKhgxJ5xrNjN9dvf1v4G%2Fimage.png?alt=media\&token=575db27d-af88-41fa-bdf1-475ded49f8e5)

### NHN Commerce 신청 사이트 : [- 바로가기 -](https://edu.nhn-commerce.com/lecture/view.php?date=\&no=6034)

## \[NHN커머스]\[중소기업유통센터] 자사몰 구축 지원 사업 (정부지원 80%) :: *<mark style="color:red;">**유료교육**</mark>* &#x20;

![그림. \[중소기업유통센터\] 자사몰 구축 지원 사업 (정부지원 80%)](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FmkljWTv68xmDw8uWZe0V%2Fimage.png?alt=media\&token=3b117a5a-d942-47f0-a393-da065444e6aa)

### NHN Commerce 신청 사이트 : [- 바로가기 -](https://edu.nhn-commerce.com/lecture/view.php?date=\&no=5997)

## \[ :tada: 클라우드 가이드라인 모음 자료 :tada: ]

{% hint style="info" %}
\[KISA] 클라우드 취약점 점검 가이드 : [다운로드](https://isms.kisa.or.kr/board/file/bbs_0000000000000004/45/FILE_000000000000707/2020122208032299776967514)&#x20;

\[KISA] 주요정보통신기반시설 기술적 취약점 분석ㆍ평가 방법 상세가이드 : [다운로드](https://www.krcert.or.kr/filedownload.do?attach_file_seq=2736\&attach_file_id=EpF2736.pdf)&#x20;

\[ADT캡스/Infosec] 2021클라우드보안가이드 AWS : [다운로드](https://infosec.adtcaps.co.kr/happyFile/liveFile/downFile/2021%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EB%B3%B4%EC%95%88%EA%B0%80%EC%9D%B4%EB%93%9C_AWS.pdf?fileName=20210518155411xKMV.pdf)  &#x20;

\[ADT캡스/Infosec] 2021 클라우드 보안 가이드 Azure : [다운로드](https://infosec.adtcaps.co.kr/happyFile/liveFile/downFile/2021%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EB%B3%B4%EC%95%88%EA%B0%80%EC%9D%B4%EB%93%9C_Azure.pdf?fileName=20210518155554jbpg.pdf)    &#x20;

\[ADT캡스/Infosec] 2021 클라우드 보안 가이드 GCP : [다운로드](https://infosec.adtcaps.co.kr/happyFile/liveFile/downFile/2021%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EB%B3%B4%EC%95%88%EA%B0%80%EC%9D%B4%EB%93%9C_GCP.pdf?fileName=20210518155640gTwh.pdf)&#x20;

\[ADT캡스/Infosec] 클라우드보안가이드(컨테이너 보안)-Docker, Kubernetes : [다운로드](http://www.skinfosec.com/liveFile/eqstinsight-file/happyFileDown.do?fileName=20190621080345E90N.pdf\&orgFileName=2019_%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EB%B3%B4%EC%95%88%EA%B0%80%EC%9D%B4%EB%93%9C%EB%9D%BC%EC%9D%B8_Docker%26amp;Kubernetes_fv.pdf\&boardSeq=927)  &#x20;

\[nCloud] Naver Cloud Platform 보안가이드 : [다운로드](https://www.ncloud.com/api/support/download/5/97)  &#x20;

\[KT Cloud] KT Cloud 보안백서 : [다운로드](https://cloud.kt.com/download/KT_Cloud_securitybook_v1.0.pdf)&#x20;

\[KT Cloud] KT Cloud 보안가이드 : [다운로드](https://cloud.kt.com/download/KT_Cloud_securityguide_v1.0.pdf)&#x20;

\[과학기술정보통신부] 민간분야 주요정보통신기반시설 클라우드 이용 가이드라인 : [다운로드](https://www.krcert.or.kr/filedownload.do?attach_file_seq=2737\&attach_file_id=EpF2737.pdf)       &#x20;
{% endhint %}

## \[2022년] NHN Cloud의 정기 웨비나

### \[2022년 4월] NHN Cloud On｜On.3 Cloud, AI and Fashion

> 인공지능(AI)가 파고든 패션 산업과 성공 사례를 통한 비즈니스 활용 전략을 소개합니다.

{% embed url="<https://youtu.be/-n_msgMPQ9A>" %}
그림. NHN Cloud On｜On.3 Cloud, AI and Fashion &#x20;
{% endembed %}

### \[2022년 3월] NHN Cloud On｜On.2 Cloud by default, Cloud NATIVE by default &#x20;

> 클라우드가 기본인 시대, 꼭 필요한 핵심 기술인 네이티브가 지닌 가치를 최대한 활용하는 방법에 대해 소개합니다.

{% embed url="<https://youtu.be/gAP-GHu89ak>" %}
그림. NHN Cloud On｜On.2 Cloud by default, Cloud NATIVE by default   &#x20;
{% endembed %}

### \[2022년 2월] NHN Cloud On｜On.1 2022 클라우드 트렌드

> 팬데믹 이후 기업의 디지털트렌스포메이션 속도가 가속화됨에 따라, 클라우드 시장 환경이 크게 변화되었습니다. 2022. 2. 22.(화)에 진행된 웨비나를 통해 2022년 주요 IT 기술 트렌드의 변화 흐름을 살펴보고, 이에 접목될 클라우드 서비스 및 기술의 발전 방향을 확인해 보시기 바랍니다.

{% embed url="<https://youtu.be/jvHXkivWyfQ>" %}
그림. NHN Cloud On｜On.1 2022 클라우드 트렌드 &#x20;
{% endembed %}

## \[2022년 3월] Cloud Native 교육자료        &#x20;

### 1. NHN Cloud 3월 1회차 교육 자료&#x20;

{% file src="/files/7rlqybq4qoPb584mYwVs" %}
파일. NHN Cloud 3월 1회차 교육 자료(서비스 및 소개)              &#x20;
{% endfile %}

### 2. NHN Cloud 3월 2회차 교육 자료&#x20;

{% file src="/files/ToxPIF7HhMvkjRZc86LR" %}
파일. NHN Cloud 3월 2회차 교육 자료 (기본인프라 서비스)       &#x20;
{% endfile %}

### 3.NHN Cloud 3월 3회차 교육 자료&#x20;

{% file src="/files/QKWVRwxcXJJJ7y6torx7" %}
파일. NHN Cloud 3월 3회차 교육 자료 (Cloud Native)
{% endfile %}

## 문의 사항 : **<dl_cloudedu@nhn.com>**

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**개인정보/보안/해킹 정보 공유 사이트** : <https://sec.skill.or.kr>   &#x20;
{% endhint %}

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Fo0nuhIiHIGidl0fGHSPA%2F%ED%9B%84%EC%9B%90%EA%B3%84%EC%A2%8C.png?alt=media&amp;token=8138e51a-f19e-4564-aa6d-723344ae8c32" alt=""><figcaption><p>후원 정보 </p></figcaption></figure>


# \[NHN Recruitings] NHN 채용/취업/공고 사이트

NHN 채용사이트

## \[NHN Recruitings] NHN 채용/취업/공고 사이트

> * 아래의 사이트를 참고 하시기 바랍니다.&#x20;

## 1. NHN Recurit : 법인별 공고 [- 바로가기 -](https://recruit.nhn.com/ent/recruitings?type=company)

## 2. NHN Recurity : 직군별 공고 [- 바로가기 -](https://recruit.nhn.com/ent/recruitings?type=class)&#x20;

## 3. NHN Cloud SEASON RECRUIT : [- 바로가기 -](https://www.nhncloud-seasonrecruit.com/)&#x20;

## 4. NHN Enterprise 채용공고 : [- 바로가기 -](https://www.nhncloud-seasonrecruit.com/enterprise)&#x20;

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FPCOWVntSefvIx8UnrMoH%2F%ED%9B%84%EC%9B%90%EA%B3%84%EC%A2%8C.png?alt=media&amp;token=8ebc11a0-372a-4c3c-b846-d659b50f06cf" alt=""><figcaption><p>후원 정보 </p></figcaption></figure>

{% embed url="<https://doc.skill.or.kr>" %}
NHN Cloud 정보 사이트&#x20;
{% endembed %}

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}


# \[Naver Cloud Recruitings] nCloud 채용/취업/공고 사이트

NHN 채용사이트

## \[Naver Cloud Recruitings] nCloud 채용/취업/공고 사이트

> * 아래의 사이트를 참고 하시기 바랍니다.&#x20;

## 1. 네이버클라우드 채용 홈페이지  [- 바로가기 -](https://recruit.navercloudcorp.com/rcrt/list.do)

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F8K8vw7YEnaxxzIECIr5I%2F%ED%9B%84%EC%9B%90%EA%B3%84%EC%A2%8C.png?alt=media&amp;token=920799ce-28fb-4270-ad1a-81b0544a93a1" alt=""><figcaption><p>후원 정보 </p></figcaption></figure>

{% embed url="<https://doc.skill.or.kr>" %}
NHN Cloud 정보 사이트&#x20;
{% endembed %}

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}


# \[NHN Cloud] 행사/프로모션 정보 공유

\[2022년 NHN Cloud Event & Promotion] NHN Cloud 행사/프로모션 정보 공유

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**개인정보/보안/해킹 정보 공유 사이트** : <https://sec.skill.or.kr>   &#x20;
{% endhint %}

## \[프로모션 1] NHN Cloud CSAP SaaS Guidance (CSAP 보안 인증 심사 지원 프로그램)&#x20;

### 프로모션  기간 : \[2022년 2월 25일 \~ 12월 31일]

### 서비스 대상 :&#x20;

> NHN Cloud 의 CSAP SaaS Guidance 서비스를 통해 공공기관에 제공하는 SaaS 의 보안 인증을 받고자 하는 고객

### 프로모션 :&#x20;

> * 보안 인증 준비 시 사용할 수 있는 500만원 상당의 NHN Cloud 크레딧 지원(유효기간 6개월)
> * CSAP SaaS Guidance 서비스 상담 진행 시 선착순 스타벅스 커피 쿠폰 제공

![그림. 프로모션 1 (CSAP SaaS Guidance)         ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FWYIZdZcinlNQKQ0jeROZ%2Fimage.png?alt=media\&token=54635672-16cb-490e-ae0e-2919fb34e88c)

### CSAP 상세 정보 확인 : [- \[NHN Cloud\] 홈페이지 바로가기 -](https://gov.toast.com/kr/service/security/csap-saas-guidance)  &#x20;

### 신청서 작성 : [- \[NHN Cloud\] CSAP 보안 인증 상담 신청 바로가기 ](https://docs.google.com/forms/d/e/1FAIpQLScvYPLTo3kwssxk5p95zLDqoTzejyYYJxHJSYU6-55uCHyTqA/viewform?fbzx=-3504463393275921713)-      &#x20;

## 문의 사항 : **<dl_cloudedu@nhn.com>**

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FVQ5eCTMUYzqlDHdRzWNk%2F%ED%9B%84%EC%9B%90%EA%B3%84%EC%A2%8C.png?alt=media&amp;token=c391e87d-87f4-43b6-8cc8-cb138cbf7b5b" alt=""><figcaption><p>후원 정보 </p></figcaption></figure>

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**개인정보/보안/해킹 정보 공유 사이트** : <https://sec.skill.or.kr>   &#x20;
{% endhint %}


# \[NHN Cloud] NHN Kubernetes Service(NKS) 활용법

\[DataUs] \[NHN Cloud] NHN Kubernetes Service(NKS) 따라하기

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. 먼저 알아 두기    &#x20;

### 1.1 Kubernetes 란 무엇인가?    &#x20;

> [쿠버네티스(Kubernetes, 쿠베르네테스, "K8s")](https://ko.wikipedia.org/wiki/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4)는 컨테이너화된 애플리케이션의 자동 디플로이, 스케일링 등을 제공하는 관리시스템으로, 오픈 소스 기반입니다. 원래 구글에 의해 설계되었고 현재 리눅스 재단에 의해 관리되고 있습니다. 목적은 여러 클러스터의 호스트 간에 애플리케이션 컨테이너의 배치, 스케일링, 운영을 자동화하기 위한 플랫폼을 제공하기 위함입니. 도커를 포함하여 일련의 컨테이너 도구들과 함께 동작합니다.

### 1.2 Kubernetes 발전사     &#x20;

> **전통적인 배포 시대:** 초기 조직은 애플리케이션을 물리 서버에서 실행했었다. 한 물리 서버에서 여러 애플리케이션의 리소스 한계를 정의할 방법이 없었기에, 리소스 할당의 문제가 발생했다. 예를 들어 물리 서버 하나에서 여러 애플리케이션을 실행하면, 리소스 전부를 차지하는 애플리케이션 인스턴스가 있을 수 있고, 결과적으로는 다른 애플리케이션의 성능이 저하될 수 있었다. 이에 대한 해결책은 서로 다른 여러 물리 서버에서 각 애플리케이션을 실행하는 것이 있다. 그러나 이는 리소스가 충분히 활용되지 않는다는 점에서 확장 가능하지 않았으므로, 물리 서버를 많이 유지하기 위해서 조직에게 많은 비용이 들었다.
>
> **가상화된 배포 시대:** 그 해결책으로 가상화가 도입되었다. 이는 단일 물리 서버의 CPU에서 여러 가상 시스템 (VM)을 실행할 수 있게 한다. 가상화를 사용하면 VM간에 애플리케이션을 격리하고 애플리케이션의 정보를 다른 애플리케이션에서 자유롭게 액세스 할 수 없으므로, 일정 수준의 보안성을 제공할 수 있다.
>
> 가상화를 사용하면 물리 서버에서 리소스를 보다 효율적으로 활용할 수 있으며, 쉽게 애플리케이션을 추가하거나 업데이트할 수 있고 하드웨어 비용을 절감할 수 있어 더 나은 확장성을 제공한다. 가상화를 통해 일련의 물리 리소스를 폐기 가능한(disposable) 가상 머신으로 구성된 클러스터로 만들 수 있다.
>
> 각 VM은 가상화된 하드웨어 상에서 자체 운영체제를 포함한 모든 구성 요소를 실행하는 하나의 완전한 머신이다.
>
> **컨테이너 개발 시대:** 컨테이너는 VM과 유사하지만 격리 속성을 완화하여 애플리케이션 간에 운영체제(OS)를 공유한다. 그러므로 컨테이너는 가볍다고 여겨진다. VM과 마찬가지로 컨테이너에는 자체 파일 시스템, CPU 점유율, 메모리, 프로세스 공간 등이 있다. 기본 인프라와의 종속성을 끊었기 때문에, 클라우드나 OS 배포본에 모두 이식할 수 있다.
>
> 컨테이너는 다음과 같은 추가적인 혜택을 제공하기 때문에 인기가 있다.
>
> * 기민한 애플리케이션 생성과 배포: VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 보다 쉽고 효율적임.
> * 지속적인 개발, 통합 및 배포: 안정적이고 주기적으로 컨테이너 이미지를 빌드해서 배포할 수 있고 (이미지의 불변성 덕에) 빠르고 효율적으로 롤백할 수 있다.
> * 개발과 운영의 관심사 분리: 배포 시점이 아닌 빌드/릴리스 시점에 애플리케이션 컨테이너 이미지를 만들기 때문에, 애플리케이션이 인프라스트럭처에서 분리된다.
> * 가시성은 OS 수준의 정보와 메트릭에 머무르지 않고, 애플리케이션의 헬스와 그 밖의 시그널을 볼 수 있다.
> * 개발, 테스팅 및 운영 환경에 걸친 일관성: 랩탑에서도 클라우드에서와 동일하게 구동된다.
> * 클라우드 및 OS 배포판 간 이식성: Ubuntu, RHEL, CoreOS, 온-프레미스, 주요 퍼블릭 클라우드와 어디에서든 구동된다.
> * 애플리케이션 중심 관리: 가상 하드웨어 상에서 OS를 실행하는 수준에서 논리적인 리소스를 사용하는 OS 상에서 애플리케이션을 실행하는 수준으로 추상화 수준이 높아진다.
> * 느슨하게 커플되고, 분산되고, 유연하며, 자유로운 마이크로서비스: 애플리케이션은 단일 목적의 머신에서 모놀리식 스택으로 구동되지 않고 보다 작고 독립적인 단위로 쪼개져서 동적으로 배포되고 관리될 수 있다.
> * 리소스 격리: 애플리케이션 성능을 예측할 수 있다.
> * 자원 사용량: 리소스 사용량: 고효율 고집적.

![그림. Traditionl/Virtualized/Container Deployment 발전사(출처:kubernetes.io) ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZKij3bhEA8bBPI_cSR%2F-MZL94H9SBnbZa3P1utH%2Fimage.png?alt=media\&token=d56054f0-a228-47de-8808-548ccbf7a21d)

### 1.3 쿠버네티스가 왜 필요하고 무엇을 할 수 있나 <a href="#why-you-need-kubernetes-and-what-can-it-do" id="why-you-need-kubernetes-and-what-can-it-do"></a>

> 컨테이너는 애플리케이션을 포장하고 실행하는 좋은 방법이다. 프로덕션 환경에서는 애플리케이션을 실행하는 컨테이너를 관리하고 가동 중지 시간이 없는지 확인해야 한다. 예를 들어 컨테이너가 다운되면 다른 컨테이너를 다시 시작해야 한다. 이 문제를 시스템에 의해 처리한다면 더 쉽지 않을까?
>
> 그것이 쿠버네티스가 필요한 이유이다! 쿠버네티스는 분산 시스템을 탄력적으로 실행하기 위한 프레임 워크를 제공한다. 애플리케이션의 확장과 장애 조치를 처리하고, 배포 패턴 등을 제공한다. 예를 들어, 쿠버네티스는 시스템의 카나리아 배포를 쉽게 관리 할 수 있다.
>
> 쿠버네티스는 다음을 제공한다.
>
> * **서비스 디스커버리와 로드 밸런싱** 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다.
> * **스토리지 오케스트레이션** 쿠버네티스를 사용하면 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재 할 수 있다.
> * **자동화된 롤아웃과 롤백** 쿠버네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술할 수 있으며 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다. 예를 들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용할 수 있다.
> * **자동화된 빈 패킹(bin packing)** 컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다. 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시한다. 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 해준다.
> * **자동화된 복구(self-healing)** 쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, '사용자 정의 상태 검사'에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때까지 그러한 과정을 클라이언트에 보여주지 않는다.
> * **시크릿과 구성 관리** 쿠버네티스를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리 할 수 있다. 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트 할 수 있다.

### 1.4 NHN Kubernetes Service(NKS) 주요 기능        &#x20;

> * NHN Cloud에 최적화된 Kubernetes 클러스터를 생성하고 관리할 수 있습니다.
>   * Compute, Network, Storage 등 NHN Cloud의 기반 서비스와 연동합니다.
>   * Load Balancer와 연동해 서비스를 공개할 수 있습니다.
>   * Block Storage와 연동해 애플리케이션에 영구 보존 가능한 저장 장치를 지원할 수 있습니다.
> * Kubernetes 클러스터를 안정적으로 관리합니다.
>   * 클러스터의 컨트롤 플레인(마스터)은 NHN Cloud에서 관리합니다.
>   * 컨트롤 플레인은 고가용성을 보장하도록 구성됩니다.
> * Kubernetes 클러스터를 콘솔로 제어할 수 있습니다.
>   * Kubernetes 클러스터를 생성, 삭제, 조회하는 기능을 제공합니다.
>   * 노드 그룹을 생성, 삭제, 조회하는 기능을 제공합니다.
>   * kubectl을 쉽게 설정할 수 있는 설정 파일을 제공합니다.

### 1.5 NHN Kubernetes Service(NKS) 기능 제공     &#x20;

> Kubernetes는 컨테이너화된 워크로드와 서비스를 관리할 수 있는 오픈소스 플랫폼입니다. Kubernetes는 다음과 같은 기능을 제공합니다.
>
> * 서비스 디스커버리와 로드 밸런싱
> * 스토리지 오케스트레이션
> * 자동화된 롤아웃과 롤백
> * 자동화된 빈 패킹(bin packing)
> * 자동화된 복구(self-healing)
> * 시크릿과 구성 관리

### 1.6 NHN Kubernetes Service(NKS) 클러스터     &#x20;

> Kubernetes 클러스터는 서로 연결되어 하나의 유닛처럼 동작하는 컴퓨터 클러스터입니다. Kubernetes가 제공하는 기능은 클러스터 단위로 동작하며, 클러스터 단위로 설정할 수 있습니다.

#### 1.6.1 구성    &#x20;

> Kubernetes 클러스터는 마스터와 노드로 구성됩니다.

#### 1.6.2 마스터     &#x20;

> 마스터는 클러스터 관리를 담당합니다. 애플리케이션을 스케줄링하거나 스케일링, 업데이트하는 등 클러스터 내의 모든 활동을 관리합니다. 일반적으로 마스터의 구성 요소들은 별도의 머신(가상 머신 혹은 물리 머신)에서 구동됩니다. 고가용성 보장을 위해 한 클러스터에 다수의 마스터를 구성할 수도 있습니다.

#### 1.6.3 노드   &#x20;

> 노드는 사용자의 애플리케이션이 구동되는 워커 머신입니다. 하나의 클러스터에는 다수의 노드가 존재할 수 있습니다. 노드는 마스터와 연결해야 동작됩니다. 마스터의 애플리케이션 구동, 정지 등의 명령에 따라 그대로 수행합니다.

### 1.7 NHN Kubernetes Service(NKS) 는...     &#x20;

> NHN Kubernetes Service(NKS) 서비스는 클라우드에서 Kubernetes를 올바르고 안전하게 구동할 수 있게 Kubernetes 클러스터를 생성하고 관리할 수 있는 서비스입니다. 사용자는 웹 콘솔을 이용해 NHN Cloud에 꼭 맞는 Kubernetes 클러스터를 만들고 관리할 수 있습니다. 안전하고 효율적으로 운영할 수 있게 마스터는 NHN Cloud에서 관리하고, 사용자는 노드와 서비스, Pod(파드) 등을 관리합니다.
>
> NHN Kubernetes Service(NKS) 서비스의 주요 기능은 다음과 같습니다.
>
> * NHN Cloud에 꼭맞는 Kubernetes 클러스터 생성과 관리
>   * NHN Cloud의 기반 서비스와 연동
>   * 로드 밸런서를 이용한 서비스 공개
>   * 블록 스토리지와 연동한 퍼시스턴트 볼륨(Persistent Volume, PV) 지원
> * 고가용성을 보장하는 마스터 관리
> * 웹 콘솔을 이용한 쉬운 조작
>   * 클러스터 생성, 삭제, 조회
>   * 노드 그룹 생성, 삭제, 조회
>   * kubectl 설정 지원

## 2. NHN Kubernetes Service(NKS) 용어 설명    &#x20;

### 2.1 클러스터   &#x20;

#### 2.1.1 클러스터 생성   &#x20;

> NHN Kubernetes Service(NKS) 서비스를 사용하려면 먼저 클러스터를 생성해야 하며 필요한 정보를 입력하고 **클러스터 생성** 버튼을 클릭하면 클러스터 생성이 시작됩니다. 클러스터 목록에서 상태를 확인할 수 있습니다. 생성하는 데는 약 10분 정도 걸립니다. 클러스터 설정에 따라 더 오래 걸릴 수도 있습니다.

| 항목         | 설명                                                                                                            |
| ---------- | ------------------------------------------------------------------------------------------------------------- |
| 클러스터 이름    | <p>Kubernetes 클러스터의 이름, 20자 이내로 영문 소문자와 숫자, '-'만 입력 가능하며 </p><p>영문 소문자로 시작해야 하고 영문 소문자 또는 숫자로 끝나야 합니다.   </p> |
| 쿠버네티스 버전   | 사용할 Kubernetes 버전                                                                                             |
| VPC        | 클러스터에 연결할 VPC 네트워크                                                                                            |
| 서브넷        | VPC에 정의된 서브넷 중 클러스터를 구성하는 인스턴스에 연결할 서브넷                                                                       |
| 이미지        | 클러스터를 구성하는 인스턴스에 사용할 이미지                                                                                      |
| 가용성 영역     | 기본 노드 그룹 인스턴스를 생성할 영역                                                                                         |
| 인스턴스 타입    | 기본 노드 그룹 인스턴스 사양                                                                                              |
| 노드 수       | 기본 노드 그룹 인스턴스 수                                                                                               |
| 키 페어       | 기본 노드 그룹 접근에 사용할 키 페어                                                                                         |
| 블록 스토리지 타입 | 기본 노드 그룹 인스턴스의 블록 스토리지 종류                                                                                     |
| 블록 스토리지 크기 | 본 노드 그룹 인스턴스의 블록 스토리지 크기                                                                                      |

#### 2.1.2 클러스터 조회    &#x20;

> &#x20;생성한 클러스터는 서비스 페이지에서 확인할 수 있습니다. 클러스터를 선택하면 하단에 클러스터 정보가 나타납니다.

| 항목            | 설명                                  |
| ------------- | ----------------------------------- |
| 클러스터 이름       | Kubernetes 클러스터의 이름과 ID             |
| 노드 수          | 클러스터를 구성하는 모든 노드 인스턴스 수             |
| Kubernetes 버전 | 사용 중인 Kubernetes 버전                 |
| VPC           | 클러스터에 연결된 VPC 네트워크                  |
| 서브넷           | 클러스터를 구성하는 노드 인스턴스에 연결된 서브넷         |
| API 엔드포인트     | 클러스터에 접근해 조작하기 위한 API 엔드포인트 URI     |
| 설정 파일         | 클러스터에 접근해 조작하기 위해 필요한 설정 파일 다운로드 버튼 |

#### 2.1.3 클러스터 삭제    &#x20;

> &#x20;삭제할 클러스터를 선택하고 **클러스터 삭제** 버튼을 클릭하면 삭제가 진행됩니다. 삭제하는 데는 약 5분 정도 걸립니다. 클러스터의 상태에 따라 더 오래 걸릴 수도 있습니다.

### 2.2 노드 그룹      &#x20;

#### 2.2.1 노드 그룹 조회  &#x20;

> 클러스터 목록에서 클러스터 이름을 클릭하면 노드 그룹 목록을 확인할 수 있습니다. 노드 그룹을 선택하면 하단에 노드 그룹 정보가 나타납니다.

| 항목         | 설명                     |
| ---------- | ---------------------- |
| 노드 그룹 이름   | 노드 그룹 이름과 ID           |
| 클러스터 이름    | 노드 그룹이 속한 클러스터의 이름과 ID |
| 쿠버네티스 버전   | 사용 중인 Kubernetes 버전    |
| 가용성 영역     | 노드 그룹 인스턴스가 생성된 영역     |
| 인스턴스 타입    | 노드 그룹 인스턴스 사양          |
| 이미지 타입     | 노드 그룹 인스턴스에 사용한 이미지 종류 |
| 블록 스토리지 크기 | 노드 그룹 인스턴스의 블록 스토리지 크기 |
| 생성일        | 노드 그룹이 생성된 시각          |
| 수정일        | 노드 그룹이 마지막으로 수정된 시각    |

#### 2.2.2 노드 그룹 생성   &#x20;

> &#x20;클러스터를 생성하면 기본 노드 그룹이 생성되지만, 필요에 따라 추가 노드 그룹을 만들 수 있습니다. 기본 노드 그룹의 인스턴스보다 높은 사양의 컨테이너 구동 환경이 필요하거나, 스케일 아웃(scale out, 확장)을 위해 더 많은 워커 노드 인스턴스가 필요한 경우 추가 노드 그룹을 생성해 사용할 수 있습니다. 노드 그룹 목록 페이지에서 **노드 그룹 생성** 버튼을 클릭하면 노드 그룹 생성 페이지가 나타납니다. 노드 그룹 생성에 필요한 항목은 다음과 같습니다.

| 항목         | 설명                                                                                   |
| ---------- | ------------------------------------------------------------------------------------ |
| 가용성 영역     | 클러스터를 구성하는 인스턴스를 생성할 영역                                                              |
| 노드 그룹 이름   | 추가 노드 그룹 이름, 20자 이내로 영문 소문자와 숫자, '-'만 입력 가능하며 영문 소문자로 시작해야 하고 영문 소문자 또는 숫자로 끝나야 합니다. |
| 인스턴스 타입    | 추가 노드 그룹 인스턴스 사양                                                                     |
| 노드 수       | 추가 노드 그룹 인스턴스 수                                                                      |
| 키 페어       | 추가 노드 그룹 접근에 사용할 키 페어                                                                |
| 블록 스토리지 타입 | 추가 노드 그룹 인스턴스의 블록 스토리지 종류                                                            |
| 블록 스토리지 크기 | 추가 노드 그룹 인스턴스의 블록 스토리지 크기                                                            |

#### 2.2.3 노드 그룹 삭제    &#x20;

> &#x20;노드 그룹 목록에서 삭제하려는 노드 그룹을 선택하고 **노드 그룹 삭제** 버튼을 클릭하면 삭제가 진행됩니다. 노드 그룹 삭제하는 데는 약 5분 정도 걸립니다. 노드 그룹의 상태에 따라 더 오래 걸릴 수도 있습니다.

2.2.4 노드 그룹에 노드 추가

> 동작 중인 노드 그룹에 노드를 추가할 수 있습니다. 노드 그룹 정보 조회 페이지의 노드 목록 탭을 클릭하면 현재 노드 목록이 나타납니다. 노드 추가 버튼을 클릭하고 노드 수를 입력하면 노드가 추가됩니다.
>
> `[주의] 오토 스케일러가 활성화된 노드 그룹은 수동으로 노드를 추가할 수 없습니다.`&#x20;

2.2.5 노드 그룹에서 노드 삭제

> 동작 중인 노드 그룹에서 노드를 삭제할 수 있습니다. 노드 그룹 정보 조회 페이지의 노드 목록 탭을 클릭하면 현재 노드 목록이 나타납니다. 노드 목록 중 삭제할 노드를 선택하고 노드 삭제 버튼을 클릭하면 확인 대화 상자가 나타납니다. 삭제할 노드 이름을 다시 한번 확인하고 확인 버튼을 클릭하면 노드가 삭제됩니다.
>
> `[주의] 삭제되는 노드에서 동작하고 있던 파드는 강제 종료 됩니다. 삭제될 노드에서 동작 중인 파드를 안전하게 다른 노드로 옮기기 위해서는 drain 명령을 내려야 합니다. 노드가 drain 된 후에도 새로운 파드는 이 노드에 스케쥴링 될 수 있습니다. 새로운 파드가 삭제될 노드에 스케쥴링되는 것을 방지하기 위해서는 cordon 명령을 내려야 합니다.`
>
> `[주의] 오토 스케일러가 활성화된 노드 그룹은 수동으로 노드를 삭제할 수 없습니다.`

### 2.3 오토 스케일러    &#x20;

#### 2.3.1 오토 스케일러 설정       &#x20;

> &#x20;오토 스케일러는 노드 그룹의 가용 리소스가 부족해 파드(pod)를 스케쥴링할 수 없거나 노드의 사용률이 일정 수준 이하로 유지되는 경우 노드의 수를 자동으로 조정하는 기능입니다. 이 기능은 노드 그룹별로 설정할 수 있고, 서로 독립적으로 동작합니다. 이 기능은 Kubernetes 프로젝트의 공식 지원 기능인 cluster-autoscaler 기능을 기반으로 합니다. 자세한 사항은 [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)를 참고하세요.
>
> `[참고] 쿠버네티스 서비스에 적용된 cluster-autoscaler의 버전은 1.19.0입니다.`

| 용어 | 의미                   |
| -- | -------------------- |
| 증설 | 노드의 수를 증가시키는 것을 말합니다 |
| 감축 | 노드의 수를 감소시키는 것을 말합니다 |

#### 2.3.2 오토 스케일링 설정 항목   &#x20;

> 오토 스케일러 기능은 노드 그룹별로 설정하고 동작합니다. 오토 스케일러 기능은 아래 경로로 설정할 수 있습니다.
>
> * 클러스터 생성 시 기본 노드 그룹에 설정
> * 노드 그룹 추가 시 추가 노드 그룹에 설정
> * 생성되어 있는 노드 그룹에 설정

| 설정 항목                     | 의미                                                 | 유효 범위  | 기본값 | 단위 |
| ------------------------- | -------------------------------------------------- | ------ | --- | -- |
| 최소 노드 수                   | 감축 가능한 최소 노드 수                                     | 1-10   | 1   | 대  |
| 최대 노드 수                   | 증설 가능한 최대 노드 수                                     | 1-10   | 10  | 대  |
| 감축                        | 노드 감축 활성 여부 설정                                     | 활성/비활성 | 활성  | -  |
| <p>리소스 사용량 </p><p>임계치</p> | 감축의 기준인 리소스 사용량 임계 영역의 기준값                         | 1-100  | 50  | %  |
| <p>임계 영역 </p><p>유지 시간</p> | <p>감축 대상이 될 노드의 임계치 이하의 리소스 </p><p>사용량 유지 시간</p>   | 1-1440 | 10  | 분  |
| <p>증설 후 </p><p>지연 시간</p>  | <p>노드 증설 후 감축 대상 노드로 모니터링하기 </p><p>시작까지의 지연 시간</p> | 1-1440 | 10  | 분  |

> `[주의] 오토 스케일러가 활성화된 노드 그룹은 수동으로 노드를 추가하거나 삭제할 수 없습니다.`

#### 2.3.2 증설 및 감축 조건    &#x20;

> 아래의 조건을 모두 만족하면 노드를 증설합니다.
>
> * 파드가 스케쥴링될 수 있는 노드가 없음
> * 현재 노드 수가 최대 노드 수보다 작음
>
> 아래의 조건을 모두 만족하면 노드를 감축합니다.
>
> * 노드의 리소스 사용량이 임계치 이하로 임계 영역 유지 시간 동안 유지
> * 현재 노드 수가 최소 노드 수보다 큼
>
> 특정 노드에 아래 조건을 만족하는 파드가 하나라도 존재한다면 해당 노드는 노드 감축 후보에서 제외됩니다.
>
> * "PodDisruptionBudget"으로 제약 받는 파드
> * "kube-system" 네임스페이스의 파드
> * "deployment", "replicaset" 등의 제어 오브젝트에 의해 시작되지 않은 파드
> * 로컬 스토리지를 사용하는 파드
> * "node selector" 등의 제약으로 인해 다른 노드로 이동이 불가능한 파드
>
> 좀 더 자세한 증설 및 감축 조건은 [Cluster Autoscaler FAQ](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md)를 참고하세요.

## 3. NHN Kubernetes Service(NKS) 관리    &#x20;

### 3.1 kubectl 설치 및 관리           &#x20;

> &#x20;원격의 호스트에서 클러스터를 조작하고 관리하려면 Kubernetes가 제공하는 명령줄 도구(CLI)인 `kubectl`이 필요합니다.

#### 3.1.1 kubectl 설치      &#x20;

> kubectl은 특별한 설치 과정 없이 실행 파일을 다운로드해 바로 사용할 수 있습니다. 운영체제별 다운로드 경로는 다음과 같습니다.

| 운영체제    | 다운로드 커맨드                                                                                                   |
| ------- | ---------------------------------------------------------------------------------------------------------- |
| Linux   | curl -LO <https://storage.googleapis.com/kubernetes-release/release/v1.15.7/bin/linux/amd64/kubectl>       |
| MacOS   | curl -LO <https://storage.googleapis.com/kubernetes-release/release/v1.15.7/bin/darwin/amd64/kubectl>      |
| Windows | curl -LO <https://storage.googleapis.com/kubernetes-release/release/v1.15.7/bin/windows/amd64/kubectl.exe> |

> `그 외 설치 방법과 옵션 등 자세한 사항은` [`Install and Set Up kubectl`](https://kubernetes.io/docs/tasks/tools/install-kubectl/) `문서를 참고하세요.`

#### 3.1.2 Kubectl 권한 변경    &#x20;

> 다운로드한 파일은 기본적으로 실행 권한이 없습니다. 실행 권한을 추가해야 합니다.

```bash
$ chmod +x kubectl
```

#### 3.1.3 Kubectl 위치 변경 또는 경로 지정       &#x20;

> 어느 경로에서든 kubectl을 실행할 수 있도록 환경 변수에 지정된 경로로 옮기거나, kubectl이 있는 경로를 환경 변수에 추가합니다.

{% code title="환경 변수에 지정된 경로로 위치 변경" %}

```bash
$ sudo mv kubectl /usr/local/bin/
```

{% endcode %}

{% code title="환경 변수에 경로 추가" %}

```bash
// kubectl이 있는 경로에서 실행
$ export PATH=$PATH:$(pwd)
```

{% endcode %}

#### 3.1.4 Kubectl 설정  &#x20;

> &#x20;kubectl로 Kubernetes 클러스터에 접근하려면 클러스터 설정 파일(kubeconfig)이 필요합니다. NHN Cloud 웹 콘솔에서 **Container > Kubernetes** 서비스 페이지를 열고 접근할 클러스터를 선택합니다. 하단 **기본 정보** 탭에서 **설정 파일** 항목의 **다운로드** 버튼을 클릭해 설정 파일을 다운로드합니다. 다운로드한 설정 파일은 원하는 위치로 옮겨 kubectl 실행 시 참조할 수 있도록 준비합니다.
>
> `[주의] NHN Cloud 웹 콘솔에서 다운로드한 설정 파일은 클러스터 정보와 인증을 위한 토큰 등이 포함되어 있습니다. 설정 파일이 있으면 해당 Kubernetes 클러스터에 접근할 수 있는 권한을 갖게 됩니다. 설정 파일을 절대로 분실하지 않도록 주의하시기 바랍니다.`

> &#x20;kubectl은 실행할 때마다 클러스터 설정 파일이 필요합니다. 따라서 매번 `--kubeconfig` 옵션을 이용해 클러스터 설정 파일을 지정해야 합니다. 그러나 환경 변수에 클러스터 설정 파일 경로가 저장되어 있다면 매번 옵션을 지정하지 않아도 됩니다.

```bash
$ export KUBECONFIG={클러스터 설정 파일 경로}
```

> &#x20;클러스터 설정 파일 경로를 환경 변수에 저장하고 싶지 않다면 kubectl의 기본 설정 파일인 `$HOME/.kube/config`로 복사해 사용할 수도 있습니다. 그러나 클러스터를 여러 개 운영한다면 환경 변숫값을 변경하는 방법이 편리합니다.

#### 3.1.5 Kubectl 연결 확인     &#x20;

> &#x20;`kubectl version` 명령어로 정상 설정되었는지 확인합니다. 문제가 없다면 `Server Version`이 출력됩니다.
>
> * Client Version: 실행한 kubectl 파일의 버전 정보  &#x20;
> * Server Version: 클러스터를 구성하고 있는 Kubernetes 버전 정보  &#x20;

{% code title="Kubectl 연결 확인" %}

```bash
$ kubectl version  
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.7", GitCommit:"6c143d35bb11d74970e7bc0b6c45b6bfdffc0bd4", GitTreeState:"clean", BuildDate:"2019-12-11T12:42:56Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.7", GitCommit:"6c143d35bb11d74970e7bc0b6c45b6bfdffc0bd4", GitTreeState:"clean", BuildDate:"2019-12-11T12:34:17Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}
```

{% endcode %}

### 3.2 LoadBalancer 서비스     &#x20;

> &#x20;Kubernetes 애플리케이션의 기본 실행 단위인 파드(pod)는 CNI(Container Network Interface)로 클러스터 네트워크에 연결됩니다. 기본적으로 클러스터 외부에서 파드로는 접근할 수 없습니다. 파드의 서비스를 클러스터 외부에 공개하려면 Kubernetes의 `LoadBalancer` 서비스(Service) 객체(object)를 이용해 외부에 공개할 경로를 만들어야 합니다. LoadBalancer 서비스 객체를 만들면 클러스터 외부에 NHN Cloud Load Balancer가 생성되어 서비스 객체와 연결됩니다.

#### 3.2.1 LoadBalancer 서비스 생성      &#x20;

> Kubernetes의 서비스 객체를 정의하려면 다음과 같은 항목으로 구성된 매니페스트가 필요합니다.

| 항목                    | 설명                                     |
| --------------------- | -------------------------------------- |
| metadata.name         | 서비스 객체의 이름                             |
| spec.selector         | 서비스 객체와 연결할 파드 이름                      |
| spec.ports            | 외부 로드 밸런서에서 들어오는 트래픽을 파드에 전달할 인터페이스 설정 |
| spec.ports.name       | 인터페이스 이름                               |
| spec.ports.protocol   | 인터페이스에서 사용할 프로토콜(예: TCP)               |
| spec.ports.port       | 서비스 객체 외부에 공개할 포트 번호                   |
| spec.ports.targetPort | 서비스 객체와 연결할 파드의 포트 번호                  |
| spec.type             | 서비스 객체 유형                              |

### 3.3 인그레이스 컨트롤러      &#x20;

> &#x20;인그레스 컨트롤러(ingress controller)는 인그레스(Ingress) 객체에 정의된 규칙을 참조하여 클러스터 외부에서 내부 서비스로 HTTP와 HTTPS 요청을 라우팅하고 SSL/TSL 종료, 가상 호스팅 등을 제공합니다. 인그레스 컨트롤러와 인그레스에 대한 자세한 내용은 [인그레스 컨트롤러](https://kubernetes.io/ko/docs/concepts/services-networking/ingress-controllers/), [인그레스](https://kubernetes.io/ko/docs/concepts/services-networking/ingress/) 문서를 참고하세요.

### 3.4 퍼시스턴트 볼륨     &#x20;

> 퍼시스턴트 볼륨(Persistent Volume, PV)는 물리 저장 장치(volume)를 표현하는 Kubernetes의 자원입니다. 하나의 PV는 하나의 NHN Cloud Block Storage와 연결됩니다. 자세한 내용은 [퍼시스턴트 볼륨](https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/) 문서를 참고하세요.
>
> PV를 파드에 연결해 사용하려면 퍼시스턴트 볼륨 클레임(Persistent Volume Claims, PVC) 객체가 필요합니다. PVC는 용량, 읽기/쓰기 모드 등 필요한 볼륨의 요구 사항을 정의합니다.
>
> PV와 PVC로 사용자는 사용하고 싶은 볼륨의 속성을 정의하고, 시스템은 사용자의 요구 사항에 맞는 볼륨 리소스를 할당하는 방식으로 자원의 사용과 관리를 분리합니다.

#### 3.4.1 PV/PVC의 생명 주기     &#x20;

> PV와 PVC는 4단계의 생명 주기(life cycle)를 따릅니다.
>
> * 프로비저닝(provisioning) 사용자가 직접 볼륨을 확보하고 PV를 생성(static provisioning)하거나 [스토리지 클래스](https://kubernetes.io/ko/docs/concepts/storage/storage-classes/)를 사용해 동적으로 생성(dynamic provisioning)할 수 있습니다.
> * 바인딩(binding) PV와 PVC를 1:1로 바인딩합니다. 동적 프로비저닝으로 PV를 생성했다면 바인딩도 자동으로 수행됩니다.
> * 사용(using) PV를 파드에 마운트해 사용합니다.
> * 반환(reclaiming) 사용을 마친 볼륨을 회수합니다. 회수 방법은 삭제(Delete), 보존(Retain), 재사용(Recycle)이 있습니다.

| 방법           | 설명                                                                                         |
| ------------ | ------------------------------------------------------------------------------------------ |
| 삭제(Delete)   | PV를 삭제할 때 연결된 볼륨을 함께 삭제합니다.                                                                |
| 보존(Retain)   | <p>PV를 삭제할 때 연결된 볼륨을 삭제하지 않습니다. </p><p>볼륨은 사용자가 직접 삭제하거나 재사용 할 수 있습니다.</p>                 |
| 재사용(Recycle) | <p>PV를 삭제할 때 연결된 볼륨을 삭제하지 않고 재사용할 수 있는 상태로 만듭니다. </p><p>이 방법은 사용 중단(deprecated) 되었습니다.</p> |

#### 3.4.2 정적 프로비저닝   &#x20;

> &#x20;정적 프로비저닝(static provisioning)은 사용자가 직접 블록 스토리지를 준비해야 합니다. NHN Cloud 웹 콘솔의 **Storage > Block Storage** 서비스 페이지에서 **블록 스토리지 생성** 버튼을 클릭해 PV와 연결할 블록 스토리지를 생성합니다. 블록 스토리지 가이드의 [블록 스토리지 생성](https://docs.toast.com/ko/Storage/Block%20Storage/ko/console-guide/#_0)을 참고하세요.

#### 3.4.3 동적 프로비저닝    &#x20;

> &#x20;동적 프로비저닝(dynamic provisioning)은 스토리지 클래스에 정의된 속성을 참조하여 자동으로 블록 스토리지를 생성합니다. 스토리지 클래스 매니페스트의 **parameters.type**에 NHN Cloud Block Storage 유형을 지정할 수 있습니다. 지정하지 않으면 HDD 유형으로 설정됩니다.

| 타입  | 설정값         |
| --- | ----------- |
| HDD | General HDD |
| SSD | General SSD |

## 4. NHN Kubernetes Service(NKS) 시스템 구축  &#x20;

### 4.1 NHN Kubernetes Service(NKS) 서비스 활성화   &#x20;

> NHN Cloud 콘솔 접속 > 조직 > 프로젝트 > 서비스 선택 (Container > NHN Kubernetes Service(NKS)) 서비스 활성화

![그림. NHN Cloud Kubernetes 서비스 활성화](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F1AVziHtrNXi7NNgXwvPA%2Fimage.png?alt=media\&token=f9b4b843-ac8b-4285-8835-1fb955dfc895)

### 4.2 NHN Kubernetes Service(NKS) 클러스터 생성     &#x20;

> NHN Cloud 콘솔 접속 > 조직 > 프로젝트 > Container > NHN Kubernetes Service(NKS) > 클러스터 생성   &#x20;

![그림. NHN Cloud Kubernetes 클러스터 생성 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FcYvPiR8QT0ZgoFQz7c2o%2Fimage.png?alt=media\&token=5fd70471-dd64-4d64-b50b-6e27edbaca47)

> 클러스터 설정 값 입력  &#x20;

![그림. Kubenetes 클러스터 설정 값 입력  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FwEWIrKR1P6OGxO9Ogxjg%2Fimage.png?alt=media\&token=af515e38-af0a-466e-9392-7feeb116d41a)

> 클러스터 설정 값 확인 후 생성     &#x20;

![그림. Kubernetes 클러스터 생성 정보 확인   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYwOncaboXjmVbxAqR0%2F-MYwOyIQzXhJqFgJCbtL%2Fimage.png?alt=media\&token=bc177055-9404-47d6-b301-d06bad3ff0f1)

> 생성 완료 된 클러스터 정보 확인     &#x20;

![그림. Kubernetes 클러스터 생성 완료](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYwPF3f8WZUau3I-Dhb%2F-MYwPryw1QbQnDqFx5g-%2Fimage.png?alt=media\&token=f279cc73-1005-4973-b9bd-ab691ad0b5c9)

## 5. NHN Kubernetes Service(NKS) 기초    &#x20;

### 5.1 Kubernetes 관리용 Kube-Manager 서버 구성      &#x20;

> 관리용 Kube-Manager 서버 생성 `* 관리용 manager 서버를 통해 kubernetes 를 관리 운영 용도로 사용`   &#x20;
>
> 사무실에서 SSH 접속을 위해 Securety Groups 의 룰셋을 설정 `22번 포트, 211.60.125.141/32 설정`

![그림. Security Group 보안 설정](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYwaxkgbLpCKMJwX23n%2F-MYwuWStuT5EFHhLjyl3%2Fimage.png?alt=media\&token=614e8657-29fa-4417-8563-0e9202d04c15)

### 5.2 Kube-Manager 서버에서 API 설정   &#x20;

> Kube-Manager 서버에 SSH 접속 후 kubectl API 설정     &#x20;
>
> `test-kubernetes_kubeconfig.yaml` 은 콘솔 > Container > Nubernetes > 클릭후 오른쪽 하단 설정파일 `다운로드`&#x20;

{% code title="ubuntu apt 업데이트 및 kubectl API 설정  " %}

```bash
# ubuntu apt update
ubuntu@kube-manager:~$ sudo apt update
Hit:1 http://mirror.kakao.com/ubuntu focal InRelease
Hit:2 http://mirror.kakao.com/ubuntu focal-updates InRelease
Hit:3 http://mirror.kakao.com/ubuntu focal-backports InRelease
Hit:4 http://security.ubuntu.com/ubuntu focal-security InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
110 packages can be upgraded. Run 'apt list --upgradable' to see them.

# kubectl 복사하기     
ubuntu@kube-manager:~$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.6/bin/linux/amd64/kubectl                
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 41.4M  100 41.4M    0     0  18.4M      0  0:00:02  0:00:02 --:--:-- 18.4M

# kubectl 실행 권한 추가 및 /usr/local/bin 폴더 이동    
ubuntu@kube-manager:~$ chmod +x kubectl && sudo mv kubectl /usr/local/bin/

# SFTP 로 `test-kubernetes_kubeconfig.yaml` 파일 업로드  
# Manager 에서 Kubernetes 의 API 통신 파일 연결 하기 
ubuntu@kube-manager:~$ mkdir ~/.kube
ubuntu@kube-manager:~$ mv test-kubernetes_kubeconfig.yaml ~/.kube/config
ubuntu@kube-manager:~$ ls -alh .kube/
total 24K
drwxrwxr-x 4 ubuntu ubuntu 4.0K Apr 22 16:43 .
drwxr-xr-x 5 ubuntu ubuntu 4.0K Apr 22 16:36 ..
drwxr-x--- 3 ubuntu ubuntu 4.0K Apr 22 16:43 cache
-rw-rw-r-- 1 ubuntu ubuntu 5.3K Apr 22 16:42 config
drwxr-x--- 3 ubuntu ubuntu 4.0K Apr 22 16:43 http-cache
```

{% endcode %}

> 아래의 그림은 설정 파일 다운로드(test-kubernetes\_kubeconfig.yaml) 을 config 으로 변경 후 \~/.kube 로 파일 이동이    &#x20;

![그림. Kubernetes 설정 파일 다운로드](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYwxYHmtiFui7DzcwfB%2F-MYwyz12gIQsMO1HipF8%2Fimage.png?alt=media\&token=63563098-ba09-4fab-bf96-44d987984d42)

### 5.3 Kube-Manager 서버와 Kubernetes Cluster 의 API 통신 테스트    &#x20;

{% code title="Kubernetes Cluster 와 API 통신 테스트    " %}

```bash
# Node Status 확인  
ubuntu@kube-manager:~$ kubectl get node
NAME                                            STATUS   ROLES    AGE   VERSION
test-kubernetes-default-w-fibhg5xhpdpf-node-0   Ready    <none>   87m   v1.17.6
test-kubernetes-default-w-fibhg5xhpdpf-node-1   Ready    <none>   88m   v1.17.6
test-kubernetes-default-w-fibhg5xhpdpf-node-2   Ready    <none>   87m   v1.17.6

# kube-system namespace 의 pod 상태 확인    
ubuntu@kube-manager:~$ kubectl get pod --namespace kube-system
NAME                                        READY   STATUS    RESTARTS   AGE
coredns-69785fddb8-b7sdk                    1/1     Running   0          92m
coredns-69785fddb8-kc2x4                    1/1     Running   0          92m
dashboard-metrics-scraper-c79c65bb7-r2llq   1/1     Running   0          92m
kube-dns-autoscaler-5bfb4969c6-j4lhq        1/1     Running   0          92m
kube-flannel-ds-amd64-cc4vx                 1/1     Running   0          89m
kube-flannel-ds-amd64-f5vv9                 1/1     Running   0          88m
kube-flannel-ds-amd64-ntwzs                 1/1     Running   0          89m
kubernetes-dashboard-7fccd7c66d-dst5s       1/1     Running   0          92m
metrics-server-7bcdd8974c-kjnc9             1/1     Running   0          92m
npd-bwvnn                                   1/1     Running   0          88m
npd-jbtjg                                   1/1     Running   0          89m
npd-zpmks                                   1/1     Running   0          88m

# API resources 확인    
ubuntu@kube-manager:~$ kubectl api-resources
NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND
bindings                                                                      true         Binding
componentstatuses                 cs                                          false        Componen            tStatus
configmaps                        cm                                          true         ConfigMa            p
endpoints                         ep                                          true         Endpoint            s
events                            ev                                          true         Event
limitranges                       limits                                      true         LimitRan            ge
namespaces                        ns                                          false        Namespac            e
nodes                             no                                          false        Node
persistentvolumeclaims            pvc                                         true         Persiste            ntVolumeClaim
persistentvolumes                 pv                                          false        Persiste            ntVolume
pods                              po                                          true         Pod
podtemplates                                                                  true         PodTempl            ate
replicationcontrollers            rc                                          true         Replicat            ionController
resourcequotas                    quota                                       true         Resource            Quota
secrets                                                                       true         Secret
serviceaccounts                   sa                                          true         ServiceA            ccount
services                          svc                                         true         Service
mutatingwebhookconfigurations                  admissionregistration.k8s.io   false        Mutating            WebhookConfiguration
validatingwebhookconfigurations                admissionregistration.k8s.io   false        Validati            ngWebhookConfiguration
customresourcedefinitions         crd,crds     apiextensions.k8s.io           false        CustomRe            sourceDefinition
apiservices                                    apiregistration.k8s.io         false        APIServi            ce
controllerrevisions                            apps                           true         Controll            erRevision
daemonsets                        ds           apps                           true         DaemonSe            t
deployments                       deploy       apps                           true         Deployme            nt
replicasets                       rs           apps                           true         ReplicaS            et
statefulsets                      sts          apps                           true         Stateful            Set
auditsinks                                     auditregistration.k8s.io       false        AuditSin            k
tokenreviews                                   authentication.k8s.io          false        TokenRev            iew
localsubjectaccessreviews                      authorization.k8s.io           true         LocalSub            jectAccessReview
selfsubjectaccessreviews                       authorization.k8s.io           false        SelfSubj            ectAccessReview
selfsubjectrulesreviews                        authorization.k8s.io           false        SelfSubj            ectRulesReview
subjectaccessreviews                           authorization.k8s.io           false        SubjectA            ccessReview
horizontalpodautoscalers          hpa          autoscaling                    true         Horizont            alPodAutoscaler
cronjobs                          cj           batch                          true         CronJob
jobs                                           batch                          true         Job
certificatesigningrequests        csr          certificates.k8s.io            false        Certific            ateSigningRequest
leases                                         coordination.k8s.io            true         Lease
endpointslices                                 discovery.k8s.io               true         Endpoint            Slice
events                            ev           events.k8s.io                  true         Event
ingresses                         ing          extensions                     true         Ingress
nodes                                          metrics.k8s.io                 false        NodeMetr            ics
pods                                           metrics.k8s.io                 true         PodMetri            cs
ingresses                         ing          networking.k8s.io              true         Ingress
networkpolicies                   netpol       networking.k8s.io              true         NetworkP            olicy
runtimeclasses                                 node.k8s.io                    false        RuntimeC            lass
poddisruptionbudgets              pdb          policy                         true         PodDisru            ptionBudget
podsecuritypolicies               psp          policy                         false        PodSecur            ityPolicy
clusterrolebindings                            rbac.authorization.k8s.io      false        ClusterR            oleBinding
clusterroles                                   rbac.authorization.k8s.io      false        ClusterR            ole
rolebindings                                   rbac.authorization.k8s.io      true         RoleBind            ing
roles                                          rbac.authorization.k8s.io      true         Role
priorityclasses                   pc           scheduling.k8s.io              false        Priority            Class
podpresets                                     settings.k8s.io                true         PodPrese            t
csidrivers                                     storage.k8s.io                 false        CSIDrive            r
csinodes                                       storage.k8s.io                 false        CSINode
storageclasses                    sc           storage.k8s.io                 false        StorageC            lass
volumeattachments                              storage.k8s.io                 false        VolumeAt            tachment

# Cluster Context 확인    
ubuntu@kube-manager:~$ kubectl config get-contexts
CURRENT   NAME      CLUSTER                 AUTHINFO   NAMESPACE
*         default   toast-test-kubernetes   admin

# kube-system namespace 의 service 확
ubuntu@kube-manager:~$ kubectl get service --namespace kube-system
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
dashboard-metrics-scraper   ClusterIP   10.254.133.132   <none>        8000/TCP                 35m
kube-dns                    ClusterIP   10.254.0.10      <none>        53/UDP,53/TCP,9153/TCP   35m
kubernetes-dashboard        ClusterIP   10.254.186.220   <none>        443/TCP                  35m
metrics-server              ClusterIP   10.254.160.71    <none>        443/TCP                  35m
```

{% endcode %}

### 5.4 Kube-Manager 에서 kubectl 을 이용한 nginx 서비스 생성   &#x20;

{% code title="nginx 서비스 생성 및 서비스 확인    " %}

```bash
# test namespace create
ubuntu@kube-manager:~$ kubectl create namespace test
namespace/test created

# test namespace nginx deployment create
ubuntu@kube-manager:~$ kubectl create deployment nginx --image nginx --namespace test
deployment.apps/nginx created

# pod scale out (pod replicas 3, image: nginx)
ubuntu@kube-manager:~$ kubectl scale deployment nginx --replicas 3 --namespace test
deployment.apps/nginx scaled

# test namespace httpd deployment create pod 수 scale out (pod 수: 1, image:httpd)
ubuntu@kube-manager:~$ kubectl create deployment httpd --image httpd --namespace test
deployment.apps/httpd created

# nginx deployment 외부에서 접속 가능한 네트워크 생성 (LoadBalancer Service:80)
ubuntu@kube-manager:~$ kubectl expose deployment nginx --port 80 --target-port 80 --type LoadBalancer --namespace test
service/nginx exposed

# nginx, httpd pod 확인    
ubuntu@kube-manager:~$ kubectl get pod --namespace test
NAME                     READY   STATUS    RESTARTS   AGE
nginx-86c57db685-4wwtv   1/1     Running   0          109s
nginx-86c57db685-kc74d   1/1     Running   0          87s
nginx-86c57db685-tqtr7   1/1     Running   0          87s
httpd-5b674d6b89-rnm5b   1/1     Running   0          67s

# nginx LoadBalancer service 확인 
# 웹 브라우저에서 해당 EXTERNAL -IP 접속     
ubuntu@kube-manager:~$ kubectl get service --namespace test
NAME    TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
nginx   LoadBalancer   10.254.249.48   133.186.229.64   80:30905/TCP   6m28s
```

{% endcode %}

### 5.5 Nginx 서비스 확인   &#x20;

![그림. Nginx 서비스 확인](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYsZlyHoJFBqGkROlBs%2F-MYs_MgkgXVOMC5t6tXB%2Fimage.png?alt=media\&token=3710491b-ec67-4d86-9cc8-38274ea72c99)

### 5.5 Kube-Mnanger 에서 POD 로 접속     &#x20;

{% code title="POD 시스템 접속 및 curl 확인   " %}

```bash
# pod 시스템 리스
ubuntu@kube-manager:~$ kubectl get pod --namespace test
NAME                     READY   STATUS    RESTARTS   AGE
nginx-86c57db685-4wwtv   1/1     Running   0          11m
nginx-86c57db685-kc74d   1/1     Running   0          11m
nginx-86c57db685-tqtr7   1/1     Running   0          11m
httpd-5b674d6b89-rnm5b   1/1     Running   0          10m

# kubectl 을 이용하여 nginx-86c57db685-4wwtv 의 POD 접속    
ubuntu@kube-manager:~$ kubectl exec -it nginx-86c57db685-4wwtv --namespace test bash
root@nginx-86c57db685-4wwtv:/$ apt update && apt install curl -y
Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Get:2 http://deb.debian.org/debian buster InRelease [121 kB]
Get:3 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:4 http://security.debian.org/debian-security buster/updates/main amd64 Packages [272 kB]
Get:5 http://deb.debian.org/debian buster/main amd64 Packages [7907 kB]
Get:6 http://deb.debian.org/debian buster-updates/main amd64 Packages [9504 B]
Fetched 8427 kB in 3s (3089 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
Reading package lists... Done
Building dependency tree
Reading state information... Done
curl is already the newest version (7.64.0-4+deb10u2).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

# curl 을 이용하여 nginx 서비스를 확인    
root@nginx-86c57db685-4wwtv:/$ curl nginx.test.svc.cluster.local:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@nginx-86c57db685-4wwtv:/#exit
```

{% endcode %}

### 5.6 Kube-Manager 에서 POD 서비스 삭제  (수정 필요)  &#x20;

{% code title="POD 확인 및 삭제     " %}

```bash
# POD 서비스 확인   
ubuntu@kube-manager:~$ kubectl get pod --namespace test
NAME                     READY   STATUS    RESTARTS   AGE
nginx-86c57db685-4wwtv   1/1     Running   0          11m
nginx-86c57db685-kc74d   1/1     Running   0          11m
nginx-86c57db685-tqtr7   1/1     Running   0          11m
httpd-5b674d6b89-rnm5b   1/1     Running   0          10m

# nginx, httpd deployment 삭제    
ubuntu@kube-manager:~$ kubectl delete deployment nginx httpd --namespace test
deployment.apps "nginx" deleted
deployment.apps "httpd" deleted

# nginx service 삭제    
ubuntu@kube-manager:~$ kubectl delete service nginx --namespace test
service "nginx" deleted

# test 네임스페이스 삭제    
ubuntu@kube-manager:~$ kubectl delete namespace test
namespace "test" deleted
```

{% endcode %}

## 6. NHN Cloud 대시보드 설정 및 활용   &#x20;

> &#x20;NHN Cloud Kubernetes 서비스는 기본 웹 UI 대시보드(dashboard)를 제공합니다. Kubernetes 대시보드에 대한 자세한 내용은 [웹 UI (대시보드)](https://kubernetes.io/ko/docs/tasks/access-application-cluster/web-ui-dashboard/) 문서를 참고하세요.

### 6.1 대시보드 서비스 활성화 및 접속 토큰     &#x20;

> &#x20;사용자 Kubernetes에는 대시보드를 공개하기 위한 `kubernetes-dashboard` 서비스 객체가 미리 생성되어 있습니다.

{% code title="대시보드 서비스 활성화 " %}

```bash
ubuntu@kube-manager:~$ kubectl get svc kubernetes-dashboard -n kube-system
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.254.46.105   <none>        443/TCP   8m11s
ubuntu@kube-manager:~$ kubectl describe svc kubernetes-dashboard -n kube-system
Name:              kubernetes-dashboard
Namespace:         kube-system
Labels:            k8s-app=kubernetes-dashboard
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard"...
Selector:          k8s-app=kubernetes-dashboard
Type:              ClusterIP
IP:                10.254.46.105
Port:              <unset>  443/TCP
TargetPort:        8443/TCP
Endpoints:         10.100.34.3:8443
Session Affinity:  None
Events:            <none>

ubuntu@kube-manager:~$ kubectl -n kube-system patch svc/kubernetes-dashboard -p '{"spec":{"type":"LoadBalancer"}}'
service/kubernetes-dashboard patched

ubuntu@kube-manager:~$ kubectl get svc -n kube-system
NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                  AGE
dashboard-metrics-scraper   ClusterIP      10.254.199.54   <none>           8000/TCP                 10m
kube-dns                    ClusterIP      10.254.0.10     <none>           53/UDP,53/TCP,9153/TCP   10m
kubernetes-dashboard        LoadBalancer   10.254.46.105   133.186.219.13   443:30778/TCP            10m
metrics-server              ClusterIP      10.254.43.179   <none>           443/TCP                  10m
ubuntu@kube-manager:~$ 
```

{% endcode %}

### 6.2 대시보드 접근 토큰 정보 확인    &#x20;

> &#x20;웹 브라우저에서 `https://{EXTERNAL-IP}`로 접속하면 Kubernetes 대시보드 페이지가 로딩됩니다. 로그인을 위해 필요한 토큰은 [대시보드 엑세스 토큰](https://docs.toast.com/ko/Container/Kubernetes/ko/user-guide/#_23)을 참고하세요.

{% code title="토큰 정보 확인" %}

```bash
ubuntu@kube-manager:~$ kubectl --kubeconfig=$KUBE_CONFIG -n kube-system describe secret $(kubectl --kubeconfig=$KUBE_CONFIG -n kube-system get secret | awk '/^kubernetes-dashboard-token/{print $1}') | awk '$1=="token:"{print $2}'
eyJhbGciOiJSUzI1NiIsImtpZCI6IjJENWpBSjBKZ09ZbmJ5d19rcUV5MHZNc0F1b3RaMjZtZWhpVFhpYnVRdlUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi01bXBueiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImQ4MzY5ZmM3LWUyYjktNDZmMC1iYTEwLTMzMDE1NDRkZGU1MyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.Ecn1skL0LzycSYfznpQhc3F8NBe79Lo3ya6zCsQZp4BGN0NVeIc44fIpgXD1f_LQ_JqRBC5qWK0iwKfBdccIzgKBs-FjkuiWLwVgnB6rAicWVq4CXwFhit4WHNXs5-C5OOBJnYiPr949xLQmqh_Tc3WYcPcMa_xzuYGfcEzq2bajyMPmWdgrys3Nf3AxUDx9LMfbrmW_F5MuCutjhb0C2Scg0S1_d5esvjggFe3FRiY2GF5LCH7okzSNKiXg
ubuntu@kube-manager:~$ 
```

{% endcode %}

### 6.3 대시보드 접속 확인   &#x20;

> 크롬을 이용하여 <https://133.186.219.13> 으로 접속 `접속아이피는 설정에 따라 변함`        &#x20;
>
> 접속 할 때 토큰 정보를 입력 하여 로그인      &#x20;

![그림. Kubernetes 대시 보드 접속 확인](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZAr9ubb-0zceYxIK5r%2F-MZArEBFkQ3yBcdc1ZPt%2Fimage.png?alt=media\&token=9c4b49e6-dcb0-487e-86d9-036ac6dc4b07)

> 정상적으로 로그인 후 다양한 정보를 확인 할 수 있습니다.

![그림. Kubenetes 의 다양한 정보 확인   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZAt8TVS36fQ2WWTWWG%2F-MZAupdhgJE9lUnLsQrt%2Fimage.png?alt=media\&token=c1c12713-4a52-4ee4-856b-cf61f2e91169)

### 6.4 (이거 하나면 끝) NHN Cloud 대시보드 서비스 등록 하기     &#x20;

> 아래의 쉘(nhn\_cloud\_dash.sh) 파일을 이용하여 실행 하면 대시보드에 접속이 가능합니다.    &#x20;

{% code title="nhn\_cloud\_dash.sh" %}

```bash
#/bin/bash

kubectl get svc kubernetes-dashboard -n kube-system
kubectl -n kube-system patch svc/kubernetes-dashboard -p '{"spec":{"type":"LoadBalancer"}}'
kubectl get svc -n kube-system
kubectl --kubeconfig=$KUBE_CONFIG -n kube-system describe secret $(kubectl --kubeconfig=$KUBE_CONFIG -n kube-system get secret | awk '/^kubernetes-dashboard-token/{print $1}') | awk '$1=="token:"{print $2}'
```

{% endcode %}

{% file src="/files/-MZGTNN2ek6P3K438m5M" %}

{% code title="nhn\_cloud\_dash.sh" %}

```bash
# nhn_cloud_dash.sh 실행 권한 부여    
ubuntu@kube-manager:~$ chmod +x nhn_cloud_dash.sh

# nhn_cloud_dash.sh 파일 실행     
ubuntu@kube-manager:~$ ./nhn_cloud_dash.sh
NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP       PORT(S)         AGE
kubernetes-dashboard   LoadBalancer   10.254.34.9   133.186.144.217   443:30826/TCP   4h10m
service/kubernetes-dashboard patched

# kube-system namespace 서비스 목록 확인
NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                  AGE
dashboard-metrics-scraper   ClusterIP      10.254.201.131   <none>            8000/TCP                 4h10m
kube-dns                    ClusterIP      10.254.0.10      <none>            53/UDP,53/TCP,9153/TCP   4h10m
kubernetes-dashboard        LoadBalancer   10.254.34.9      133.186.144.217   443:30826/TCP            4h10m
metrics-server              ClusterIP      10.254.103.255   <none>            443/TCP                  4h10m

# 대시 보드 토큰 값(로그인 토큰)      
eyJhbGciOiJSUzI1NiIsImtpZCI6IkhPSzNnRnVibWpkOHRUXzdKVUxHZDJNV3V1Z0VHRksybnJrOWhScDVaOGcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1icmJmaCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjVjYzIzZGU2LWM4NzUtNDZmNS1iYTViLTY3OGVjOTQyODE5OSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVz5-xEtugE6I5SEwoI7zhFDqYw_PJNoKhxTXXjt4DjhCumyBdPsxSHgwyeeQEqQ1KimIOQ4wSsiB1APyf8dflRF9k0I7snTBxHlDpEs9mVlhZDacV52yDBgAcomP5QwQn8ZUSuZqF-ptjuz-CXHB8IPwRLs32Qqnbf7ZB4DTU7fBc_NzCgnx_2t3bJQhNdDH89U6HxdgKsplqEQT1q0hZFNszpdtJUGF2jiXyoYLxKvZqO4ALJi_-03yziIZE4VG7IHHN81-Uf4ovGOK9dFxg28rDgDWTztZ8gcFZgDJi0c6IeyjQCE1ZZFJ81Wu8QFzmlQj_g
```

{% endcode %}

## 7. Kubernetes 관리용 WeaveScope 시각화 도구 무료 툴   &#x20;

### 7.1 WeaveScope 설치 및 실행       &#x20;

{% code title="WeaveScope 설치 및 실행" %}

```bash
# Kubectl create  리소스 생성  실행    
ubuntu@kube-manager:~$ kubectl create -f 'https://cloud.weave.works/launch/k8s/weavescope.yaml'
namespace/weave created
serviceaccount/weave-scope created
deployment.apps/weave-scope-app created
service/weave-scope-app created
deployment.apps/weave-scope-cluster-agent created
daemonset.apps/weave-scope-agent created
# Kubectl apply 는 리소스 생성 및 업데이트 후 실행   
ubuntu@kube-manager:~$ kubectl apply -f 'https://cloud.weave.works/launch/k8s/weavescope.yaml'
namespace/weave created
serviceaccount/weave-scope created
deployment.apps/weave-scope-app created
service/weave-scope-app created
deployment.apps/weave-scope-cluster-agent created
daemonset.apps/weave-scope-agent created
ubuntu@kube-manager:~$
```

{% endcode %}

### 7.2 WeaveScope Pod 실행 확인     &#x20;

{% code title="WeaveScope Pod 실행 확인  " %}

```bash
ubuntu@kube-manager:~$ kubectl get pod --namespace weave
NAME                                       READY   STATUS    RESTARTS   AGE
weave-scope-agent-6jr62                    1/1     Running   0          26m
weave-scope-agent-m5ztn                    1/1     Running   0          26m
weave-scope-agent-mlfts                    1/1     Running   0          26m
weave-scope-app-5f48f66458-p45r2           1/1     Running   0          26m
weave-scope-cluster-agent-9bbd4f85-r56rp   1/1     Running   0          26m
```

{% endcode %}

### 7.3 WeaveScope Services 확인

{% code title="WeaveScope Services 확인" %}

```bash
ubuntu@kube-manager:~$ kubectl get services --namespace weave
NAME                               TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
weave-scope-app                    ClusterIP      10.254.39.30    <none>           80/TCP           28m
ubuntu@kube-manager:~$
```

{% endcode %}

### 7.4 WeaveScope 외부 접속 서비스 설정 (Loadbalancer Type 이용)   &#x20;

{% code title="kubectl expose 를 이용하여 LoadBalancer 를 이용하여 외부 접속    " %}

```bash
# pod 값에 weave-scope-app-5f48f66458-p45r2 값을 저장     
ubuntu@kube-manager:~$ pod=$(kubectl get pod -n weave --selector=name=weave-scope-app -o jsonpath={.items..metadata.name})
# kubectl expose 를 이용하여 4040 포트를 
ubuntu@kube-manager:~$ kubectl expose pod $pod -n weave --port=4040 --target-port=4040 --type=LoadBalancer
ubuntu@kube-manager:~$ kubectl get services --namespace weave
NAME                               TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
weave-scope-app                    ClusterIP      10.254.39.30    <none>           80/TCP           73m
weave-scope-app-5f48f66458-p45r2   LoadBalancer   10.254.11.142   133.186.159.43   4040:32260/TCP   73m
ubuntu@kube-manager:~$
```

{% endcode %}

### 7.5 WeaveScope 크롬 접속 확인    &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZBqNm7YL8_OkP63E0i%2F-MZBrM3--nDdFy9nTvYL%2Fimage.png?alt=media\&token=59cab579-6cf1-4717-8752-2c4f65256877)

### 7.6 WeaveScope 외부 접속 제한 (LoadBalancer 에서  접속 제한)   &#x20;

> WeaveScope 는 접속 제한이 없어 NHN Cloud Console 의 LoadBalancer 에 IP접근제어그룹에 접속해야 하는 공인IP 및 사설IP 를 입력 하여 접속을 제한     &#x20;

#### 7.6.1 NHN Cloud > Network > LoadBancer > IP 접근 제어 그룹 > IP 접근 제어 그룹 생성    &#x20;

> 공인 IP : 211.60.125.141/32, 사설IP : 192.168.0.0/24 (회사 사설IP) 등  &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZBtm5BTxbVea5wBYgz%2F-MZBvE2tI3HCViy20VMs%2Fimage.png?alt=media\&token=b9ff214b-ca2f-4f9f-9933-9ecfa21594aa)

#### 7.6.2 IP 접근제어 그룹 생성   &#x20;

> IP 접근제어 그룹은 이름, 설명, IP 접근제어 타입, IP 접근제어 대상 추가 에 입력 후 확인    &#x20;
>
> `등록 IP 만 접속을 허가 하므로 IP 접근제어 타입은 '허용'으로 설정`   &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZBtm5BTxbVea5wBYgz%2F-MZBxEzWZqilEjkBImfy%2Fimage.png?alt=media\&token=253b6940-8ca9-4a3b-a235-bef756e4774d)

#### 7.6.3 IP 접근 제어 그룹 적용   &#x20;

> * 로드 밸런서에 weave 서비스 확인
> * IP 접근제어 그룹 선택에서 허용 : Kube-Manager 선택 후 확인   &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZBtm5BTxbVea5wBYgz%2F-MZBvWOku_oDH_F-svdm%2Fimage.png?alt=media\&token=8e61abfb-ea4b-48c4-a50e-4a32b5ef469a)

#### 7.6.4 LoadBalancer 관리에서 IP 접근 타입, 그룹 확인       &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZBtm5BTxbVea5wBYgz%2F-MZByVt7IOCHT4E97AOS%2Fimage.png?alt=media\&token=fb16a4c8-1435-497d-a668-702df14ed555)

### 7.7 WeaveScope 중지      &#x20;

{% code title="WeaveScope 중지    " %}

```bash
ubuntu@kube-manager:~$ kubectl get services --namespace weave
NAME                               TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
weave-scope-app                    ClusterIP      10.254.39.30    <none>           80/TCP           73m
weave-scope-app-5f48f66458-p45r2   LoadBalancer   10.254.11.142   133.186.159.43   4040:32260/TCP   73m
ubuntu@kube-manager:~$ kubectl delete namespace weave
namespace "weave" deleted
ubuntu@kube-manager:~$
```

{% endcode %}

### 7.8 (이거 하나면 끝) NHN Cloud 에서 weavescope 서비스 등록 하기    &#x20;

> Kube-Manager 서버에서 쉘(nhn\_cloud\_weavescope.sh) 파일을 이용하여 실행 하면 Weavescope 의 웹 페이지에 접속이 가능합니다. ***7.6***&#xC5D0; IP 접속 제한을 하여야 합니다.&#x20;

{% code title="nhn\_cloud\_weavescope.sh" %}

```bash
#/bin/bash

kubectl get pod --all-namespaces
kubectl get services --all-namespaces
kubectl apply -f 'https://cloud.weave.works/launch/k8s/weavescope.yaml'
kubectl -n weave patch svc/weave-scope-app -p '{"spec":{"type":"LoadBalancer"}}'
kubectl get services --all-namespaces
```

{% endcode %}

{% file src="/files/-MZGVIxW\_56Ln-mr9siK" %}

{% code title="nhn\_cloud\_weavescope.sh" %}

```bash
# nhn_cloud_weavescope.sh 실행 권한 부여    
ubuntu@kube-manager:~$ chmod +x nhn_cloud_weavescope.sh

# nhn_cloud_weavescope.sh 실행     
ubuntu@kube-manager:~$ ./nhn_cloud_weavescope.sh

# 전체 namespace Pod 목록 확인     
NAMESPACE     NAME                                                 READY   STATUS    RESTARTS   AGE
default       echo-799bdfb445-jnkqb                                1/1     Running   0          127m
kube-system   cluster-autoscaler-default-worker-796888b878-c22v7   1/1     Running   0          4h27m
kube-system   coredns-69785fddb8-rqmm8                             1/1     Running   0          4h28m
kube-system   coredns-69785fddb8-xtfkt                             1/1     Running   0          4h28m
kube-system   dashboard-metrics-scraper-c79c65bb7-qpplj            1/1     Running   0          4h28m
kube-system   kube-dns-autoscaler-5bfb4969c6-qwx6d                 1/1     Running   0          4h28m
kube-system   kube-flannel-ds-amd64-2t9h2                          1/1     Running   0          4h24m
kube-system   kubernetes-dashboard-7fccd7c66d-dzxwp                1/1     Running   0          4h28m
kube-system   metrics-server-7bcdd8974c-hn4h8                      1/1     Running   0          4h28m
kube-system   npd-7hzrv                                            1/1     Running   0          4h23m

# 전체 namespace 서비스 목록 확인     
NAMESPACE     NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                  AGE
default       kubernetes                  ClusterIP      10.254.0.1       <none>            443/TCP                  4h28m
kube-system   dashboard-metrics-scraper   ClusterIP      10.254.201.131   <none>            8000/TCP                 4h28m
kube-system   kube-dns                    ClusterIP      10.254.0.10      <none>            53/UDP,53/TCP,9153/TCP   4h28m
kube-system   kubernetes-dashboard        LoadBalancer   10.254.34.9      133.186.144.217   443:30826/TCP            4h28m
kube-system   metrics-server              ClusterIP      10.254.103.255   <none>            443/TCP                  4h28m

# weavescope 서비스 실행    
namespace/weave created
serviceaccount/weave-scope created
clusterrole.rbac.authorization.k8s.io/weave-scope configured
clusterrolebinding.rbac.authorization.k8s.io/weave-scope configured
deployment.apps/weave-scope-app created
service/weave-scope-app created
deployment.apps/weave-scope-cluster-agent created
daemonset.apps/weave-scope-agent created

# type 을 LoadBalancer 로 변경     
service/weave-scope-app patched

# EXTERNAL-IP 에서 공인 IP 획득       
NAMESPACE     NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                  AGE
default       kubernetes                  ClusterIP      10.254.0.1       <none>            443/TCP                  4h28m
kube-system   dashboard-metrics-scraper   ClusterIP      10.254.201.131   <none>            8000/TCP                 4h28m
kube-system   kube-dns                    ClusterIP      10.254.0.10      <none>            53/UDP,53/TCP,9153/TCP   4h28m
kube-system   kubernetes-dashboard        LoadBalancer   10.254.34.9      133.186.144.217   443:30826/TCP            4h28m
kube-system   metrics-server              ClusterIP      10.254.103.255   <none>            443/TCP                  4h28m
weave         weave-scope-app             LoadBalancer   10.254.226.22    133.186.159.43    80:32541/TCP             1s
```

{% endcode %}

## 8. YAML 검증 사이트  활용    &#x20;

### 8.1 YAML 검증 사이트 <http://www.yamllint.com/>

> Yaml 파일을 실행 하기 전에 아래의 사이트에서 검증을 사용해 보자.      &#x20;

![그림. yamllint.com 사이트 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F9L9kDOkzpInnqpnD553o%2Fimage.png?alt=media\&token=2106309c-1c61-4b71-a31c-3e1a10486b17)

![그림. Yaml 이 이상이 없을경우        ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F5J531UpPVQk4l6XH2SLL%2Fimage.png?alt=media\&token=fae9bd1a-f324-4943-9608-d1a12816935e)

![그림. Yaml 에 오류가 있는경우     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Fw4b8hjbyWKTO4LrJzaSb%2Fimage.png?alt=media\&token=18335e74-2149-480b-87b1-758fd3ae24e2)

## 부록. Kubectl 명령어 사용법   &#x20;

### 1. Pod 조회   &#x20;

> pod 조회 시 pods, po 와 같이 사용이 가능함    &#x20;

```bash
# Pod 조회 
ubuntu@kube-manager:~$ kubectl get pod
No resources found in default namespace.

# 전체 NameSpace 의 Pod 조회          
ubuntu@kube-manager:~$ kubectl get pod --all-namespaces
NAMESPACE     NAME                                                 READY   STATUS    RESTARTS   AGE
kube-system   cluster-autoscaler-default-worker-796888b878-c22v7   1/1     Running   0          60m
kube-system   coredns-69785fddb8-rqmm8                             1/1     Running   0          61m
kube-system   coredns-69785fddb8-xtfkt                             1/1     Running   0          61m
kube-system   dashboard-metrics-scraper-c79c65bb7-qpplj            1/1     Running   0          61m
kube-system   kube-dns-autoscaler-5bfb4969c6-qwx6d                 1/1     Running   0          61m
kube-system   kube-flannel-ds-amd64-2t9h2                          1/1     Running   0          57m
kube-system   kubernetes-dashboard-7fccd7c66d-dzxwp                1/1     Running   0          61m
kube-system   metrics-server-7bcdd8974c-hn4h8                      1/1     Running   0          61m
kube-system   npd-7hzrv                                            1/1     Running   0          56m
weave         weave-scope-agent-9knlg                              1/1     Running   0          48m
weave         weave-scope-app-5f48f66458-9m85b                     1/1     Running   0          46m
weave         weave-scope-cluster-agent-9bbd4f85-vlp8n             1/1     Running   0          46m

# 특정(weave) NameSpace 의 Pod 조회    
ubuntu@kube-manager:~$ kubectl get pod --namespace weave
NAME                                       READY   STATUS    RESTARTS   AGE
weave-scope-agent-9knlg                    1/1     Running   0          54m
weave-scope-app-5f48f66458-9m85b           1/1     Running   0          52m
weave-scope-cluster-agent-9bbd4f85-vlp8n   1/1     Running   0          52m

```

### 2. 전체 서비스 정보 조회      &#x20;

```bash
# default 서비스를 조회    
ubuntu@kube-manager:~$ kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.254.0.1   <none>        443/TCP   65m

# 모든 NameSpace 의 서비스를 조회    
ubuntu@kube-manager:~$ kubectl get all --all-namespaces
NAMESPACE     NAME                                                     READY   STATUS    RESTARTS   AGE
kube-system   pod/cluster-autoscaler-default-worker-796888b878-c22v7   1/1     Running   0          65m
kube-system   pod/coredns-69785fddb8-rqmm8                             1/1     Running   0          65m
kube-system   pod/coredns-69785fddb8-xtfkt                             1/1     Running   0          65m
kube-system   pod/dashboard-metrics-scraper-c79c65bb7-qpplj            1/1     Running   0          65m
kube-system   pod/kube-dns-autoscaler-5bfb4969c6-qwx6d                 1/1     Running   0          65m
kube-system   pod/kube-flannel-ds-amd64-2t9h2                          1/1     Running   0          61m
kube-system   pod/kubernetes-dashboard-7fccd7c66d-dzxwp                1/1     Running   0          65m
kube-system   pod/metrics-server-7bcdd8974c-hn4h8                      1/1     Running   0          65m
kube-system   pod/npd-7hzrv                                            1/1     Running   0          61m
weave         pod/weave-scope-agent-9knlg                              1/1     Running   0          52m
weave         pod/weave-scope-app-5f48f66458-9m85b                     1/1     Running   0          50m
weave         pod/weave-scope-cluster-agent-9bbd4f85-vlp8n             1/1     Running   0          50m

NAMESPACE     NAME                                TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                                                     AGE
default       service/kubernetes                  ClusterIP      10.254.0.1       <none>            443/TCP                                                                                                     65m
kube-system   service/dashboard-metrics-scraper   ClusterIP      10.254.201.131   <none>            8000/TCP                                                                                                    65m
kube-system   service/kube-dns                    ClusterIP      10.254.0.10      <none>            53/UDP,53/TCP,                                                                                   9153/TCP   65m
kube-system   service/kubernetes-dashboard        ClusterIP      10.254.34.9      <none>            443/TCP                                                                                                     65m
kube-system   service/metrics-server              ClusterIP      10.254.103.255   <none>            443/TCP                                                                                                     65m
weave         service/weave-scope-app             LoadBalancer   10.254.81.167    133.186.240.198   80:30884/TCP                                                                                                52m

NAMESPACE     NAME                                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SEL                                                                                   ECTOR                   AGE
kube-system   daemonset.apps/kube-flannel-ds-amd64   1         1         1       1            1           beta.kub                                                                                   ernetes.io/arch=amd64   65m
kube-system   daemonset.apps/npd                     1         1         1       1            1           <none>                                                                                                             65m
weave         daemonset.apps/weave-scope-agent       1         1         1       1            1           <none>                                                                                                             52m

NAMESPACE     NAME                                                READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/cluster-autoscaler-default-worker   1/1     1            1           65m
kube-system   deployment.apps/coredns                             2/2     2            2           65m
kube-system   deployment.apps/dashboard-metrics-scraper           1/1     1            1           65m
kube-system   deployment.apps/kube-dns-autoscaler                 1/1     1            1           65m
kube-system   deployment.apps/kubernetes-dashboard                1/1     1            1           65m
kube-system   deployment.apps/metrics-server                      1/1     1            1           65m
weave         deployment.apps/weave-scope-app                     1/1     1            1           52m
weave         deployment.apps/weave-scope-cluster-agent           1/1     1            1           52m

NAMESPACE     NAME                                                           DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/cluster-autoscaler-default-worker-796888b878   1         1         1       65m
kube-system   replicaset.apps/coredns-69785fddb8                             2         2         2       65m
kube-system   replicaset.apps/dashboard-metrics-scraper-c79c65bb7            1         1         1       65m
kube-system   replicaset.apps/kube-dns-autoscaler-5bfb4969c6                 1         1         1       65m
kube-system   replicaset.apps/kubernetes-dashboard-7fccd7c66d                1         1         1       65m
kube-system   replicaset.apps/metrics-server-7bcdd8974c                      1         1         1       65m
weave         replicaset.apps/weave-scope-app-5f48f66458                     1         1         1       52m
weave         replicaset.apps/weave-scope-cluster-agent-9bbd4f85             1         1         1       52m
ubuntu@kube-manager:~$

```

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FemRODXrZqaW8yHZkwHvq%2F%ED%9B%84%EC%9B%90%EA%B3%84%EC%A2%8C.png?alt=media&amp;token=81e13f5d-c803-4bbf-b40a-d3b835dc21c2" alt=""><figcaption><p>후원 정보 </p></figcaption></figure>


# \[NHN Cloud] NHN Kubernetes Service(NKS) 관리용 OpenSource 설치 방법

\[DataUs] NHN Kubernetes Service(NKS) 관리용 OpenSource 설치 방법

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. Kubebox&#x20;

> Kubernetes 용 터미널 과 웹 콘솔을 제공하는 Kubebox 입니다.

### 1.1 Kubebox Features

> * ✓ Configuration from *kubeconfig* files (`KUBECONFIG` environment variable or `$HOME/.kube`)
> * ✓ Switch contexts interactively
> * ✓ [Authentication support](https://github.com/astefanutti/kubebox#authentication) (bearer token, basic auth, private key / cert, OAuth, OpenID Connect, Amazon EKS, Google Kubernetes Engine, Digital Ocean)
> * ✓ Namespace selection and pods list watching
> * ✓ Container log scrolling / watching
> * ✓ Container resources usage (memory, CPU, network, file system charts) \[[1](https://github.com/astefanutti/kubebox#_footnotedef_1)]
> * ✓ Container remote exec terminal
> * ✓ Cluster, namespace, pod events
> * ❏ Object configuration editor and CRUD operations
> * ❏ Cluster and nodes views / monitoring

### 1.2 Kubebox Terminal Console Install

#### 1.2.1 Kubebox Install    &#x20;

> 원격 접속 후 터미널로 실행이 가능하며 이를 권장 함.

{% code title="Ubuntu 20.04 에 Kubebox 설치 및 실행" %}

```bash
# Kubebox 파일 다운로드 및 실행 권한 
$ curl -Lo kubebox https://github.com/astefanutti/kubebox/releases/download/v0.9.0/kubebox-linux && chmod +x kubebox
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   619  100   619    0     0   2292      0 --:--:-- --:--:-- --:--:--  2284
100 11.8M  100 11.8M    0     0  5401k      0  0:00:02  0:00:02 --:--:-- 10.1M

# /usr/local/bin 폴더로 이동
$ sudo mv kubebox /usr/local/bin/

# Resources(Memory/Cpu/Net/FS) 를 보기 위해 cadvisor.yaml 실행   
$ kubectl apply -f https://raw.github.com/astefanutti/kubebox/master/cadvisor.yaml
namespace/cadvisor created
serviceaccount/cadvisor created
podsecuritypolicy.policy/cadvisor unchanged
clusterrole.rbac.authorization.k8s.io/cadvisor unchanged
clusterrolebinding.rbac.authorization.k8s.io/cadvisor unchanged
daemonset.apps/cadvisor created

# 실행  
$ kubebox
```

{% endcode %}

#### 1.2.2 Kubebox Terminal Console 실행 화면&#x20;

![그림. Kubebox Terminal Console 접속 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb48frM9PxspD_YM1wX%2F-Mb4CARFC5cOTiLaUVn8%2Fimage.png?alt=media\&token=0f895fc0-f747-4259-90b9-a3edfe6ea793)

![그림. Kubebox 접속 후 pod 로그 및 Resources 현황   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb48frM9PxspD_YM1wX%2F-Mb4IZrEMGT-iw-p7SSP%2Fimage.png?alt=media\&token=1daec0b5-9fe0-4493-9b8a-e17ccdde088f)

![그림. Kubebox 접속 후 pod 로 원격 쉘 접근 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb48frM9PxspD_YM1wX%2F-Mb4Iy5NVOTEYyJD5Gp-%2Fimage.png?alt=media\&token=16a3eec6-eeb8-407c-9702-ac2d8fa995d0)

![그림. Kubebox 접속 후 Pod 의 Events Cluster 의 상세 로그 현황   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb48frM9PxspD_YM1wX%2F-Mb4JNwQMMvTrErXsXpA%2Fimage.png?alt=media\&token=faa00004-ba6e-40fc-8d1e-972d72bfca3f)

#### 1.2.3 Kubebox Download & Executable  &#x20;

> Download the Kubebox standalone executable for your OS:
>
> ```
> # Linux (x86_64)
> $ curl -Lo kubebox https://github.com/astefanutti/kubebox/releases/download/v0.9.0/kubebox-linux && chmod +x kubebox
>
> # Linux (ARMv7)
> $ curl -Lo kubebox https://github.com/astefanutti/kubebox/releases/download/v0.9.0/kubebox-linux-arm && chmod +x kubebox
>
> # OSX
> $ curl -Lo kubebox https://github.com/astefanutti/kubebox/releases/download/v0.9.0/kubebox-macos && chmod +x kubebox
>
> # Windows
> $ curl -Lo kubebox.exe https://github.com/astefanutti/kubebox/releases/download/v0.9.0/kubebox-windows.exe
> ```

### 1.3 Kubebox Web Console Install

> Kubebox Web Console 접속 할 때 비밀번호 없이 접속이 가능하며 이를 ***제한*** 하여야 함.

{% code title="Kubebox Web Console 실행 방법 # 웹 콘솔 접속 시 ID/Pass 없으며 웹 쉘의 IP 접근 제한을 하여야 함.   " %}

```bash
# Kubebox pod 실행    
$ kubectl apply -f https://raw.github.com/astefanutti/kubebox/master/kubernetes.yaml                                                                                                                                   x/master/kubernetes.yaml
namespace/kubebox created
service/kubebox created
ingress.networking.k8s.io/kubebox created
deployment.apps/kubebox created
serviceaccount/kubebox created
clusterrolebinding.rbac.authorization.k8s.io/kubebox created
clusterrole.rbac.authorization.k8s.io/kubebox created

# Resources(Memory/Cpu/Net/FS) 를 보기 위해 cadvisor.yaml 실행  
$ kubectl apply -f https://raw.github.com/astefanutti/kubebox/master/cadvisor.yaml
namespace/cadvisor created
serviceaccount/cadvisor created
podsecuritypolicy.policy/cadvisor unchanged
clusterrole.rbac.authorization.k8s.io/cadvisor unchanged
clusterrolebinding.rbac.authorization.k8s.io/cadvisor unchanged
daemonset.apps/cadvisor created

# Kubebox pod 정보 확인     
$ kubectl get pod --namespace kubebox -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP           NODE                                      NOMINATED NODE   READINESS GATES
kubebox-8c8b4b7b-wh4dv   1/1     Running   0          100s   10.100.2.5   kube-test-default-w-ely36nnk7fog-node-1   <none>           <none>

# Kubebox Service 확인     
$ kubectl get svc --all-namespaces
NAMESPACE     NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes                  ClusterIP   10.254.0.1       <none>        443/TCP                  33m
kube-system   dashboard-metrics-scraper   ClusterIP   10.254.190.192   <none>        8000/TCP                 33m
kube-system   kube-dns                    ClusterIP   10.254.0.10      <none>        53/UDP,53/TCP,9153/TCP   33m
kube-system   kubernetes-dashboard        ClusterIP   10.254.169.196   <none>        443/TCP                  33m
kube-system   metrics-server              ClusterIP   10.254.232.10    <none>        443/TCP                  33m
kubebox       kubebox                     ClusterIP   10.254.236.84    <none>        8080/TCP                 6m31s

# Kubebox LoadBalancer 등록    
$ kubectl -n kubebox  patch svc/kubebox  -p '{"spec":{"type":"LoadBalancer"}}'
service/kubebox patched

# Kubebox service 
$ kubectl get svc --all-namespaces
NAMESPACE     NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                  AGE
default       kubernetes                  ClusterIP      10.254.0.1       <none>            443/TCP                  36m
kube-system   dashboard-metrics-scraper   ClusterIP      10.254.190.192   <none>            8000/TCP                 35m
kube-system   kube-dns                    ClusterIP      10.254.0.10      <none>            53/UDP,53/TCP,9153/TCP   35m
kube-system   kubernetes-dashboard        ClusterIP      10.254.169.196   <none>            443/TCP                  35m
kube-system   metrics-server              ClusterIP      10.254.232.10    <none>            443/TCP                  35m
kubebox       kubebox                     LoadBalancer   10.254.236.84    133.186.155.190   8080:30130/TCP           8m55s

# cadvisor namespace 삭제    
$ kubectl delete namespace cadvisor
namespace "cadvisor" deleted

# Kubebox namespace 삭제 
$ kubectl delete namespace kubebox
namespace "kubebox" deleted
```

{% endcode %}

#### 1.3.1 Kubebox Web Console 실행 화면  &#x20;

![그림. Kubebox Web Console 접속 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb48frM9PxspD_YM1wX%2F-Mb4IH_Br2GVx73S-7-e%2Fimage.png?alt=media\&token=a2d1d3f8-f6ef-46af-95a6-a2391aa9a58b)

![그림. Kubebox 접속 후 pod 로그 및 Resources 현황   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb48frM9PxspD_YM1wX%2F-Mb4Ig7BAZ2zjteCZb0h%2Fimage.png?alt=media\&token=642ca7e8-13e6-42d8-9b08-3a1b13eca11b)

![그림. Kubebox 접속 후 pod 로 원격 쉘 접근 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb48frM9PxspD_YM1wX%2F-Mb4J42RKQ0Al6YYy7UH%2Fimage.png?alt=media\&token=31d45149-5db5-46bb-8ff4-ab0a78d680ea)

![그림. Kubebox 접속 후 Pod 의 Events Cluster 의 상세 로그 현황   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb48frM9PxspD_YM1wX%2F-Mb4JU-oHePpk7Qw2Pxo%2Fimage.png?alt=media\&token=db2797a1-9eb5-4ecf-be50-1843daf7d4a6)

### 1.4 Kubebox Development&#x20;

```bash
$ git clone https://github.com/astefanutti/kubebox.git
$ cd kubebox
$ npm install
$ node index.js
```

### 1.5 Kubebox Hotkeys

|           | Keybinding                                  | Description                                                        |
| --------- | ------------------------------------------- | ------------------------------------------------------------------ |
| *General* | l, Ctrl+l                                   | Login                                                              |
|           | n                                           | Change current namespace                                           |
|           | <p>\[Shift+]←, → </p><p>\[Alt+]1, …​, 9</p> | Navigate screens (use Shift or Alt inside exec terminal)           |
|           | Tab, Shift+Tab                              | Change focus within the active screen                              |
|           | ↑, ↓                                        | Navigate list / form / log                                         |
|           | PgUp, PgDn                                  | Move one page up / down                                            |
|           | Enter                                       | Select item / submit form                                          |
|           | Esc                                         | Close modal window / cancel form                                   |
|           | Ctrl+z                                      | Close current screen                                               |
|           | q, Ctrl+q                                   | Exit \[[3](https://github.com/astefanutti/kubebox#_footnotedef_3)] |
| *Login*   | ←, →                                        | Navigate Kube configurations                                       |
| *Pods*    | Enter                                       | Select pod / cycle containers                                      |
|           | r                                           | Remote shell into container                                        |
|           | m                                           | Memory usage                                                       |
|           | c                                           | CPU usage                                                          |
|           | t                                           | Network usage                                                      |
|           | f                                           | File system usage                                                  |
|           | e                                           | Pod events                                                         |
|           | Shift+e                                     | Namespace events                                                   |
|           | Ctrl+e                                      | Cluster events                                                     |

### 1.6 Authentication

> We try to support the various authentication strategies supported by `kubectl`, in order to provide seamless integration with your local setup. Here are the different authentication strategies we support, depending on how you’re using Kubebox:

|                          | Executable | Docker | Online                                                                                  |
| ------------------------ | ---------- | ------ | --------------------------------------------------------------------------------------- |
| OpenID Connect           | ✔️         | ✔️     | ✔️\[[2](https://github.com/astefanutti/kubebox/blob/master/README.adoc#_footnotedef_2)] |
| Amazon EKS               | ✔️         |        |                                                                                         |
| Digital Ocean            | ✔️         |        |                                                                                         |
| Google Kubernetes Engine | ✔️         |        |                                                                                         |

> If the mode you’re using isn’t supported, you can refresh the authentication token/certs manually and update your *kubeconfig* file accordingly.

### 1.7 cAdvisor

> Kubebox relies on [cAdvisor](https://github.com/google/cadvisor) to retrieve the resource usage metrics. Before version 0.8.0, Kubebox used to access the cAdvisor endpoints, that are embedded in the *Kubelet*. However, these endpoints are being deprecated, and will eventually be removed, as discussed in [kubernetes#68522](https://github.com/kubernetes/kubernetes/issues/68522).
>
> Starting version 0.8.0, Kubebox expects cAdvisor to be deployed as a [DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/). This can be achieved with:
>
> ```bash
> $ kubectl apply -f https://raw.github.com/astefanutti/kubebox/master/cadvisor.yaml
> ```
>
> It’s recommended to use the provided `cadvisor.yaml` file, that’s tested to work with Kubebox. However, the DaemonSet example, from the [cAdvisor](https://github.com/google/cadvisor) project, should also work just fine. Note that the cAdvisor containers must run with a *privileged* security context, so that they can access the container runtime on each node.
>
> You can change the default `--storage_duration` and `--housekeeping_interval` options, added to the cAdvisor container arguments declared in the `cadvisor.yaml` file, to adjust the duration of the storage moving window (default to `5m0s`), and the sampling period (default to `10s`) respectively. You may also have to provide the path of your cluster container runtime socket, in case it’s not following the usual convention.

### 1.8 FAQ

> * ***Resources usage metrics are unavailable!***
>   * Starting version 0.8.0, Kubebox expects [cAdvisor](https://github.com/google/cadvisor) to be deployed as a DaemonSet. See the [cAdvisor](https://github.com/astefanutti/kubebox#cadvisor) section for more details;
>   * The metrics are retrieved from the REST API, of the cAdvisor pod running on the same node as the container for which the metrics are being requested. That REST API is accessed via the API server proxy, which requires proper RBAC permission, e.g.:
>
>     ```
>     # Permission to list the cAdvisor pods (selected using the `spec.nodeName` field selector)
>     $ kubectl auth can-i list pods -n cadvisor
>     yes
>     # Permission to proxy the selected cAdvisor pod, to call its REST API
>     $ kubectl auth can-i get pod --subresource proxy -n cadvisor
>     yes
>     ```

### 1.9 출처 : <https://github.com/astefanutti/kubebox>

## 2. Kubernetes Operational View

> Kubernetes Operational View?
>
> Goal: provide a common operational picture for multiple Kubernetes clusters.
>
> * Render nodes and indicate their overall status ("Ready")
> * Show node capacity and resource usage (CPU, memory)
>   * Render one "box" per CPU and fill up to sum of pod CPU requests/usage
>   * Render vertical bar for total memory and fill up to sum of pod memory requests/usage
> * Render individual pods
>   * Indicate pod status by border line color (green: ready/running, yellow: pending, red: error etc)
>   * Show current CPU/memory usage (gathered from Heapster) by small vertical bars
>   * System pods ("kube-system" namespace) will be grouped together at the bottom
> * Provide tooltip information for nodes and pods
> * Animate pod creation and termination

> What it is not:
>
> * It's not a replacement for the [Kubernetes Dashboard](https://github.com/kubernetes/dashboard). The Kubernetes Dashboard is a general purpose UI which allows managing applications.
> * It's not a monitoring solution. Use your preferred monitoring system to alert on production issues.
> * It's not a operation management tool. Kubernetes Operational View does not allow interacting with the actual cluster.

### 2.1 Kubernetes Operational View Install&#x20;

{% code title="Kubernetes Operational View 다운로드 및 실행 방법" %}

```bash
# Kubernetes Operational View 소스 파일 다운로드    
$ git clone https://codeberg.org/hjacobs/kube-ops-view.git
Cloning into 'kube-ops-view'...
remote: Enumerating objects: 1970, done.
remote: Counting objects: 100% (1970/1970), done.
remote: Compressing objects: 100% (766/766), done.
remote: Total 1970 (delta 1340), reused 1702 (delta 1162), pack-reused 0
Receiving objects: 100% (1970/1970), 1.11 MiB | 825.00 KiB/s, done.
Resolving deltas: 100% (1340/1340), done.

# 소스 파일 다운로드 
$ ls
kube-ops-view

# deploy 폴더에 yaml 파일 확인    
$ cd kube-ops-view/deploy/
$ ls
deployment.yaml  kustomization.yaml  rbac.yaml  redis-deployment.yaml  redis-service.yaml  service.yaml

# service.yaml 파일에 LoadBalancer IP 할당   
$ vi service.yaml
type: ClusterIP  ==> type: LoadBalancer

# Kubernetes Operational View Service 실행    
$ kubectl apply -k .
serviceaccount/kube-ops-view created
clusterrole.rbac.authorization.k8s.io/kube-ops-view created
clusterrolebinding.rbac.authorization.k8s.io/kube-ops-view created
service/kube-ops-view-redis created
service/kube-ops-view created
deployment.apps/kube-ops-view-redis created
deployment.apps/kube-ops-view created

# Kubernetes Operational View Service 실행 확인         
$ kubectl get svc --all-namespaces
NAMESPACE     NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                  AGE
default       kube-ops-view               LoadBalancer   10.254.81.99     133.186.244.48   80:31174/TCP             75s
default       kube-ops-view-redis         ClusterIP      10.254.60.234    <none>           6379/TCP                 109s
default       kubernetes                  ClusterIP      10.254.0.1       <none>           443/TCP                  3h18m
kube-system   dashboard-metrics-scraper   ClusterIP      10.254.190.192   <none>           8000/TCP                 3h18m
kube-system   kube-dns                    ClusterIP      10.254.0.10      <none>           53/UDP,53/TCP,9153/TCP   3h18m
kube-system   kubernetes-dashboard        ClusterIP      10.254.169.196   <none>           443/TCP                  3h18m
kube-system   metrics-server              ClusterIP      10.254.232.10    <none>           443/TCP                  3h18m

# Kubernetes Operational View Service 중지         
$ kubectl delete -k .
serviceaccount "kube-ops-view" deleted
clusterrole.rbac.authorization.k8s.io "kube-ops-view" deleted
clusterrolebinding.rbac.authorization.k8s.io "kube-ops-view" deleted
service "kube-ops-view-redis" deleted
service "kube-ops-view" deleted
deployment.apps "kube-ops-view-redis" deleted
deployment.apps "kube-ops-view" deleted

```

{% endcode %}

### 2.2 Kubernetes Operational View 실행 화면  &#x20;

#### 2.2.1 실행 화면   &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb4Wqwrr7LV9oYUW9_9%2F-Mb4XFYuG4GBvH_zkPID%2Fimage.png?alt=media\&token=0f89b734-2891-4676-ab4e-aba30f1d27a4)

#### 2.2.2 Pod Mouse Point over    &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb4Wqwrr7LV9oYUW9_9%2F-Mb4XXyb1S0nbjVWowqi%2Fimage.png?alt=media\&token=55db9828-5c2b-4792-8be6-06ffac3fd4c0)

#### 2.2.3 화면 크게 하기   &#x20;

> <http://ServiceIP/_**#scale=2.0>\*\*\_ 로 화면 크기를 늘림.

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mb4Wqwrr7LV9oYUW9_9%2F-Mb4Y9GkJFvxluRO_1ng%2Fimage.png?alt=media\&token=57b087ed-dcea-4cf5-80f7-14ca9b85e2a1)

### 2.3 Development & Building    &#x20;

#### 2.3.1 Development&#x20;

> The app can be started in "mock mode" to work on UI features without running any Kubernetes cluster:
>
> ```
> $ pipenv install && pipenv shell
> $ (cd app && npm start &)  # watch and compile JS bundle
> $ python3 -m kube_ops_view --mock --debug
> ```

#### 2.3.2 Building   &#x20;

> The provided `Makefile` will generate a Docker image by default:
>
> ```
> $ make
> ```

### 2.4 Multiple Clusters     &#x20;

> Multiple clusters are supported by passing a list of API servers, reading a kubeconfig file or pointing to an HTTP Cluster Registry endpoint.
>
> See the [documentation on multiple clusters](https://kubernetes-operational-view.readthedocs.io/en/latest/multiple-clusters.html) for details.

### 2.5 Configuration

> The following environment variables are supported:`AUTHORIZE_URL`
>
> Optional OAuth 2 authorization endpoint URL for protecting the UI.`ACCESS_TOKEN_URL`
>
> Optional token endpoint URL for the OAuth 2 Authorization Code Grant flow.`SCOPE`
>
> Optional scope specifies level of access that the application is requesting.`CLUSTERS`
>
> Comma separated list of Kubernetes API server URLs. It defaults to `http://localhost:8001/` (default endpoint of `kubectl proxy`).`CLUSTER_REGISTRY_URL`
>
> URL to cluster registry returning list of Kubernetes clusters.`CREDENTIALS_DIR`
>
> Directory to read (OAuth) credentials from --- these credentials are only used for non-localhost cluster URLs.`DEBUG`
>
> Set to "true" for local development to reload code changes.`KUBECONFIG_PATH`
>
> Path to kubeconfig file to use for cluster access.`KUBECONFIG_CONTEXTS`
>
> Comma separated list of contexts to use when reading the kubeconfig file from `KUBECONFIG_PATH`.`MOCK`
>
> Set to "true" to mock Kubernetes cluster data.`QUERY_INTERVAL`
>
> Interval in seconds for querying clusters (default: 5). Each cluster will at most queried once per configured interval.`REDIS_URL`
>
> Optional Redis server to use for pub/sub events and job locking when running more than one replica. Example: `redis://my-redis:6379SERVER_PORT`
>
> HTTP port to listen on. It defaults to `8080`.`NODE_LINK_URL_TEMPLATE`
>
> Template to make Nodes clickable, e.g. can point to [kube-web-view](https://codeberg.org/hjacobs/kube-web-view/). `{cluster}` (cluster ID) and `{name}` (Node name) will be replaced in the URL template.`POD_LINK_URL_TEMPLATE`
>
> Template to make Pods clickable, e.g. can point to [kube-web-view](https://codeberg.org/hjacobs/kube-web-view/). `{cluster}` (cluster ID), `{namespace}` (Pod's namespace), and `{name}` (Pod name) will be replaced in the URL template.`ROUTE_PREFIX`
>
> The URL prefix under which kube-ops-view is externally reachable (for example, if kube-ops-view is served via a reverse proxy). Used for generating relative and absolute links back to kube-ops-view itself. If the URL has a path portion, it will be used to prefix all HTTP endpoints served by kube-ops-view. If omitted, relevant URL components will be derived automatically.

### 2.6 Supported Browsers

> The UI uses WebGL, ECMAScript 6, and EventSource features. The following browsers are known to work:
>
> * Chrome/Chromium 53.0+
> * Mozilla Firefox 49.0+
>
> See the [ECMAScript 6 Compatibility Table](https://kangax.github.io/compat-table/es6/) for details on supported browser versions.

### 2.7 License  &#x20;

> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
>
> This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
>
> You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.

### 2.8 출처 : <https://codeberg.org/hjacobs/kube-ops-view>

## 3. NHN Kubernetes Service(NKS) DashBoard  &#x20;

> NHN Kubernetes Service(NKS) 는 기본 웹 UI 대시보드(dashboard)를 제공합니다. Kubernetes 대시보드에 대한 자세한 내용은 [웹 UI (대시보드)](https://kubernetes.io/ko/docs/tasks/access-application-cluster/web-ui-dashboard/) 문서를 참고하세요.

### 3.1 NHN Kubernetes Service(NKS) DashBoard Install  &#x20;

> Manager 서버에서 아래의 쉘(nhn\_cloud\_dash.sh) 파일을 이용하여 실행 하면 대시보드에 접속이 가능합니다.    &#x20;

{% code title="nhn\_cloud\_dash.sh" %}

```bash
#/bin/bash

kubectl get svc kubernetes-dashboard -n kube-system
kubectl -n kube-system patch svc/kubernetes-dashboard -p '{"spec":{"type":"LoadBalancer"}}'
kubectl get svc -n kube-system
kubectl --kubeconfig=$KUBE_CONFIG -n kube-system describe secret $(kubectl --kubeconfig=$KUBE_CONFIG -n kube-system get secret | awk '/^kubernetes-dashboard-token/{print $1}') | awk '$1=="token:"{print $2}'
```

{% endcode %}

{% file src="/files/-MZGTNN2ek6P3K438m5M" %}

{% code title="nhn\_cloud\_dash.sh" %}

```bash
# nhn_cloud_dash.sh 실행 권한 부여    
ubuntu@kube-manager:~$ chmod +x nhn_cloud_dash.sh

# nhn_cloud_dash.sh 파일 실행     
ubuntu@kube-manager:~$ ./nhn_cloud_dash.sh
NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP       PORT(S)         AGE
kubernetes-dashboard   LoadBalancer   10.254.34.9   133.186.144.217   443:30826/TCP   4h10m
service/kubernetes-dashboard patched

# kube-system namespace 서비스 목록 확인
NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                  AGE
dashboard-metrics-scraper   ClusterIP      10.254.201.131   <none>            8000/TCP                 4h10m
kube-dns                    ClusterIP      10.254.0.10      <none>            53/UDP,53/TCP,9153/TCP   4h10m
kubernetes-dashboard        LoadBalancer   10.254.34.9      133.186.144.217   443:30826/TCP            4h10m
metrics-server              ClusterIP      10.254.103.255   <none>            443/TCP                  4h10m

# 대시 보드 토큰 값(로그인 토큰)      
eyJhbGciOiJSUzI1NiIsImtpZCI6IkhPSzNnRnVibWpkOHRUXzdKVUxHZDJNV3V1Z0VHRksybnJrOWhScDVaOGcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1icmJmaCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjVjYzIzZGU2LWM4NzUtNDZmNS1iYTViLTY3OGVjOTQyODE5OSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVz5-xEtugE6I5SEwoI7zhFDqYw_PJNoKhxTXXjt4DjhCumyBdPsxSHgwyeeQEqQ1KimIOQ4wSsiB1APyf8dflRF9k0I7snTBxHlDpEs9mVlhZDacV52yDBgAcomP5QwQn8ZUSuZqF-ptjuz-CXHB8IPwRLs32Qqnbf7ZB4DTU7fBc_NzCgnx_2t3bJQhNdDH89U6HxdgKsplqEQT1q0hZFNszpdtJUGF2jiXyoYLxKvZqO4ALJi_-03yziIZE4VG7IHHN81-Uf4ovGOK9dFxg28rDgDWTztZ8gcFZgDJi0c6IeyjQCE1ZZFJ81Wu8QFzmlQj_g
```

{% endcode %}

### 3.2 NHN Kubernetes Service(NKS) DashBoard 접속 확인   &#x20;

> 크롬을 이용하여 <https://133.186.219.13> 으로 접속 `접속아이피는 설정에 따라 변함`        &#x20;
>
> 접속 할 때 토큰 정보를 입력 하여 로그인      &#x20;

![그림. Kubernetes 대시 보드 접속 확인](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZAr9ubb-0zceYxIK5r%2F-MZArEBFkQ3yBcdc1ZPt%2Fimage.png?alt=media\&token=9c4b49e6-dcb0-487e-86d9-036ac6dc4b07)

> 정상적으로 로그인 후 다양한 정보를 확인 할 수 있습니다.

![그림. Kubenetes 의 다양한 정보 확인   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZAt8TVS36fQ2WWTWWG%2F-MZAupdhgJE9lUnLsQrt%2Fimage.png?alt=media\&token=c1c12713-4a52-4ee4-856b-cf61f2e91169)

### 3.3 출처 : <https://docs.toast.com/ko/Container/Kubernetes/ko/user-guide/>

## 4. WeaveScope&#x20;

> Weave Scope automatically generates a map of your application, enabling you to intuitively understand, monitor, and control your containerized, microservices-based application.
>
> &#x20;**Ensure your computer is behind a firewall that blocks.**
>
> #### Understand your Docker containers in real time
>
> [![Map you architecture](https://github.com/weaveworks/scope/raw/master/imgs/topology.png)](https://github.com/weaveworks/scope/blob/master/imgs/topology.png)
>
> Choose an overview of your container infrastructure, or focus on a specific microservice. Easily identify and correct issues to ensure the stability and performance of your containerized applications.
>
> #### Contextual details and deep linking
>
> [![Focus on a single container](https://github.com/weaveworks/scope/raw/master/imgs/selected.png)](https://github.com/weaveworks/scope/blob/master/imgs/selected.png)
>
> View contextual metrics, tags, and metadata for your containers. Effortlessly navigate between processes inside your container to hosts your containers run on, arranged in expandable, sortable tables. Easily find the container using the most CPU or memory for a given host or service.
>
> #### Interact with and manage containers
>
> [![Launch a command line.](https://github.com/weaveworks/scope/raw/master/imgs/terminals.png)](https://github.com/weaveworks/scope/blob/master/imgs/terminals.png)
>
> Interact with your containers directly: pause, restart, and stop containers. Launch a command line. All without leaving the scope browser window.
>
> #### Extend and customize via plugins
>
> Add custom details or interactions for your hosts, containers, and/or processes by creating Scope plugins. Or, just choose from some that others have already written at the GitHub [Weaveworks Scope Plugins](https://github.com/weaveworks-plugins/) organization.

### 4.1 WeaveScope Install  &#x20;

> Manager 서버에서 쉘(nhn\_cloud\_weavescope.sh) 파일을 이용하여 실행 하면 Weavescope 의 웹 페이지에 접속이 가능합니다.&#x20;

{% code title="nhn\_cloud\_weavescope.sh" %}

```bash
#/bin/bash

kubectl get pod --all-namespaces
kubectl get services --all-namespaces
kubectl apply -f 'https://cloud.weave.works/launch/k8s/weavescope.yaml'
kubectl -n weave patch svc/weave-scope-app -p '{"spec":{"type":"LoadBalancer"}}'
kubectl get services --all-namespaces
```

{% endcode %}

{% file src="/files/-MZGVIxW\_56Ln-mr9siK" %}

{% code title="nhn\_cloud\_weavescope.sh" %}

```bash
# nhn_cloud_weavescope.sh 실행 권한 부여    
ubuntu@kube-manager:~$ chmod +x nhn_cloud_weavescope.sh

# nhn_cloud_weavescope.sh 실행     
ubuntu@kube-manager:~$ ./nhn_cloud_weavescope.sh

# 전체 namespace Pod 목록 확인     
NAMESPACE     NAME                                                 READY   STATUS    RESTARTS   AGE
default       echo-799bdfb445-jnkqb                                1/1     Running   0          127m
kube-system   cluster-autoscaler-default-worker-796888b878-c22v7   1/1     Running   0          4h27m
kube-system   coredns-69785fddb8-rqmm8                             1/1     Running   0          4h28m
kube-system   coredns-69785fddb8-xtfkt                             1/1     Running   0          4h28m
kube-system   dashboard-metrics-scraper-c79c65bb7-qpplj            1/1     Running   0          4h28m
kube-system   kube-dns-autoscaler-5bfb4969c6-qwx6d                 1/1     Running   0          4h28m
kube-system   kube-flannel-ds-amd64-2t9h2                          1/1     Running   0          4h24m
kube-system   kubernetes-dashboard-7fccd7c66d-dzxwp                1/1     Running   0          4h28m
kube-system   metrics-server-7bcdd8974c-hn4h8                      1/1     Running   0          4h28m
kube-system   npd-7hzrv                                            1/1     Running   0          4h23m

# 전체 namespace 서비스 목록 확인     
NAMESPACE     NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                  AGE
default       kubernetes                  ClusterIP      10.254.0.1       <none>            443/TCP                  4h28m
kube-system   dashboard-metrics-scraper   ClusterIP      10.254.201.131   <none>            8000/TCP                 4h28m
kube-system   kube-dns                    ClusterIP      10.254.0.10      <none>            53/UDP,53/TCP,9153/TCP   4h28m
kube-system   kubernetes-dashboard        LoadBalancer   10.254.34.9      133.186.144.217   443:30826/TCP            4h28m
kube-system   metrics-server              ClusterIP      10.254.103.255   <none>            443/TCP                  4h28m

# weavescope 서비스 실행    
namespace/weave created
serviceaccount/weave-scope created
clusterrole.rbac.authorization.k8s.io/weave-scope configured
clusterrolebinding.rbac.authorization.k8s.io/weave-scope configured
deployment.apps/weave-scope-app created
service/weave-scope-app created
deployment.apps/weave-scope-cluster-agent created
daemonset.apps/weave-scope-agent created

# type 을 LoadBalancer 로 변경     
service/weave-scope-app patched

# EXTERNAL-IP 에서 공인 IP 획득       
NAMESPACE     NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                  AGE
default       kubernetes                  ClusterIP      10.254.0.1       <none>            443/TCP                  4h28m
kube-system   dashboard-metrics-scraper   ClusterIP      10.254.201.131   <none>            8000/TCP                 4h28m
kube-system   kube-dns                    ClusterIP      10.254.0.10      <none>            53/UDP,53/TCP,9153/TCP   4h28m
kube-system   kubernetes-dashboard        LoadBalancer   10.254.34.9      133.186.144.217   443:30826/TCP            4h28m
kube-system   metrics-server              ClusterIP      10.254.103.255   <none>            443/TCP                  4h28m
weave         weave-scope-app             LoadBalancer   10.254.226.22    133.186.159.43    80:32541/TCP             1s
```

{% endcode %}

### 4.2 WeaveScope 크롬 접속 확인    &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MZBqNm7YL8_OkP63E0i%2F-MZBrM3--nDdFy9nTvYL%2Fimage.png?alt=media\&token=59cab579-6cf1-4717-8752-2c4f65256877)

### 4.3 License

> Scope is licensed under the Apache License, Version 2.0. See [LICENSE](https://github.com/weaveworks/scope/blob/master/LICENSE) for the full license text.\
> Find more details about the licenses of vendored code in [VENDORED\_CODE.md](https://github.com/weaveworks/scope/blob/master/VENDORED_CODE.md).

### 4.4 출처 : <https://www.weave.works/oss/scope/> ,   <https://github.com/weaveworks/scope>

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}


# TIPs. \[NHN Cloud] NHN Kubernetes Service(NKS) 의 LoadBalancer 사용법

\[DataUs] LoadBalancer 사용 할 때 공인IP를 지정 하여 사용하는 방법(NHN Cloud Kubernetes)

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## TIPs. \[NHN Cloud] NHN Kubernetes Service(NKS)에서 LoadBalancer 사용 방법     &#x20;

### 1. NHN Kubernetes Service(NKS) 에서 LoadBalaner 사용 하기 &#x20;

> Kubernetes 에 서비스 등록 후 외부 공인IP 를 사용하여 접속 하려면 LoadBalancer 를 이용하여야 한.
>
> Service Type 에서는 "ClusterIP", "ExternalName", "LoadBalancer", "NodePort" 값이 있다.&#x20;
>
> * ClusterIP (기본값) - 클러스터 내에서 내부 IP 에 대해 서비스를 노출해준다. 이 방식은 오직 클러스터 내에서만 서비스가 접근될 수 있도록 해준다.
> * NodePort - NAT가 이용되는 클러스터 내에서 각각 선택된 노드들의 동일한 포트에 서비스를 노출시켜준다. `<NodeIP>:<NodePort>`를 이용하여 클러스터 외부로부터 서비스가 접근할 수 있도록 해준다. ClusterIP의 상위 집합이다.
> * LoadBalancer - (지원 가능한 경우) 기존 클라우드에서 외부용 로드밸런서를 생성하고 서비스에 고정된 공인 IP를 할당해준다. NodePort의 상위 집합이다.
> * ExternalName - `CNAME` 레코드 및 값을 반환함으로써 서비스를 `externalName` 필드의 내용(예를 들면, \`foo.bar.example.com\`)에 매핑한다. 어떠한 종류의 프록시도 설정되지 않는다. 이 방식은 `kube-dns` v1.7 이상 또는 CoreDNS 버전 0.0.8 이상을 필요로 한다.

{% code title="LoadBalancer 를 이용하여 공인IP 사용하기    " %}

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: http-echo
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
        image: hashicorp/http-echo
        args: ["-text", "hello-world"]
        ports:
        - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: http-echo
spec:
  ports:
  - port: 5678
    protocol: TCP
    targetPort: 5678
  selector:
    app: http-echo
  ## NodePort 가 아니라 LoadBalancer 로 설정 해 주어야 함.
  type: LoadBalancer
```

{% endcode %}

### 2. 서비스 중지 시 공인IP 유지 하기!!!!!

> 서비스를 중지 하였는데 `Loadbalancer 에 등록된 공인IP 가 같이 사라졌다!!!!!`
>
> 이를 해결하기 위해 아래와 같은 `loadbalancer.openstack.org/keep-floatingip: "true"` 값이 필요 하.
>
> {% code title="Service 의 metadata 하위에 아래의 annotations 값을 입력" %}
>
> ```
>   annotations:
>     loadbalancer.openstack.org/keep-floatingip: "true"
> ```
>
> {% endcode %}

> 아래와 같은 소스로 실행해 보자.

{% code title="서비스가 중지 되더라도 공인IP 유지하기(Floating ip 유지 설정)" %}

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: http-echo
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
        image: hashicorp/http-echo
        args: ["-text", "hello-world"]
        ports:
        - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: http-echo
  annotations:                                           ## 오브젝트 선언형 관리
    loadbalancer.openstack.org/keep-floatingip: "true"   ## Floating ip 유지 설정  
spec:
  ports:
  - port: 5678
    protocol: TCP
    targetPort: 5678
  selector:
    app: http-echo
  ## NodePort 가 아니라 LoadBalancer 로 설정 해 주어야 함.
  type: LoadBalancer
```

{% endcode %}

### 3. 사용하고 있는 공인 IP 를 LoadBalancer IP 로 설정해 보자!!!!!   &#x20;

> NHN Cloud Console 에서 Floating IP 를 할당 받고 LoadBalancer 등록 할때 고정 IP 로  yaml 파일에 적용해 보자.
>
> 할당 받은 Floating IP 는 `133.186.215.195` 이다.
>
> 이를 적용하기 위해서는 Service 의 Spec 에서 아래의 같은  값을 `loadBalancerIP: 133.186.215.195` 정보를 입력 한.

{% code title="http-echo.yaml 파일" %}

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: http-echo
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
        image: hashicorp/http-echo
        args: ["-text", "hello-world"]
        ports:
        - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: http-echo
  annotations:                                           ## 오브젝트 선언형 관리
    loadbalancer.openstack.org/keep-floatingip: "true"   ## Floating ip 설정  
spec:
  ports:
  - port: 5678
    protocol: TCP
    targetPort: 5678
  selector:
    app: http-echo
  ## NodePort 가 아니라 LoadBalancer 로 설정 해 주어야 함.
  type: LoadBalancer
  ## Floating ip 를 지정 하여 Loadbalancer ip 로 설정.
  loadBalancerIP: 133.186.215.195
  
  #####  설명   
  #####  annotations:                                            ## 오브젝트 선언형 관리 
  #####    loadbalancer.openstack.org/keep-floatingip: "true"    ## Floating ip 설정     
  #####  type: LoadBalancer
  #####  loadBalancerIP: 133.186.215.195
```

{% endcode %}

{% file src="/files/-MbeDAs2S8Ap9t\_E8Xxi" %}

### 참고 : <https://kubernetes.io/ko/docs/tasks/manage-kubernetes-objects/declarative-config/>

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}


# \[NHN Cloud] NHN Kubernetes Service(NKS) 를 이용한 커뮤니티 블로그 구축 사례

\[DataUs] 커뮤니티 블로그 구축 사례 feat. NHN Cloud(NKS)

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. 먼저 알아 두기

### 1.1 Kubernetes 란 무엇인가?    &#x20;

> [쿠버네티스(Kubernetes, 쿠베르네테스, "K8s")](https://ko.wikipedia.org/wiki/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4)는 컨테이너화된 애플리케이션의 자동 디플로이, 스케일링 등을 제공하는 관리시스템으로, 오픈 소스 기반입니다. 원래 구글에 의해 설계되었고 현재 리눅스 재단에 의해 관리되고 있습니다. 목적은 여러 클러스터의 호스트 간에 애플리케이션 컨테이너의 배치, 스케일링, 운영을 자동화하기 위한 플랫폼을 제공하기 위함입니. 도커를 포함하여 일련의 컨테이너 도구들과 함께 동작합니다.

### 1.2 NHN Kubernetes Service(NKS) 란?   &#x20;

{% hint style="success" %}
해당 서비스가 궁금하신 분들은 [NHN Cloud](https://www.toast.com/kr/service/container/nhn-kubernetes-service-nks) 에 방문 하시기 바랍니다.   &#x20;
{% endhint %}

> NHN Kubernetes Service(NKS)는 컨테이너 오케스트레이션의 사실상 표준(de-facto standard)이 되어가고 있는 Kubernetes를 쉽게 운영할 수 있도록 도와주는 서비스입니다. NHN Kubernetes Service(NKS)로 NHN Cloud에 최적화된 Kubernetes 클러스터를 쉽게 만들어 사용할 수 있습니다.
>
> NHN Cloud  클라우드에서 Kubernetes를 올바르고 안전하게 구동할 수 있게 Kubernetes 클러스터를 생성하고 관리할 수 있는 서비스입니다. 사용자는 웹 콘솔을 이용해 NHN Cloud에 꼭 맞는 Kubernetes 클러스터를 만들고 관리할 수 있습니다. 안전하고 효율적으로 운영할 수 있게 마스터는 NHN Cloud에서 관리하고, 사용자는 노드와 서비스, Pod(파드) 등을 관리합니다.
>
> NHN Kubernetes Service(NKS)의 주요 기능은 다음과 같습니다.
>
> * NHN Cloud에 꼭맞는 Kubernetes 클러스터 생성과 관리
>   * NHN Cloud의 기반 서비스와 연동
>   * 로드 밸런서를 이용한 서비스 공개
>   * 블록 스토리지와 연동한 퍼시스턴트 볼륨(Persistent Volume, PV) 지원
> * 고가용성을 보장하는 마스터 관리
> * 웹 콘솔을 이용한 쉬운 조작
>   * 클러스터 생성, 삭제, 조회
>   * 노드 그룹 생성, 삭제, 조회
>   * kubectl 설정 지원

## 2. NHN Kubernetes Service(NKS) 를 이용하여  커뮤니티 블로그를 구축 설계도        &#x20;

{% hint style="success" %}
이 글은 이전에 작성해 놓은 글인데 사용하기 쉽게 다시 작성 하게 되었습니다.

원본 글은 ["DockerFile 을 이용하여 나만의 Docker Image 만들기"](https://doc.skill.or.kr/dockerfile-docker-image) 입니다.             &#x20;
{% endhint %}

### 2.1 구축 환경  &#x20;

> * 빠른 개발을위해  최소한의 시스템으로 구성.\[NHN Kubernetes Service(NKS) 사용]
> * Manager Server 를 통해 NHN Kubernetes Service System 에 접속 &#x20;
> * Kubernetes Yaml 파일로 L4/WEB/WAS/DB 구성 &#x20;
> * Kubernetes Yaml 파일에서 Pod Image 는 Docker Hub 에 구성한 업로드 Image 사용     &#x20;
>   * [x] 커뮤니티 블로그 개발 소스 : [Github Site 방문하기](https://github.com/bc-hwang/TEST)      &#x20;
>   * [x] Docker Hub Images : [Docker Hub Site 방문하기](https://hub.docker.com/u/bchwang)&#x20;

### 2.2 아키텍처 물리 설계 구성도    &#x20;

> **대규모 3-Tier 구성 : 로드 발란스를 이용하여 3-Tier 구성을 확장하는 구성 방식. 웹 시스템의 사용자가 많은 엔터프라이즈 어플리케이션일 경우 대부분 대규모 3-Tier 구성을 이용하고 있다.**

![그림. 3-Tier 구성도     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FhVAGfxcpsKLqSrrS6Tq4%2Fimage.png?alt=media\&token=f194197a-0b20-481d-ac62-1a52bb412495)

### 2.3 Infra Instance 구성 방안  &#x20;

| TYPE               | Manager Server                  | NKS Server                                                          |
| ------------------ | ------------------------------- | ------------------------------------------------------------------- |
| Instance           | u2.c1m1                         | m2.c4m8                                                             |
| Base OS            | Ubuntu Server 20.04 LTS         | Ubuntu Server 18.04.6 LTS - Container (2022.01.20)                  |
| Block Storage Type | HDD 20GB                        | SSD 1000GB                                                          |
| IP 설정              | <p>Floating IP<br>Public IP</p> | Public IP                                                           |
| 기타 사항              | 관리 Port 외부 접속 허용                | <p>Kubernetes 버전 : v1.22.3</p><p>노드 수 : 3  <br>오토 스케일러 : 사용 안 함</p> |

### 2.4 Network 구성 방안 &#x20;

<table><thead><tr><th width="181.42640060280738">Server</th><th width="268.2982579478653">Floating IP</th><th>Public IP</th></tr></thead><tbody><tr><td>Manager Server</td><td>외부에서 접근이 가능하도 설정</td><td>NKS Server 와 접근 가능하 도록  설정          </td></tr><tr><td>NKS Server</td><td>  -</td><td>NKS System 과 접근 가능하도록 설정           </td></tr><tr><td>POD 구성</td><td>  Yaml Code 에 Loadbanacer 설정 </td><td>내부 Pod 만 연결 설정    </td></tr></tbody></table>

{% hint style="info" %}
NHN Cloud 에서 Network 설정은 [Security Groups](https://www.toast.com/kr/service/network/security-groups) 에서 알아 볼 수 있습니다.         &#x20;
{% endhint %}

### 2.5 Kubernetes Pod 구성 방안&#x20;

<table><thead><tr><th width="186.64951015322805">Service 종류 </th><th>종류</th></tr></thead><tbody><tr><td>Service Type</td><td>Floating IP(Loadbanacer)</td></tr><tr><td>WEB/WAS Service</td><td><p>Docker Hub Image : bchwang/tomcat_mariadb:nginx<em>tomcat</em><br><em>Base Image : ubuntu:20.04</em><br><em>nignx :</em> 1.18.0<br><em>Apache Tomcat : 9.0.45</em><br><em>openjdk : 1.8.0.</em>292<br><em>Nodejs : v14.17.1</em></p><p><em>Service Port : 80, 8080</em></p></td></tr><tr><td>DB Service</td><td>Docker Hub Image: bchwang/tomcat_mariadb:mariadb<br>Base Image : mariadb:10.4.18<br>Mysql root Passwd : root<br>Mysql Database : deverse<br>Home Directory : /home/dev<br>Service Port : 3306</td></tr></tbody></table>

## 3. NHN Cloud Console 에서 만들어 보자&#x20;

### 3.1 NHN Cloud Console 접속 하기  &#x20;

> NHN Cloud 에 방문 하기 - 바로가기 -  &#x20;

![그림. NHN Cloud 메인 화면        ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F0lcF6cMqsYVQ9ft6qB0D%2Fimage.png?alt=media\&token=45805f6b-44d8-4fa3-a753-1b4b07f119df)

### 3.1 NHN Cloud Instance 생성 &#x20;

> 먼저 Manager Server 를 만들어 보자&#x20;
>
> `NHN Cloud > Console > Compute > instance > 인스턴스 생성`   &#x20;

![그림. Instance 생성 -1    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FMtBw3eZAdeKh813Q2JMm%2Fimage.png?alt=media\&token=8bd72e57-f362-4dee-8a74-5e1fc22d2a3c)

![그림. Instance 생성 -2 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FBk60Avp7MZVrGIZj3Egt%2Fimage.png?alt=media\&token=bf67dc75-ba40-4022-a422-9f4137ac9948)

{% hint style="success" %}
"그림. Instance 생성 -2" 에서   인스턴스 생성 시 이미지, 인스턴스 정보를 입력 하여야 한다.

또한 u2 계열의 인스턴트 타입은 문제가 발생 되었을 경우 손해배상 대상에서  제외된다는 것을 알아두셔야 합니다. &#x20;

자세한 사항은 NHN Cloud 를 방문 하시기 바랍니다.  [- 바로가기 -](https://www.toast.com/kr/service/compute/instance)         &#x20;
{% endhint %}

![그림. Instance 생성 -3  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FU65uXpT9qTXGvjj8UPV1%2Fimage.png?alt=media\&token=c74f7b3c-f612-4b67-9d44-0fba66eeb97f)

{% hint style="success" %}
"그림. Instance 생성 -3" 에서 보안 그룹(Security Groups) 에서 접근 통제 설정을 한다.

자세한 사항은 Security Groups 를 참고하시기 바랍니다. [- 바로가기 -](https://www.toast.com/kr/service/compute/instance)   &#x20;
{% endhint %}

![그림. Instance 생성 -4    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F29plD4bDLKibTmnT58mX%2Fimage.png?alt=media\&token=f5be9fce-3dc1-473a-bc94-c7f9093afb97)

{% hint style="success" %}
"그림. Instance 생성 -4" 에서 추가 블록 스토리지, 예약 스크립트 설정을 할 수 있다.       &#x20;
{% endhint %}

![그림. Instance 생성 -5    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Fy5PsOqyRKQVv0fAcrb2v%2Fimage.png?alt=media\&token=25b05c87-3176-43d0-8e7c-7b4f15893133)

{% hint style="success" %}
"그림. Instance 생성 -4" 에서 인스턴스의 생성 정보를 확인 하고 인스턴스 생성을 통해 만들 수 있습니다.    &#x20;

인스턴스를 생성하는 순간부터 과금이 시작됨을 알아 두시기 바랍니다.             &#x20;
{% endhint %}

### 3.2 NHN Kubernetes Service(NKS) 생성&#x20;

> NHN Kubernetes Service(NKS) 를 생성 해 보자.  &#x20;
>
> `NHN Cloud > Console > Container > NHN Kubernetes Service(NKS) > 클러스터 생성`  &#x20;

![그림. NHN Kubernetes Service(NKS) 생성 -1 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FP3bguMAmhHwLyzbPcI42%2Fimage.png?alt=media\&token=0a2a487e-39e0-4cd7-bdb7-75407b191d6f)

![그림. NHN Kubernetes Service(NKS) 생성 -2      ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FbJcxvqAwEdztaIeFhsmB%2Fimage.png?alt=media\&token=36294f6d-a065-4000-9dad-b80e20da25dd)

{% hint style="info" %}
"그림. NHN Kubernetes Service(NKS) 생성 -2" 에서  클러스터 이름, 기본 노드 그룹 등 설정을하여야 합니다.      &#x20;

* 클러스터 이름 : test-kubernetes&#x20;
* Kubernetes 버전 : v1.22.3
* 기본 노드 그룹 : Ubuntu Server 18.04.6 LTS - Container (2022.01.20)
* 인스턴스  타입 : m2.c4m8
* 노드 수 : 1 이상 (최대 10)&#x20;
* 블록 스토리지 : SSD 1000GB      &#x20;
  {% endhint %}

![그림. NHN Kubernetes Service(NKS) 생성 -3      ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Fp6KL75Aw14VXO9RofaGC%2Fimage.png?alt=media\&token=b7aada46-af9f-47ce-831d-2f5ac5083aae)

{% hint style="info" %}
"그림. NHN Kubernetes Service(NKS) 생성 -3" 에서 오토 스케일러, 예약 스크립트 등의 설정이 있습니다.     &#x20;

* 사용 : 오토 스케일러에 대한 사용 여부를 선택&#x20;
* 최소 노드 수 : 1 \~ X (기본  노드 수에 따라 변경)  &#x20;
* 최대 노드 수 : 3 \~ 10
* 감축 : 오토 스케일러에 대한 감축 사용 여부를 선택
* 리소스 사용량 임계치(%) : 시스템에 따른 설정이 필요(Default : 50)
* 임계 영역 유지 시간(분) : 시스템에 따른 설정이 필요(Default : 10)
* 증설 후 감축 지연 시간(분) : 시스템에 따른 설정이 필요(Default : 10)                    &#x20;
  {% endhint %}

![그림. NHN Kubernetes Service 생성 -4    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FLdNNMEWTEdub75b1R0aR%2Fimage.png?alt=media\&token=8f268380-167e-4232-9ee1-dc275a3408bb)

{% hint style="success" %}
"그림. NHN Kubernetes Service 생성 -4" 에서 클러스터의 생성 정보를 확인 하고 클러스터 생성을 통해 만들 수 있습니다.    &#x20;

클러스터 를 생성하는 순간부터 과금이 시작됨을 알아 두시기 바랍니다.&#x20;

* 클러스터는 최대 3개까지 생성할 수 있습니다.    &#x20;
  {% endhint %}

{% hint style="danger" %}
클러스터 생성 후 접속 방법은 ["\[NHN Cloud\] NHN Kubernetes Service(NKS) 활용법"](https://doc.skill.or.kr/nhn-cloud#5.-nhn-kubernetes-service-nks) 에서 찾아 보시기 바랍다.  &#x20;
{% endhint %}

## 4. Kubernetes Yaml 만들기     &#x20;

### 4.1 NameSpace Yaml

{% code title="NameSpace.yaml" %}

```
apiVersion: v1
kind: Namespace
metadata:
  name: project
```

{% endcode %}

{% file src="/files/20UwOJz5vtjkW1ADrhoQ" %}
파일. NameSpace.yaml
{% endfile %}

### 4.2  MariaDB Yaml

{% code title="MariaDB.yaml" %}

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-mariadb
  labels:
    app: mariadb
  namespace: project
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      hostname: mariadb
      containers:
      - name: mariadb
        image: bchwang/tomcat_mariadb:mariadb
        ports:
        - containerPort: 3306
          name: mariadb
```

{% endcode %}

{% file src="/files/GbPM4A6O23Ex4h0nNasx" %}
파일. MariaDB.yaml  &#x20;
{% endfile %}

### 4.3 Mariadb Service Yaml

{% code title="MariaDB-Service.yaml" %}

```
apiVersion: v1
kind: Service
metadata:
  name: tomcat-mariadb
  labels:
    app: mariadb
  namespace: project
spec:
  clusterIP: None
  ports:
  - port: 3306
  selector:
    app: mariadb
```

{% endcode %}

{% file src="/files/xCYsVFVf0rLdlxxjV2HX" %}
파일. MariaDB-Service.yaml    &#x20;
{% endfile %}

### 4.4 Nginx & Tomcat Service Yaml

{% code title="Nginx-Tomcat-Service.yaml" %}

```
apiVersion: v1
kind: Service
metadata:
  name: nginx-tomcat
  labels:
    app: nginx-tomcat
  namespace: project
  ## 오브젝트 선언형 관리
  annotations
    ## Floating ip 유지 설정
    loadbalancer.openstack.org/keep-floatingip: "true"
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 30000
  selector:
    app: nginx-tomcat
  ## NodePort 가 아니라 LoadBalancer 로 설정 해 주어야 함.
  type: LoadBalancer
  ## Floating ip 를 지정 하여 Loadbalancer ip 로 설정.
  loadBalancerIP: 133.186.216.107
```

{% endcode %}

{% file src="/files/7GJzzlHZStwvtwAelCpa" %}
파일. Nginx-Tomcat-Service.yaml &#x20;
{% endfile %}

### 4.5 Nginx & Tomcat Yaml&#x20;

> 아래의 내용 중 hostAliases 의 ip 정보가 mariadb 의 IP 정보를 입력 하여야 함.
>
> MariaDB 를 실행 한 후에 `kuberctl get pod -n project` 로 나온 IP 값을 입력 하면 됨.

{% code title="Nginx-Tomcat.yaml" %}

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-tomcat
  labels:
    app: nginx-tomcat
  namespace: project
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx-tomcat
  template:
    metadata:
      labels:
        app: nginx-tomcat
      name: nginx-tomcat
    spec:
      hostname: nginx-tomcat
      hostAliases:
      - ip: "10.100.4.9" ### mariadb hosts 지정
        hostnames:
        - "mariadb"
      containers:
      - name: nginx-tomcat
        image: bchwang/tomcat_mariadb:nginx_tomcat
        ports:
        - containerPort: 80
          name: nginx-tomcat
```

{% endcode %}

{% file src="/files/PKPBnuMPUxnVyEqQlC4O" %}
파일. Nginx-Tomcat.yaml &#x20;
{% endfile %}

## 5. NHN Kubernetes Service(NKS) 를 이용하여 커뮤니티 블로그 실행&#x20;

### 5.1 NHN Kubernetes Service(NKS) 실행 하기 &#x20;

{% code title="NHN Cloud Manager Server 접속 " %}

```
### mariadb 및 서비스 실행   
$ kubectl apply -f 1.kubernetes_mariadb+service.yaml

### Mariadb Pod 실행 및 IP 정보 확인     
$ kubectl get pod -n project -o wide
NAME                                        READY     STATUS    RESTARTS   AGE          IP            NODE       NOMINATED NODE   READINESS GATES
mariadb-service-59868b7dd6-xb8tq            1/1       Running   0          1m           10.100.4.9    kubernetes   <none>           <none>

### ip 입력 후 nginx & tomcat 실행    
kubectl apply -f 2.kubernetes_nginx+tomcat.yaml

### Pod 실행 및 IP 정보 확인     
$ kubectl get pod -n project -o wide
NAME                                        READY     STATUS    RESTARTS   AGE          IP            NODE       NOMINATED NODE   READINESS GATES
mariadb-service-59868b7dd6-xb8tq            1/1       Running   0          1m           10.100.4.9    kubernetes   <none>           <none>
nginx_tomcat-service-59868b7dd6-xb8tq       1/1       Running   0          1m           10.100.4.10   kubernetes   <none>           <none>

### Service 정보 확인     
$ kubectl get service -n project -o wide
NAMESPACE              NAME                            TYPE         CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE     SELECTOR
nginx_tomcat           nginx_tomcat                    LoadBalancer 133.186.216.107 <none>        80/TCP                   8m4s    app=nginx_tomcat
mariadb                mariadb                         ClusterIP    <none>          <none>        3306/TCP                 18m4s   app=mariadb 
```

{% endcode %}

{% hint style="success" %}
아래의 yaml 파일을 정리 하여 첨부 하였습니다.       &#x20;
{% endhint %}

{% file src="/files/lyWHUrRoYyba5ZK849IU" %}
파일.  1.kubernetes\_mariadb+service.yaml&#x20;
{% endfile %}

{% file src="/files/r092swlowKVtRJlvXVV9" %}
파일. 2.kubernetes\_nginx+tomcat.yaml &#x20;
{% endfile %}

### 5.2 크롬 접속 화면    &#x20;

![그림. 커뮤니티 블로그 접속 화면         ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FFwFoKzjXRf0p4yU4fb6N%2Fimage.png?alt=media\&token=ee3e4f33-cd3b-42f5-a9b5-79e5a95de47c)

## 6. 문의하기 &#x20;

> Docker or NHN Kubernetes Service 가 궁금하신 분들은 아래의 메일로 보내주시기 바랍니다.      &#x20;
>
> * E-Mail : <hwang79xx@msn.com>&#x20;

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정**: <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}


# \[NHN Cloud] YouTube 사용자 가이드

\[NHN Cloud] YouTube 정보

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## :tada: NHN Cloud YouTube 사용자 가이드 :tada: &#x20;

## 1. NHN Cloud 시작하기 &#x20;

> * \[STEP1] 회원가입&#x20;
> * \[STEP2] 결제 수단 등록
>   * NHN Cloud 접속 : <https://www.toast.com/kr>&#x20;

{% embed url="<https://youtu.be/zkh3VPCfc1E>" %}
그림. NHN Cloud 시작하기       &#x20;
{% endembed %}

## 2. NHN Cloud Console 시작하기

> * \[STEP1] 조직 관리
> * \[STEP2] 프로젝트 관리     &#x20;

{% embed url="<https://youtu.be/PphP9zBrHeI>" %}
그림. NHN Cloud Console 시작하기      &#x20;
{% endembed %}

## 3. NHN Cloud 서버 구축하기

> * \[STEP1] Instance 생성하기&#x20;
> * \[STEP2] 키 페어 생성하기  &#x20;
> * \[STEP3] 추가 설정 확인하기 &#x20;

{% embed url="<https://youtu.be/Ig-DjAj7xcY>" %}
그림. NHN Cloud 서버 구축하기      &#x20;
{% endembed %}

## 4. NHN Cloud 사용자 OS 만들기        &#x20;

> * \[STEP1] Image 생성하기   &#x20;

{% embed url="<https://youtu.be/X_p4ouMDCck>" %}
그림. NHN Cloud 사용자 OS 만들기        &#x20;
{% endembed %}

## 5. NHN Cloud 인스턴스 부하\[Load] 방지하기         &#x20;

> * \[STEP1] 인스턴스 템플릿 만들기&#x20;
> * \[STEP2] 스케일링 그룹 만들기           &#x20;

{% embed url="<https://youtu.be/6ON5y6Dlk7w>" %}
그림. NHN Cloud 인스턴스 부하\[Load] 방지하기           &#x20;
{% endembed %}

## 6. NHN Cloud 인스턴스 모니터링하기        &#x20;

> * \[STEP1] 모니터링 기능 이용하기&#x20;
> * \[STEP2] 모니터링 알림 받기                &#x20;

{% embed url="<https://youtu.be/G1mQTC_pNAk>" %}
그림. NHN Cloud 인스턴스 모니터링하기              &#x20;
{% endembed %}

## 7. NHN Cloud 인스턴스 접속하기     &#x20;

> * \[STEP1] Linux 인스턴스 접속하기
> * \[STEP2] Windows 인스턴스 접속하기                &#x20;

{% embed url="<https://youtu.be/O8xhss2uyjk>" %}
그림. NHN Cloud 인스턴스 접속하기         &#x20;
{% endembed %}

## 8. NHN Cloud 네트워크 구성하기          &#x20;

> * \[STEP1] 대역 설정하기&#x20;
> * \[STEP2] 서브넷 생성하기&#x20;
> * \[STEP3] 인터넷 게이트웨이 생성하기                    &#x20;

{% embed url="<https://youtu.be/faX5L2XA_78>" %}
그림. NHN Cloud 네트워크 구성하기           &#x20;
{% endembed %}

## 9. NHN Cloud 네트워크 설정하기         &#x20;

> * \[STEP1] 서로 다른 두 개의 VPC 연결하기&#x20;
> * \[STEP2] 외부 연결 IP 생성하기&#x20;
> * \[STEP3] 인스턴스 보호하기                         &#x20;

{% embed url="<https://youtu.be/qLjzBebDaqE>" %}
그림. NHN Cloud 네트워크 설정하기         &#x20;
{% endembed %}

## 10. NHN Cloud 접속량 분산하기       &#x20;

> * \[STEP1] 로드밸런서 만들기&#x20;
> * \[STEP2] IP 접근 제어하기&#x20;
> * \[STEP3] 로드밸런서 확인하기                       &#x20;

{% embed url="<https://youtu.be/NQsVhkLuo5o>" %}
그림. NHN Cloud 접속량 분산하기  &#x20;
{% endembed %}

## 11. NHN Cloud 가상 디스크 추가하기      &#x20;

> * \[STEP1] 블록 스토리지 생성하기&#x20;
> * \[STEP2] 스냅숏으로 백업하기                   &#x20;

{% embed url="<https://youtu.be/ELSWkexXKiM>" %}
그림. NHN Cloud 가상 디스크 추가하기  &#x20;
{% endembed %}

## 12. NHN Cloud Linux 빈 블록 스토리지 사용하기       &#x20;

> * \[STEP1] 파티션 생성하기&#x20;
> * \[STEP2] 파티션 포맷하기
> * \[STEP3] 디스크 연결하기&#x20;
> * \[STEP4] 재부팅 시 자동으로 마운트하기                                  &#x20;

{% embed url="<https://youtu.be/HQhD932TUrY>" %}
그림. NHN Cloud Linux 빈 블록 스토리지 사용하기&#x20;
{% endembed %}

## 13. NHN Cloud Windows 빈 블록 스토리지 사용하기    &#x20;

> * \[STEP1] Windows 블록 스토리지 생성하기
> * \[STEP2] 볼륨 추가하기                &#x20;

{% embed url="<https://youtu.be/0pUzeSMDKBU>" %}
그림. NHN Cloud Windows 빈 블록 스토리지 사용하기 &#x20;
{% endembed %}

## 14. NHN Cloud 스토리지 공유하기       &#x20;

> * \[STEP1] NAS 서비스 이용하기
> * \[STEP2] Volume 증성하기&#x20;
> * \[STEP3] Volume 연결하기               &#x20;

{% embed url="<https://youtu.be/4P0t4Ttr7z8>" %}
그림. NHN Cloud 스토리지 공유하기 &#x20;
{% endembed %}

## 15. NHN Cloud MySql 데이터베이스 이용하기&#x20;

> * \[STEP1] MySql 인스턴스 생성하기&#x20;
> * \[STEP2] MySql 시작하기&#x20;
> * \[STEP3] MySql 초기 설정하기                &#x20;

{% embed url="<https://youtu.be/VSQzrFv6ZvI>" %}
그림. NHN Cloud Mysql 데이터베이스 이용하기 &#x20;
{% endembed %}

## 16. NHN Cloud MS-SQL 데이터베이스 이용하기 &#x20;

> * \[STEP1] MS-SQL 인스턴스 생성하기&#x20;
> * \[STEP2] 인증모드 설정하기
> * \[STEP3] 서비스 포트 변경하기&#x20;
> * \[STEP4] 데이터베이스 기본 위치 변경하기                                 &#x20;

{% embed url="<https://youtu.be/RF4soK__K2s>" %}
그림. NHN Cloud MS-SQL 데이터베이스 이용하기 &#x20;
{% endembed %}

## 17. NHN Cloud 서버로 콘텐츠 배포하기  &#x20;

> * \[STEP1] CDN 서비스 생성하기&#x20;
> * \[STEP2] CDN 서비스 설정하기&#x20;
> * \[STEP3] CDN 감시 설정하기&#x20;
> * \[STEP4] CDN 통계 확인하기                        &#x20;

{% embed url="<https://youtu.be/fDkH2ewVA6Y>" %}
그림. NHN Cloud 서버로 콘텐츠 배포하기 &#x20;
{% endembed %}

## 18. NHN Cloud 서비스에서 사용하는 이미지 관리하기 &#x20;

> * \[STEP1] 폴더 및 이미지 파일 관리하기&#x20;
> * \[STEP2] 썸네일 관리하기                   &#x20;

{% embed url="<https://youtu.be/vOZBS4FZHnM>" %}
그림. NHN Cloud 서비스에서 사용하는 이미지 관리하기 &#x20;
{% endembed %}

## 19. NHN Cloud 모바일 앱 보호하기    &#x20;

> * \[STEP1] 모바일 앱 AppGuard 적용하기&#x20;
> * \[STEP2] 차단 정책 관리하기 &#x20;
> * \[STEP3] 대시보드 활용하기
> * \[STEP4] 블랙리스트 관리하기                                 &#x20;

{% embed url="<https://youtu.be/LFr808vEHlI>" %}
그림. NHN Cloud 모바일 앱 보호하기 &#x20;
{% endembed %}

## 20. NHN Cloud 애플리케이션 배포하기  &#x20;

> * \[STEP1] 애플리케이션 배포하기
> * \[STEP2] 클라이언트 애플리케이션 배포 설정하기&#x20;
> * \[STEP3] 서버 애플리케이션 배포 설정하기                                        &#x20;

{% embed url="<https://youtu.be/oVyGlPTOyNg>" %}
그림. NHN Cloud 애플리케이션 배포하기 &#x20;
{% endembed %}

## 21. NHN Cloud 리소스 관리하기 &#x20;

> * \[STEP1] 파일 그룹 생성하기&#x20;
> * \[STEP2] 리소스 배포하기               &#x20;

{% embed url="<https://youtu.be/Fcc0g0E6-r0>" %}
그림. NHN Cloud 리소스 관리하기 &#x20;
{% endembed %}

## 22. NHN Cloud 서비스 장애 관리하기  &#x20;

> * \[STEP1] 서비스 관리하기&#x20;
> * \[STEP2] 모니터링하기&#x20;
> * \[STEP3] 전파 현황 확인하기&#x20;
> * \[STEP4] 일시적으로 전파 중지하기                                 &#x20;

{% embed url="<https://youtu.be/cdJ1aXLjqcE>" %}
그림. NHN Cloud 서비스 장애 관리하기 &#x20;
{% endembed %}

## 23. NHN Cloud API 생성 및 배포하기   &#x20;

> * \[STEP1] 도메인 생성하기&#x20;
> * \[STEP2] 엔드포인트 관리하기&#x20;
> * \[STEP3] 플러그인 살펴보기&#x20;
> * \[STEP4] 통계 조회하기                             &#x20;

{% embed url="<https://youtu.be/pSEkwydygww>" %}
그림. NHN Cloud API 생성 및 배포하기 &#x20;
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}


# \[NHN Cloud] Dooray 사용자 가이드

\[NHN Cloud] YouTube 정보

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

## :tada: NHN Dooray YouTube 사용자 가이드 :tada:

> * Dooray!는 [NHN Dooray](https://namu.wiki/w/NHN%20Dooray)가 서비스하는 협업 플랫폼으로 프로젝트, 메신저, 메일, 캘린더, 드라이브, 위키, 주소록, 결재와 같이 온라인에서 협업하는데 필요한 도구를 통합하여 제공하는 서비스이다.
> * macOS, Windows, iOS, Android는 물론 웹까지 다섯 가지의 플랫폼으로 제공되므로, 실질적으로 운영체제에 무관하게 사용 가능하다.
> * Dooray Home Page : <https://dooray.com/home/>
> * Dooray 가격 정책 : 25인 미만 사용 기업은 무료 [(자세히 보기)](https://dooray.com/home/pricing/)     &#x20;

## 1. NHN Dooray 프로젝트 생성하기        &#x20;

{% embed url="<https://youtu.be/CRzv4YuCHQ4>" %}
그림. NHN Dooray 프로젝트 생성하기          &#x20;
{% endembed %}

## 2. NHN Dooray 멤버 초대하기        &#x20;

{% embed url="<https://youtu.be/7wQIw1Kwgps>" %}
그림. NHN Dooray 멤버 초대하기&#x20;
{% endembed %}

## 3. NHN Dooray 멤버 관리하기     &#x20;

{% embed url="<https://youtu.be/BkxnihA7zZ0>" %}
그림. NHN Dooray 멤버 관리하기 &#x20;
{% endembed %}

## 4. NHN Dooray 업무 등록하기      &#x20;

{% embed url="<https://youtu.be/wctbwM4gb7Y>" %}
그림. NHN Dooray 업무 등록하기 &#x20;
{% endembed %}

## 5. NHN Dooray 담당 업무 확인과 업무 읽기        &#x20;

{% embed url="<https://youtu.be/A2riDp_7vGs>" %}
그림. NHN Dooray 담당 업무 확인과 업무 읽기 &#x20;
{% endembed %}

## 6. NHN Dooray 담당자가 2명 이상일 때 업무의 상태 변경과 업무의 이력 확인                &#x20;

{% embed url="<https://youtu.be/ADIK6u9a1Qw>" %}
그림. NHN Dooray 담당자가 2명 이상일 때 업무의 상태 변경과 업무의 이력 확인&#x20;
{% endembed %}

## 7. NHN Dooray 댓글 달기    &#x20;

{% embed url="<https://youtu.be/0XJwUdHjwf4>" %}
그림. NHN Dooray 댓글 달기&#x20;
{% endembed %}

## 8. NHN Dooray 업무의 이력 확인과 댓글로 담당자·참조자 변경하기          &#x20;

{% embed url="<https://youtu.be/yxIUg7kG-28>" %}
그림. NHN Dooray 업무의 이력 확인과 댓글로 담당자·참조자 변경하기&#x20;
{% endembed %}

## 9. NHN Dooray 태그 설정하고 업무에 적용하기             &#x20;

{% embed url="<https://youtu.be/EcXJ3sazPlo>" %}
그림. NHN Dooray 태그 설정하고 업무에 적용하기 &#x20;
{% endembed %}

## 10. NHN Dooray 마일스톤 설정하고 업무에 적용하기                &#x20;

{% embed url="<https://youtu.be/NL_KKCFKC-Q>" %}
그림. NHN Dooray 마일스톤 설정하고 업무에 적용하기 &#x20;
{% endembed %}

## 11. NHN Dooray 드라이브에 파일 올리기           &#x20;

{% embed url="<https://youtu.be/hK-L_07XXu8>" %}
그림. NHN Dooray 드라이브에 파일 올리기
{% endembed %}

## 12. NHN Dooray 드라이브 파일 편집하기           &#x20;

{% embed url="<https://youtu.be/H2seWiD2ZCw>" %}
그림. NHN Dooray 드라이브 파일 편집하기&#x20;
{% endembed %}

## 13. NHN Dooray 사용할 편집기의 선택         &#x20;

{% embed url="<https://youtu.be/CchzvcRiZ60>" %}
그림. NHN Dooray 사용할 편집기의 선택  &#x20;
{% endembed %}

## 14. NHN Dooray HTML 모드로 글 입력하기        &#x20;

{% embed url="<https://youtu.be/qQOJ_u_YvI4>" %}
그림. NHN Dooray HTML 모드로 글 입력하기 &#x20;
{% endembed %}

## 15. NHN Dooray 마크다운 모드로 글 입력하기           &#x20;

{% embed url="<https://youtu.be/IUanqLoSQkg>" %}
그림. NHN Dooray 마크다운 모드로 글 입력하기 &#x20;
{% endembed %}

## 16. NHN Dooray 텍스트 형식의 문서를 파워포인트처럼 보기                &#x20;

{% embed url="<https://youtu.be/1dUwfBQ7Sc8>" %}
&#x20;그림. NHN Dooray 텍스트 형식의 문서를 파워포인트처럼 보기  &#x20;
{% endembed %}

## 17. NHN Dooray 위키페이지 생성하기         &#x20;

{% embed url="<https://youtu.be/L6lhdYmJOTo>" %}
그림. NHN Dooray 위키페이지 생성하기 &#x20;
{% endembed %}

## 18. NHN Dooray 위키페이지의 변경 내역 추적하고 복원하기                  &#x20;

{% embed url="<https://youtu.be/B5Z5GptiI_0>" %}
그림. NHN Dooray 위키페이지의 변경 내역 추적하고 복원하기 &#x20;
{% endembed %}

## 19. NHN Dooray 대괄호를 이용한 업무, 위키, 드라이브의 참조               &#x20;

{% embed url="<https://youtu.be/uLPwMwURjfA>" %}
그림. NHN Dooray 대괄호를 이용한 업무, 위키, 드라이브의 참조&#x20;
{% endembed %}

## 20. NHN Dooray 프로젝트 권한 설정과 수정           &#x20;

{% embed url="<https://youtu.be/J7s98W8QaUc>" %}
그림. NHN Dooray 프로젝트 권한 설정과 수정 &#x20;
{% endembed %}

## 21. NHN Dooray 업무 상태의 종류와 변경          &#x20;

{% embed url="<https://youtu.be/775B0o92Wfc>" %}
그림. NHN Dooray 업무 상태의 종류와 변경  &#x20;
{% endembed %}

## 22. NHN Dooray 보드 기능 활용 - 업무를 칸반보드처럼              &#x20;

{% embed url="<https://youtu.be/A8x_n0G634o>" %}
그림. NHN Dooray 보드 기능 활용 - 업무를 칸반보드처럼 &#x20;
{% endembed %}

## 23. NHN Dooray 자동화 기능을 이용해서 담당자 자동 지정하기                    &#x20;

{% embed url="<https://youtu.be/mCrOt_IuMLw>" %}
그림. NHN Dooray 자동화 기능을 이용해서 담당자 자동 지정하기 &#x20;
{% endembed %}

## 24. NHN Dooray 플래닝 기능 활용하기 마일스톤 간 업무 분배                  &#x20;

{% embed url="<https://youtu.be/DnH-s6SR7cc>" %}
그림. NHN Dooray 플래닝 기능 활용하기 마일스톤 간 업무 분배 &#x20;
{% endembed %}

## 25. NHN Dooray 업무 템플릿 작성과 활용          &#x20;

{% embed url="<https://youtu.be/D1iXDu_-1-U>" %}
그림. NHN Dooray 업무 템플릿 작성과 활용 &#x20;
{% endembed %}

## 26. NHN Dooray 외부와 협업하기 - 업무와 파일 공유             &#x20;

{% embed url="<https://youtu.be/p443jQRFfkM>" %}
그림. NHN Dooray 외부와 협업하기 - 업무와 파일 공유 &#x20;
{% endembed %}

## 27. NHN Dooray 외부와 협업하기 - 프로젝트에서 외부 메일로 협업                     &#x20;

{% embed url="<https://youtu.be/tzRSbNJzz3I>" %}
그림. NHN Dooray 외부와 협업하기 - 프로젝트에서 외부 메일로 협업 &#x20;
{% endembed %}

## 28. NHN Dooray 메일 연동으로 작은 고객센터 만들어보기               &#x20;

{% embed url="<https://youtu.be/AfbS_NEdytw>" %}
그림. NHN Dooray 메일 연동으로 작은 고객센터 만들어보기 &#x20;
{% endembed %}

## 29. NHN Dooray 캘린더 연동하기       &#x20;

{% embed url="<https://youtu.be/3J6Ln2Yzgek>" %}
그림. NHN Dooray 캘린더 연동하기 &#x20;
{% endembed %}

## 30. NHN Dooray 자동으로 번역하기 (프로젝트, 메일, 업무, 위키, 메신저)

{% embed url="<https://youtu.be/9E_UswRu_IE>" %}
그림. NHN Dooray 자동으로 번역하기 (프로젝트, 메일, 업무, 위키, 메신저) &#x20;
{% endembed %}

## 31. NHN Dooray 검색하기 - 특정 프로젝트

{% embed url="<https://youtu.be/0EQEZppkx4E>" %}
그림. NHN Dooray 검색하기 - 특정 프로젝트&#x20;
{% endembed %}

## 32. NHN Dooray 검색하기 - 프로젝트 전체

{% embed url="<https://youtu.be/JA6-1-MQNSg>" %}
그림. NHN Dooray 검색하기 - 프로젝트 전체 &#x20;
{% endembed %}

## 33. NHN Dooray 바 캘린더로 일정 확인하기

{% embed url="<https://youtu.be/uk9G6NB2tPA>" %}
그림. NHN Dooray 바 캘린더로 일정 확인하기  &#x20;
{% endembed %}

## 34. NHN Dooray 다른 캘린더와 연동하기 (구독, 발행)

{% embed url="<https://youtu.be/jtr5XNtMzsM>" %}
그림. NHN Dooray 다른 캘린더와 연동하기 (구독, 발행) &#x20;
{% endembed %}

## 35. NHN Dooray 웹 캘린더 활용하기

{% embed url="<https://youtu.be/DHehvvFguo0>" %}
그림. NHN Dooray 웹 캘린더 활용하기 &#x20;
{% endembed %}

## 36. NHN Dooray 캘린더 활용하기 - 일정 확인, 이동시간 설정, 길찾기&#x20;

{% embed url="<https://youtu.be/58W0oKjRBGo>" %}
그림. NHN Dooray 캘린더 활용하기 - 일정 확인, 이동시간 설정, 길찾기  &#x20;
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}


# NHN, AWS, Tencent, KT Cloud Calculator

NHN, AWS, Tencent, KT Cloud 가격 조회 사이트

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. NHN Cloud Calculator&#x20;

* <https://www.toast.com/kr/pricing/calculator>

![그림. NHN Cloud Calculator  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Me93tLTYQ9Xg7eN10dq%2F-Me94TDxlYyW71VkXmRB%2Fimage.png?alt=media\&token=f3df3939-bad8-482a-8d6a-c1d65cb0bea5)

## 2. Amazon Web Service Simple monthly Calculator&#x20;

* <https://calculator.s3.amazonaws.com/index.html>

![그림. AWS Calculator   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Me9-b5CkhuxeSyeuSI0%2F-Me93rIF1S5DoqrITc_U%2Fimage.png?alt=media\&token=ac0592e1-e697-426d-b75e-ecec4a375b53)

## 3. Tencent Cloud Calculator&#x20;

* [https://buy.intl.cloud.tencent.com](https://buy.intl.cloud.tencent.com/pricing/cvm/calculator?devPayMode=hourly\&regionId=33\&zoneId=330001\&instanceType=S5.MEDIUM4\&imageType=linux\&systemDiskType=CLOUD_PREMIUM\&systemDiskSize=50\&bandwidthType=TRAFFIC_POSTPAID_BY_HOUR\&bandwidth=1)

![그림. Tencent Cloud Calculator  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Me951ABZhOWXBqdvuAD%2F-Me95jcyWgDlMdNZvDmj%2Fimage.png?alt=media\&token=e61dc63f-4225-4875-aa48-343e15cc43d5)

## 4. KT Cloud Calculator&#x20;

* <https://cloud.kt.com/portal/p_pay_calcul.html>

![그림. KT Cloud Calculator   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Me964dZBB8FP46wt-eR%2F-Me96QejqQTWXhYNHtrL%2Fimage.png?alt=media\&token=959a8002-a9eb-44ca-b5af-15723d93de01)

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}


# \[취업정보] 2022's Cloud Job Infomations

클라우드 취업 정보 공유

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

## NHN Cloud 시즌채용 &#x20;

![그림. NHN Cloud 시즌채용        ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FExvr65J3FAP6cfQZmFxg%2Fimage.png?alt=media\&token=575a14bc-1f3e-41cf-a4ee-1eabb938e9c1)

### 자세한 정보는 NHN Cloud 채용 사이트에서 확인 하시기 바랍니다. [- 바로 가기 -](https://www.nhncloud-seasonrecruit.com/)       &#x20;

## 2022 클라우드 취업 박람회&#x20;

![그림. 2022 클라우드 취업 박람회                ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FSxYAowpfjLuqkJZfHUzk%2Fimage.png?alt=media\&token=64587015-df79-4725-90c4-4bcd6c57c04e)

### **□ 기업소개 및 채용 직무 등 관련 자료** (\*\* 참여 기업 소개 자료 입니다.)

[2022\_클라우드\_취업박람회\_이노그리드.pdf (111.953 KiB)](https://cfile1.onoffmix.com/attach/yiYBIRhbcZouOEsQ8zl0rmwxC13MfKND)

[2022\_클라우드\_취업박람회\_메가존클라우드.pdf (120.127 KiB)](https://cfile1.onoffmix.com/attach/5fGStCP7sloT2qyibDeBX9jH4FIUYNLK)

[2022\_클라우드\_취업박람회\_디딤365.pdf (223.73 KiB)](https://cfile1.onoffmix.com/attach/OLDlSFbVGI4zU2JBXvi5WpHPNeh6ERj7)

[2022\_클라우드\_취업박람회\_케이티클라우드.pdf (110.703 KiB)](https://cfile1.onoffmix.com/attach/zxZ9qC4QFo7LhmT8cV6uUbjGvJwRHd20)&#x20;

관심 있는 분들은 신청 해 보시기 바랍니다.

### 자세한 사항은 onoffmix 에서 확인 해 보시기 바랍니다. [- 바로가기 -](https://onoffmix.com/event/254365)&#x20;

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}


# Docker 관리 UI Manager Tool

\[https\://doc.skill.or.kr] Docker 관리 UI 전용 툴

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. 먼저 알아 두기 &#x20;

### 1.1 도커(docker) 란?&#x20;

> ***도커(Docker)***&#xB294; 리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트이다. 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싸며 리눅스에서 운영 체제 수준 가상화의 추상화 및 자동화 계층을 추가적으로 제공한다. 도커는 cgroups와 커널 이름 공간과 같은 리눅스 커널, 또 aufs와 같은 유니언 가능 파일 시스템의 리소스 격리 기능을 사용하며, 이를 통해 독립적인 "컨테이너"가 하나의 리눅스 인스턴스 안에서 실행할 수 있게 함으로써 가상 머신을 시작하여 ***유지보수 해야 하는 부담을 없애준다.***

### 1.2 도커(docker) 사용 도구

#### 1.2.1 Docker Compose&#x20;

> Compose는 멀티 컨테이너 도커 애플리케이션을 정의하고 실행하는 도구이다. YAML 파일을 사용하여 애플리케이션의 서비스를 구성하며 하나의 명령을 가지고 모든 컨테이너의 생성 및 시작 프로세스를 수행한다.

#### 1.2.2 Docker Swarm

> Docker Swarm은 도커 컨테이너의 네이티브 클러스터링 기능을 제공하며 도커 엔진을 하나의 가상 도커 엔진으로 탈바꿈시킨다. 도커 1.12 이상부터 Swarm 모드가 도커 엔진에 통합되어 있다.

### 1.3 도커허브 이미지  (hub.docker.com) &#x20;

#### 1.3.1 uifd/ui-for-docker (해당 이미지 사용)  : [바로가기](https://hub.docker.com/r/uifd/ui-for-docker) &#x20;

> Docker용 UI는 Docker Remote API용 웹 인터페이스입니다. 목표는 순수한 클라이언트 측 구현을 제공하여 도커를 연결하고 관리하는 것이 수월하도록 하는 것입니다.
>
> 세부 사항 및 추가 사항은 제작사 홈페이지 [바로가기](https://hub.docker.com/r/uifd/ui-for-docker)를 참고하시기 바랍니다.    &#x20;

## 2. Docker 관리 UI Manager Tool &#x20;

### 2.1 Docker 관리 UI Manager Tool 이란?&#x20;

> Docker용 UI는 Docker Remote API용 웹 인터페이스입니다. 목표는 순수한 클라이언트 측 구현을 제공하여 도커를 연결하고 관리하는 것이 수월하도록 하는 것입니다.

### 2.2 Docker 관리 UI Manager Tool 의 목표는? &#x20;

> * 최소한의 종속성 - 이 프로젝트를 순수한 html/js 앱으로 유지하고 싶습니다.
> * 일관성 - 웹 UI는 docker CLI에 있는 명령과 일치해야 합니다.

### 2.3 UI For Docker 의 Docker Hub 및 GitHub 주소   &#x20;

> * Docker Hub Site : <https://hub.docker.com/r/uifd/ui-for-docker>
> * GitHub Site : <https://github.com/kevana/ui-for-docker>

## 3 Docker 관리 UI Manager Tool 의 실행 및 접속 방법?

### 3.1. 실행 방법  &#x20;

```
# docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker
Unable to find image 'uifd/ui-for-docker:latest' locally
latest: Pulling from uifd/ui-for-docker
841194d080c8: Pull complete
Digest: sha256:fe371ff5a69549269b24073a5ab1244dd4c0b834cbadf244870572150b1cb749
Status: Downloaded newer image for uifd/ui-for-docker:latest
77f4719a1bd888b9dc3c0f5ed7960253bf0f5c1ed6c294d56d32fc7a05676083

# docker ps
CONTAINER ID   IMAGE                COMMAND            CREATED         STATUS         PORTS                    NAMES
77f4719a1bd8   uifd/ui-for-docker   "/ui-for-docker"   5 seconds ago   Up 3 seconds   0.0.0.0:9000->9000/tcp   happy_bhabha
```

### 3.2 접속 방법&#x20;

> 크롬으로  <http://localhost:9000> 으로 접속  &#x20;

![그림. UI For Docker 접속 화면 (Dashboard)    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Ffmnhf21xzQozpMNBFrjk%2Fimage.png?alt=media\&token=ee727ab3-3cb9-4aae-8913-8ddcd5b1d1ee)

## 4. 화면 설명  &#x20;

### 4.1 DashBoard 정보 &#x20;

![그림. DashBoard ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FpWGM4jCnPvF7BfPA7mxT%2Fimage.png?alt=media\&token=fa209f1d-76ee-4962-8378-9c4fbe07e4bd)

### 4.2 Containers 정보

#### 4.2.1 Container  정보 &#x20;

![그림. Containers       ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F4jupn0FnPppWWXKImWAp%2Fimage.png?alt=media\&token=ea041c7d-0c78-4193-a512-23d12eb1c178)

#### 4.2.1-1 Containers > Actions 정보    &#x20;

![그림. Continers > Actions   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FmyGa69GmI6RVBGa1xC1z%2Fimage.png?alt=media\&token=e6726321-cb9a-440b-a7a9-597db5194c3b)

#### 4.2.2 Containers > Names 정보&#x20;

![그림. Containers > Names  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F4Ct6Usx4eNjvDZuAqdfO%2Fimage.png?alt=media\&token=a21000ab-7287-4a48-b6f0-2b5b6053f2c6)

#### 4.2.3 Containers > Images 정보  &#x20;

![그림. Containers > Images   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FePgr9RfYmrQyZUg1459M%2Fimage.png?alt=media\&token=c202abcd-f921-4fc5-9c19-6d251abeac73)

#### 4.2.4 Containers > Log 정보 &#x20;

![그림. Containers > Log  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F5aJzFkhmW5sL18s3Ba8r%2Fimage.png?alt=media\&token=12aa1c09-c83a-465c-bfd2-0d698e4eafb7)

### 4.3 Containers Network 정보  &#x20;

![그림. Containers Network  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FldqbiBllfEYB6oZ0DCs8%2Fimage.png?alt=media\&token=b5248208-adb9-42c8-842c-5d17d1734f69)

### 4.4 Images 정보 &#x20;

4.4.1 Images 정보  &#x20;

![그림. Images   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F0OvzwtZN64HfTOy0j3kn%2Fimage.png?alt=media\&token=839e7471-ea09-464a-9d29-815bb0bb51b0)

4.4.2 Images > Actions&#x20;

![그림. Images > Actions   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FiDn1l21yVk3jhxjvCF8e%2Fimage.png?alt=media\&token=94397dc2-56a1-4361-83a1-a1006ee917eb)

#### 4.4.3 Images > Pull &#x20;

![그림. Images > Pull    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FYzbGHKJ0AhLTJeqIPbiK%2Fimage.png?alt=media\&token=b08ad905-8c7f-4cc6-a63e-47dbee210def)

### 4.5 Networks 정보 &#x20;

#### 4.5.1 Networks&#x20;

![그림. Networks   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FvXGbQ9G1H28MPhS54GIO%2Fimage.png?alt=media\&token=e6b14b0c-cd14-44ee-b05b-f0d021cc5041)

#### 4.5.2 Network > Name&#x20;

![그림. Network > name    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FWCQmjHeNNwPHlF0Bdjdy%2Fimage.png?alt=media\&token=163f469f-7b7e-4abc-9335-3110878934e2)

### 4.6 Volumes 정보 &#x20;

![그림. Volumes   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FpUpPRrb01hjrd1ukyRsC%2Fimage.png?alt=media\&token=f4c1fa49-948b-41b6-afb5-535ace2f2902)

### 4.7 Info&#x20;

#### 4.7.1 Info&#x20;

![그림. Info   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FJAkpSC6dYyE4Neod4o1z%2Fimage.png?alt=media\&token=54b91e2f-99f2-47ca-af49-f0c7f4b6eaef)

#### 4.7.2 Info > Events&#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FZvPUol6pHsB8qX9mXxzY%2Fimage.png?alt=media\&token=e8f5a814-aa45-4b6a-961b-b00028ab4048)

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}


# 빠른 개발을 위한 docker 활용법(5분 완성)

\[https\://doc.skill.or.kr] 5분이면 누구든지 쉽게 따라 할 수 있는 시스템 구성 방법(Docker-compose 활용)

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. 먼저 알아 두기 &#x20;

### 1.1 도커(docker) 란?&#x20;

> ***도커(Docker)***&#xB294; 리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트이다. 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싸며 리눅스에서 운영 체제 수준 가상화의 추상화 및 자동화 계층을 추가적으로 제공한다. 도커는 cgroups와 커널 이름 공간과 같은 리눅스 커널, 또 aufs와 같은 유니언 가능 파일 시스템의 리소스 격리 기능을 사용하며, 이를 통해 독립적인 "컨테이너"가 하나의 리눅스 인스턴스 안에서 실행할 수 있게 함으로써 가상 머신을 시작하여 ***유지보수 해야 하는 부담을 없애준다.***

### 1.2 도커(docker) 사용 도구

#### 1.2.1 Docker Compose (*해당 문서는 이 도구를 사용함*)

> Compose는 멀티 컨테이너 도커 애플리케이션을 정의하고 실행하는 도구이다. YAML 파일을 사용하여 애플리케이션의 서비스를 구성하며 하나의 명령을 가지고 모든 컨테이너의 생성 및 시작 프로세스를 수행한다.

#### 1.2.2 Docker Swarm

> Docker Swarm은 도커 컨테이너의 네이티브 클러스터링 기능을 제공하며 도커 엔진을 하나의 가상 도커 엔진으로 탈바꿈시킨다. 도커 1.12 이상부터 Swarm 모드가 도커 엔진에 통합되어 있다.

### 1.3 WordPress 란?

> 2003년 매트 물렌웨그가 개발한 워드프레스는 세계 최대의 오픈 소스 저작물 관리 시스템이며, 워드프레스 기반 웹사이트는 전세계 웹사이트의 30%를 차지한다.

### 1.4 MySQL 이란?

> MySQL은 세계에서 가장 많이 쓰이는 오픈 소스의 관계형 데이터베이스 관리 시스템이다. 다중 스레드, 다중 사용자 형식의 구조질의어 형식의 데이터베이스 관리 시스템으로서 오라클이 관리 및 지원하고 있으며, Qt처럼 이중 라이선스가 적용된다.

### 1.5  **레플리케이션**(Replication) 이란?

> 레플리케이션(Replication)은 데이터 저장과 백업하는 방법과 관련이 있는 데이터를 호스트 컴퓨터에서 다른 컴퓨터로 복사하는 것인데 이때 다른 컴퓨터가 반드시 떨어진 지역에 있어야 하는 것은 아니다. 컴퓨터 네트워크 상태에서는 데이터 저장을 할 수 있게 하는데 로컬 데이터 물리적 기억 장치와는 완전하게 구분된다. 레플리케이션은 유명한 데이터베이스 관리 시스템 (RDBMS, Relational DataBase Management Systems)에서 추가적으로 제공하거나 여러 대의 데이터베이스 서버의 부하를 맞추어 줄 용도로 제공한다.

### 1.6 텐서플로(TensorFlow) 란?    &#x20;

> 텐서플로(TensorFlow)는 다양한 작업에 대해 데이터 흐름 프로그래밍을 위한 오픈소스 소프트웨어 라이브러리이다. 심볼릭 수학 라이브러리이자, 인공 신경망같은 기계 학습 응용프로그램에도 사용된다. 이것은 구글내 연구와 제품개발을 위한 목적으로 구글 브레인팀이 만들었고 2015년 11월 9일 아파치 2.0 오픈 소스 라이선스로 공개되었다.

### 1.7 아파치 하둡(Apache Hadoop) 이란?    &#x20;

> 아파치 하둡(Apache Hadoop, High-Availability Distributed Object-Oriented Platform)은 대량의 자료를 처리할 수 있는 큰 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는 프리웨어 자바 소프트웨어 프레임워크이다. 원래 너치의 분산 처리를 지원하기 위해 개발된 것으로, 아파치 루씬의 하부 프로젝트이다. 분산처리 시스템인 구글 파일 시스템을 대체할 수 있는 하둡 분산 파일 시스템(HDFS: Hadoop Distributed File System)과 맵리듀스를 구현한 것이다.

## 2. 도커(Docker) 컨테이너 실행 및 사용법       &#x20;

### 2.1 도커(Docker)는 어떻게 작동 하나?

> Docker기술은 Linux 커널과 함께 Cgroups 및 네임스페이스와 같은 커널의 기능을 사용하여 프로세스를 분리함으로써 독립적으로 실행될 수 있도록 합니다. 이러한 독립성은 컨테이너의 본래 목적입니다. 다시 말해서, 여러 프로세스와 애플리케이션을 서로 개별적으로 실행하여 인프라를 더 효과적으로 활용하고 개별 시스템을 사용할 때와 동일한 보안을 유지할 수 있습니다.     &#x20;
>
> Docker를 포함한 컨테이너 툴은 이미지 기반 배포 모델을 제공하므로 여러 환경 전반에서 애플리케이션 또는 서비스를 모든 종속 항목과 손쉽게 공유할 수 있습니다. 또한 Docker는 이 컨테이너 환경 내에서 애플리케이션(또는 앱을 구성하는 결합된 프로세스) 배포를 자동화합니다.      &#x20;
>
> 이러한 툴은 Linux 컨테이너를 기반으로 구축되어 Docker를 사용자 친화적이고 고유하게 만들어 주므로 사용자는 그 어느 때보다도 쉽게 앱에 액세스해 빠르게 배포하고 버전 및 버전 배포를 관리할 수 있습니다.   &#x20;

### 2.2 도커(Docker) 기술이 기존의 Linux 컨테이너와 동일한가?

> &#x20;그렇지 않습니다. Docker 기술은 처음에 [LXC](https://linuxcontainers.org/) 기술을 기반으로 구축되긴 했으나, 그 이후로는 종속 관계를 벗어났습니다. 하지만 대부분의 사용자는 "기존의" Linux 컨테이너와 연결지어 생각하고 있습니다. LXC는 경량의 가상화 방법으로 유용하게 사용되었지만 개발자 또는 사용자에게 우수한 경험을 제공하지는 못했습니다. Docker 기술은 컨테이너를 실행하는 기능 이상의 것을 제공하며 무엇보다도 컨테이너 생성 및 구축, 이미지 전송, 이미지 버전 관리 프로세스를 용이하게 해 줍니다.      &#x20;
>
> 전통적인 Linux 컨테이너는 멀티플 프로세스를 관리할 수 있는 초기화 시스템을 사용합니다. 즉, 전체 애플리케이션을 하나로 실행할 수 있습니다. Docker 기술은 애플리케이션이 개별 프로세스로 세분화되도록 하며 이를 수행할 수 있는 툴을 제공합니다. 이 세분화된 접근 방식에는 이점이 있습니다.&#x20;

![그림. Traditional Linux contaniners vs. Docker(출처 : redhat.com)](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYclG3qlIe5BlAd2Zan%2F-MYcnfN3vUp5eINxRmY7%2Fimage.png?alt=media\&token=4da42a31-a364-48dd-b960-d24c143a942e)

### 2.3 도커(Docker) 컨테이너의 이점은?   &#x20;

#### 2.3.1 모듈성   &#x20;

> &#x20;Docker의 컨테이너화 접근 방식은 전체 애플리케이션을 분해할 필요 없이 애플리케이션의 일부를 분해하고, 업데이트 또는 복구하는 능력에 집중되어 있습니다. 사용자는 이 마이크로서비스 기반 접근 방식 외에도 [SOA(service-oriented architecture)](https://en.wikipedia.org/wiki/Service-oriented_architecture)의 작동 방식과 동일하게 멀티플 애플리케이션 사이에서 프로세스를 공유할 수 있습니다.   &#x20;

#### 2.3.2 계층 및 이미지 버전 제어

> 각 Docker 이미지 파일은 일련의 계층으로 이루어져 있으며 이 계층들은 단일 이미지로 결합됩니다. 이미지가 변경될 때 계층이 생성되고, 사용자가 실행 또는 복사와 같은 명령을 지정할 때마다 새 계층이 생성됩니다.
>
> Docker는 새로운 컨테이너를 구축할 때 이러한 계층을 재사용하므로 구축 프로세스가 훨씬 더 빨라집니다. 중간 변경 사항이 이미지 사이에서 공유되므로 속도, 규모, 효율성이 더 개선됩니다. 계층화에는 버전 관리가 내재되어 있으며 새로운 변경 사항이 발생할 때마다 내장 변경 로그가 기본적으로 적용되므로 컨테이너 이미지를 완전히 제어할 수 있습니다.

#### 2.3.3 롤백       &#x20;

> &#x20;계층화에서 가장 유용한 부분은 아마도 롤백 기능일 것입니다. 모든 이미지에는 계층이 있으며, 현재의 이미지 반복이 적절하지 않은 경우 이전 버전으로 롤백하면 됩니다. 이 기능은 애자일(agile) 개발 접근 방식을 지원하며 툴 관점에서 실제로 [지속적인 통합 및 연속 배포(Continuous Integration and Deployment, CI/CD)](https://en.wikipedia.org/wiki/CI/CD)를 수행하는 데 도움을 줍니다.

#### 2.3.4 신속한 배포      &#x20;

> 새로운 하드웨어를 준비하고, 실행하고, 프로비저닝하고, 사용할 수 있게 하려면 일반적으로 며칠이 소요되었습니다. 많은 노력과 부가적인 업무가 필요하므로 부담도 상당했습니다. Docker 기반 컨테이너는 배포 시간을 몇 초로 단축할 수 있습니다. 각 프로세스에 대한 컨테이너를 생성함으로써 사용자는 유사한 프로세스를 새 앱과 빠르게 공유할 수 있습니다. 또한, 컨테이너를 추가하거나 이동하기 위해 OS를 부팅할 필요가 없으므로 배포 시간이 크게 단축됩니다. 이뿐만 아니라 배포 속도가 빨라 컨테이너에서 생성된 데이터를 비용 효율적으로 쉽게 생성하고 삭제할 수 있고 사용자는 우려를 할 필요가 없습니다.
>
> 즉, Docker 기술은 효율성을 중시하며 더 세분화되고 제어 가능한 마이크로서비스 기반 접근 방식입니다.

### 2.4 도커(docker) 및 도커 컴포즈(docker-compose) 사용 방법    &#x20;

> 도커 컴포즈(docker-compose)는 컨테이너 실행에 사용되는 옵션과 컨테이너 사이의 의존성을 모두 `docker-compose.yml` 파일에 저장 하여 컨테이너의 실행 및 설정 관리 한다.

#### 2.4.1 docker-compose 버전 확인  &#x20;

```bash
## docker compose 버전확인

$ docker-compose -version
docker-compose version 1.28.5, build c4eb3a1f
```

#### 2.4.2 docker-compose 실행     &#x20;

```bash
## docker-compose.yml 파일이 있는 폴더로 이동 후에 아래와 같이 실행

$ cd ./docker-compose/tenserflow   # docker-compose.yml 이 있는 폴더 이동
$ ls -alh docker-compose.yml   # docker-compose.yml 파일 확인
-rw-r--r-- 1 root root 79100 Apr 19 05:46 docker-compose.yml
$ docker-compose up -d  # docker-compose.yml 에 설정된 컨테이너를 deamon 으로 실행 
```

#### 2.4.3 docker-compose 중지/재시작       &#x20;

```bash
## 중지 할 컨테이너의 설정 값이 있는 docker-compose.yml 파일이 있는 폴더로 이동 후에 아래와 같이 실행

$ cd ./docker-compose/tenserflow   # docker-compose.yml 이 있는 폴더 이동
$ ls -alh docker-compose.yml   # docker-compose.yml 파일 확인
-rw-r--r-- 1 root root 79100 Apr 19 05:46 docker-compose.yml
$ docker-compose restart # docker-compose.yml 에 설정 된 컨테이너 재시작
$ docker-compose down  # docker-compose.yml 에 설정 된 컨테이너 중지     
```

#### 2.4.4 docker 컨테이너 접속 하기(docker exec -it 사용)     &#x20;

```bash
## 실행된 컨테이너에 접속 하기

$ docker ps  # docker 이미지를 보여줌
CONTAINER ID   IMAGE                                  COMMAND                  CREATED       STATUS       PORTS                    NAMES
2f85b4b5942d   tensorflow/tensorflow:latest-jupyter   "bash -c 'source /et…"   2 hours ago   Up 2 hours   0.0.0.0:8888->8888/tcp   tensorflow-jupyter
$ docker exec -it tenserflow-jupyter /bin/bash  # docker exec -it 옵션을 이용하여 /bin/bash 로 접속
root@2f85b4b5942d:/tf#  
```

#### 2.4.5 docker 컨테이너 logs 확인      &#x20;

```bash
## 실행된 컨테이너 Log 확인

$ docker logs -f tenserflow-jupyter # 해당 시스템의 중요 Log 를 보여줌.
[I 05:12:30.229 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[I 05:12:30.664 NotebookApp] Serving notebooks from local directory: /tf
[I 05:12:30.665 NotebookApp] Jupyter Notebook 6.2.0 is running at:
[I 05:12:30.665 NotebookApp] http://2f85b4b5942d:8888/?token=3d3c18bfc2ebfe222e8f46245722ed7cfb387f3816398cef
[I 05:12:30.665 NotebookApp]  or http://127.0.0.1:8888/?token=3d3c18bfc2ebfe222e8f46245722ed7cfb387f3816398cef
[I 05:12:30.665 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 05:12:30.671 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
    Or copy and paste one of these URLs:
        http://2f85b4b5942d:8888/?token=3d3c18bfc2ebfe222e8f46245722ed7cfb387f3816398cef
     or http://127.0.0.1:8888/?token=3d3c18bfc2ebfe222e8f46245722ed7cfb387f3816398cef
```

### 2.5 docker 이미지 형식      &#x20;

| 태그      | 설명                                 |
| ------- | ---------------------------------- |
| latest  | 바이너리 이미지의 최신 출시입니다. 기본값입니다.        |
| nightly | 이미지의 나이틀리 빌드입니다(불안정).              |
| version | 바이너리 이미지의 *버전*을 지정합니다(예: *2.1.0*). |
| devel   | 개발 환경의 나이틀리 빌드입니다.                 |

아래와 같이 TensorFlow 이미지를 다운로드 할 수 있습니다.      &#x20;

```bash
## 다양한 tenserflow 에 대한 이미지 

$ docker pull tensorflow/tensorflow                     # latest stable release
$ docker pull tensorflow/tensorflow:latest-jupyter      # latest stable release Jupyter
$ docker pull tensorflow/tensorflow:nightly-jupyter     # nightly dev release Jupyter
$ docker pull tensorflow/tensorflow:devel-gpu           # nightly dev release w/ GPU support
$ docker pull tensorflow/tensorflow:latest-gpu-jupyter  # latest release w/ GPU support and Jupyter
```

## 3. WordPress, MySQL  이용하여 홈페이지 만들기 (1분 완성)  &#x20;

### Step 1. 사전 준비 단계

* 폴더 구조      &#x20;

| 메인 폴더              | 서브 폴더 | 파일                 | 설명                       |
| ------------------ | ----- | ------------------ | ------------------------ |
| wordpress+mysql5.7 |       |                    |                          |
|                    | wp    |                    | wordpress 소스파일 저장 폴더     |
|                    | mysql |                    | mysql 저장 폴더              |
|                    |       | docker-compose.yml | docker-compose.yml 설정 파일 |

{% file src="/files/-MYisZkrK8-nh\_AWXw3y" %}

### Step 2. Docker-compose.yml 설정 &#x20;

{% tabs %}
{% tab title="docker-compose.yml" %}
{% code title="docker-compose.yml" %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 db: # 서비스 명
  image: mysql:5.7 # 사용할 이미지
  container_name: db # 컨테이너 이름 설정
  volumes:
   - ./mysql:/var/lib/mysql
  restart: always 
  ports:
   - "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
  environment:
   MYSQL_ROOT_PASSWORD: wp
   MYSQL_DATABASE: wp
   MYSQL_USER: wp
   MYSQL_PASSWORD: wp
 wordpress:
  image: wordpress:latest
  container_name: wordpress
  volumes:
   - ./wp:/var/www/html 
  ports:
   - "8080:80"
  restart: always
  environment:
   WORDPRESS_DB_HOST: db:3306
   WORDPRESS_DB_NAME: wp
   WORDPRESS_DB_USER: wp
   WORDPRESS_DB_PASSWORD: wp
```

{% endcode %}

{% file src="/files/-MYJmoa-\_lk\_Ef5WOEDe" %}
{% endtab %}
{% endtabs %}

### Step 3. Docker-compose 실행 및 중지/재시작  &#x20;

{% tabs %}
{% tab title="1. Docker-compose 실행" %}
{% code title="docker-compose 실행" %}

```bash
cd .\docker-compose\
cd .\wordpress+mysql5.7\
docker ps
docker-compose.exe up -d
docker ps
```

{% endcode %}

![그림. docker-compose 실행](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYJmh4bwqBqJ-JfQAc_%2F-MYJnvL229mI2sC9yFQk%2Fimage.png?alt=media\&token=f888fc88-ee4c-4895-8f81-1fb47bab11dc)
{% endtab %}

{% tab title="2. Docker-compose 중지" %}
{% code title="docker-compose 중지" %}

```bash
cd .\docker-compose\
cd .\wordpress+mysql5.7\
docker ps
docker-compose.exe down
docker ps
```

{% endcode %}

![그림. docker-compose 중지](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYJoKQELWRlHjYGxicA%2F-MYJoldgk8AL9PX_iLFY%2Fimage.png?alt=media\&token=25d69982-111e-4f08-88c4-aafe068a8d0b)
{% endtab %}

{% tab title="3. Docker-compose 재시작" %}
{% code title="docker-compose 재시작" %}

```bash
cd .\docker-compose\
cd .\wordpress+mysql5.7\
docker ps
docker-compose.exe restart
docker ps
```

{% endcode %}

![그림. docker-compose 재시작](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYJoKQELWRlHjYGxicA%2F-MYMqF3zMdGHHKwquujW%2Fimage.png?alt=media\&token=a5e93da6-2c87-4426-8940-90693aaa21ce)
{% endtab %}
{% endtabs %}

### Step 4. WordPress 접속 및 설정     &#x20;

{% tabs %}
{% tab title="1. wordpress 접속" %}

```
크롬에서 localhost:8080 으로 접속   
wordpress 셋팅 후 사용   
```

![그림. 크롬으로 localhost:8080 접속 화면](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYMqGiTHbaeQLhNkdBQ%2F-MYMsknWMlwRduND5sFG%2Fimage.png?alt=media\&token=08c7a81d-ceff-46dd-8536-e24cbdae50b4)
{% endtab %}
{% endtabs %}

## 4. MySQL Replication 시스템 구성 (5분 완성)  &#x20;

### Step 1. 사전 준비 단계

* 폴더 구조

| 메인 폴더       | 서브 폴더        | 서브 폴더     | 파일                 | 설명                         |
| ----------- | ------------ | --------- | ------------------ | -------------------------- |
| mysql5.7-ha |              |           |                    |                            |
|             | master-mysql |           |                    | master-db mysql 설치, 데이터 파일 |
|             | slave-mysql  |           |                    | slave-db mysql 설치, 데이터 파일  |
|             | conf         | master-db | config\_file.cnf   | master-db mysql 설정 파일      |
|             |              | slave-db  | config\_file.cnf   | slave-db mysql 설정 파일       |
|             |              |           | docker-compose.yml | docker-compose.yml 설정 파일   |

{% file src="/files/-MYisrlNAZvfbinnOLRG" %}

* MySQL Master/Slave 에 config\_file.cnf 작성

{% tabs %}
{% tab title="1. Master 파일 config\_file.cnf" %}
{% code title="./conf/master-db/config\_file.cnf" %}

```
[mysqld]
log-bin=mysql-bin
server-id=1
```

{% endcode %}

{% file src="/files/-MYJ\_7JnGpuB7cTdj5Ye" %}
{% endtab %}

{% tab title="2. Slave 파일 config\_file.cnf" %}
{% code title="./conf/slave-db/config\_file.cnf" %}

```
[mysqld]
server-id=2
```

{% endcode %}

{% file src="/files/-MYJ\_CgQ\_VqNeYfMyjy\_" %}
{% endtab %}
{% endtabs %}

### Step 2. Docker-compose.yml 설정&#x20;

{% tabs %}
{% tab title="docker-compose.yml" %}
{% code title="docker-compose.yml" %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 master-db: # 서비스 명
  image: mysql:5.7 # 사용할 이미지
  container_name: master-db # 컨테이너 이름 설정
  volumes:
   - "./conf/master-db:/etc/mysql/conf.d"
   - "./master-mysql:/var/lib/mysql:rw"
  restart: always 
  #ports:
   #- "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
  environment:
   MYSQL_ROOT_PASSWORD: masterpw
   MYSQL_DATABASE: user001db
   MYSQL_USER: user001
   MYSQL_PASSWORD: user001pw
 slave-db:
  image: mysql:5.7
  container_name: slave-db
  volumes:
   - "./conf/slave-db:/etc/mysql/conf.d"
   - "./slave-mysql:/var/lib/mysql:rw"
  restart: always
  links:
   - master-db
  #ports:
   #- "3307:3306"
  environment:
   MYSQL_ROOT_PASSWORD: slavepw
   MYSQL_DATABASE: user001db
   MYSQL_USER: user001
   MYSQL_PASSWORD: user001pw
```

{% endcode %}

{% file src="/files/-MYJZgU9dmB7kGoAOTYa" %}
{% endtab %}
{% endtabs %}

### Step 3. Docker-compose 실행 및 중지/재시작&#x20;

{% tabs %}
{% tab title="1. Docker-compose 실행" %}

```bash
cd .\docker-compose\
cd .\mysql5.7-ha\
docker ps
docker-compose.exe up -d
docker ps
```

{% endtab %}

{% tab title="2. Docker-compose 중지" %}

```bash
cd .\docker-compose\
cd .\mysql5.7-ha\
docker ps
docker-compose.exe up -d
docker ps
```

{% endtab %}

{% tab title="3. Docker-compose 재시작" %}

```bash
cd .\docker-compose\
cd .\mysql5.7-ha\
docker-compose.exe restart
```

{% endtab %}
{% endtabs %}

### Step 4. MySQL 설정&#x20;

* MySQL 의 master-db 의 계정 설정 및 table, dump 생성&#x20;

{% tabs %}
{% tab title="1. master-db 접속 계정 및 정보 확인" %}

```bash
docker exec -it master-db /bin/bash
mysql -u root -p
mysql> use mysql;
mysql> SELECT Host,User,plugin,authentication_string FROM mysql.user; 
mysql> GRANT REPLICATION SLAVE ON . TO 'user001'@'%'; 
mysql> flush privileges; 
```

{% endtab %}

{% tab title="2. master-db 테이블 생성" %}

```bash
mysql> USE user001db;
mysql> CREATE TABLE user001table ( no INT(8), PRIMARY KEY (no) );
mysql> DESC user001table;
```

{% endtab %}

{% tab title="3. master-db 에서 user001db 의 dump 생성" %}

```bash
$ mysqldump -u root -p user001db > user001_dump.sql
```

{% endtab %}
{% endtabs %}

* user001db 의 dump 파일 복사 및 이동, 데이터 확인

{% tabs %}
{% tab title="1. master-db -> 관리서버 파일 이동" %}

```bash
$ docker cp master-db:user001_dump.sql . 
```

{% endtab %}

{% tab title="2. 관리서버 -> slave-db 파일 전송" %}

```bash
$ docker cp user001_dump.sql slave-db:. 
```

{% endtab %}

{% tab title="3. slave-db 에 user001\_dump.sql Import" %}

```bash
$ mysql -u root -p user001db < user001_dump.sql 
```

{% endtab %}

{% tab title="4. slave-db user001db 데이터 확인" %}

```bash
docker exec -it slave-db /bin/bash
mysql -u root -p
mysql> use user001db;
mysql> show tables;
```

{% endtab %}
{% endtabs %}

### Step 5. master-db/slave-db 서버 연결

{% tabs %}
{% tab title="1. master-db 상태 정보" %}

```bash
docker exec -it master-db /bin/bash
mysql -u root -p
mysql> show master status\g
```

![그림. Master 상태 정보](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYItErxrcWS_1WTW5Kc%2F-MYItwUQvSr7yn3oD3Ss%2Fimage.png?alt=media\&token=6ce50c96-8c3e-4001-8848-b9aaa18e90ff)
{% endtab %}

{% tab title="2. slave-db 에서 master-db 연결 설정" %}

```bash
docker exec -it slave-db /bin/bash
mysql -u root -p
mysql> CHANGE MASTER TO MASTER_HOST='master-db', MASTER_USER='user001', MASTER_PASSWORD='user001pw', MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=154;
mysql> START SLAVE;
```

![그림. Slave 연결 설정 방법](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYItErxrcWS_1WTW5Kc%2F-MYIvEl_BrFJizJc2pnd%2Fimage.png?alt=media\&token=f857c6b2-9201-4ea5-aa6d-33a79ce4decf)
{% endtab %}

{% tab title="3. slave-db 연결 상태 확인" %}

```bash
docker exec -it slave-db /bin/bash
mysql -u root -p
mysql> SHOW SLAVE STATUS\G
```

![그림. Slave 연결 상태 확인](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYItErxrcWS_1WTW5Kc%2F-MYIyTlCNsegK7xScmXC%2Fimage.png?alt=media\&token=2db61965-f2b6-4060-9e64-544d2097e27c)
{% endtab %}
{% endtabs %}

### Step 6. MySQL Replication 데이터   확인

{% tabs %}
{% tab title="1. master-db 데이터 입력" %}

```bash
$ mysql -u root -p
mysql> use user001db; 
mysql> INSERT INTO user001table VALUES (1);
mysql> select * from user001table;
```

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYIz6Xrme-2XoOo2BEy%2F-MYJ0xH0GX5J8wlsxjoU%2Fimage.png?alt=media\&token=eaba0557-14f8-4714-9f74-e64dd184d67e)
{% endtab %}

{% tab title="2. slave-db Replication 데이터 확인" %}

```bash
$ mysql -u root -p
mysql> use user001db; 
mysql> select * from user001table;
```

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYIz6Xrme-2XoOo2BEy%2F-MYJ1KYfbl_tRlquw5eq%2Fimage.png?alt=media\&token=8550426e-97e5-4b4a-89c9-0277f4bdb76f)
{% endtab %}

{% tab title="3. slave-db 에서 slave 상태 확인" %}

```bash
$ mysql -u root -p
mysql> SHOW SLAVE STATUS\G 
mysql> select * from user001table;
```

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYIz6Xrme-2XoOo2BEy%2F-MYJ1jNBApPZfYsjJ7Dc%2Fimage.png?alt=media\&token=8f85290a-873b-4b26-bcb9-ccb053b1e7e5)
{% endtab %}
{% endtabs %}

### ETC. Error/Warning 해결 방안     &#x20;

* master-db 에서 master status 정보가 없을 때

{% tabs %}
{% tab title="1. master-db 확인" %}

```bash
docker exec -it master-db /bin/bash
mysql -u root -p
mysql> SHOW MASTER STATUS\G #MASTER 데이터가 없음    
```

{% endtab %}

{% tab title="2. 확인 사항" %}

```bash
docker logs -f master-db #에러 또는 오류 메시지 확인    
docker-compose.yml 파일에서 volumes: 에 경로를 확인  
mysql5.7-ha/conf 폴더에 master-db, slave-db 에 config_file.cnf 파일 및 데이터 확인 
master-db 와 slave-db 에 config_file.cnf 파일 확인    
```

{% endtab %}

{% tab title="3. 해결 방안" %}

```bash
Step 1 부터 다시 한번 확인
mysql5.7-ha/conf 에서 master-db, slave-db 안에 config_file.cnf 설정 값 과 확장자 명 확인
docker-compose.yml 파일에 오탈자 확인    
```

{% endtab %}
{% endtabs %}

* Log 에 server\_errno=1236 이 발생 되어 비정상 동작을 할 때&#x20;

{% tabs %}
{% tab title="1. DB 서버가 중단 되었을때" %}

```bash
* master-db 또는 slave-db 가 중단 되었을 때 다시 데이터를 연동 하는 방법
docker logs -f slave-db  #로그인 확인    
아래와 같은 에러 발생 시
2021-04-14T08:31:54.946584Z 9 [ERROR] Error reading packet from server for channel '': Client requested master to start replication from position > file size (server_errno=1236)
```

{% endtab %}

{% tab title="2. master-db 확인" %}

```bash
docker exec -it master-db /bin/bash
mysql -u root -p
mysql> SHOW MASTER STATUS\G
```

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYJ8ZfWZUvwtWPM0xBS%2F-MYJ9yobeGlFp0YOmC-U%2Fimage.png?alt=media\&token=a396c51c-a395-4349-85ac-56841cccb446)
{% endtab %}

{% tab title="3. slave-db 확인 방법" %}

```bash
docker exec -it slave-db /bin/bash
mysql -u root -p
SHOW SLAVE STATUS\G
```

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYJ8ZfWZUvwtWPM0xBS%2F-MYJ9a3Xl94IjI-CuJyh%2Fimage.png?alt=media\&token=6f49b5f7-5fe2-4744-a332-3d22a7704099)
{% endtab %}

{% tab title="4. 처리 방법" %}

```bash
docker exec -it slave-db /bin/bash 
mysql -u root -p 
# 설정값을 확인 후 
STOP SLAVE; 
RESET SLAVE; 
CHANGE MASTER TO MASTER_HOST='master-db', MASTER_USER='user001', MASTER_PASSWORD='user001pw', MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=154;
START SLAVE; 
SHOW SLAVE STATUS\G
```

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYJ8ZfWZUvwtWPM0xBS%2F-MYJAV4oKC2vGuJat6Wq%2Fimage.png?alt=media\&token=58d06cfc-a0d5-484a-83c5-258ade87772d)
{% endtab %}
{% endtabs %}

* MySQL 시작 시 config\_file.cnf is ignored  worning 발생 시   &#x20;

{% tabs %}
{% tab title="1. MySQL 시작 시 config\_file.cnf is ignored 에 대한 wornig 에러 발생" %}

```bash
mysql -u root -p # 실행 시 아래에 config_file.cnf 파일에 대한 ignored 가 발생 로그가 보임
SHOW MASTER STATUS\G #상태 값이 반환 되지 않음
```

{% endtab %}

{% tab title="2. 처리 방법" %}

```bash
cd /etc/mysql/conf.d #폴더 이동
ls -al config_file.cnf #파일은 (644) 권한 필요
chmod 644 config_file.cnf #실행 하여 권한을 변경 함.
** docker-compose.yml 파일에 volumes 에 config_file.cnf 경로를 다시 한번 확인 해야 함.
```

{% endtab %}
{% endtabs %}

## 5. TensorFlow 시스템 구축 (1분 완성)   &#x20;

### Step 1. 사전 준비 단계    &#x20;

* 폴더 구조      &#x20;

| 메인 폴더      | 서브 폴더  | 파일                 | 설명                       |
| ---------- | ------ | ------------------ | ------------------------ |
| tensorflow |        |                    |                          |
|            | upload |                    | tensorflow 업로드 폴더 지정     |
|            | result |                    | tensorflow 저장 폴더 지정      |
|            | tmp    |                    | tensorflow 임시 저장 폴더      |
|            |        | docker-compose.yml | docker-compose.yml 설정 파일 |

{% file src="/files/-MYcWPo19KcO5WGBOOp2" %}

### Step 2. Docker-compose.yml 설정        &#x20;

{% tabs %}
{% tab title="docker-compose.yml" %}
{% code title="docker-compose.yml" %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 tensorflow-jupyter: # 서비스 명
  image: tensorflow/tensorflow:latest-jupyter # 사용할 이미지
  container_name: tensorflow-jupyter # 컨테이너 이름 설정
  volumes:
   - ./tensorflow/result:/tf/tensorflow-tutorials/result # result 폴더에 결과 저장
   - ./tensorflow/upload:/tf/tensorflow-tutorials/upload # upload 폴더
   - ./tensorflow/tmp:/tmp # 임시 파일
  restart: always 
  ports:
   - "8888:8888" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
```

{% endcode %}

{% file src="/files/-MYcWK7hQsffhLZQx8zd" %}
{% endtab %}
{% endtabs %}

### Step 3. Docker-compose 실행 및 중지/재시작      &#x20;

{% tabs %}
{% tab title="1. Docker-compose 실행" %}

```bash
cd ./docker-compose/
cd ./tensorflow/
docker ps 
docker-compose.exe up -d
docker ps
```

{% endtab %}

{% tab title="2. Docker-compose 중지" %}

```bash
cd ./docker-compose/
cd ./tensorflow/
docker ps
docker-compose.exe down
docker ps
```

{% endtab %}

{% tab title="3. Docker-compose 재시작" %}

```bash
cd ./docker-compose/
cd ./tensorflow/
docker ps
docker-compose.exe restart
docker ps
```

{% endtab %}
{% endtabs %}

### Step 4. TensorFlow 접속 및 확인   &#x20;

{% tabs %}
{% tab title="1. TensorFlow 접속 token 확인" %}

```
docker logs -f tensorflow-jupyter # 실행 후 URL Log 확인    
```

![그림. tensorflow-jupyter Log 확인](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcROg_pnaes6EwXYdP%2F-MYcSxuBFCIId_5kBqOj%2Fimage.png?alt=media\&token=eaadc765-f62b-440e-9e25-e41db2aee543)
{% endtab %}

{% tab title="2. TensorFlow 크롬 접속" %}

```
Docker 로그를 통해 token 을 이용하 크롬에 접속  
```

![그림. docker 로그를 통해 URL 접속 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcROg_pnaes6EwXYdP%2F-MYcTNHXfmnMfivxn6gX%2Fimage.png?alt=media\&token=5db17824-89d0-472e-84b6-c5462e6c96a2)
{% endtab %}

{% tab title="3. Jupyter 접속 화면" %}

```
크롬에 URL 을 정상적으로 입력 하면 아래와 같은 화면을 볼 수 있음 
```

![그림. 정상적으로 접속 된 화면](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcROg_pnaes6EwXYdP%2F-MYcTpKfW5W53JaRHgxK%2Fimage.png?alt=media\&token=7c1901e4-39b7-47e7-b56a-86af1e951a84)
{% endtab %}
{% endtabs %}

### Step 5. TensorFlow 실행 및 저장     &#x20;

{% tabs %}
{% tab title="1. Jupyter tutorial 리스트" %}

```
크롬 localhost:8888 접속 후 tensorflow-tutorials 폴더 확인
```

![그림. TensorFlow Tutorial 목록 확인   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYnWUVOL06kB1B8jTmi%2F-MYnYJOn28yefWgheslt%2Fimage.png?alt=media\&token=544e7873-e9da-4489-bf82-68fae37b0176)
{% endtab %}

{% tab title="2. Jupyter tutorial 실행" %}

```
ipynb 파일 클릭 후 아래와 같이 확인
상단에 Run or restart 버튼을 클  
```

![그림. Jupyter 실행 및 중지/재시작](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYc_QmvbX8kwkI7avkM%2F-MYccDaxUrrfGn1dqxAO%2Fimage.png?alt=media\&token=5b25460d-decb-4eed-98eb-6ebbe4c3737d)

&#x20;
{% endtab %}

{% tab title="3. Jupyter tutorial 업로드" %}

```
Main 화면에서 Upload 버튼 클릭 후 파일 선택  
업로드 후에 2번과 같이 진행    
```

![그림. ipynb 파일 업로드](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYcczq6P-Xw_gi-2eeG%2Fimage.png?alt=media\&token=dc058d95-3b20-450f-a3bf-1b5f2a75b173)
{% endtab %}

{% tab title="4. Jupyter tutorial 결과 및 저장" %}

```
진행 결과 확인 
결과 확인(Running) 및 파일 저장(File > Save as)     
```

![그림. Running 탭에서 진행 결과 확인     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYcda9qUqmKJSGT8yJW%2Fimage.png?alt=media\&token=4cbe3cc8-61f5-474b-a94a-98f7c68e6d42)

![그림. 결과 파일 저장(File -> Save as)     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYceyGZASsVhxKkNq4b%2Fimage.png?alt=media\&token=92b4288b-adad-4565-b1a6-840eb8765163)

![그림. 저장 파일은 로컬시스템 및 가상화 시스템 경로 확인    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYcfVgLaWBy-lPwY43k%2Fimage.png?alt=media\&token=15a15b82-18fe-47fb-a596-3c80074d4bf6)
{% endtab %}
{% endtabs %}

## 6. Hadoop 시스템 구축 (5분 완성)      &#x20;

### Step 1. 사전 준비 단계    &#x20;

* 폴더 구조      &#x20;

| 메인 폴더  | 서 폴더 | 서 폴더          | 파일                 | 설명                       |
| ------ | ---- | ------------- | ------------------ | ------------------------ |
| hadoop |      |               |                    |                          |
|        | logs |               |                    | Hadoop 로그 파일 저장          |
|        | dfs  | name          |                    | NameNode 저장 위치           |
|        |      | data          |                    | DataNode 저장 위치           |
|        |      | namesecondary |                    | NameNodeSecondary 저장 위치  |
|        |      |               | docker-compose.yml | docker-compose.yml 설정 파일 |

{% file src="/files/-M\_4SbDBK4kRJmGo9gI1" %}

### Step 2. Docker-compose.yml 설정     &#x20;

{% tabs %}
{% tab title="docker-compose.yml" %}
{% code title="docker-compose.yml" %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 hadoop-dev: # 서비스 명
  image: harisekhon/hadoop-dev # 사용할 이미지
  container_name: hadoop-dev # 컨테이너 이름 설정
  restart: always 
  volumes:
   #- ./hadoop/dfs/name:/tmp/hadoop-root/dfs/name
   #- ./hadoop/dfs/data:/tmp/hadoop-root/dfs/data
   #- ./hadoop/dfs/namesecondary:/tmp/hadoop-root/dfs/namesecondary
   - ./hadoop/logs:/hadoop/logs
  ports:
   - 8042:8042    # node
   - 8088:8088    # cluster
```

{% endcode %}

{% file src="/files/-M\_4B5XR8o16zmQYG1HP" %}
{% endtab %}
{% endtabs %}

### Step 3. Docker-compose 실행 및 중지/재시작     &#x20;

{% tabs %}
{% tab title="1. Docker-compose 실행" %}

```bash
cd ./docker-compose
cd ./hadoop
docker ps
docker-compose up -d
docker ps
```

```bash
docker-compose up -d
Creating network "hadoop_default" with the default driver
Creating hadoop-dev ... done
docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED         STATUS          PORTS                                                                                                                                                                                          NAMES
02b2458e15d7   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   8 seconds ago   Up 11 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
```

{% endtab %}

{% tab title="2. Docker-compose 중지" %}

```bash
cd ./docker-compose
cd ./hadoop
docker ps
docker-compose down
docker ps
```

```bash
docker-compose down
Stopping hadoop-dev ... done
Removing hadoop-dev ... done
Removing network hadoop_default
docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

{% endtab %}

{% tab title="3. Docker-compose 재시작" %}

```bash
cd ./docker-compose
cd ./hadoop
docker ps
docker-compose restart
docker ps
```

```bash
docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED                  STATUS         PORTS                                                                                                                                                                                          NAMES
d33193820d6c   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   Less than a second ago   Up 3 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
docker-compose restart
Restarting hadoop-dev ... done
docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED          STATUS         PORTS                                                                                                                                                                                          NAMES
d33193820d6c   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   25 seconds ago   Up 4 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
```

{% endtab %}
{% endtabs %}

### Step 4. Hadoop 시스템 확인       &#x20;

{% tabs %}
{% tab title="1. Hadoop Node 확인  " %}

```
 크롬으로 localhost:8042 접속    
```

![그림. Hadoop node 페이지](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYljqM08Q1grUmrP1nZ%2F-MYllF9DSVqP6zGDCxUU%2Fimage.png?alt=media\&token=65dea3b1-ffdb-42f9-a8ce-872f8fb2660b)
{% endtab %}

{% tab title="2. Hadoop Cluster 확인 " %}

```
 크롬으로 localhost:8088 접속
```

![그림. Hadoop Cluster 페이지  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYljqM08Q1grUmrP1nZ%2F-MYlmXPh7KgiqpcdISVT%2Fimage.png?alt=media\&token=a30f71a7-8ee0-4cb3-88cc-f7399a558762)
{% endtab %}

{% tab title="3. Hadoop Dfshealth 확인  " %}

```
 크롬으로 localhost:50070 접속
```

![그림. Hadoop dfshealth 페이지 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYlmZQJCDi50-zGdlrn%2F-MYln3zvMpaqBm5dDrgH%2Fimage.png?alt=media\&token=60aa2bdb-e675-4905-b904-980e27364bd1)
{% endtab %}

{% tab title="4. Hadoop Datanode 확인 " %}

```
크롬으로 localhost:50075 접속 
```

![그림. Hadoop datanode 페이지 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYlmZQJCDi50-zGdlrn%2F-MYlnRSZEaBCbha9hqq3%2Fimage.png?alt=media\&token=8dd63c84-374b-47aa-a6a4-397ca8866124)
{% endtab %}

{% tab title="5. Hadoop Status 확인" %}

```
크롬으로 localhost:50090 접속 
```

![그림. Hadoop status 페이지 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYlmZQJCDi50-zGdlrn%2F-MYlnjhWw5yKRaGpjL5m%2Fimage.png?alt=media\&token=ddc3b8ec-ac45-4ab2-a621-dfd90fbe4a0d)
{% endtab %}
{% endtabs %}

### Step 5. Hadoop 테스트 확인  &#x20;

{% tabs %}
{% tab title="1. Sample Test 이동/복사 " %}

```
Hadoop 경로 이동 및 파일 저장(NOTICE.txt)    
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c /]# cd $HADOOP_HOME
[root@4bb51d4c894c hadoop]# ls
bin  etc  include  lib  libexec  LICENSE.txt  logs  NOTICE.txt  README.txt  sbin  share
[root@4bb51d4c894c hadoop]# hadoop fs -mkdir -p /data
[root@4bb51d4c894c hadoop]# hadoop fs -put NOTICE.txt /data
[root@4bb51d4c894c hadoop]# hadoop fs -ls /data
Found 1 items
-rw-r--r--   1 root supergroup      15915 2021-04-21 00:26 /data/NOTICE.txt
```

{% endtab %}

{% tab title="2. Sample Test 실행    " %}

```
Hadoop Sample 테스트 실행  
hadoop-mapreduce-examples-2.9.0.jar 의 파라미터(wordmean) 이용하여 NOTICE.txt 파일의 단어와 글자수를 계산    
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c]# cd /hadoop/share/hadoop/mapreduce
[root@4bb51d4c894c mapreduce]# ls
hadoop-mapreduce-client-app-2.9.0.jar     hadoop-mapreduce-client-hs-plugins-2.9.0.jar       hadoop-mapreduce-examples-2.9.0.jar  sources
hadoop-mapreduce-client-common-2.9.0.jar  hadoop-mapreduce-client-jobclient-2.9.0.jar        jdiff
hadoop-mapreduce-client-core-2.9.0.jar    hadoop-mapreduce-client-jobclient-2.9.0-tests.jar  lib
hadoop-mapreduce-client-hs-2.9.0.jar      hadoop-mapreduce-client-shuffle-2.9.0.jar          lib-examples
[root@4bb51d4c894c mapreduce]# hadoop jar hadoop-mapreduce-examples-2.9.0.jar
Valid program names are:
  aggregatewordcount: An Aggregate based map/reduce program that counts the words in the input files.
  aggregatewordhist: An Aggregate based map/reduce program that computes the histogram of the words in the input files.
  bbp: A map/reduce program that uses Bailey-Borwein-Plouffe to compute exact digits of Pi.
  dbcount: An example job that count the pageview counts from a database.
  distbbp: A map/reduce program that uses a BBP-type formula to compute exact bits of Pi.
  grep: A map/reduce program that counts the matches of a regex in the input.
  join: A job that effects a join over sorted, equally partitioned datasets
  multifilewc: A job that counts words from several files.
  pentomino: A map/reduce tile laying program to find solutions to pentomino problems.
  pi: A map/reduce program that estimates Pi using a quasi-Monte Carlo method.
  randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.
  randomwriter: A map/reduce program that writes 10GB of random data per node.
  secondarysort: An example defining a secondary sort to the reduce.
  sort: A map/reduce program that sorts the data written by the random writer.
  sudoku: A sudoku solver.
  teragen: Generate data for the terasort
  terasort: Run the terasort
  teravalidate: Checking results of terasort
  wordcount: A map/reduce program that counts the words in the input files.
  wordmean: A map/reduce program that counts the average length of the words in the input files.
  wordmedian: A map/reduce program that counts the median length of the words in the input files.
  wordstandarddeviation: A map/reduce program that counts the standard deviation of the length of the words in the input files.
[root@4bb51d4c894c mapreduce]# hadoop jar hadoop-mapreduce-examples-2.9.0.jar wordmean /data /data_out
21/04/21 00:52:37 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
21/04/21 00:52:38 INFO input.FileInputFormat: Total input files to process : 1
21/04/21 00:52:38 INFO mapreduce.JobSubmitter: number of splits:1
21/04/21 00:52:38 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.enabled is deprecated. Instead, use yarn.system-metrics-publisher.enabled
21/04/21 00:52:38 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1618964082934_0001
21/04/21 00:52:39 INFO impl.YarnClientImpl: Submitted application application_1618964082934_0001
21/04/21 00:52:39 INFO mapreduce.Job: The url to track the job: http://4bb51d4c894c:8088/proxy/application_1618964082934_0001/
21/04/21 00:52:39 INFO mapreduce.Job: Running job: job_1618964082934_0001
21/04/21 00:52:50 INFO mapreduce.Job: Job job_1618964082934_0001 running in uber mode : false
21/04/21 00:52:50 INFO mapreduce.Job:  map 0% reduce 0%
21/04/21 00:52:58 INFO mapreduce.Job:  map 100% reduce 0%
21/04/21 00:53:04 INFO mapreduce.Job:  map 100% reduce 100%
21/04/21 00:53:04 INFO mapreduce.Job: Job job_1618964082934_0001 completed successfully
21/04/21 00:53:04 INFO mapreduce.Job: Counters: 49
        File System Counters
                FILE: Number of bytes read=39
                FILE: Number of bytes written=403473
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=16020
                HDFS: Number of bytes written=24
                HDFS: Number of read operations=6
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
        Job Counters
                Launched map tasks=1
                Launched reduce tasks=1
                Data-local map tasks=1
                Total time spent by all maps in occupied slots (ms)=4347
                Total time spent by all reduces in occupied slots (ms)=3565
                Total time spent by all map tasks (ms)=4347
                Total time spent by all reduce tasks (ms)=3565
                Total vcore-milliseconds taken by all map tasks=4347
                Total vcore-milliseconds taken by all reduce tasks=3565
                Total megabyte-milliseconds taken by all map tasks=4451328
                Total megabyte-milliseconds taken by all reduce tasks=3650560
        Map-Reduce Framework
                Map input records=455
                Map output records=3624
                Map output bytes=52548
                Map output materialized bytes=39
                Input split bytes=105
                Combine input records=3624
                Combine output records=2
                Reduce input groups=2
                Reduce shuffle bytes=39
                Reduce input records=2
                Reduce output records=2
                Spilled Records=4
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=205
                CPU time spent (ms)=1500
                Physical memory (bytes) snapshot=504504320
                Virtual memory (bytes) snapshot=4011933696
                Total committed heap usage (bytes)=347602944
        Shuffle Errors
                BAD_ID=0
                CONNECTION=0
                IO_ERROR=0
                WRONG_LENGTH=0
                WRONG_MAP=0
                WRONG_REDUCE=0
        File Input Format Counters
                Bytes Read=15915
        File Output Format Counters
                Bytes Written=24
The mean is: 7.2759381898454745
[root@4bb51d4c894c mapreduce]#
```

{% endtab %}

{% tab title="3. Sample Test 결과 확인  " %}

```
# Sample Test 결과 확인   
hadoop fs -cat /data_out/*     
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c]# hadoop fs -ls  /data_out
Found 2 items
-rw-r--r--   1 root supergroup          0 2021-04-21 00:53 /data_out/_SUCCESS
-rw-r--r--   1 root supergroup         24 2021-04-21 00:53 /data_out/part-r-00000
[root@4bb51d4c894c]# hadoop fs -cat /data_out/*
count   1812
length  13184
[root@4bb51d4c894c]#
```

{% endtab %}

{% tab title="4. Hadoop node 확인    " %}

```
크롬에서 localhost:8088 로 접속 하여 FINISHED Applications 을 확인    
```

![그림. Hadoop Cluster 에서 FINISHED Applications 페이지](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYm-KmOSDjT6KiAiO2t%2F-MYm0GV8FcHY4ydUCIzk%2Fimage.png?alt=media\&token=b1a7fe6d-389a-4479-8aaf-d5db638523cb)
{% endtab %}

{% tab title="5. Hadoop HDFS Browse Directory 확인 " %}

```
크롬에서 localhost:50070 으로 접속하여 Utilities > Browse Directory 로 이동      
해당 폴더 에 들어가서 파일을 클릭 하면 상세 정보 및 파일 다운로드가 가능    
```

![그림. Hadoop HDFS Browse Directory 페이지](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYm-KmOSDjT6KiAiO2t%2F-MYm0p60wybKbsBCIucL%2Fimage.png?alt=media\&token=70a5bba4-d3c7-450c-a0eb-52123e24effc)

![그림. Hadoop HDFS 에 파일 다운로드 및 상세 보기  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYm1C5jloPP6saVhu4A%2F-MYm1Yv83vtpCbXqJS-6%2Fimage.png?alt=media\&token=bd79d41d-f125-4c81-9e27-77af158374b0)
{% endtab %}
{% endtabs %}

### Step 6. Hadoop 결과 데이터 동기화   &#x20;

{% tabs %}
{% tab title="1. Hadoop 시스템 접속 후 데이터 확인 및 압축" %}

```
hadoop 시스템을 재시작 하면 결과 값이 초기화 됨
/tmp/hadoop-root/dfs 의 하위 디렉토리를 압축 하여 관리 pc 에 dfs.tar 파일을 이동 
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@6debfd1fd33d]# cd /tmp/hadoop-root/dfs
[root@6debfd1fd33d dfs]# ls
data  name  namesecondary
[root@6debfd1fd33d dfs]# tar -zcvf dfs.tar ./data ./name ./namesecondary
[root@6debfd1fd33d dfs]# ls dfs.tar
dfs.tar
[root@6debfd1fd33d dfs]# exit

PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>cd ./hadoop/hadoop/dfs
PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>docker cp hadoop:/tmp/hadoop-root/dfs/dfs.tar .
PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>tar -zxvf dfs.tar
PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>ls


    디렉터리: C:\Users\user1\docker-compose\hadoop\hadoop\dfs


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
da----      2021-04-21  오전 11:04                data
d-----      2021-04-21  오전 10:12                name
d-----      2021-04-21  오전 10:13                namesecondary
```

{% endtab %}

{% tab title="2. docker-compose.yml" %}

```
docker-compose.yml 파일 수정 
```

{% code title="docker-compose.yml volumes 의 주석 제거" %}

```
  volumes:
   - ./hadoop/dfs/name:/tmp/hadoop-root/dfs/name
   - ./hadoop/dfs/data:/tmp/hadoop-root/dfs/data
   - ./hadoop/dfs/namesecondary:/tmp/hadoop-root/dfs/namesecondary
```

{% endcode %}

{% file src="/files/-MYmfDb3lwVPBag5hLk4" %}
{% endtab %}

{% tab title="3. docker-compose 실행" %}

```
수정된 docker-compose.yml 파일로 컨테이너 시작    
hadoop-dev 에 접속 후 데이터 확인 
```

```bash
PS C:\Users\user1> cd ./docker-compose/hadoop
PS C:\Users\user1\docker-compose\hadoop> docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
PS C:\Users\user1\docker-compose\hadoop> docker-compose up -d
Creating network "hadoop_default" with the default driver
Creating hadoop-dev ... done
PS C:\Users\user1\docker-compose\hadoop> docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED         STATUS         PORTS                                                                                                                                                                                          NAMES
2d5becf8894f   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   4 seconds ago   Up 8 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
PS C:\Users\user1\docker-compose\hadoop> docker exec -it hadoop-dev /bin/bash
[root@2d5becf8894f /]# hadoop fs -ls /
Found 5 items
drwxr-xr-x   - root supergroup          0 2021-04-21 01:45 /data
drwxr-xr-x   - root supergroup          0 2021-04-21 01:48 /data_in_out
drwxr-xr-x   - root supergroup          0 2021-04-21 01:48 /data_in_out_wordcount
drwxr-xr-x   - root supergroup          0 2021-04-21 01:15 /data_out
drwx------   - root supergroup          0 2021-04-21 01:15 /tmp
```

{% endtab %}
{% endtabs %}

### ETC. Error/Worning 해결 방안&#x20;

* 데이터가 사라져요!!!

{% tabs %}
{% tab title="1. 데이터 확인" %}

```
컨테이너 재시작 또는 중지 후 시작 했을 때 데이터가 사라짐    
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c]# hadoop fs -ls  /data_out
Found 2 items
-rw-r--r--   1 root supergroup          0 2021-04-21 00:53 /data_out/_SUCCESS
-rw-r--r--   1 root supergroup         24 2021-04-21 00:53 /data_out/part-r-00000
[root@4bb51d4c894c]# hadoop fs -cat /data_out/*
count   1812
length  13184
[root@4bb51d4c894c]#
## ---> 컨테이너 재시작 또는 중지 후 시작           
```

{% endtab %}

{% tab title="2. 확인 방법" %}

```
docker logs -f hadoop-dev (hadoop-dev log 확인)    
docker-compose.yml 의 volumes 파라미터 경로 확인 
```

{% code title="hadoop-dev log 확인     " %}

```bash
PS C:\Users\user1\docker-compose\hadoop>docker logs -f hadoop-dev
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:L9lYtwzxrlF6HqevI8yaUlXhuoihLxHNrwIMXjv1Yow root@2d5becf8894f
The key's randomart image is:
+---[RSA 1024]----+
|            ..   |
|           ..    |
|     o    ...    |
|.  ...o   .+     |
|.o. =.o.S.+ +    |
| .oE.= +oB O .   |
|   .+.oo=o* * .  |
|    o.o  o+=.+   |
|     o..o...++.  |
+----[SHA256]-----+
'/root/.ssh/id_rsa.pub' -> '/root/.ssh/authorized_keys'
mode of '/root/.ssh/authorized_keys' changed from 0644 (rw-r--r--) to 0400 (r--------)
Generating SSH2 RSA host key: [  OK  ]
Generating SSH2 ECDSA host key: [  OK  ]
Generating SSH2 ED25519 host key: [  OK  ]
```

{% endcode %}

{% code title="docker-compose.yml 의 volumes 경로 확인     " %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 hadoop-dev: # 서비스 명
  image: harisekhon/hadoop-dev # 사용할 이미지
  container_name: hadoop-dev # 컨테이너 이름 설정
  restart: always 
  volumes:
   - ./hadoop/dfs/name:/tmp/hadoop-root/dfs/name
   - ./hadoop/dfs/data:/tmp/hadoop-root/dfs/data
   - ./hadoop/dfs/namesecondary:/tmp/hadoop-root/dfs/namesecondary
   - ./hadoop/logs:/hadoop/logs
  ports:
   - 8042:8042    # node
   - 8088:8088    # cluster
   - 50070:50070 # dfshealth
   - 50075:50075 # datanode
   - 50090:50090 # status
```

{% endcode %}

&#x20;
{% endtab %}

{% tab title="3. 처리 방법  " %}

```
docker-compose.yml 파일을 다운로드 받아서 시작      
Step 6 를 다시 한번 해 본다  
```

{% endtab %}
{% endtabs %}

## 부록. Docker 명령어 사용법    &#x20;

### 1. docker images 검색 방법       &#x20;

#### 1.1 Docker search 를 이용한 방법      &#x20;

{% code title="Docker Search 검색 방법    " %}

```bash
$ docker search tomcat
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
tomcat                        Apache Tomcat is an open source implementati…   3027      [OK]
tomee                         Apache TomEE is an all-Apache Java EE certif…   87        [OK]
dordoka/tomcat                Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base…   57                   [OK]
bitnami/tomcat                Bitnami Tomcat Docker Image                     37                   [OK]
kubeguide/tomcat-app          Tomcat image for Chapter 1                      30
consol/tomcat-7.0             Tomcat 7.0.57, 8080, "admin/admin"              18                   [OK]
cloudesire/tomcat             Tomcat server, 6/7/8                            15                   [OK]
aallam/tomcat-mysql           Debian, Oracle JDK, Tomcat & MySQL              13                   [OK]
arm32v7/tomcat                Apache Tomcat is an open source implementati…   11
rightctrl/tomcat              CentOS , Oracle Java, tomcat application ssl…   6                    [OK]
unidata/tomcat-docker         Security-hardened Tomcat Docker container.      5                    [OK]
arm64v8/tomcat                Apache Tomcat is an open source implementati…   3
oobsri/tomcat8                Testing CI Jobs with different names.           2
jelastic/tomcat               An image of the Tomcat Java application serv…   2
cfje/tomcat-resource          Tomcat Concourse Resource                       2
amd64/tomcat                  Apache Tomcat is an open source implementati…   2
chenyufeng/tomcat-centos      tomcat基于centos6的镜像                              1                    [OK]
camptocamp/tomcat-logback     Docker image for tomcat with logback integra…   1                    [OK]
picoded/tomcat7               tomcat7 with jre8 and MANAGER_USER / MANAGER…   1                    [OK]
99taxis/tomcat7               Tomcat7                                         1                    [OK]
i386/tomcat                   Apache Tomcat is an open source implementati…   1
ppc64le/tomcat                Apache Tomcat is an open source implementati…   1
secoresearch/tomcat-varnish   Tomcat and Varnish 5.0                          0                    [OK]
softwareplant/tomcat          Tomcat images for jira-cloud testing            0                    [OK]
s390x/tomcat                  Apache Tomcat is an open source implementati…   0
```

{% endcode %}

#### 1.2 docker hub 사이트에 방문 하여 검색 하는 방법     &#x20;

![그림. Docker hub 사이트   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-M_d7HQoGfoVIwNlf5ko%2F-M_d7z-37iGHvnyvLA1K%2Fimage.png?alt=media\&token=e76937da-ced6-4dc3-8437-bc8e09676f54)

#### 1.3 Docker hub 에서 검색한 tomcat 상세 정보   &#x20;

![그림. Docker hub 의 tomcat Description 정보     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-M_d8N_B-I78K-LqcxqE%2F-M_d8SIpcL2JCdf5pzEH%2Fimage.png?alt=media\&token=d4ee5883-12d2-4d83-89d7-d06f34e70886)

![그림. Docker hub 의 tomcat Tag 정보   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-M_d8N_B-I78K-LqcxqE%2F-M_d91_acb7ir8wT8X5v%2Fimage.png?alt=media\&token=45072aeb-51a0-4b70-a9aa-7535fcd630ef)

### 2. docker images 다운 받기     &#x20;

#### 2.1 Docker Pull 명령어를 이용하여 Images 를 다운 받기    &#x20;

{% code title="Docker Pull 명령어를 이용하여 ubuntu images 를 로컬에 다운(\*\* tag 의 버전을 선택 할 수 있음, 지정하지 않았을땐 latest 버전으로 다운로드 됨)   " %}

```bash
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
345e3491a907: Already exists
57671312ef6f: Already exists
5e9250ddb7d0: Already exists
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
```

{% endcode %}

### 3. docker images 확인 방법               &#x20;

#### 3.1 docker images 확인  방   &#x20;

{% code title="docker images 확인 방법" %}

```bash
$ docker images
REPOSITORY                                      TAG                   IMAGE ID       CREATED         SIZE
tomcat                                          latest                c43a65faae57   10 hours ago    667MB
nextcloud                                       latest                a1fe3eba658d   7 days ago      868MB
mongo                                           4.0                   cf8a52aa11b1   7 days ago      430MB
adminer                                         latest                7707fd9b142f   12 days ago     89.8MB
mediawiki                                       latest                0c7cd121c65f   2 weeks ago     785MB
rocket.chat                                     latest                9b447d9edcb3   2 weeks ago     830MB
mariadb                                         10.4.18               37406e27ca2c   2 weeks ago     394MB
mariadb                                         latest                992bce5ed710   2 weeks ago     401MB
bonita                                          latest                aa3e6a88c70e   2 weeks ago     445MB
tomcat                                          <none>                c0e850d7b9bb   3 weeks ago     667MB
tomcat                                          10.0.5-jdk8-openjdk   698d4f634b6a   3 weeks ago     534MB
docker.elastic.co/elasticsearch/elasticsearch   7.12.1                41dc8ea0f139   3 weeks ago     851MB
elasticsearch                                   7.12.1                41dc8ea0f139   3 weeks ago     851MB
tensorflow/tensorflow                           nightly-jupyter       11641d92de28   3 weeks ago     1.47GB
jupyter/tensorflow-notebook                     latest                4325fb762796   3 weeks ago     3.71GB
jetty                                           latest                578b8511e3f6   3 weeks ago     497MB
redis                                           alpine                d6121e6a8ceb   4 weeks ago     32.3MB
wordpress                                       latest                1a226d88524f   4 weeks ago     550MB
ghost                                           latest                804319142d08   4 weeks ago     453MB
postgres                                        10                    76e40881ecc6   4 weeks ago     200MB
mysql                                           5.7                   450379344707   4 weeks ago     449MB
mysql                                           latest                cbe8815cbea8   4 weeks ago     546MB
mongo                                           4                     30b3be246e39   5 weeks ago     449MB
nirmata/tomcat9-alpine-jre12-openj9             latest                c9796dcdd8ae   7 weeks ago     156MB
tensorflow/tensorflow                           latest-jupyter        5cb625714462   3 months ago    1.75GB
tensorflow/tensorflow                           latest                45872ba1e662   3 months ago    1.57GB
```

{% endcode %}

#### 3.2 docker history 확인

{% code title="docker images 의 history 의 내용 확인" %}

```bash
$ docker images
REPOSITORY                                      TAG               IMAGE ID       CREATED         SIZE
tomcat                                          latest            c43a65faae57   3 days ago      667MB

$ docker history c43a65faae57 # image의 history 를 확인      
IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
c43a65faae57   3 days ago   /bin/sh -c #(nop)  CMD ["catalina.sh" "run"]    0B
<missing>      3 days ago   /bin/sh -c #(nop)  EXPOSE 8080                  0B
<missing>      3 days ago   /bin/sh -c set -eux;  nativeLines="$(catalin…   0B
<missing>      3 days ago   /bin/sh -c set -eux;   savedAptMark="$(apt-m…   20.3MB
<missing>      3 days ago   /bin/sh -c #(nop)  ENV TOMCAT_SHA512=4a82ed5…   0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV TOMCAT_VERSION=9.0.46    0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV TOMCAT_MAJOR=9           0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV GPG_KEYS=05AB33110949…   0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV LD_LIBRARY_PATH=/usr/…   0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV TOMCAT_NATIVE_LIBDIR=…   0B
<missing>      3 days ago   /bin/sh -c #(nop) WORKDIR /usr/local/tomcat     0B
<missing>      3 days ago   /bin/sh -c mkdir -p "$CATALINA_HOME"            0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV PATH=/usr/local/tomca…   0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV CATALINA_HOME=/usr/lo…   0B
<missing>      4 days ago   /bin/sh -c #(nop)  CMD ["jshell"]               0B
<missing>      4 days ago   /bin/sh -c set -eux;   arch="$(dpkg --print-…   342MB
<missing>      4 days ago   /bin/sh -c #(nop)  ENV JAVA_VERSION=11.0.11+9   0B
<missing>      4 days ago   /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B
<missing>      4 days ago   /bin/sh -c #(nop)  ENV PATH=/usr/local/openj…   0B
<missing>      4 days ago   /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J…   27B
<missing>      4 days ago   /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/local/…   0B
<missing>      4 days ago   /bin/sh -c set -eux;  apt-get update;  apt-g…   11.1MB
<missing>      5 days ago   /bin/sh -c apt-get update && apt-get install…   146MB
<missing>      5 days ago   /bin/sh -c set -ex;  if ! command -v gpg > /…   17.5MB
<missing>      5 days ago   /bin/sh -c set -eux;  apt-get update;  apt-g…   16.5MB
<missing>      5 days ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      5 days ago   /bin/sh -c #(nop) ADD file:1a1eae7a82c66d673…   114MB
```

{% endcode %}

### 4. docker images 삭제    &#x20;

#### 4.1 docker images 를 rmi 또는 rmi -f 로 이미지 삭제(rmi or rmi -f command)  &#x20;

{% code title="docker rmi 또는 rmi -f 로 이미지 삭제(rmi Command 는 이미지 삭제)   " %}

```bash
$ docker images
REPOSITORY                                      TAG                   IMAGE ID       CREATED         SIZE
tomcat                                          <none>                c0e850d7b9bb   3 weeks ago     667MB
tomcat                                          10.0.5-jdk8-openjdk   698d4f634b6a   3 weeks ago     534MB

$ docker rmi c0e850d7b9bb # docker image 삭제    
Untagged: tomcat@sha256:0509684774ac53d8b152f4a50dd92889218a8633c0feddb4b35d092e55cd215d
Deleted: sha256:c0e850d7b9bb0aa55db12991bd0fe825cdab4f5d4be72b2a94cc760bcc3aa82f
Deleted: sha256:de48848504882240b92b703da9601af0709e38a64a9a40a07109b78446aa9e95
Deleted: sha256:1a0e354e31a0ab7456bbad4f060ea6c6f7ab7b144dc74c874bf689c7e519e27c
Deleted: sha256:cd25cd758181de964bdfb328f5c630c25263557f5a46793356c93e0e369af7a4
Deleted: sha256:b824ca3e73f4984338fc3eb212702bcadd7770320c8297fc21b2d1d265146d16
Deleted: sha256:d8b838beea6f90d6556650b670930f58d16bf0007b1a7d9effe3dd1735fdfa8d

$ docker rmi -f 698d4f634b6a # 컨테이너와 이미지를 강제로 삭제    
Untagged: tomcat:10.0.5-jdk8-openjdk
Untagged: tomcat@sha256:d71aea6d7ea381800fe822bd4703f618f1fa5d549d95745fe2f9307747d38f94
Deleted: sha256:698d4f634b6a5d5ff99f8e283ef79d7a4bffdf57555755d6684d4fae111cb9b5
Deleted: sha256:9e223a6dc64bb093d14d86326d1ba3be286b7147ab92e50ef0d63f5e1c91e0ca
Deleted: sha256:a0eb2d97f87c1451c26f62d850b7b940bbe051496bd1fc75145cb64503754d82
Deleted: sha256:db7de79a03f68b3e8f9e4d2df4067151c5974d3b917bcc4d589e1e80385651be
Deleted: sha256:322cc15a236c54f0447628c4203d59a01f99ff6719d5ffa184ef629bfc2b3381
Deleted: sha256:9ed7fb822f948a4b78dfcb7e19cf7a903fc735ee2e624a38174d641f91fb3ae4
Deleted: sha256:3f61a2fb8ca663bf88786884ba5f5be3274c91ee82c1ae9bb36bb1ad1fa0b3d0
Deleted: sha256:ac996dca9c2f86e5d2744187de88cd328f12dde417a7950dff33448906228ae3
Deleted: sha256:e4ed057c6550560fb44b9146dadd5c62bfc00404ba69937c89a44e10485c9010
Deleted: sha256:985d0a2cd810a6fc7b68886aee94ee060acd63e122a1def04370dac5fa9d05f6
Deleted: sha256:e2c6ff46235709f5178ab7c1939f4fba7237ffde84e13b1582fa5f0837c1d978
```

{% endcode %}

### 5. docker container 실행 및 접속 방법      &#x20;

#### 5.1 docker container 실행 및 접속 방법(run/attach command :: -it\[Shell connect], -d\[background])   &#x20;

{% tabs %}
{% tab title="docker run -it" %}
{% code title="docker run 으로 실행(run Command 는 컨테이너 실행)   " %}

```bash
$ docker run -it ubuntu /bin/bash # ubuntu 실행 후 bash 접속    
root@611214af2b73:/# exit

$ docker ps # docker container 가 실행 중인 리스트    
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
eeef4fb61940   ubuntu    "/bin/bash"   4 seconds ago   Up 3 seconds             suspicious_cerf

$ docker ps -a # docker container 의 종료된 리스트 확인  
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
eeef4fb61940   ubuntu    "/bin/bash"   8 seconds ago   Exited (0) 6 seconds ago             suspicious_cerf
```

{% endcode %}
{% endtab %}

{% tab title="docker run -d" %}
{% code title="docker run 으로 실행(run Command 는 컨테이너 실행) " %}

```bash
$ docker run -d ubuntu # ubuntu 를 Background 실행 

$ docker ps # docker container 가 실행 중인 리스트    
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
eeef4fb61940   ubuntu    "/bin/bash"   4 seconds ago   Up 3 seconds             suspicious_cerf

$ docker exec -it eeef4fb61940 /bin/bash # 실행 된 container 에 bash 로 접속   
root@611214af2b73:/# exit    
```

{% endcode %}
{% endtab %}

{% tab title="docker attach" %}
{% code title="실행 중인 container 에 접속    " %}

```
$ docker attach eeef4fb61940 # 실행 중인 container 에 접속하기    
root@611214af2b73:/# exit  
```

{% endcode %}
{% endtab %}
{% endtabs %}

#### 5.2 docker container 실행 방법(start command)

{% code title="docker start 로 실행(start Command 는 종료된 컨테이너 실행)" %}

```bash
$ docker ps -a # 종료된 컨테이너 검색 
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
80d50a1f66e3   ubuntu    "/bin/bash"   7 minutes ago   Exited (0) 7 minutes ago             vibrant_bouman
$ docker start 80d50a1f66e3 # 종료된 컨테이너 실행   
80d50a1f66e3
$ docker ps # 실행 완료 후 종료   
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
$ docker ps -a # 종료된 컨테이너 상태 확인   
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                      PORTS     NAMES
80d50a1f66e3   ubuntu    "/bin/bash"   7 minutes ago   Exited (0) 11 seconds ago             vibrant_bouman
```

{% endcode %}

#### 5.3 docker container 실행 방법(restart command)    &#x20;

{% code title="docker restart 로 실행(restart Command 는 시작 또는 종료된 container 를 재시작) " %}

```bash
$ docker ps -a # 종료된 컨테이너 검 
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                      PORTS     NAMES
80d50a1f66e3   ubuntu    "/bin/bash"   7 minutes ago   Exited (0) 11 seconds ago             vibrant_bouman

$ docker restart 80d50a1f66e3 # 종료된 컨테이너 재시작   
80d50a1f66e3

$ docker ps -a # 컨테이너 확인     
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
80d50a1f66e3   ubuntu    "/bin/bash"   11 minutes ago   Exited (0) 7 seconds ago             vibrant_bouman
```

{% endcode %}

### 6. docker container 중지 방법   &#x20;

#### 6.1 docker container 중지 방법(stop command)  &#x20;

{% code title="docker stop 으로 종료(stop Command 는 container 종료)    " %}

```bash
$ docker ps # 컨테이너 검색    
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                      PORTS     NAMES
80d50a1f66e3   ubuntu    "/bin/bash"   7 minutes ago   60 seconds ago             vibrant_bouman

$ docker stop 80d50a1f66e3 # 컨테이너 종료      
80d50a1f66e3

$ docker ps -a # 컨테이너 확인     
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
80d50a1f66e3   ubuntu    "/bin/bash"   7 seconds ago    Exited (0) 7 seconds ago             vibrant_bouman
```

{% endcode %}

### 7. docker container 삭제   &#x20;

#### 7.1 docker container 삭제 방법(rm command)   &#x20;

{% code title="docker rm 으로 container 삭제(rm Command 는 container 삭제)   " %}

```bash
$ docker ps -a # 종료된 컨테이너 검색   
CONTAINER ID   IMAGE     COMMAND       CREATED      STATUS                  PORTS     NAMES
4fd7ed2b06f9   ubuntu    "/bin/bash"   2 days ago   Exited (0) 2 days ago             youthful_grothendieck
32840b2b7e9b   ubuntu    "/bin/bash"   8 seconds ago   Exited (0) 8 seconds ago             thirsty_dhawan

$ docker rm 4fd7ed2b06f9 #컨테이너 삭제    
4fd7ed2b06f9

$ docker rm $(docker ps -a -q) # 모든 컨테이너 삭제       
32840b2b7e9b

$ docker ps -a # 종료된 컨테이너 확인
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

{% endcode %}

### 8. docker logs 확인    &#x20;

#### 8.1 docker container 의 log 확인(logs or logs -f -t command)        &#x20;

{% code title="docker container 의 log 를 확인(logs -f 확인)" %}

```bash
$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
648a49d08fe7   ubuntu    "/bin/bash"   3 minutes ago   Up 3 minutes             busy_carver

$ docker logs 648a49d08fe7 # 현재 기준의 Log 만 보여줌    

$ docker logs -f 648a49d08fe7 # 실시간 log 를 보여줌    

$ docker logs -f -t 648a49d08fe7 # Server TimeStamp log 를 보여줌   
```

{% endcode %}

### 9. docker stats/top 확인    &#x20;

#### 9.1 docker stats 확인

{% code title="docker container 의 시스템 상태 확인" %}

```bash
$ docker stats 648a49d08fe7 # 컨테이너의 상태를 보여줌      
CONTAINER ID   NAME          CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O   PIDS
648a49d08fe7   busy_carver   0.00%     2.879MiB / 11.95GiB   0.02%     1.26kB / 0B   0B / 0B     1
```

{% endcode %}

#### 9.2 docker top&#x20;

{% code title="docker container 의 process 상태 확인   " %}

```bash
$ docker top 648a49d08fe7 # 컨테이너 process 상태 확인     
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2153                2132                0                   03:04               ?                   00:00:00            /bin/bash
root                2228                2153                0                   03:24               ?                   00:00:00            perl
```

{% endcode %}

### 10. docker container 파일 복사   &#x20;

#### 10.1 docker container 파일 복사(container 에서 localhost 로 복사 하기)

{% code title="container -> localhost 로 복사     " %}

```bash
$ docker cp master-db:user001_dump.sql . # cp [원본데이터] [복사할위치]   
```

{% endcode %}

#### 10.2 docker container 파일 복사(localhost 에서 container 로 복사 하기)

{% code title="localhost -> container 로 복사" %}

```bash
$ docker cp user001_dump.sql slave-db:. # cp [원본데이터] [복사할위치]   
```

{% endcode %}

### 11. docker container 정보 및 상세 정보 보기     &#x20;

#### 11.1 docker ps 로 정보 확인(ps or ps -a command)   &#x20;

{% code title="container 상태 정보 확인   " %}

```bash
$ docker ps # 실행 중인 container 확인    
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
314a7288e569   ubuntu    "/bin/bash"   2 minutes ago   Up 2 minutes             laughing_euclid

$ docker ps -a # 중지 또는 실행 중인 container 확인   
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
314a7288e569   ubuntu    "/bin/bash"   2 minutes ago   Up 2 minutes             laughing_euclid
648a49d08fe7   ubuntu    "/bin/bash"   3 minutes ago   Up 3 minutes             busy_carver
```

{% endcode %}

#### 11.2 docker inspect 로 정보 확인(inspect command)

{% code title="inspect 를 이용하여 container 의 상세 정보 확인    " %}

```bash
$ docker inspect 314a7288e569
[
    {
        "Id": "314a7288e569369f4e1cc1ca808afcad32645d99a39e5a0049dc646acd476590",
        "Created": "2021-05-17T03:48:15.6653275Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2596,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-05-17T03:48:16.0161869Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:7e0aa2d69a153215c790488ed1fcec162015e973e49962d438e18249d16fa9bd",
        "ResolvConfPath": "/var/lib/docker/containers/314a7288e569369f4e1cc1ca808afcad32645d99a39e5a0049dc646acd476590/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/314a7288e569369f4e1cc1ca808afcad32645d99a39e5a0049dc646acd476590/hostname",
        "HostsPath": "/var/lib/docker/containers/314a7288e569369f4e1cc1ca808afcad32645d99a39e5a0049dc646acd476590/hosts",
        "LogPath": "/var/lib/docker/containers/314a7288e569369f4e1cc1ca808afcad32645d99a39e5a0049dc646acd476590/314a7288e569369f4e1cc1ca808afcad32645d99a39e5a0049dc646acd476590-json.log",
        "Name": "/laughing_euclid",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                27,
                168
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/c2b9a13767439122f9a5df8334ea51940dd2dd3a20b5dc5ffdf7a74179fb56e6-init/diff:/var/lib/docker/overlay2/0d3900a7c9e37b91a3e023df3a59b7f23330f7692ffa2fddd65f744fb7d86c9f/diff:/var/lib/docker/overlay2/ae118fc795087ebfcfbec12b285a1106be16d5984bdc8abd8c210cf6735eff4d/diff:/var/lib/docker/overlay2/14ae07770678390b02cd27cd696f58b2cf38aeb30369a9ff748dd35f757b3983/diff",
                "MergedDir": "/var/lib/docker/overlay2/c2b9a13767439122f9a5df8334ea51940dd2dd3a20b5dc5ffdf7a74179fb56e6/merged",
                "UpperDir": "/var/lib/docker/overlay2/c2b9a13767439122f9a5df8334ea51940dd2dd3a20b5dc5ffdf7a74179fb56e6/diff",
                "WorkDir": "/var/lib/docker/overlay2/c2b9a13767439122f9a5df8334ea51940dd2dd3a20b5dc5ffdf7a74179fb56e6/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "314a7288e569",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "ubuntu",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "6f65f8e570103862fa99bfb60a82c176138e81d0e34aa75e6fc1f1c2430ab06a",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/6f65f8e57010",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "c8349fc50d81134adfc574ca011200544ac2f9b2cdb2e759b5c49543e8598340",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "e6ef417d4fbe02878a99fd130df88ac2da09b09fa75b511844a02b88a9f1873b",
                    "EndpointID": "c8349fc50d81134adfc574ca011200544ac2f9b2cdb2e759b5c49543e8598340",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]  
```

{% endcode %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


# 시스템 별 도커(docker) 설치 방법

\[https\://doc.skill.or.kr] Windows, Mac, Linux, Ubuntu 별 시스템 설치 방법

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. 윈도우 시스템 도커(docker) 설치 방법   &#x20;

### 1.1 윈도우용 도커 데스크탑이란?   &#x20;

> Windows 용 Docker Desktop은 Windows 10에서 실행되도록 설계된 Docker입니다. Docker화된 앱을 빌드, 배송 및 실행하기위한 사용하기 쉬운 개발 환경을 제공하는 기본 Windows 애플리케이션입니다. Windows 용 Docker Desktop은 Windows 네이티브 Hyper-V 가상화 및 네트워킹을 사용하며 Windows에서 Docker 앱을 개발하는 가장 빠르고 안정적인 방법입니다. Windows 용 Docker Desktop은 Linux 및 Windows Docker 컨테이너 실행을 모두 지원합니다.

### 1.2 윈도우용 도커 데스크탑 다운로드

> [홈페이지 다운로드 ](https://hub.docker.com/editions/community/docker-ce-desktop-windows): `Docker Hub (Docker Desktop for Windows) 사이트`     &#x20;
>
> [윈도우용 도커 데스크탑 다운로드](https://desktop.docker.com/win/stable/amd64/Docker%20Desktop%20Installer.exe) : `Docker Desktop Installer.exe`

### 1.3 설치 방법    &#x20;

> 다운로드 한 `Docker Desktop Installer.exe` 더블 클릭 하여 설치 프로그램을 실행합니다.
>
> 설치가 완료되면 Docker가 자동으로 시작됩니다. ![](https://d1q6f0aelx0por.cloudfront.net/icons/whale-x-win.png)알림 영역 의 고래 는 Docker가 실행 중이며 터미널에서 액세스 할 수 있음을 나타냅니다.

### 1.4 실행 방법   &#x20;

> PowerShell과 같은 명령 줄 터미널을 열고 몇 가지 Docker 명령을 사용해보십시오!
>
> * `docker version`버전을 확인하려면 실행하십시오 .
> * 실행 `docker run hello-world`하여 Docker가 이미지를 가져오고 실행할 수 있는지 확인합니다.

### 1.5 Windows 10에 Linux용 Windows 하위 시스템 설치 가이드(wsl2kernel)    &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-M_tM939YxTmwaaiuL2r%2F-M_tOqmTDDf7w9rVgieu%2Fimage.png?alt=media\&token=c113a117-c88c-4823-94bd-e57ccb4c1aad)

#### 1.5.1 Linux 커널 업데이트 패키지 다운로드 ([참고사이트](https://docs.microsoft.com/ko-kr/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package))   &#x20;

> 1. 최신 패키지 다운로드 : [x64 머신용 최신 WSL2 Linux 커널 업데이트 패키지](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)   &#x20;
> 2. 이전 단계에서 다운로드한 업데이트 패키지를 실행합니다. (실행하려면 두 번 클릭 - 관리자 권한을 요구하는 메시지가 표시되면 '예'를 선택하여 이 설치를 승인합니다.)

#### 1.5.2 Linux 배포 설치    &#x20;

> &#x20;1\. [Microsoft Store](https://aka.ms/wslstore)를 열고 즐겨 찾는 Linux 배포를 선택합니다.

![그림. Microsoft Store 사이트   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-M_tQOL-sTPq8PIRFKZL%2F-M_tR51zIyOz_PPSrRcU%2Fimage.png?alt=media\&token=cb67aa76-62da-4b83-b85c-deeeb5082487)

> 각 배포에 대한 Microsoft Store 페이지를 여는 링크는 다음과 같습니다.
>
> * [Ubuntu 16.04 LTS](https://www.microsoft.com/store/apps/9pjn388hp8c9)
> * [Ubuntu 18.04 LTS](https://www.microsoft.com/store/apps/9N9TNGVNDL3Q)
> * [Ubuntu 20.04 LTS](https://www.microsoft.com/store/apps/9n6svws3rx71)
> * [openSUSE Leap 15.1](https://www.microsoft.com/store/apps/9NJFZK00FGKV)
> * [SUSE Linux Enterprise Server 12 SP5](https://www.microsoft.com/store/apps/9MZ3D1TRP8T1)
> * [SUSE Linux Enterprise Server 15 SP1](https://www.microsoft.com/store/apps/9PN498VPMF3Z)
> * [Kali Linux](https://www.microsoft.com/store/apps/9PKR34TNCV07)
> * [Debian GNU/Linux](https://www.microsoft.com/store/apps/9MSVKQC78PK6)
> * [Fedora Remix for WSL](https://www.microsoft.com/store/apps/9n6gdm4k2hnc)
> * [Pengwin](https://www.microsoft.com/store/apps/9NV1GV1PXZ6P)
> * [Pengwin Enterprise](https://www.microsoft.com/store/apps/9N8LP0X93VCP)
> * [Alpine WSL](https://www.microsoft.com/store/apps/9p804crf0395)

> 2\. 배포 페이지에서 "가져오기"를 선택합니다.

![그림. Microsoft Store 사이트   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-M_tQOL-sTPq8PIRFKZL%2F-M_tRN-64LCZ7zMBxAoK%2Fimage.png?alt=media\&token=691d9d8b-afa5-4fa5-935d-c4341f0b7aa6)

> 3\.  [새 Linux 배포를 위한 사용자 계정 및 암호를 만들어야](https://docs.microsoft.com/ko-kr/windows/wsl/user-support) 합니다.

![그림. Ubuntu 계정 생성 및 패스워드 입력   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-M_tQOL-sTPq8PIRFKZL%2F-M_tRiMQtC8bnsmw76ri%2Fimage.png?alt=media\&token=c662df09-44d2-4f63-a0f8-61292f271813)

### 1.6 문제 해결  &#x20;

> * **0x80070003 오류로 인한 설치 실패**
>   * Linux용 Windows 하위 시스템은 시스템 드라이브(일반적으로 `C:` 드라이브)에서만 실행됩니다. 배포가 시스템 드라이브에 저장되어 있는지 확인합니다.
>   * **설정** -> \*\*시스템 -->**스토리지** -> **더 많은 스토리지 설정을 차례로 엽니다. 새 콘텐츠가 저장된 위치를 변경합니다.**

> * **0x8007019e 오류로 인한 WslRegisterDistribution 실패**
>   * 선택적인 Linux용 Windows 하위 시스템 구성 요소가 실행되지 않습니다.
>   * **제어판** -> **프로그램 및 기능** -> **Windows 기능 사용/사용 안 함** 을 차례로 열어 **Linux용 Windows 하위 시스템** 을 선택하거나 이 문서의 시작 부분에서 설명한 PowerShell cmdlet을 사용합니다.

> * **0x80070003 오류 또는 0x80370102 오류로 인해 설치하지 못했습니다.**
>   * 컴퓨터 BIOS 내에서 가상화를 사용하도록 설정했는지 확인합니다. 이 방법에 대한 지침은 컴퓨터마다 다르며, CPU 관련 옵션에 있을 가능성이 높습니다.
>   * WSL2를 사용하려면 CPU가 Intel Nehalem 프로세서(Intel Core 1세대) 및 AMD Opteron에 도입된 SLAT(두 번째 수준 주소 변환) 기능을 지원해야 합니다. 이전 CPU(예: Intel Core 2 Duo)는 Virtual Machine 플랫폼을 성공적으로 설치하더라도 WSL2를 실행할 수 없습니다.

> * **업그레이드 시도 중 오류: `Invalid command line option: wsl --set-version Ubuntu 2`**
>   * Linux용 Windows 하위 시스템을 사용하도록 설정했고 Windows 빌드 버전 18362 이상을 사용하고 있는지 확인합니다. WSL을 실행하도록 하려면 관리자 권한(`Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux`)으로 PowerShell 프롬프트에서 이 명령을 실행합니다.

> * **가상 디스크 시스템 제한으로 인해 요청한 작업을 완료할 수 없습니다. 가상 하드 디스크 파일은 압축이 풀려 있는 상태이고 암호화되지 않아야 하며 스파스가 아니어야 합니다.**
>   * Linux 배포판의 프로필 폴더를 열어서 "내용 압축"과 "내용 암호화"를 선택 취소합니다. 이는 Windows 파일 시스템의 `USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited...` 같은 폴더에 있을 것입니다.
>   * 이 Linux 배포판 프로필에는 LocalState 폴더가 있을 것입니다. 이 폴더를 마우스 오른쪽 단추로 클릭하여 옵션 메뉴를 표시합니다. 속성 > 고급을 선택하고 "내용을 압축하여 디스크 공간 절약" 및 "데이터 보호를 위해 내용을 암호화" 확인란이 선택 취소되어 있는지 확인합니다(선택하지 않음). 이를 현재 폴더 또는 모든 하위 폴더와 파일에만 적용할지 묻는 메시지가 표시되면 압축 플래그만 지우도록 "이 폴더만"을 선택합니다. 그러면 `wsl --set-version` 명령이 작동할 것입니다.

> * **cmdlet, 함수, 스크립트 파일 또는 실행 프로그램의 이름에는 'wsl'이라는 단어가 들어갈 수 없습니다.**
>   * [Linux용 Windows 하위 시스템 옵션 구성 요소가 설치되었는지](https://docs.microsoft.com/ko-kr/windows/wsl/install-win10#step-3---enable-virtual-machine-feature) 확인하세요. 또는 ARM64 디바이스를 사용 중이고 PowerShell에서 이 명령을 실행하는 경우 이 오류가 표시됩니다. [PowerShell Core](https://docs.microsoft.com/ko-kr/powershell/scripting/install/installing-powershell-core-on-windows) 또는 명령 프롬프트에서 `wsl.exe`를 대신 실행하세요.

> * **오류: 이 업데이트는 Linux용 Windows 하위 시스템을 사용하는 머신에만 적용됩니다.**
>   * Linux 커널 업데이트 MSI 패키지를 설치하려면 WSL이 필요하며, 먼저 이를 사용하도록 설정해야 합니다. 실패하면 `This update only applies to machines with the Windows Subsystem for Linux` 메시지가 표시됩니다.
>   * 이 메시지가 표시되는 세 가지 가능한 원인은 다음과 같습니다.
>   * WSL 2를 지원하지 않는 이전 버전의 Windows를 아직 사용하고 있습니다. 버전 요구 사항 및 업데이트에 대한 링크는 2단계를 참조하세요.
>   * WSL을 사용하도록 설정되지 않았습니다. 1단계로 돌아가서 머신에서 선택적 WSL 기능을 사용하도록 설정되어 있는지 확인해야 합니다.
>   * WSL을 사용하도록 설정한 후에는 다시 부팅해야 적용됩니다. 머신을 다시 부팅하고 다시 시도하세요.

> * **오류: WSL 2에는 커널 구성 요소에 대한 업데이트가 필요합니다. 자세한 내용은** [**https://aka.ms/wsl2kernel**](https://aka.ms/wsl2kernel) **을 방문하세요.**
>   * Linux 커널 패키지가 %SystemRoot%\system32\lxss\tools 폴더에 없는 경우 이 오류가 발생합니다. 이러한 설치 지침의 4단계에서 Linux 커널 업데이트 MSI 패키지를 설치하여 이 문제를 해결하세요. '프로그램 추가/제거'에서 MSI를 제거하고 다시 설치해야 할 수 있습니다.

> * **오류: ubuntu 의 root or user 패스워드를 잃어 버렸을때.**
>
>   * 윈도우 터미널(Powershell or cmd) 에서 기본 사용자를 변경
>
>   &#x20;       `>  ubuntu config --default-user root`
>
>   * 윈도우 터미널(Powershell or cmd) 에서 ubuntu 접속 후 비밀번호를 변경
>
>   &#x20;       `# passwd ubuntu or root` 사용자 입력 후 비밀번호 변경 &#x20;
>
>   * wsl distro 별 기본 사용자 변경
>
>   &#x20;       `# Ubuntu : > ubuntu config --default-user root`\
>   `# openSUSE Leap 42: > openSUSE-42 config --default-user root`\
>   `# SUSE Linux: > SLES-12 config --default-user root`\
>   `# Debian: > debian config --default-user root`\
>   `# Kali Linux: > kali config --default-user root`

### 1.7 출처 : [doc.microsoft.com](https://docs.microsoft.com/ko-kr/windows/wsl/install-win10#troubleshooting-installation) / [hub.docker.com](https://hub.docker.com/editions/community/docker-ce-desktop-windows)

## 2. 맥 시스템 도커(docker) 설치 방법   &#x20;

### 2.1 맥용 도커 데스크탑이란?   &#x20;

> Mac 용 Docker Desktop은 Mac에서 Dockerized 앱을 빌드, 디버깅 및 테스트하기위한 설치가 쉬운 데스크톱 앱입니다. Mac 용 Docker Desktop은 Mac OS Hypervisor 프레임 워크, 네트워킹 및 파일 시스템과 긴밀하게 통합 된 완전한 개발 환경입니다. Docker Desktop-Mac은 Mac에서 Docker를 실행하는 가장 빠르고 안정적인 방법입니다.

### 2.2 맥용 도커 데스크탑 다운로드

> [홈페이지 다운로드](https://hub.docker.com/editions/community/docker-ce-desktop-mac) : `Docker Hub (Docker Desktop for Mac) 사이트`      &#x20;
>
> 맥용 도커 데스크탑 다운로드([Mac with Intel chip](https://desktop.docker.com/mac/stable/amd64/Docker.dmg) / [Mac with Apple chip](https://desktop.docker.com/mac/stable/arm64/Docker.dmg)) : `Docker.dmg` &#x20;

### 2.3 시스템 요구 사항    &#x20;

> [요구 사항 목록 참조](https://docs.docker.com/docker-for-mac/install/#system-requirements) 확인   &#x20;

### 2.4 설치 방법  &#x20;

> 다운로드 한 `Docker.dmg` 을 설치 프로세스를 시작하십시오.
>
> 설치가 완료되고 Docker가 시작되면 상단 상태 표시 줄의 고래가 Docker가 실행 중이며 터미널에서 액세스 할 수 있음을 표시합니다.
>
> ![메뉴 모음에서 고래](https://d1q6f0aelx0por.cloudfront.net/icons/whale-in-menu-bar.png)

### 2.5 실행 방법   &#x20;

> 명령 줄 터미널을 열고 몇 가지 Docker 명령을 시도합니다.
>
> * 실행 `docker version`하여 최신 릴리스가 설치되어 있는지 확인하십시오.
> * 실행 `docker run hello-world`하여 Docker가 이미지를 가져오고 예상대로 실행되는지 확인합니다.

### 2.6 출처 : [hub.docker.com](https://hub.docker.com/editions/community/docker-ce-desktop-mac)

## 3. Centos 7.8 시스템 도커(docker) 설치&#x20;

### 3.1 도커(docker) 설치 및 확인&#x20;

{% code title="Centos 7.x 버전은 아래와 같이 설치" %}

```
// Docker 설치에 필요한 패키지 설치
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

// Docker 저장소 추가
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

// Docker 설치
$ sudo yum install -y docker-ce docker-ce-cli containerd.io

// Docker 서비스 시작
$ sudo systemctl start docker
$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service

// Docker 확인 
$ sudo docker run hello-world
```

{% endcode %}

### 3.2 도커 컴포즈(docker-compose) 설치 및&#x20;

{% code title="Docker-compose 설치 및 확인" %}

```bash
// Docker-compose download   
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

// Docker-compose 권한 설정
$ sudo chmod +x /usr/local/bin/docker-compose

// Link 설정   
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

// docker-compose 버전 확인
$ docker-compose --version
docker-compose version 1.29.2, build 1110ad01
```

{% endcode %}

### 3.3 출처 : [doc.toast.com](https://docs.toast.com/ko/Container/Container%20Registry/ko/user-guide/)  / [docs.docker.com](https://docs.docker.com/compose/install/)

## 4. Ubuntu 18.04/20.04 TLS 시스템 도커(docker) 설치&#x20;

### 4.1 도커(docker) 설치 및 확인   &#x20;

```
// apt 인덱스 업데이트
$ sudo apt-get update

// repository over HTTPS를 사용하기 위한 패키지 설치
$ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common

// GPG Key를 추가하고 확인
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

// 저장소 추가하고 apt 인덱스 업데이트
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update

// Docker 설치
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

// Docker 서비스 시작
$ sudo systemctl start docker
$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service

// Docker 확인
$ sudo docker run hello-world
```

### 4.2 도커 컴포즈(docker-compose) 설치 및&#x20;

{% code title="Docker-compose 설치 및 확인" %}

```bash
// Docker-compose download   
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

// Docker-compose 권한 설정
$ sudo chmod +x /usr/local/bin/docker-compose

// Link 설정   
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

// docker-compose 버전 확인
$ docker-compose --version
docker-compose version 1.29.2, build 1110ad01
```

{% endcode %}

### 4.3 출처 : [doc.toast.com](https://docs.toast.com/ko/Container/Container%20Registry/ko/user-guide/) / [docs.docker.com](https://docs.docker.com/compose/install/)

## 5. docker to start on boot

### 5.1 Docker Service start  &#x20;

{% code title="도커 서비스 시작" %}

```bash
$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service
```

{% endcode %}

### 5.2 Docker Service stop

{% code title="도커 서비스 중지" %}

```bash
$ sudo systemctl disable docker.service
$ sudo systemctl disable containerd.service
```

{% endcode %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


# Docker Windows 컨테이너 실행 가이드

\[https\://doc.skill.or.kr] Windows container 실행 가이드, Error 해결 방법

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. Windows 컨테이너 실행 전 준비 사항    &#x20;

### 1.1 Windows 컨테이너 실행 하기    &#x20;

> Windows PowerShell 에서 Docker 실행 하였을 때 아래와 같은 메시지가 발생 하였을 때......

![그림. Windows 컨테이너 실행 시 오류 발생    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MalzUGFrHa8cgLBE6_N%2F-Mam1CrSxDJ59v720nRz%2Fimage.png?alt=media\&token=42bf7cf6-ba14-4bce-9172-14deefdc7068)

### 1.2 아래와 같이 해결       &#x20;

> 도커의 설정에서 `Switch to Windows Containers...`  를 클릭 한 후 아래와 같이  Switch 를 변경 해 주어야 한다.
>
> Windows PowerShell \[관리자 권한 필요] 로 접속 후 아래의 코드를 입력 해 준다.
>
> `Enable-WindowsOptionalFeature -Online -FeatureName $("Microsoft-Hyper-V", "Containers") -All`
>
> 실행이 완료 되면 재부팅 해 주어야 한다.   &#x20;

![그림. Docker 에서 Switch to Windows Containers 를 클릭    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MalzUGFrHa8cgLBE6_N%2F-Mam1crhU6btncL2UAh8%2Fimage.png?alt=media\&token=27f313a9-966d-4f81-9ebd-4f0d7e28d18e)

![그림. Windows Containers 의 Switch 클릭    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MalzUGFrHa8cgLBE6_N%2F-Mam2JFLDPD63C78QVA_%2Fimage.png?alt=media\&token=a1bf9c3a-6818-4cea-9939-38ae42c79761)

![그림. 코드 값을 입력 \[관리자 권한 필요\] 후 재부팅       ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mam5xvzY6SLrDMRdg9s%2F-Mam8qPNCsO4NbJtb6vo%2Fimage.png?alt=media\&token=2feb2292-5d35-4d63-84c7-a5bd22517254)

## 2. Docker Hub 에서 Windows 공식 사이트    &#x20;

### 2.1 Docker Hub 에서 Windows 공식 사이트   &#x20;

> Docker Hub Site : [Windows Docker Hub 바로가기 ](https://hub.docker.com/_/microsoft-windows-base-os-images)

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MafbQmpzGaJxQ2nWB4V%2F-Malw-vUe9KB7p8FFPmW%2Fimage.png?alt=media\&token=276f8c43-b86b-4fea-8279-7e18b86beb53)

### 2.2 Docker Hub 에서 Windows/Servercore 공식 사이트   &#x20;

> Windows Server Core base OS image Docker Hub Site : [Docker Hub 바로가기 ](https://hub.docker.com/_/microsoft-windows-servercore)

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MafbQmpzGaJxQ2nWB4V%2F-MalwP7v2G0ncq8XtPe2%2Fimage.png?alt=media\&token=86e0fc0a-39a1-4ac0-9c50-ba36811e7c52)

### 2.3 Docker Hub 에서 Windows/NanoServer 공식 사이트   &#x20;

> Nano Server base OS image Docker Hub Site : [Docker Hub 바로가기 ](https://hub.docker.com/_/microsoft-windows-nanoserver)

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MafbQmpzGaJxQ2nWB4V%2F-Malx0NUiOJl4hRKINU3%2Fimage.png?alt=media\&token=21864037-055f-41ec-a79f-655772f29fe7)

### 2.4 Docker Hub 에서 Windows 공식 사이트   &#x20;

> Windows base OS image Docker Hub Site : [Docker Hub 바로가기 ](https://hub.docker.com/_/microsoft-windows)

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MafbQmpzGaJxQ2nWB4V%2F-Malv1NwPYL4qBFlXzkh%2Fimage.png?alt=media\&token=9ce974d4-f257-46ff-979d-ced3ac0eb376)

## 3. 윈도우 시스템에서 실행 하기   &#x20;

### 3.1 시작 > Windows PowerSehll ***\[관리자권한 필요]*** 실행 및 확인     &#x20;

> Windows 컨테이너 실행 여부 확인 코드 입력
>
> `Enable-WindowsOptionalFeature -Online -FeatureName $("Microsoft-Hyper-V", "Containers") -All`

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mam8wj4CC6Mk3Z7cmU1%2F-MamASIClrtQbpFGRfis%2Fimage.png?alt=media\&token=0724dbb9-d08d-4dd9-b02e-4d1b1c902a94)

### 3.2 Docker 를 이용하여 Windows 실행 하기     &#x20;

{% code title="Windows PowerShell 실행 후 NanoServer Pulling 후 실행       " %}

```
//Windows NanoServer Pulling
PS C:\WINDOWS\system32> docker pull mcr.microsoft.com/windows/nanoserver:20H2
20H2: Pulling from windows/nanoserver
b20eb6725f08: Pull complete
Digest: sha256:22654bd23d1fb8ff9ddfd98ddb5ad15a15e3ad06719b53d3425c46c88f2dc70f
Status: Downloaded newer image for mcr.microsoft.com/windows/nanoserver:20H2
mcr.microsoft.com/windows/nanoserver:20H2

//Windows NanoServer Run    
PS C:\WINDOWS\system32> docker run mcr.microsoft.com/windows/nanoserver:20H2
Microsoft Windows [Version 10.0.19042.985]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\>
```

{% endcode %}

## 4. Windows 컨테이너 Tag 정

### 4.1 Windows Server Core Tag 정보 (The official Windows Server Core base image for containers)   &#x20;

#### 4.1.1 Windows Images    &#x20;

| Tags                  | Architecture | Dockerfile    | OsVersion       | CreatedTime         | LastUpdatedTime     |
| --------------------- | ------------ | ------------- | --------------- | ------------------- | ------------------- |
| 20H2                  | multiarch    | No Dockerfile | 10.0.19042.985  | 11/10/2020 18:03:17 | 05/11/2021 17:03:28 |
| 20H2-KB5003173        | multiarch    | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:03:26 | 05/11/2021 17:03:26 |
| 10.0.19042.985        | multiarch    | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:03:37 | 05/11/2021 17:03:37 |
| 20H2-amd64            | amd64        | No Dockerfile | 10.0.19042.985  | 11/10/2020 18:02:18 | 05/11/2021 17:01:55 |
| 20H2-KB5003173-amd64  | amd64        | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:01:27 | 05/11/2021 17:01:27 |
| 10.0.19042.985-amd64  | amd64        | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:02:50 | 05/11/2021 17:02:50 |
| 2004                  | multiarch    | No Dockerfile | 10.0.19041.985  | 05/27/2020 17:02:35 | 05/11/2021 17:03:11 |
| 2004-KB5003173        | multiarch    | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:03:10 | 05/11/2021 17:03:10 |
| 10.0.19041.985        | multiarch    | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:03:12 | 05/11/2021 17:03:12 |
| 2004-amd64            | amd64        | No Dockerfile | 10.0.19041.985  | 05/27/2020 17:01:28 | 05/11/2021 17:02:07 |
| 2004-KB5003173-amd64  | amd64        | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:01:40 | 05/11/2021 17:01:40 |
| 10.0.19041.985-amd64  | amd64        | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:02:34 | 05/11/2021 17:02:34 |
| 1909                  | multiarch    | No Dockerfile | 10.0.18363.1556 | 11/12/2019 18:34:11 | 05/11/2021 17:08:12 |
| 1909-KB5003169        | multiarch    | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:08:13 | 05/11/2021 17:08:13 |
| 10.0.18363.1556       | multiarch    | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:08:13 | 05/11/2021 17:08:13 |
| 1909-amd64            | amd64        | No Dockerfile | 10.0.18363.1556 | 11/12/2019 18:09:57 | 05/11/2021 17:02:23 |
| 1909-KB5003169-amd64  | amd64        | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:01:52 | 05/11/2021 17:01:52 |
| 10.0.18363.1556-amd64 | amd64        | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:03:01 | 05/11/2021 17:03:01 |
| ltsc2019              | multiarch    | No Dockerfile | 10.0.17763.1935 | 10/03/2018 20:30:05 | 05/11/2021 17:03:34 |
| 1809                  | multiarch    | No Dockerfile | 10.0.17763.1935 | 10/03/2018 20:02:05 | 05/11/2021 17:03:34 |
| 1809-KB5003171        | multiarch    | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:03:35 | 05/11/2021 17:03:35 |
| 10.0.17763.1935       | multiarch    | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:03:36 | 05/11/2021 17:03:36 |
| ltsc2019-amd64        | amd64        | No Dockerfile | 10.0.17763.1935 | 02/12/2019 22:07:45 | 05/11/2021 17:03:01 |
| 1809-amd64            | amd64        | No Dockerfile | 10.0.17763.1935 | 02/12/2019 22:04:03 | 05/11/2021 17:02:06 |
| 1809-KB5003171-amd64  | amd64        | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:01:39 | 05/11/2021 17:01:39 |
| 10.0.17763.1935-amd64 | amd64        | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:02:35 | 05/11/2021 17:02:35 |
| ltsc2016              | multiarch    | No Dockerfile | 10.0.14393.4402 | 10/05/2018 23:34:11 | 05/11/2021 17:04:37 |
| 1607                  | multiarch    | No Dockerfile | 10.0.14393.4402 | 02/12/2019 20:59:17 | 05/11/2021 17:04:08 |
| 1607-KB5003197        | multiarch    | No Dockerfile | 10.0.14393.4402 | 05/11/2021 17:04:34 | 05/11/2021 17:04:34 |
| 10.0.14393.4402       | multiarch    | No Dockerfile | 10.0.14393.4402 | 05/11/2021 17:04:07 | 05/11/2021 17:04:07 |
| ltsc2016-amd64        | amd64        | No Dockerfile | 10.0.14393.4402 | 04/09/2019 21:21:07 | 05/11/2021 17:03:05 |
| 1607-amd64            | amd64        | No Dockerfile | 10.0.14393.4402 | 04/09/2019 21:20:00 | 05/11/2021 17:02:37 |
| 1607-KB5003197-amd64  | amd64        | No Dockerfile | 10.0.14393.4402 | 05/11/2021 17:02:10 | 05/11/2021 17:02:10 |
| 10.0.14393.4402-amd64 | amd64        | No Dockerfile | 10.0.14393.4402 | 05/11/2021 17:03:34 | 05/11/2021 17:03:34 |

#### 4.1.2 Multi-arch Images   &#x20;

| Tags            | Achitecture | OS      | OsVersion       | CreatedTime         | LastUpdated Time    |
| --------------- | ----------- | ------- | --------------- | ------------------- | ------------------- |
| 20H2            | multiarch   | windows | 10.0.19042.985  | 11/10/2020 18:03:17 | 05/11/2021 17:03:28 |
| 20H2-KB5003173  | multiarch   | windows | 10.0.19042.985  | 05/11/2021 17:03:26 | 05/11/2021 17:03:26 |
| 10.0.19042.985  | multiarch   | windows | 10.0.19042.985  | 05/11/2021 17:03:37 | 05/11/2021 17:03:37 |
| 2004            | multiarch   | windows | 10.0.19041.985  | 05/27/2020 17:02:35 | 05/11/2021 17:03:11 |
| 2004-KB5003173  | multiarch   | windows | 10.0.19041.985  | 05/11/2021 17:03:10 | 05/11/2021 17:03:10 |
| 10.0.19041.985  | multiarch   | windows | 10.0.19041.985  | 05/11/2021 17:03:12 | 05/11/2021 17:03:12 |
| 1909            | multiarch   | windows | 10.0.18363.1556 | 11/12/2019 18:34:11 | 05/11/2021 17:08:12 |
| 1909-KB5003169  | multiarch   | windows | 10.0.18363.1556 | 05/11/2021 17:08:13 | 05/11/2021 17:08:13 |
| 10.0.18363.1556 | multiarch   | windows | 10.0.18363.1556 | 05/11/2021 17:08:13 | 05/11/2021 17:08:13 |
| ltsc2019        | multiarch   | windows | 10.0.17763.1935 | 10/03/2018 20:30:05 | 05/11/2021 17:03:34 |
| 1809            | multiarch   | windows | 10.0.17763.1935 | 10/03/2018 20:02:05 | 05/11/2021 17:03:34 |
| 1809-KB5003171  | multiarch   | windows | 10.0.17763.1935 | 05/11/2021 17:03:35 | 05/11/2021 17:03:35 |
| 10.0.17763.1935 | multiarch   | windows | 10.0.17763.1935 | 05/11/2021 17:03:36 | 05/11/2021 17:03:36 |
| ltsc2016        | multiarch   | windows | 10.0.14393.4402 | 10/05/2018 23:34:11 | 05/11/2021 17:04:37 |
| 1607            | multiarch   | windows | 10.0.14393.4402 | 02/12/2019 20:59:17 | 05/11/2021 17:04:08 |
| 1607-KB5003197  | multiarch   | windows | 10.0.14393.4402 | 05/11/2021 17:04:34 | 05/11/2021 17:04:34 |
| 10.0.14393.4402 | multiarch   | windows | 10.0.14393.4402 | 05/11/2021 17:04:07 | 05/11/2021 17:04:07 |

### 4.2 Nano Server Tag 정보(The official Nano Server base image for containers)    &#x20;

#### 4.2.1 Windows Images    &#x20;

| Tags                    | Architecture | Dockerfile    | OsVersion       | CreatedTime         | LastUpdatedTime     |
| ----------------------- | ------------ | ------------- | --------------- | ------------------- | ------------------- |
| 20H2                    | multiarch    | No Dockerfile | 10.0.19042.985  | 11/10/2020 18:03:18 | 05/11/2021 17:03:23 |
| 20H2-KB5003173          | multiarch    | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:03:24 | 05/11/2021 17:03:24 |
| 10.0.19042.985          | multiarch    | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:03:25 | 05/11/2021 17:03:25 |
| 20H2-amd64              | amd64        | No Dockerfile | 10.0.19042.985  | 11/10/2020 18:02:19 | 05/11/2021 17:01:56 |
| 20H2-KB5003173-amd64    | amd64        | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:01:27 | 05/11/2021 17:01:27 |
| 10.0.19042.985-amd64    | amd64        | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:02:53 | 05/11/2021 17:02:53 |
| 2004                    | multiarch    | No Dockerfile | 10.0.19041.985  | 05/27/2020 17:02:33 | 05/11/2021 17:03:10 |
| 2004-KB5003173          | multiarch    | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:03:11 | 05/11/2021 17:03:11 |
| 10.0.19041.985          | multiarch    | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:03:11 | 05/11/2021 17:03:11 |
| 2004-amd64              | amd64        | No Dockerfile | 10.0.19041.985  | 05/27/2020 17:01:25 | 05/11/2021 17:02:13 |
| 2004-KB5003173-amd64    | amd64        | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:01:47 | 05/11/2021 17:01:47 |
| 10.0.19041.985-amd64    | amd64        | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:02:41 | 05/11/2021 17:02:41 |
| 1909                    | multiarch    | No Dockerfile | 10.0.18363.1556 | 11/12/2019 18:34:15 | 05/11/2021 17:08:11 |
| 1909-KB5003169          | multiarch    | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:08:12 | 05/11/2021 17:08:12 |
| 10.0.18363.1556         | multiarch    | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:08:11 | 05/11/2021 17:08:11 |
| 1909-amd64              | amd64        | No Dockerfile | 10.0.18363.1556 | 11/12/2019 18:32:52 | 05/11/2021 17:02:20 |
| 1909-KB5003169          | amd64        | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:08:12 | 05/11/2021 17:08:12 |
| 10.0.18363.1556-amd64   | amd64        | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:02:48 | 05/11/2021 17:02:48 |
| 1809                    | multiarch    | No Dockerfile | 10.0.17763.1935 | 11/13/2018 19:06:10 | 05/11/2021 17:03:33 |
| 1809-KB5003171          | multiarch    | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:03:37 | 05/11/2021 17:03:37 |
| 10.0.17763.1935         | multiarch    | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:03:34 | 05/11/2021 17:03:34 |
| 1809-amd64              | amd64        | No Dockerfile | 10.0.17763.1935 | 02/12/2019 22:04:00 | 05/11/2021 17:02:05 |
| 1809-KB5003171-amd64    | amd64        | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:01:39 | 05/11/2021 17:01:39 |
| 10.0.17763.1935-amd64   | amd64        | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:02:32 | 05/11/2021 17:02:32 |
| 1809-arm32v7            | arm          | No Dockerfile | 10.0.17763.1935 | 03/12/2019 22:50:40 | 05/11/2021 17:02:09 |
| 1809-KB5003171-arm32v7  | arm          | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:01:39 | 05/11/2021 17:01:39 |
| 10.0.17763.1935-arm32v7 | arm          | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:02:36 | 05/11/2021 17:02:36 |

#### 4.2.2 Multi-arch Images    &#x20;

| Tags            | Achitecture      | OS      | OsVersion       | CreatedTime         | LastUpdated Time    |
| --------------- | ---------------- | ------- | --------------- | ------------------- | ------------------- |
| 20H2            | multiarch        | windows | 10.0.19042.985  | 11/10/2020 18:03:18 | 05/11/2021 17:03:23 |
| 20H2-KB5003173  | multiarch        | windows | 10.0.19042.985  | 05/11/2021 17:03:24 | 05/11/2021 17:03:24 |
| 10.0.19042.985  | multiarch        | windows | 10.0.19042.985  | 05/11/2021 17:03:25 | 05/11/2021 17:03:25 |
| 2004            | multiarch        | windows | 10.0.19041.985  | 05/27/2020 17:02:33 | 05/11/2021 17:03:10 |
| 2004-KB5003173  | multiarch        | windows | 10.0.19041.985  | 05/11/2021 17:03:11 | 05/11/2021 17:03:11 |
| 10.0.19041.985  | multiarch        | windows | 10.0.19041.985  | 05/11/2021 17:03:11 | 05/11/2021 17:03:11 |
| 1909            | multiarch        | windows | 10.0.18363.1556 | 11/12/2019 18:34:15 | 05/11/2021 17:08:11 |
| 1909-KB5003169  | amd64, multiarch | windows | 10.0.18363.1556 | 05/11/2021 17:08:12 | 05/11/2021 17:08:12 |
| 10.0.18363.1556 | multiarch        | windows | 10.0.18363.1556 | 05/11/2021 17:08:11 | 05/11/2021 17:08:11 |
| 1809            | multiarch        | windows | 10.0.17763.1935 | 11/13/2018 19:06:10 | 05/11/2021 17:03:33 |
| 1809-KB5003171  | multiarch        | windows | 10.0.17763.1935 | 05/11/2021 17:03:37 | 05/11/2021 17:03:37 |
| 10.0.17763.1935 | multiarch        | windows | 10.0.17763.1935 | 05/11/2021 17:03:34 | 05/11/2021 17:03:34 |

### 4.3 Windows Tag 정보 (The official Windows base image for containers)   &#x20;

#### 4.3.1 Windows Images   &#x20;

| Tags                  | Architecture | Dockerfile    | OsVersion       | CreatedTime         | LastUpdatedTime     |
| --------------------- | ------------ | ------------- | --------------- | ------------------- | ------------------- |
| 20H2                  | multiarch    | No Dockerfile | 10.0.19042.985  | 11/10/2020 18:03:46 | 05/11/2021 17:03:28 |
| 20H2-KB5003173        | multiarch    | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:03:28 | 05/11/2021 17:03:28 |
| 10.0.19042.985        | multiarch    | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:03:54 | 05/11/2021 17:03:54 |
| 20H2-amd64            | amd64        | No Dockerfile | 10.0.19042.985  | 11/10/2020 18:02:18 | 05/11/2021 17:01:56 |
| 20H2-KB5003173-amd64  | amd64        | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:01:28 | 05/11/2021 17:01:28 |
| 10.0.19042.985-amd64  | amd64        | No Dockerfile | 10.0.19042.985  | 05/11/2021 17:02:53 | 05/11/2021 17:02:53 |
| 2004                  | multiarch    | No Dockerfile | 10.0.19041.985  | 05/27/2020 17:02:32 | 05/11/2021 17:03:09 |
| 2004-KB5003173        | multiarch    | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:03:11 | 05/11/2021 17:03:11 |
| 10.0.19041.985        | multiarch    | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:03:11 | 05/11/2021 17:03:11 |
| 2004-amd64            | amd64        | No Dockerfile | 10.0.19041.985  | 05/27/2020 17:01:45 | 05/11/2021 17:02:08 |
| 2004-KB5003173-amd64  | amd64        | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:01:41 | 05/11/2021 17:01:41 |
| 10.0.19041.985-amd64  | amd64        | No Dockerfile | 10.0.19041.985  | 05/11/2021 17:02:35 | 05/11/2021 17:02:35 |
| 1909                  | multiarch    | No Dockerfile | 10.0.18363.1556 | 11/12/2019 18:34:10 | 05/11/2021 17:08:12 |
| 1909-KB5003169        | multiarch    | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:08:12 | 05/11/2021 17:08:12 |
| 10.0.18363.1556       | multiarch    | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:08:12 | 05/11/2021 17:08:12 |
| 1909-amd64            | amd64        | No Dockerfile | 10.0.18363.1556 | 11/12/2019 18:29:34 | 05/11/2021 17:02:20 |
| 1909-KB5003169-amd64  | amd64        | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:01:45 | 05/11/2021 17:01:45 |
| 10.0.18363.1556-amd64 | amd64        | No Dockerfile | 10.0.18363.1556 | 05/11/2021 17:02:50 | 05/11/2021 17:02:50 |
| 1809                  | multiarch    | No Dockerfile | 10.0.17763.1935 | 11/13/2018 19:06:09 | 05/11/2021 17:04:02 |
| 1809-KB5003171        | multiarch    | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:04:02 | 05/11/2021 17:04:02 |
| 10.0.17763.1935       | multiarch    | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:04:06 | 05/11/2021 17:04:06 |
| 1809-amd64            | amd64        | No Dockerfile | 10.0.17763.1935 | 04/05/2019 21:22:36 | 05/11/2021 17:02:15 |
| 1809-KB5003171-amd64  | amd64        | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:01:46 | 05/11/2021 17:01:46 |
| 10.0.17763.1935-amd64 | amd64        | No Dockerfile | 10.0.17763.1935 | 05/11/2021 17:02:42 | 05/11/2021 17:02:42 |

#### 4.3.2 Multi-arch Images  &#x20;

| Tags            | Achitecture | OS      | OsVersion       | CreatedTime         | LastUpdated Time    |
| --------------- | ----------- | ------- | --------------- | ------------------- | ------------------- |
| 20H2            | multiarch   | windows | 10.0.19042.985  | 11/10/2020 18:03:46 | 05/11/2021 17:03:28 |
| 20H2-KB5003173  | multiarch   | windows | 10.0.19042.985  | 05/11/2021 17:03:28 | 05/11/2021 17:03:28 |
| 10.0.19042.985  | multiarch   | windows | 10.0.19042.985  | 05/11/2021 17:03:54 | 05/11/2021 17:03:54 |
| 2004            | multiarch   | windows | 10.0.19041.985  | 05/27/2020 17:02:32 | 05/11/2021 17:03:09 |
| 2004-KB5003173  | multiarch   | windows | 10.0.19041.985  | 05/11/2021 17:03:11 | 05/11/2021 17:03:11 |
| 10.0.19041.985  | multiarch   | windows | 10.0.19041.985  | 05/11/2021 17:03:11 | 05/11/2021 17:03:11 |
| 1909            | multiarch   | windows | 10.0.18363.1556 | 11/12/2019 18:34:10 | 05/11/2021 17:08:12 |
| 1909-KB5003169  | multiarch   | windows | 10.0.18363.1556 | 05/11/2021 17:08:12 | 05/11/2021 17:08:12 |
| 10.0.18363.1556 | multiarch   | windows | 10.0.18363.1556 | 05/11/2021 17:08:12 | 05/11/2021 17:08:12 |
| 1809            | multiarch   | windows | 10.0.17763.1935 | 11/13/2018 19:06:09 | 05/11/2021 17:04:02 |
| 1809-KB5003171  | multiarch   | windows | 10.0.17763.1935 | 05/11/2021 17:04:02 | 05/11/2021 17:04:02 |
| 10.0.17763.1935 | multiarch   | windows | 10.0.17763.1935 | 05/11/2021 17:04:06 | 05/11/2021 17:04:06 |

## 5. Base image servicing lifecycles

> &#x20;Microsoft has delayed the scheduled end of support and servicing dates for a number of products to help people and organizations focus their attention on retaining business continuity. See [Lifecycle changes to end of support and servicing dates](https://support.microsoft.com/help/4557164/lifecycle-changes-to-end-of-support-and-servicing-dates) entry from April 14, 2020 for more information.
>
> Windows container base images are based on either Semi-Annual Channel releases or Long-Term Servicing Channel releases of Windows Server. This article explains how long support will last for different versions of base images from both channels.
>
> The Semi-Annual Channel is a twice-per-year feature update release with eighteen-month servicing timelines for each release. This lets customers take advantage of new operating system capabilities at a faster pace, both in applications (particularly those built on containers and microservices) and in the software-defined hybrid datacenter. For more information, see the [Windows Server Semi-Annual Channel overview](https://docs.microsoft.com/en-us/windows-server/get-started/semi-annual-channel-overview).
>
> For Server Core images, customers can also use the Long-Term Servicing Channel that releases a new major version of Windows Server every two to three years. Long-Term Servicing Channel releases receive five years of mainstream support and five years of extended support. This channel works with systems that require a longer servicing option and functional stability.
>
> The following table lists each type of base image, its servicing channel, and how long its support will last.

| Base image                        | Servicing channel      | Version    | OS build | Availability | Mainstream support end date | Extended support date |
| --------------------------------- | ---------------------- | ---------- | -------- | ------------ | --------------------------- | --------------------- |
| Server Core, Nano Server, Windows | Semi-Annual            | 20H2       | 19042    | 10/20/2020   | 05/10/2022                  | N/A                   |
| Server Core, Nano Server, Windows | Semi-Annual            | 2004       | 19041    | 05/27/2020   | 12/14/2021                  | N/A                   |
| Server Core, Nano Server, Windows | Semi-Annual            | 1909       | 18363    | 11/12/2019   | 05/11/2021                  | N/A                   |
| Server Core, Nano Server, Windows | Semi-Annual            | 1903       | 18362    | 05/21/2019   | 12/08/2020                  | N/A                   |
| Server Core                       | Long-Term, Semi-Annual | 2019, 1809 | 17763    | 11/13/2018   | 01/09/2024                  | 01/09/2029            |
| Nano Server                       | Semi-Annual            | 1809       | 17763    | 11/13/2018   | 01/09/2024                  | N/A                   |
| Windows                           | Semi-Annual            | 1809       | 17763    | 11/13/2018   | 01/09/2024                  | N/A                   |
| Server Core, Nano Server          | Semi-Annual            | 1803       | 17134    | 04/30/2018   | 11/12/2019                  | N/A                   |
| Server Core, Nano Server          | Semi-Annual            | 1709       | 16299    | 10/17/2017   | 04/09/2019                  | N/A                   |
| Server Core                       | Long-Term              | 2016       | 14393    | 10/15/2016   | 01/11/2022                  | 01/11/2027            |
| Nano Server                       | Semi-Annual            | 1607       | 14393    | 10/15/2016   | 10/09/2018                  | N/A                   |

### 5.1 출처 : [doc.microsoft.com](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/base-image-lifecycle)

## 6. License 정책&#x20;

> * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice)
>
> > **Legal Notice:** Microsoft containers are licensed under various licenses depending upon the container’s content. If the container has a Debian, Ubuntu or Alpine Linux base image and you want to retrieve the licenses, copyright notices or source code information for the base image and its official packages, please review the [Linux Legal Metadata](https://aka.ms/mcr/osslinuxmetadata) instructions file. If you are using a Windows based container the governing licenses are referenced in this Docker Hub “License” section or in the container itself, usually as a NOTICE or LICENSE file. All other components (whether open or closed source) are licensed as indicated either in this Docker Hub “License” section or in the container itself.
> >
> > This container may incorporate material from third parties. Microsoft makes certain open source code available at [https://3rdpartysource.microsoft.com](https://3rdpartysource.microsoft.com/), or if you want a copy of the source code in this container you may send a check or money order for US $5.00, including the product name, the open source component name, and version number, to: Source Code Compliance Team, Microsoft Corporation, One Microsoft Way, Redmond, WA 98052 USA
>
> **MICROSOFT SOFTWARE SUPPLEMENTAL LICENSE FOR WINDOWS CONTAINER BASE IMAGE**\
> This Supplemental License is for the Windows Container Base Image (“Container Image”). If you comply with the terms of this Supplemental License you may use the Container Image as described below.
>
> **CONTAINER OS IMAGE**\
> The Container Image may only be used with a validly licensed copy of:
>
> * Windows Server Standard or Windows Server Datacenter software (collectively “Server Host Software”), or
> * Microsoft Windows Operating System (version 10) software (“Client Host Software”), or
> * Windows 10 IoT Enterprise and Windows 10 IoT Core (collectively “IoT Host Software”).
>
> The Server Host Software, Client Host Software, and IoT Host Software are collectively referred to as the “Host Software” and a license for Host Software is a "Host License".
>
> You may not use the Container Image if you do not have a corresponding version and edition of the Host License. Certain restrictions and additional terms may apply, which are described herein. If licensing terms herein conflict with Host License, then this Supplemental License shall govern with respect to the Container Image. BY ACCEPTING THIS SUPPLEMENTAL LICENSE OR USING THE CONTAINER IMAGE, YOU AGREE TO ALL OF THESE TERMS. IF YOU DO NOT ACCEPT AND COMPLY WITH THESE TERMS, YOU MAY NOT USE THE CONTAINER IMAGE.
>
> **DEFINITIONS**\
> **Windows Server Container** (without Hyper-V isolation) is a feature of Microsoft Windows Server software.
>
> **Windows Server Container with Hyper-V isolation.** Section 2(k) of the Microsoft Windows Server license terms is hereby deleted in its entirety and replaced with the revised terms as shown in “UPDATED” below.
>
> UPDATED: Windows Server Container with Hyper-V isolation (formerly known as Hyper-V Container) is a container technology in Windows Server which utilizes a virtual operating system environment to host one or more Windows Server Container(s). Each Hyper-V isolation instance used to host one or more Windows Server Container(s) is considered one virtual operating system environment.
>
> **LICENSE TERMS**\
> **Host License.** The Host License terms apply to your use of the Container Image and any Windows container(s) created with the Container Image which are distinct and separate from a virtual machine.
>
> **Use Rights.** The Container Image may be used to create an isolated virtualized Windows operating system environment that includes at least one application that adds primary and significant functionality. You may use the Container Image only to create, build, and run Windows container(s) on Host Software. Updates to the Host Software may not update the Container Image so you may re-create any Windows containers based on an updated Container Image.
>
> **Restrictions.** You may not remove this Supplemental License document file from the Container Image. You may not enable remote access to the application(s) you run within your container to avoid applicable license fees. You may not reverse engineer, decompile, or disassemble the Container Image, or attempt to do so, except and only to the extent required by third party licensing terms governing the use of certain open-source components that may be included with the software. Additional restrictions in the Host License may apply.
>
> **ADDITIONAL TERMS**\
> **Client Host Software.** When running a Container Image on Client Host Software you may run any number of the Container Image instantiated as Windows containers for test or development purposes only. You may not use these Windows containers in a production environment on Client Host Software.
>
> **IoT Host Software.** When running a Container Image on IoT Host Software you may run any number of the Container Image instantiated as Windows containers for test or development purposes only. You may only use the Container Image in a production environment if you have agreed to the Microsoft Commercial Terms of Use for Windows 10 Core Runtime Images or the Windows 10 IoT Enterprise Device License (“Windows IoT Commercial Agreement”). Additional terms and restrictions in the Windows IoT Commercial Agreements apply to your use of Container Image in a production environment.
>
> **Third Party Software.** The Container Image may include third party applications that are licensed to you under this Supplemental License or under their own terms. License terms, notices, and acknowledgements, if any, for the third-party applications may be accessible online at <http://aka.ms/thirdpartynotices> or in an accompanying notices file. Even if such applications are governed by other agreements, the disclaimer, limitations on, and exclusions of damages in the Host License also apply to the extent allowed by applicable law.
>
> **Open Source Components.** The Container Image may contain third party copyrighted software licensed under open source licenses with source code availability obligations. Copies of those licenses are included in the ThirdPartyNotices file or other accompanying notices file. You may obtain the complete corresponding source code from Microsoft if and as required under the relevant open source license by sending a money order or check for $5.00 to: Source Code Compliance Team, Microsoft Corporation, 1 Microsoft Way, Redmond, WA 98052, USA. Please include the name “Microsoft Software Supplemental License for Windows Container base image,“ the open source component name and version number in the memo line of your payment. You may also find a copy of the source at <http://aka.ms/getsource>.

## 7. Error 해결 방안      &#x20;

### 7.1 Windows PowerShell 에서 Windows 로 Switch 하려고 하는데 권한이 없다고 코드가 실행 되지 않아요.....

#### 7.1.1 Error 화면     &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mam5xvzY6SLrDMRdg9s%2F-Mam81tKYcXiYKHaFtl0%2Fimage.png?alt=media\&token=f9669c3f-bb3c-4c06-8773-244dec6f962b)

#### 7.1.2 해결 방법    &#x20;

> 검색 > Windows PowerShell ***\[관리자]*** 로 접속 후에 아래의 코드를 입력 해 준다.    `Enable-WindowsOptionalFeature -Online -FeatureName $("Microsoft-Hyper-V", "Containers") -All`

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mam5xvzY6SLrDMRdg9s%2F-Mam8YX6FrWTf53tiTnk%2Fimage.png?alt=media\&token=f5ba07a4-9659-45a9-9c75-8f3031a522d4)

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Mam5xvzY6SLrDMRdg9s%2F-Mam8joX7rm7rJ6rNqv1%2Fimage.png?alt=media\&token=e3e07d65-f37a-4829-98a9-00e5cc610355)

### 7.2 Docker 실행 하니 아래와 같은 메시지가 보여요.

#### 7.2.1 Error 화면  &#x20;

> Windows PowerShell 에서 docker run 을 하였을 때 Windows 컨테이너가 실행 되지 않아요.
>
> &#x20;`MSG :: docker: no matching manifest for linux/amd64 in the manifest list entries.`

{% code title="Windows PowerSehll 에서 아래와 같은 Error 발생" %}

```
PS C:\WINDOWS\system32> docker run mcr.microsoft.com/windows/nanoserver:20H2
Unable to find image 'mcr.microsoft.com/windows/nanoserver:20H2' locally
20H2: Pulling from windows/nanoserver
docker: no matching manifest for linux/amd64 in the manifest list entries.
See 'docker run --help'.
```

{% endcode %}

![그림. Windows 컨테이너가 정상적으로 실행 되지 않음.](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MamCy3AT5AZPE8CgJ7R%2F-MamDeBbOZQcQC0MW9VJ%2Fimage.png?alt=media\&token=e1704d97-45c7-4cc5-ab87-ae62ab9c78d3)

#### 7.2.2 해결 방법      &#x20;

> 도커 설정 값에서 `Switch to Windows Containers...` 를 클릭&#x20;

![그림. Linux Container 만 실행 가능함. Windows 사용 시 변경 해 주어야 함.    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MamE1wgObanVDLgi5V5%2F-MamGYRL9b1S9Jgdf66Q%2Fimage.png?alt=media\&token=ec9cfba6-4c35-4c13-b1fb-4e30e9502e52)

![그림. Windows Container 만 실행 가능함. Linux 사용 시 변경해 주어야 함.](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MamE1wgObanVDLgi5V5%2F-MamFy0m2DB7Hx7vP-ex%2Fimage.png?alt=media\&token=e1756bad-8045-4ba6-bb38-34694ec7a7e4)

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


# Lean Startup 을 위한 docker 사용법

\[https\://doc.skill.or.kr] 개발을 위한 시스템 구축을 가장 빠르게 하기 위한 docker 사용법(개발자가 봐야 하는 문서)

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. Lean Startup 이란 무엇인가?           &#x20;

> 아이디어를 빠르게 최소요건제품(시제품)으로 제조한 뒤 시장의 반응을 통해 다음 제품 개선에 반영하는 전략이다.
>
> 이를 통해  짧은 시간 동안 제품을 만들고 성과를 측정해 다음 제품 개선에 반영하는 것을 반복해 성공 확률을 높이는 경영 방법론의 일종이다. 일본 도요타자동차의 린 제조(lean manufacturing) 방식을 본 뜬 것으로, 미국 실리콘밸리의 벤처기업가 에릭 리스(Eric Ries, 1979\~ )가 개발했다. 린스타트업은 「만들기 ─ 측정 ─ 학습」의 과정을 반복하면서 꾸준히 혁신해 나가는 것을 주요 내용으로 한다.
>
> **\[출처 : 네이버 지식백과]** [린스타트업](https://terms.naver.com/entry.naver?docId=1847238) (시사상식사전, pmg 지식엔진연구소)

![그림. 린스타트 순환구조 \[출처: 린 스타트업 p.71 (에릭 리스 지음 / 이창수, 송우일 옮김)\]    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Ma7m7VvSP2J73j4x9RU%2F-Ma7pU9EL-4ytsnGknwc%2Fimage.png?alt=media\&token=de23f243-3b04-4372-82fb-e3544d8399b2)

## 2. 소프트웨어 개발자는 왜 Docker 를 사용 하여야 하는가?    &#x20;

> 소프트웨어 개발자가 프로그램을 개발하려면 노트북 1대만 갖춰선 될 일이 아니다. 여러 명이 동시에 개발할 수 있는 환경도 필요하며, 수천명의 사용자를 상대로 내놓으려면 인프라 환경도 갖춰야 한다. 서버와 스토리지, 운영체제 등을 뒷단에서 갖추고 관리해야 하는 것이다. 이에 맞는 미들웨어와 런타임 환경을 제대로 구성하는 데 보통 수개월 이상 걸리곤 한다.
>
> Docker를 통 이용자는 몇 분에서 몇 시간 혹은 하루 정도의 시간으로 플랫폼을 손쉽게 구축할 수 있다.
>
> 즉, ***빠른 개발환경의 구축***&#xC744; 위해 Docker 를 사용 하여야 한다.
>
> **\[출처 : 네이버 지식백과]** [도커](https://terms.naver.com/entry.naver?docId=3578612) - 오픈소스 진영의 샛별 (용어로 보는 IT, 이지현)

## 3. 그럼 Docker 란 무엇인가?

> ***도커(Docker)***&#xB294; 리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트이다. 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싸며 리눅스에서 운영 체제 수준 가상화의 추상화 및 자동화 계층을 추가적으로 제공한다. 도커는 cgroups와 커널 이름 공간과 같은 리눅스 커널, 또 aufs와 같은 유니언 가능 파일 시스템의 리소스 격리 기능을 사용하며, 이를 통해 독립적인 "컨테이너"가 하나의 리눅스 인스턴스 안에서 실행할 수 있게 함으로써 가상 머신을 시작하여 ***유지보수 해야 하는 부담을 없애준다.***

## 4. 가상화 vs 도커   &#x20;

> 리눅스 컨테이너 기술은 가상화와 비슷한 기술이다. 가상화 기술은 하이퍼바이저라는 기술이 반드시 있어야 한다. 하이퍼바이저는 하나의 컴퓨터에서 여러 개의 운영체제(OS)를 사용할 수 있게 도와주는 기술이다. 가상화 환경은 가장 밑단에 깔린 호스트 OS를 공유한다. 만약 게스트 OS가 네트워크를 많이 사용하는 애플리케이션을 돌리면 어떻게 될까. 한정된 호스트 OS 자원으로는 애플리케이션을 감당하기 어렵게 된다. 하이퍼바이저도 호스트 OS와 게스트 OS, 애플리케이션을 중재하는 과정에서 많은 작업을 처리하게 된다.
>
> 도커는 하이퍼바이저와 달리 게스트 OS를 두지 않고 호스트 OS 커널을 바로 사용한다. 하이퍼바이저 대신 도커 엔진이 올라가, 호스트 OS와 여러 애플리케이션을 연결해주는 역할을 한다. 따라서 도커를 사용하면 가상화보다는 내부에서 더 적은 일을 처리하고, 애플리케이션을 좀더 빠르고 효율적으로 실행시킬 수 있다. 현재 업계에선 가상화 기술과 도커가 서로 부족한 부분을 채우는 보완 기술로 발전할 것으로 보고 있다.
>
> **\[출처 : 네이버 지식백과]** [도커](https://terms.naver.com/entry.naver?docId=3578612) - 오픈소스 진영의 샛별 (용어로 보는 IT, 이지현)

![그림. 가상화 기술과 도커 기술 비교(출처 : 네이버지식백과)   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Ma7qevPBd28GJkBtP8p%2F-Ma7r-bu80eWRcwfQZZ-%2Fimage.png?alt=media\&token=5ae81299-6214-4ed8-97b2-9c547dff45f9)

## 5. Docker 를 사용하여 빠른 개발환경 구축 방법    &#x20;

### 5.1 TensorFlow 시스템 구축 (1분 완성)   &#x20;

#### Step 1. 사전 준비 단계    &#x20;

* 폴더 구조      &#x20;

| 메인 폴더      | 서브 폴더  | 파일                 | 설명                       |
| ---------- | ------ | ------------------ | ------------------------ |
| tensorflow |        |                    |                          |
|            | upload |                    | tensorflow 업로드 폴더 지정     |
|            | result |                    | tensorflow 저장 폴더 지정      |
|            | tmp    |                    | tensorflow 임시 저장 폴더      |
|            |        | docker-compose.yml | docker-compose.yml 설정 파일 |

{% file src="/files/-MYcWPo19KcO5WGBOOp2" %}

#### Step 2. Docker-compose.yml 설정        &#x20;

{% tabs %}
{% tab title="docker-compose.yml" %}
{% code title="docker-compose.yml" %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 tensorflow-jupyter: # 서비스 명
  image: tensorflow/tensorflow:latest-jupyter # 사용할 이미지
  container_name: tensorflow-jupyter # 컨테이너 이름 설정
  volumes:
   - ./tensorflow/result:/tf/tensorflow-tutorials/result # result 폴더에 결과 저장
   - ./tensorflow/upload:/tf/tensorflow-tutorials/upload # upload 폴더
   - ./tensorflow/tmp:/tmp # 임시 파일
  restart: always 
  ports:
   - "8888:8888" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
```

{% endcode %}

{% file src="/files/-MYcWK7hQsffhLZQx8zd" %}
{% endtab %}
{% endtabs %}

#### Step 3. Docker-compose 실행 및 중지/재시작      &#x20;

{% tabs %}
{% tab title="1. Docker-compose 실행" %}

```bash
cd ./docker-compose/
cd ./tensorflow/
docker ps 
docker-compose.exe up -d
docker ps
```

{% endtab %}

{% tab title="2. Docker-compose 중지" %}

```bash
cd ./docker-compose/
cd ./tensorflow/
docker ps
docker-compose.exe down
docker ps
```

{% endtab %}

{% tab title="3. Docker-compose 재시작" %}

```bash
cd ./docker-compose/
cd ./tensorflow/
docker ps
docker-compose.exe restart
docker ps
```

{% endtab %}
{% endtabs %}

#### Step 4. TensorFlow 접속 및 확인   &#x20;

{% tabs %}
{% tab title="1. TensorFlow 접속 token 확인" %}

```
docker logs -f tensorflow-jupyter # 실행 후 URL Log 확인    
```

![그림. tensorflow-jupyter Log 확인](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcROg_pnaes6EwXYdP%2F-MYcSxuBFCIId_5kBqOj%2Fimage.png?alt=media\&token=eaadc765-f62b-440e-9e25-e41db2aee543)
{% endtab %}

{% tab title="2. TensorFlow 크롬 접속" %}

```
Docker 로그를 통해 token 을 이용하 크롬에 접속  
```

![그림. docker 로그를 통해 URL 접속 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcROg_pnaes6EwXYdP%2F-MYcTNHXfmnMfivxn6gX%2Fimage.png?alt=media\&token=5db17824-89d0-472e-84b6-c5462e6c96a2)
{% endtab %}

{% tab title="3. Jupyter 접속 화면" %}

```
크롬에 URL 을 정상적으로 입력 하면 아래와 같은 화면을 볼 수 있음 
```

![그림. 정상적으로 접속 된 화면](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYcROg_pnaes6EwXYdP%2F-MYcTpKfW5W53JaRHgxK%2Fimage.png?alt=media\&token=7c1901e4-39b7-47e7-b56a-86af1e951a84)
{% endtab %}
{% endtabs %}

#### Step 5. TensorFlow 실행 및 저장     &#x20;

{% tabs %}
{% tab title="1. Jupyter tutorial 리스트" %}

```
크롬 localhost:8888 접속 후 tensorflow-tutorials 폴더 확인
```

![그림. TensorFlow Tutorial 목록 확인   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYnWUVOL06kB1B8jTmi%2F-MYnYJOn28yefWgheslt%2Fimage.png?alt=media\&token=544e7873-e9da-4489-bf82-68fae37b0176)
{% endtab %}

{% tab title="2. Jupyter tutorial 실행" %}

```
ipynb 파일 클릭 후 아래와 같이 확인
상단에 Run or restart 버튼을 클  
```

![그림. Jupyter 실행 및 중지/재시작](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYc_QmvbX8kwkI7avkM%2F-MYccDaxUrrfGn1dqxAO%2Fimage.png?alt=media\&token=5b25460d-decb-4eed-98eb-6ebbe4c3737d)

&#x20;
{% endtab %}

{% tab title="3. Jupyter tutorial 업로드" %}

```
Main 화면에서 Upload 버튼 클릭 후 파일 선택  
업로드 후에 2번과 같이 진행    
```

![그림. ipynb 파일 업로드](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYcczq6P-Xw_gi-2eeG%2Fimage.png?alt=media\&token=dc058d95-3b20-450f-a3bf-1b5f2a75b173)
{% endtab %}

{% tab title="4. Jupyter tutorial 결과 및 저장" %}

```
진행 결과 확인 
결과 확인(Running) 및 파일 저장(File > Save as)     
```

![그림. Running 탭에서 진행 결과 확인     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYcda9qUqmKJSGT8yJW%2Fimage.png?alt=media\&token=4cbe3cc8-61f5-474b-a94a-98f7c68e6d42)

![그림. 결과 파일 저장(File -> Save as)     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYceyGZASsVhxKkNq4b%2Fimage.png?alt=media\&token=92b4288b-adad-4565-b1a6-840eb8765163)

![그림. 저장 파일은 로컬시스템 및 가상화 시스템 경로 확인    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYccRSEqyxIAvoLSAZo%2F-MYcfVgLaWBy-lPwY43k%2Fimage.png?alt=media\&token=15a15b82-18fe-47fb-a596-3c80074d4bf6)
{% endtab %}
{% endtabs %}

### 5.2 Hadoop 시스템 구축 (5분 완성)      &#x20;

#### Step 1. 사전 준비 단계    &#x20;

* 폴더 구조      &#x20;

| 메인 폴더  | 서 폴더 | 서 폴더          | 파일                 | 설명                       |
| ------ | ---- | ------------- | ------------------ | ------------------------ |
| hadoop |      |               |                    |                          |
|        | logs |               |                    | Hadoop 로그 파일 저장          |
|        | dfs  | name          |                    | NameNode 저장 위치           |
|        |      | data          |                    | DataNode 저장 위치           |
|        |      | namesecondary |                    | NameNodeSecondary 저장 위치  |
|        |      |               | docker-compose.yml | docker-compose.yml 설정 파일 |

{% file src="/files/-M\_4SbDBK4kRJmGo9gI1" %}

#### Step 2. Docker-compose.yml 설정     &#x20;

{% tabs %}
{% tab title="docker-compose.yml" %}
{% code title="docker-compose.yml" %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 hadoop-dev: # 서비스 명
  image: harisekhon/hadoop-dev # 사용할 이미지
  container_name: hadoop-dev # 컨테이너 이름 설정
  restart: always 
  volumes:
   #- ./hadoop/dfs/name:/tmp/hadoop-root/dfs/name
   #- ./hadoop/dfs/data:/tmp/hadoop-root/dfs/data
   #- ./hadoop/dfs/namesecondary:/tmp/hadoop-root/dfs/namesecondary
   - ./hadoop/logs:/hadoop/logs
  ports:
   - 8042:8042    # node
   - 8088:8088    # cluster
```

{% endcode %}

{% file src="/files/-M\_4B5XR8o16zmQYG1HP" %}
{% endtab %}
{% endtabs %}

#### Step 3. Docker-compose 실행 및 중지/재시작     &#x20;

{% tabs %}
{% tab title="1. Docker-compose 실행" %}

```bash
cd ./docker-compose
cd ./hadoop
docker ps
docker-compose up -d
docker ps
```

```bash
docker-compose up -d
Creating network "hadoop_default" with the default driver
Creating hadoop-dev ... done
docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED         STATUS          PORTS                                                                                                                                                                                          NAMES
02b2458e15d7   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   8 seconds ago   Up 11 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
```

{% endtab %}

{% tab title="2. Docker-compose 중지" %}

```bash
cd ./docker-compose
cd ./hadoop
docker ps
docker-compose down
docker ps
```

```bash
docker-compose down
Stopping hadoop-dev ... done
Removing hadoop-dev ... done
Removing network hadoop_default
docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

{% endtab %}

{% tab title="3. Docker-compose 재시작" %}

```bash
cd ./docker-compose
cd ./hadoop
docker ps
docker-compose restart
docker ps
```

```bash
docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED                  STATUS         PORTS                                                                                                                                                                                          NAMES
d33193820d6c   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   Less than a second ago   Up 3 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
docker-compose restart
Restarting hadoop-dev ... done
docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED          STATUS         PORTS                                                                                                                                                                                          NAMES
d33193820d6c   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   25 seconds ago   Up 4 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
```

{% endtab %}
{% endtabs %}

#### Step 4. Hadoop 시스템 확인       &#x20;

{% tabs %}
{% tab title="1. Hadoop Node 확인  " %}

```
 크롬으로 localhost:8042 접속    
```

![그림. Hadoop node 페이지](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYljqM08Q1grUmrP1nZ%2F-MYllF9DSVqP6zGDCxUU%2Fimage.png?alt=media\&token=65dea3b1-ffdb-42f9-a8ce-872f8fb2660b)
{% endtab %}

{% tab title="2. Hadoop Cluster 확인 " %}

```
 크롬으로 localhost:8088 접속
```

![그림. Hadoop Cluster 페이지  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYljqM08Q1grUmrP1nZ%2F-MYlmXPh7KgiqpcdISVT%2Fimage.png?alt=media\&token=a30f71a7-8ee0-4cb3-88cc-f7399a558762)
{% endtab %}

{% tab title="3. Hadoop Dfshealth 확인  " %}

```
 크롬으로 localhost:50070 접속
```

![그림. Hadoop dfshealth 페이지 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYlmZQJCDi50-zGdlrn%2F-MYln3zvMpaqBm5dDrgH%2Fimage.png?alt=media\&token=60aa2bdb-e675-4905-b904-980e27364bd1)
{% endtab %}

{% tab title="4. Hadoop Datanode 확인 " %}

```
크롬으로 localhost:50075 접속 
```

![그림. Hadoop datanode 페이지 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYlmZQJCDi50-zGdlrn%2F-MYlnRSZEaBCbha9hqq3%2Fimage.png?alt=media\&token=8dd63c84-374b-47aa-a6a4-397ca8866124)
{% endtab %}

{% tab title="5. Hadoop Status 확인" %}

```
크롬으로 localhost:50090 접속 
```

![그림. Hadoop status 페이지 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYlmZQJCDi50-zGdlrn%2F-MYlnjhWw5yKRaGpjL5m%2Fimage.png?alt=media\&token=ddc3b8ec-ac45-4ab2-a621-dfd90fbe4a0d)
{% endtab %}
{% endtabs %}

#### Step 5. Hadoop 테스트 확인  &#x20;

{% tabs %}
{% tab title="1. Sample Test 이동/복사 " %}

```
Hadoop 경로 이동 및 파일 저장(NOTICE.txt)    
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c /]# cd $HADOOP_HOME
[root@4bb51d4c894c hadoop]# ls
bin  etc  include  lib  libexec  LICENSE.txt  logs  NOTICE.txt  README.txt  sbin  share
[root@4bb51d4c894c hadoop]# hadoop fs -mkdir -p /data
[root@4bb51d4c894c hadoop]# hadoop fs -put NOTICE.txt /data
[root@4bb51d4c894c hadoop]# hadoop fs -ls /data
Found 1 items
-rw-r--r--   1 root supergroup      15915 2021-04-21 00:26 /data/NOTICE.txt
```

{% endtab %}

{% tab title="2. Sample Test 실행    " %}

```
Hadoop Sample 테스트 실행  
hadoop-mapreduce-examples-2.9.0.jar 의 파라미터(wordmean) 이용하여 NOTICE.txt 파일의 단어와 글자수를 계산    
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c]# cd /hadoop/share/hadoop/mapreduce
[root@4bb51d4c894c mapreduce]# ls
hadoop-mapreduce-client-app-2.9.0.jar     hadoop-mapreduce-client-hs-plugins-2.9.0.jar       hadoop-mapreduce-examples-2.9.0.jar  sources
hadoop-mapreduce-client-common-2.9.0.jar  hadoop-mapreduce-client-jobclient-2.9.0.jar        jdiff
hadoop-mapreduce-client-core-2.9.0.jar    hadoop-mapreduce-client-jobclient-2.9.0-tests.jar  lib
hadoop-mapreduce-client-hs-2.9.0.jar      hadoop-mapreduce-client-shuffle-2.9.0.jar          lib-examples
[root@4bb51d4c894c mapreduce]# hadoop jar hadoop-mapreduce-examples-2.9.0.jar
Valid program names are:
  aggregatewordcount: An Aggregate based map/reduce program that counts the words in the input files.
  aggregatewordhist: An Aggregate based map/reduce program that computes the histogram of the words in the input files.
  bbp: A map/reduce program that uses Bailey-Borwein-Plouffe to compute exact digits of Pi.
  dbcount: An example job that count the pageview counts from a database.
  distbbp: A map/reduce program that uses a BBP-type formula to compute exact bits of Pi.
  grep: A map/reduce program that counts the matches of a regex in the input.
  join: A job that effects a join over sorted, equally partitioned datasets
  multifilewc: A job that counts words from several files.
  pentomino: A map/reduce tile laying program to find solutions to pentomino problems.
  pi: A map/reduce program that estimates Pi using a quasi-Monte Carlo method.
  randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.
  randomwriter: A map/reduce program that writes 10GB of random data per node.
  secondarysort: An example defining a secondary sort to the reduce.
  sort: A map/reduce program that sorts the data written by the random writer.
  sudoku: A sudoku solver.
  teragen: Generate data for the terasort
  terasort: Run the terasort
  teravalidate: Checking results of terasort
  wordcount: A map/reduce program that counts the words in the input files.
  wordmean: A map/reduce program that counts the average length of the words in the input files.
  wordmedian: A map/reduce program that counts the median length of the words in the input files.
  wordstandarddeviation: A map/reduce program that counts the standard deviation of the length of the words in the input files.
[root@4bb51d4c894c mapreduce]# hadoop jar hadoop-mapreduce-examples-2.9.0.jar wordmean /data /data_out
21/04/21 00:52:37 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
21/04/21 00:52:38 INFO input.FileInputFormat: Total input files to process : 1
21/04/21 00:52:38 INFO mapreduce.JobSubmitter: number of splits:1
21/04/21 00:52:38 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.enabled is deprecated. Instead, use yarn.system-metrics-publisher.enabled
21/04/21 00:52:38 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1618964082934_0001
21/04/21 00:52:39 INFO impl.YarnClientImpl: Submitted application application_1618964082934_0001
21/04/21 00:52:39 INFO mapreduce.Job: The url to track the job: http://4bb51d4c894c:8088/proxy/application_1618964082934_0001/
21/04/21 00:52:39 INFO mapreduce.Job: Running job: job_1618964082934_0001
21/04/21 00:52:50 INFO mapreduce.Job: Job job_1618964082934_0001 running in uber mode : false
21/04/21 00:52:50 INFO mapreduce.Job:  map 0% reduce 0%
21/04/21 00:52:58 INFO mapreduce.Job:  map 100% reduce 0%
21/04/21 00:53:04 INFO mapreduce.Job:  map 100% reduce 100%
21/04/21 00:53:04 INFO mapreduce.Job: Job job_1618964082934_0001 completed successfully
21/04/21 00:53:04 INFO mapreduce.Job: Counters: 49
        File System Counters
                FILE: Number of bytes read=39
                FILE: Number of bytes written=403473
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=16020
                HDFS: Number of bytes written=24
                HDFS: Number of read operations=6
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
        Job Counters
                Launched map tasks=1
                Launched reduce tasks=1
                Data-local map tasks=1
                Total time spent by all maps in occupied slots (ms)=4347
                Total time spent by all reduces in occupied slots (ms)=3565
                Total time spent by all map tasks (ms)=4347
                Total time spent by all reduce tasks (ms)=3565
                Total vcore-milliseconds taken by all map tasks=4347
                Total vcore-milliseconds taken by all reduce tasks=3565
                Total megabyte-milliseconds taken by all map tasks=4451328
                Total megabyte-milliseconds taken by all reduce tasks=3650560
        Map-Reduce Framework
                Map input records=455
                Map output records=3624
                Map output bytes=52548
                Map output materialized bytes=39
                Input split bytes=105
                Combine input records=3624
                Combine output records=2
                Reduce input groups=2
                Reduce shuffle bytes=39
                Reduce input records=2
                Reduce output records=2
                Spilled Records=4
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=205
                CPU time spent (ms)=1500
                Physical memory (bytes) snapshot=504504320
                Virtual memory (bytes) snapshot=4011933696
                Total committed heap usage (bytes)=347602944
        Shuffle Errors
                BAD_ID=0
                CONNECTION=0
                IO_ERROR=0
                WRONG_LENGTH=0
                WRONG_MAP=0
                WRONG_REDUCE=0
        File Input Format Counters
                Bytes Read=15915
        File Output Format Counters
                Bytes Written=24
The mean is: 7.2759381898454745
[root@4bb51d4c894c mapreduce]#
```

{% endtab %}

{% tab title="3. Sample Test 결과 확인  " %}

```
# Sample Test 결과 확인   
hadoop fs -cat /data_out/*     
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c]# hadoop fs -ls  /data_out
Found 2 items
-rw-r--r--   1 root supergroup          0 2021-04-21 00:53 /data_out/_SUCCESS
-rw-r--r--   1 root supergroup         24 2021-04-21 00:53 /data_out/part-r-00000
[root@4bb51d4c894c]# hadoop fs -cat /data_out/*
count   1812
length  13184
[root@4bb51d4c894c]#
```

{% endtab %}

{% tab title="4. Hadoop node 확인    " %}

```
크롬에서 localhost:8088 로 접속 하여 FINISHED Applications 을 확인    
```

![그림. Hadoop Cluster 에서 FINISHED Applications 페이지](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYm-KmOSDjT6KiAiO2t%2F-MYm0GV8FcHY4ydUCIzk%2Fimage.png?alt=media\&token=b1a7fe6d-389a-4479-8aaf-d5db638523cb)
{% endtab %}

{% tab title="5. Hadoop HDFS Browse Directory 확인 " %}

```
크롬에서 localhost:50070 으로 접속하여 Utilities > Browse Directory 로 이동      
해당 폴더 에 들어가서 파일을 클릭 하면 상세 정보 및 파일 다운로드가 가능    
```

![그림. Hadoop HDFS Browse Directory 페이지](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYm-KmOSDjT6KiAiO2t%2F-MYm0p60wybKbsBCIucL%2Fimage.png?alt=media\&token=70a5bba4-d3c7-450c-a0eb-52123e24effc)

![그림. Hadoop HDFS 에 파일 다운로드 및 상세 보기  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MYm1C5jloPP6saVhu4A%2F-MYm1Yv83vtpCbXqJS-6%2Fimage.png?alt=media\&token=bd79d41d-f125-4c81-9e27-77af158374b0)
{% endtab %}
{% endtabs %}

#### Step 6. Hadoop 결과 데이터 동기화   &#x20;

{% tabs %}
{% tab title="1. Hadoop 시스템 접속 후 데이터 확인 및 압축" %}

```
hadoop 시스템을 재시작 하면 결과 값이 초기화 됨
/tmp/hadoop-root/dfs 의 하위 디렉토리를 압축 하여 관리 pc 에 dfs.tar 파일을 이동 
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@6debfd1fd33d]# cd /tmp/hadoop-root/dfs
[root@6debfd1fd33d dfs]# ls
data  name  namesecondary
[root@6debfd1fd33d dfs]# tar -zcvf dfs.tar ./data ./name ./namesecondary
[root@6debfd1fd33d dfs]# ls dfs.tar
dfs.tar
[root@6debfd1fd33d dfs]# exit

PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>cd ./hadoop/hadoop/dfs
PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>docker cp hadoop:/tmp/hadoop-root/dfs/dfs.tar .
PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>tar -zxvf dfs.tar
PS C:\Users\user1\docker-compose\hadoop\hadoop\dfs>ls


    디렉터리: C:\Users\user1\docker-compose\hadoop\hadoop\dfs


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
da----      2021-04-21  오전 11:04                data
d-----      2021-04-21  오전 10:12                name
d-----      2021-04-21  오전 10:13                namesecondary
```

{% endtab %}

{% tab title="2. docker-compose.yml" %}

```
docker-compose.yml 파일 수정 
```

{% code title="docker-compose.yml volumes 의 주석 제거" %}

```
  volumes:
   - ./hadoop/dfs/name:/tmp/hadoop-root/dfs/name
   - ./hadoop/dfs/data:/tmp/hadoop-root/dfs/data
   - ./hadoop/dfs/namesecondary:/tmp/hadoop-root/dfs/namesecondary
```

{% endcode %}

{% file src="/files/-MYmfDb3lwVPBag5hLk4" %}
{% endtab %}

{% tab title="3. docker-compose 실행" %}

```
수정된 docker-compose.yml 파일로 컨테이너 시작    
hadoop-dev 에 접속 후 데이터 확인 
```

```bash
PS C:\Users\user1> cd ./docker-compose/hadoop
PS C:\Users\user1\docker-compose\hadoop> docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
PS C:\Users\user1\docker-compose\hadoop> docker-compose up -d
Creating network "hadoop_default" with the default driver
Creating hadoop-dev ... done
PS C:\Users\user1\docker-compose\hadoop> docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED         STATUS         PORTS                                                                                                                                                                                          NAMES
2d5becf8894f   harisekhon/hadoop-dev   "/bin/sh -c \"/entryp…"   4 seconds ago   Up 8 seconds   0.0.0.0:8042->8042/tcp, 8020/tcp, 9000/tcp, 10020/tcp, 19888/tcp, 50010/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 50020/tcp, 0.0.0.0:50090->50090/tcp   hadoop-dev
PS C:\Users\user1\docker-compose\hadoop> docker exec -it hadoop-dev /bin/bash
[root@2d5becf8894f /]# hadoop fs -ls /
Found 5 items
drwxr-xr-x   - root supergroup          0 2021-04-21 01:45 /data
drwxr-xr-x   - root supergroup          0 2021-04-21 01:48 /data_in_out
drwxr-xr-x   - root supergroup          0 2021-04-21 01:48 /data_in_out_wordcount
drwxr-xr-x   - root supergroup          0 2021-04-21 01:15 /data_out
drwx------   - root supergroup          0 2021-04-21 01:15 /tmp
```

{% endtab %}
{% endtabs %}

#### ETC. Error/Worning 해결 방안&#x20;

* 데이터가 사라져요!!!

{% tabs %}
{% tab title="1. 데이터 확인" %}

```
컨테이너 재시작 또는 중지 후 시작 했을 때 데이터가 사라짐    
```

```bash
docker exec -it hadoop-dev /bin/bash
[root@4bb51d4c894c]# hadoop fs -ls  /data_out
Found 2 items
-rw-r--r--   1 root supergroup          0 2021-04-21 00:53 /data_out/_SUCCESS
-rw-r--r--   1 root supergroup         24 2021-04-21 00:53 /data_out/part-r-00000
[root@4bb51d4c894c]# hadoop fs -cat /data_out/*
count   1812
length  13184
[root@4bb51d4c894c]#
## ---> 컨테이너 재시작 또는 중지 후 시작           
```

{% endtab %}

{% tab title="2. 확인 방법" %}

```
docker logs -f hadoop-dev (hadoop-dev log 확인)    
docker-compose.yml 의 volumes 파라미터 경로 확인 
```

{% code title="hadoop-dev log 확인     " %}

```bash
PS C:\Users\user1\docker-compose\hadoop>docker logs -f hadoop-dev
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:L9lYtwzxrlF6HqevI8yaUlXhuoihLxHNrwIMXjv1Yow root@2d5becf8894f
The key's randomart image is:
+---[RSA 1024]----+
|            ..   |
|           ..    |
|     o    ...    |
|.  ...o   .+     |
|.o. =.o.S.+ +    |
| .oE.= +oB O .   |
|   .+.oo=o* * .  |
|    o.o  o+=.+   |
|     o..o...++.  |
+----[SHA256]-----+
'/root/.ssh/id_rsa.pub' -> '/root/.ssh/authorized_keys'
mode of '/root/.ssh/authorized_keys' changed from 0644 (rw-r--r--) to 0400 (r--------)
Generating SSH2 RSA host key: [  OK  ]
Generating SSH2 ECDSA host key: [  OK  ]
Generating SSH2 ED25519 host key: [  OK  ]
```

{% endcode %}

{% code title="docker-compose.yml 의 volumes 경로 확인     " %}

```
version: '2' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
 hadoop-dev: # 서비스 명
  image: harisekhon/hadoop-dev # 사용할 이미지
  container_name: hadoop-dev # 컨테이너 이름 설정
  restart: always 
  volumes:
   - ./hadoop/dfs/name:/tmp/hadoop-root/dfs/name
   - ./hadoop/dfs/data:/tmp/hadoop-root/dfs/data
   - ./hadoop/dfs/namesecondary:/tmp/hadoop-root/dfs/namesecondary
   - ./hadoop/logs:/hadoop/logs
  ports:
   - 8042:8042    # node
   - 8088:8088    # cluster
   - 50070:50070 # dfshealth
   - 50075:50075 # datanode
   - 50090:50090 # status
```

{% endcode %}

&#x20;
{% endtab %}

{% tab title="3. 처리 방법  " %}

```
docker-compose.yml 파일을 다운로드 받아서 시작      
Step 6 를 다시 한번 해 본다  
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

## 작성중인 문서.....


# Remote - Containers 를 사용한 Visual Studio Code 원격 개발 feat.Dockerfile

\[DataUs] Front-End 개발자를 위한 원격 개발. feat. vscode & Remote-Containers & Dockerfile

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. 먼저 알아 두기 &#x20;

### 1.1 vscode 가 무엇인가? &#x20;

> 마이크로소프트에서 개발한 텍스트 에디터로, 2015년 4월 29일에 소개되고 2016년 4월 15일에 1.0.0 정식판이 발표되었다. Electron 프레임워크를 기반으로 만들었다. MS의 개발 툴 중 최초로 크로스 플랫폼을 지원하는 에디터이며 윈도우, macOS, 리눅스를 모두 지원한다. GitHub에서 배포되는 소스 코드는 MIT 라이선스하에 배포되는 오픈 소스지만, 실제로 공식 사이트에서 배포되는 릴리즈 바이너리는 마이크로소프트의 독자적 라이선스(EULA의 일종)하에 배포되는 것으로 오픈 소스가 아니다. 대부분 사용자들은 릴리즈 바이너리를 설치하므로 마이크로소프트의 독자적 라이선스 하에 VS Code를 사용하고 있다.
>
> 참고 : [Visual Studio Code 나무위키](https://namu.wiki/w/Visual%20Studio%20Code?from=%EB%B9%84%EC%A3%BC%EC%96%BC%20%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4%20%EC%BD%94%EB%93%9C)&#x20;

### 1.2 Visual Studio Code Remote - Containers 란 무엇인가? &#x20;

> Visual Studio Code 에서 Docker 컨테이너를 기반으로  개발 환경을 가져오고 만들고 구성합니다.   &#x20;

### 1.3 'Front-End' , 'Back-End' 란 무엇인가? &#x20;

#### 1.3.1 'Front-End' 란 무엇인가? &#x20;

> 'Front-End' 는 컴퓨터와 사용자 사이의 인터페이스 (I/F) 부분을 말한다. '앞단', '뷰단'(view端) 또는 '사용자단' 이라고 부른다. 웹사이트의 디자인, 메뉴, 폰트, HTML, CSS, 자바스크립트 등이 있다.     &#x20;
>
> 참고 : [Front-End 해쉬넷](http://wiki.hash.kr/index.php/%ED%94%84%EB%9F%B0%ED%8A%B8%EC%97%94%EB%93%9C)

#### 1.3.2 'Back-End'란 무엇인가?&#x20;

> 'Back-End' 는 컴퓨터와 응용 프로그램 또는 컴퓨터와 데이터베이스  사이의 인터페이스 (I/F) 부분을말한다. '뒷단' 또는 '백단'(back端) 이라고 부른다. 응용 프로그램, DBMS, 운영체제, 웹서버, WAS 드아이 있다.
>
> 참고 : [Back-End 해쉬넷   ](http://wiki.hash.kr/index.php/%EB%B0%B1%EC%97%94%EB%93%9C)      &#x20;

### 1.4 dockerfile 이란 무엇인가?  &#x20;

> DockerFile 은 코드의 형태로 인프라를 구성하는 방법을 텍스트 형식으로 저장해 놓은 파일이며 docker build 를 사용하여 자신만의 이미지를 만들 수 있다.

## 2. Visual Studio Code 의 Remote - Containers 를 사용하는 이유

> 언제, 어디서든, 개발 환경 및 구성을 동일하게 하기 위해 이 문서를 작성하게 되었습니다.
>
> 간단한 설정 방법과 쉽게 따라 할 수  있도록 구성 하였습니다.                            &#x20;

## 3. Visual Studio Code 다운로드 및 설치

### 3.1 Visual Studio Code 다운로드 및 설치&#x20;

> Visual Studio Code 사이트에 접속하면 Windows/Linux/Mac 등 설치 파일이 있습니다.         &#x20;
>
> 다운로드 : <https://code.visualstudio.com/download>&#x20;

![그림. Visual Studio Code Web Site   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FdWCjTaNUd1oTBctSUERJ%2Fimage.png?alt=media\&token=2756858e-1896-46b8-b43c-a904d476d4bc)

## 4. DockerFile 설정  &#x20;

### 4.1 DockerFile 설정 파일 알아보자   &#x20;

{% code title="" %}

```
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.217.4/containers/javascript-node/.devcontainer/base.Dockerfile

# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 16, 14, 12, 16-bullseye, 14-bullseye, 12-bullseye, 16-buster, 14-buster, 12-buster
ARG VARIANT="16-bullseye"
FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-${VARIANT}

# 시간 및 날짜 설정
ENV TZ Asia/Seoul

RUN apt-get update && apt-get install -y locales
# 한국어 설정   
RUN locale-gen ko_KR.UTF-8
RUN export LC_ALL=ko_KR.UTF-8

# 테마 적용
RUN sed -i 's/codespaces/agnoster/' /home/node/.zshrc
RUN sed -i'' -r -e "/prompt_hg/a\  prompt_newline" /home/node/.oh-my-zsh/themes/agnoster.zsh-theme

# [Optional] Uncomment if you want to install an additional version of node using nvm
ARG EXTRA_NODE_VERSION=16.14.0
RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}"

# [Optional] Uncomment if you want to install more global node modules
RUN su node -c "npm install -g yarn @vue/cli parcel-bundler"
```

{% endcode %}

{% file src="/files/YV04buVcuIzBwu3qSuJp" %}
DockerFile 파일 &#x20;
{% endfile %}

## 5. Visual Studio Code 의 devcontainer.json 알아보자    &#x20;

> Dockerfile 을 실행 하면서 devcontainer.json 에서 extensions, features 대한 설정 값을 지정 할 수 있습니다.        &#x20;
>
> * extensions 목록&#x20;
>   * [x] eslint
>   * [x] gitlens
>   * [x] jest
>   * [x] 한국어팩
>   * [x] liveserver
>   * [x] postcss
>   * [x] python
>   * [x] tailwindcss
>   * [x] rainbow-csv
> * features 목록
>   * [x] git
>   * [x] sshd
>   * [x] homebrew
>   * [x] python
>   * [x] java
>
> 참고  <https://code.visualstudio.com/docs/remote/devcontainerjson-reference>

{% code title="devcontainer.json  " %}

```
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.217.4/containers/javascript-node
{
  "name": "DataUs Frontend",
  "build": {
    "dockerfile": "Dockerfile",
    // Update 'VARIANT' to pick a Node version: 16, 14, 12.
    // Append -bullseye or -buster to pin to an OS version.
    // Use -bullseye variants on local arm64/Apple Silicon.
    "args": { "VARIANT": "16-bullseye" }
  },

  // Set *default* container specific settings.json values on container create.
  "settings": {
    "editor.formatOnSave": false,
    "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true
    },
    "eslint.alwaysShowStatus": true,
    "eslint.workingDirectories": [{ "mode": "auto" }],
    "eslint.validate": ["javascript", "typescript"]
  },

  // Add the IDs of extensions you want installed when the container is created.
  "extensions": [
    "dbaeumer.vscode-eslint",
    "eamodio.gitlens-insiders",
    "octref.vetur",
    "Orta.vscode-jest",
    "MS-CEINTL.vscode-language-pack-ko",
    "ritwickdey.LiveServer",
    "csstools.postcss",
    "ms-python.python",
    "bradlc.vscode-tailwindcss",
    "mechatroner.rainbow-csv"
  ],

  // Use 'forwardPorts' to make a list of ports inside the container available locally.
  "forwardPorts": [4231],

  // Use 'postCreateCommand' to run commands after the container is created.
  // "postCreateCommand": "yarn install",

  // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
  "remoteUser": "node",
  "features": {
    "git": "latest",
    "sshd": "latest",
    "homebrew": "latest",
    "python": "latest",
    "java": "lts"
  }
}

```

{% endcode %}

{% file src="/files/jBWoNMZ3NVuyJHF0p4jg" %}
devcontainer.json 파일 &#x20;
{% endfile %}

## 6. Visual Studio Code 를 이용하여 Remote - Containers 를 실행 하자  &#x20;

### 6.1 폴더 구성   &#x20;

<table><thead><tr><th>File</th><th>설명 </th><th data-hidden>Folder</th></tr></thead><tbody><tr><td>Dockerfile</td><td>도커파일     </td><td>/</td></tr><tr><td>devcontainer.json</td><td>VSCode 설정 파일 (extensions, features)   </td><td>/</td></tr></tbody></table>

{% file src="/files/6aOzkYHgMiKNYpc5kHHU" %}
설정 zip 파일   &#x20;
{% endfile %}

### 6.2 VSCode 에서 Remote - Containers 실행 하기  &#x20;

#### 6.2.1 VSCode 실행  및 설정  &#x20;

![그림. Visual Studio Code 실행 화면      ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FzJaTEq2PQqvMxW6cPbCA%2Fimage.png?alt=media\&token=88e4b404-8aff-494e-8e11-5c7cfdf54ec3)

![그림.  파일>폴더열기> vscode-server1 Folder 선택          ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FWUWdPP6QSeCg4Ru8gGq5%2Fimage.png?alt=media\&token=3e80e6f8-b3a9-49b0-b50e-342adbedf3a8)

> 위의 그림에서 폴더는 [#5.1](#5.1 "mention")에서 다운로드(vscode-remote-containers.zip) 받아서 압축을 해제            &#x20;
>
> 아래의 그림 처럼 실행.  &#x20;

![그림. 왼쪽 아래(원격 창 열기) 클릭 후 'Open Folder in Container...' 를 선택 하여 실행              ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FRABKLJ7z0Nymz2bmkbgk%2Fimage.png?alt=media\&token=4f990903-1805-44f5-a36a-aaab24cf5fb0)

![그림. 원격 열기가 실행 되며 Dockerfile 과 devcontainer.json 의 설정 값을  실행 함          ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FFMt5Xb7GfSLyE170L37D%2Fimage.png?alt=media\&token=eaa8fba6-e05b-49db-aff9-2d15055ce877)

![그림. Remote - Containers 로 실행 된 화면          ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F27qAyk0Q73L0n1wddII1%2Fimage.png?alt=media\&token=04192b4f-10fd-484f-9448-ce20d6d9645b)

> 이 환경 설정 값을 통해 Remote - Containers 를 사용하게 되면 동일한 개발 환경을 제공하게 됩니다.             &#x20;
>
> 자세한  [#4.-visual-studio-code-devcontainer.json](#4.-visual-studio-code-devcontainer.json "mention") 에서  extensions, features 에 지정한 것들을 사용 할 수 있으며 필요한 프로그램이 있다면 등록하여 사용 하시기 바랍니다.    &#x20;

## 7. Github Sample Code 로 테스트 해 보자  &#x20;

### 7.1 Git Clone 또는 압축 파일 다운로드 하기&#x20;

> 먼저 [#6.2-vscode-remote-containers](#6.2-vscode-remote-containers "mention") 를 통해서 연결 한 후에 아래의 Git 주소로 Clone 또는 [압축 파일 다운로드](https://github.com/dalcon10028/vue3-tailwindcss-template/archive/refs/heads/master.zip)를 workspace 에 풀어서 실행&#x20;
>
> &#x20;`git clone` [`https://github.com/dalcon10028/vue3-tailwindcss-template.git`](https://github.com/dalcon10028/vue3-tailwindcss-template.git)  `semi-project` &#x20;

{% file src="/files/CNvyTCpt3OT3lTt9rPWd" %}
압축 파일&#x20;
{% endfile %}

![그림. Git 주소(https://github.com/dalcon10028/vue3-tailwindcss-template) ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FCheKxMoXDWhdqeInhgxC%2Fimage.png?alt=media\&token=36dfd7af-5fa9-4c5d-b30f-c1914aac40f2)

### 7.2 Github Sample Code 를 VSCode  실행 하기    &#x20;

> Git 또는 압축 파일을 다운로드 받아서 압축 해제 후 [#6.2-vscode-remote-containers](#6.2-vscode-remote-containers "mention")      &#x20;
>
> 아래의 Sample Code 는 Yarn 으로  실행 하기 위해 devcontainer.json 파일을 아래와 같이 수정 하여야 함.
>
> `** git clone 또는 다운로드 받은 파일은 수정 할 필요가 없음.`                     &#x20;

{% code title="devcontainer.json" %}

```
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.217.4/containers/javascript-node
{
  "name": "DataUs Frontend",
  "build": {
    "dockerfile": "Dockerfile",
    "args": { "VARIANT": "16-bullseye" }
  },

  "settings": {
    "editor.formatOnSave": false,
    "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true
    },
    "eslint.alwaysShowStatus": true,
    "eslint.workingDirectories": [{ "mode": "auto" }],
    "eslint.validate": ["javascript", "typescript"],
    "terminal.integrated.defaultProfile.linux": "/bin/zsh"
  },

  "extensions": [
    "dbaeumer.vscode-eslint",
    "eamodio.gitlens-insiders",
    "octref.vetur",
    "Orta.vscode-jest",
    "MS-CEINTL.vscode-language-pack-ko",
    "ritwickdey.LiveServer",
    "csstools.postcss",
    "ms-python.python",
    "bradlc.vscode-tailwindcss",
    "mechatroner.rainbow-csv"
  ],

  // Use 'forwardPorts' to make a list of ports inside the container available locally.
  "forwardPorts": [3000, 8080, 80, 443],

  // Use 'postCreateCommand' to run commands after the container is created.
  "postCreateCommand": "yarn install",   ### yarn install 

  // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
  "remoteUser": "root",     ### 사용자를 node -> root  
  "features": {
    "git": "latest",
    "sshd": "latest",
    "homebrew": "latest",
    "python": "latest",
    "java": "lts"
  }
}
```

{% endcode %}

{% file src="/files/SnypF0V6UG4Vbzig4SFa" %}
변경된 사용자 및 yarn install   devcontainer.json &#x20;
{% endfile %}

![그림. VSCode 의 Remote-Containers 로 연결하기      ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F7zn5e37hJYQbwWHJiWex%2Fimage.png?alt=media\&token=e7a9d72c-d854-4fc1-932b-7e0573e84309)

![그림. Remote-Containers 에 연결 중     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F9c4TD9RHMtvwVaN8fEET%2Fimage.png?alt=media\&token=517da582-a4eb-4972-8fae-f41063cceb92)

> Visual Studio Code 에 Remote-Containers 로 연결 완료 된 후 `터미널 -> yarn serve`실행       &#x20;

![그림. yarn serve 실행  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FUJXNOMOHtglLXvcXB9Xb%2Fimage.png?alt=media\&token=b4a1ef53-c84e-412b-b869-42cd99259b11)

![그림. localhost:8080 실행 완료     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FNxYfmaKJkcQiGO80PMsD%2Fimage.png?alt=media\&token=52cb95c3-202d-49ed-9f21-dac841abc975)

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


# DockerFile 을 이용하여 나만의 Docker Image 만들기

DockerFile Build 사용법(커뮤니티 블로그 만들기)

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. 먼저 알아 두기     &#x20;

### 1.1 DockerFile 이란?

> DockerFile 은 코드의 형태로 인프라를 구성하는 방법을 텍스트 형식으로 저장해 놓은 파일이며 docker build 를 사용하여 자신만의 이미지를 만들 수 있다.

### 1.2 Docker Build 란?   &#x20;

> DockerFile 및 컨텍스트로부터 이미지를 빌드하는 Docker 명령

### 1.3 Docker-Compose 란?

> Compose는 멀티 컨테이너 도커 애플리케이션을 정의하고 실행하는 도구이다. YAML 파일을 사용하여 애플리케이션의 서비스를 구성하며 하나의 명령을 가지고 모든 컨테이너의 생성 및 시작 프로세스를 수행한다.

## 2. DockerFile을 이용하여 만들어 보자!!!    &#x20;

### 2.1 서비스 설계 구성       &#x20;

|                       | DataBase Server    | WEB/WAS Service                                             |
| --------------------- | ------------------ | ----------------------------------------------------------- |
| Docker Hub Base Image | mariadb:10.4.18    | ubuntu:20.04                                                |
| OS                    | Ubuntu 20.04.2 LTS | Ubuntu 20.04.2 LTS                                          |
| Service               | Mariadb 10.4.18    | <p>Nginx 1.18.0</p><p>Tomcat 9.0.45</p>                     |
| Developer             |                    | <p>OpenJDK 1.8.x</p><p>Maven 3.8.1</p><p>NodeJS 14.16.1</p> |
| Dev Source            |                    | USE Github                                                  |
| Service Port          | 3306               | 80, 8080                                                    |

### 2.2 아키텍처 물리 설계 구성도   &#x20;

> **대규모 3-Tier 구성 : 로드 발란스를 이용하여 3-Tier 구성을 확장하는 구성 방식. 웹 시스템의 사용자가 많은 엔터프라이즈 어플리케이션일 경우 대부분 대규모 3-Tier 구성을 이용하고 있다.**

![](https://lh3.googleusercontent.com/oUpNO68tu2GvjTzWHulL3jQUx8v-dJDMlbZPwiCTWoDM7uWgzVBdnuC4OBLDJQl8i_Luyg0n9A8-cMwUXZufw3UO0teA2RKNVLSKlnJdTsOLBqutn1Jk1FHCyPr9tZZFwiQ47c6QJ-g)

### 2.3 Database(Mariadb:10.4.18) Docker Image 만들기       &#x20;

```
### Base Image 지정    
FROM mariadb:10.4.18  

### TimeZone 환경 변수 지정
ENV TZ Asia/Seoul  

### Mariadb root 비밀번호 설정
ENV MYSQL_ROOT_PASSWORD=root

### Mariadb Database 생성  
ENV MYSQL_DATABASE=deverse      

### TimeZone 설
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

### Mariadb User 및 DB 스키마 설정 스크립
ADD deverse.sql /docker-entrypoint-initdb.d/deverse.sql
ADD db_user.sql /docker-entrypoint-initdb.d/db_user.sql

### 홈 디렉토리
WORKDIR /home/dev

### 서비스 포
EXPOSE 3306
```

{% hint style="info" %}
소스 파일은 [Github ](https://github.com/bc-hwang/TEST/)에서 참고 하시기 바랍니다.
{% endhint %}

### 2.4 Nginx & Tomcat(ubuntu:20.04) Docker Image 만들기

```
### Base Image 지정
FROM ubuntu:20.04

### TimeZone 환경 변수 지정
ENV TZ Asia/Seoul

### TimeZone 설정    
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

### /home/dev 폴더 생성
RUN mkdir /home/dev

### update 및 패키지 설치     
RUN apt update && apt -y install vim git tar gzip build-essential curl alien openjdk-8-jdk nginx

### nodejs 설
RUN curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_14_setup.sh && bash nodesource_14_setup.sh && apt -y install nodejs

### build, tomcat, maven, nginx(default.conf) 파일 복사   
COPY build.tar.gz /home/dev/build.tar.gz
COPY tomcat-9.0.45.tar.gz /home/dev/tomcat-9.0.45.tar.gz
COPY apache-maven-3.8.1.tar.gz /home/dev/apache-maven-3.8.1.tar.gz
COPY default.conf /etc/nginx/conf.d/default.conf

### ubuntu01 계정 생성
RUN addgroup --gid 1100 ubuntu01 && adduser --disabled-password --home /home/dev --no-create-home --system -q --uid 1000 --ingroup ubuntu01 ubuntu01

### Github Source 파일 다운로드     
RUN git clone https://github.com/bc-hwang/TEST.git /home/dev/deverse

### /home/dev 폴더 이동   
WORKDIR /home/dev

### 암축 파일 해제    
RUN tar -zxvf apache-maven-3.8.1.tar.gz
RUN tar -zxvf tomcat-9.0.45.tar.gz
RUN tar -zxvf build.tar.gz

### maven link 설정
RUN ln -s /home/dev/apache-maven-3.8.1/bin/mvn /usr/bin/mvn

### Build 실행
RUN cd /home/dev/build && bash ./back_build.sh
RUN cd /home/dev/build && bash ./front_build.sh

### Nginx & Tomcat Service 실행    
CMD nginx -g 'daemon on;' && /home/dev/tomcat-9.0.45/bin/catalina.sh run

### 서비스 포
EXPOSE 80 8080

```

{% hint style="info" %}
소스 파일은 [Github ](https://github.com/bc-hwang/TEST/)에서 참고 하시기 바랍니다.
{% endhint %}

### 2.5 DockerFile Buil 하기 후 Docker Hub 에 업로드 하기     &#x20;

{% tabs %}
{% tab title="Database(mariadb:10.4.18)" %}
**Step1. docker loign** <br>

**Step2. 작성 한 DockerFile 에서 빌드 하기**

&#x20; **• docker build -t tomcat\_mariadb:mariadb .**

&#x20; **• docker images ## 로컬에 저장된 Docker Images 확인**<br>

**Step3. 로컬에 만든 이미지 실행 및 확인**

&#x20; **• docker run –d tomcat\_mariadb:mariadb** <br>

**Step4. Docker Hub 이미지 업로드**

&#x20; **• docker tag tomcat\_mariadb:mariadb bchwang/tomcat\_mariadb:mariadb**

&#x20; **• docker push bchwang/tomcat\_mariadb:mariadb**  <br>

**Step5. Docker Hub 에 등록된 이미지 확인**

&#x20; **• Docker Hub 에 개인 개정으로 로그인 후 Docker Image 및 Tag 확인**
{% endtab %}

{% tab title="Nginx\&Tomcat(ubuntu:20.04)" %}
**Step1. docker loign** <br>

**Step2. 작성 한 DockerFile 에서 빌드 하기**

&#x20; **• docker build -t tomcat\_mariadb:nginx\_tomcat .**

&#x20; **• docker images ## 로컬에 저장된 Docker Images 확인**<br>

**Step3. 로컬에 만든 이미지 실행 및 확인**

&#x20; **• docker run –d –p 80:80 tomcat\_mariadb: nginx\_tomcat** <br>

**Step4. Docker Hub 이미지 업로드**

&#x20; **• docker tag tomcat\_mariadb:nginx\_tomcat bchwang/tomcat\_mariadb:nginx\_tomcat**&#x20;

&#x20; **• docker push bchwang/tomcat\_mariadb: nginx\_tomcat** <br>

**Step5. Docker Hub 에 등록된 이미지 확인**

&#x20; **• Docker Hub 에 개인 개정으로 로그인 후 Docker Image 및 Tag 확인**<br>
{% endtab %}
{% endtabs %}

### 2.6 Docker-Compose 를 이용하여 실행 하기     &#x20;

#### 2.6.1 Local 에서 Build Image 를 이용하여 docker-compose.yml 만들기      &#x20;

{% code title="docker-compose.yml" %}

```
### 빌드할 버전    
version: '2'

### 서비스 설정    
services:
  mariadb:
    image: tomcat_mariadb:mariadb
    restart: always

  nginx-tomcat:
    image: tomcat_mariadb:nginx_tomcat
    restart: always
    ports:
      - 80:80
    links:
      - mariadb
```

{% endcode %}

{% hint style="info" %}
소스 파일은 [Github ](https://github.com/bc-hwang/TEST/)에서 참고 하시기 바랍니다.
{% endhint %}

#### 2.6.2 Docker Hub Image 를 이용하여 docker-compose.yml 만들기    &#x20;

{% code title="docker-compose.yml" %}

```
### 빌드할 버전    
version: '2'

### 서비스 설정    
services:
  mariadb:
    image: bchwang/tomcat_mariadb:mariadb
    restart: always

  nginx-tomcat:
    image: bchwang/tomcat_mariadb:nginx_tomcat
    restart: always
    ports:
      - 80:80
    links:
      - mariadb
```

{% endcode %}

## 3. NHN Cloud 를 이용한 Kubernetes 서비스를 구축 방법     &#x20;

### 3.1 커뮤니티 블로그 서비스 Yaml 설정 하기         &#x20;

> NHN Cloud 를 이용하여 커뮤니티 블로그 서비스를 Kubernetes 로 구축 하는 방법을 소개해 드립니다.
>
> 아래의 내용을 따라 하시거나 [GitHub ](https://github.com/bc-hwang/TEST)의 소스 파일을 참고 시기 바랍니다.

### 3.2 NameSpace Yaml        &#x20;

```
apiVersion: v1
kind: Namespace
metadata:
  name: project
```

### 3.3 Mariadb Yaml    &#x20;

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-mariadb
  labels:
    app: mariadb
  namespace: project
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      hostname: mariadb
      containers:
      - name: mariadb
        image: bchwang/tomcat_mariadb:mariadb
        ports:
        - containerPort: 3306
          name: mariadb
```

### 3.4. Mariadb Service Yaml     &#x20;

```
apiVersion: v1
kind: Service
metadata:
  name: tomcat-mariadb
  labels:
    app: mariadb
  namespace: project
spec:
  clusterIP: None
  ports:
  - port: 3306
  selector:
    app: mariadb
```

### 3.5 Nginx & Tomcat Service Yaml   &#x20;

```
apiVersion: v1
kind: Service
metadata:
  name: nginx-tomcat
  labels:
    app: nginx-tomcat
  namespace: project
  ## 오브젝트 선언형 관리
  annotations
    ## Floating ip 유지 설정
    loadbalancer.openstack.org/keep-floatingip: "true"
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 30000
  selector:
    app: nginx-tomcat
  ## NodePort 가 아니라 LoadBalancer 로 설정 해 주어야 함.
  type: LoadBalancer
  ## Floating ip 를 지정 하여 Loadbalancer ip 로 설정.
  loadBalancerIP: 133.186.216.107
```

### 3.6 Nginx & Tomcat Yaml    &#x20;

> 아래의 내용 중 hostAliases 의 ip 정보가 mariadb 의 IP 정보를 입력 하여야 함.
>
> Mariadb 를 실행 한 후에 `kuberctl get pod -n project` 로 나온 IP 값을 입력 하면 됨.

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-tomcat
  labels:
    app: nginx-tomcat
  namespace: project
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx-tomcat
  template:
    metadata:
      labels:
        app: nginx-tomcat
      name: nginx-tomcat
    spec:
      hostname: nginx-tomcat
      hostAliases:
      - ip: "10.100.4.9" ### mariadb hosts 지정
        hostnames:
        - "mariadb"
      containers:
      - name: nginx-tomcat
        image: bchwang/tomcat_mariadb:nginx_tomcat
        ports:
        - containerPort: 80
          name: nginx-tomcat
```

{% hint style="info" %}
소스 파일은 [Github ](https://github.com/bc-hwang/TEST/)에서 참고 하시기 바랍니다.
{% endhint %}

### 3.7 커뮤니티 블로그 서비스 Yaml 실행 하기  &#x20;

{% code title="NHN Cloud Manager Server 에 접속 하여 실행 함" %}

```
### mariadb 및 서비스 실행   
$ kubectl apply -f 1.kubernetes_mariadb+service.yaml

### Mariadb Pod 실행 및 IP 정보 확인     
$ kubectl get pod -n project -o wide
NAME                                        READY     STATUS    RESTARTS   AGE          IP            NODE       NOMINATED NODE   READINESS GATES
mariadb-service-59868b7dd6-xb8tq            1/1       Running   0          1m           10.100.4.9    kubernetes   <none>           <none>

### ip 입력 후 nginx & tomcat 실행    
kubectl apply -f 2.kubernetes_nginx+tomcat.yaml

### Pod 실행 및 IP 정보 확인     
$ kubectl get pod -n project -o wide
NAME                                        READY     STATUS    RESTARTS   AGE          IP            NODE       NOMINATED NODE   READINESS GATES
mariadb-service-59868b7dd6-xb8tq            1/1       Running   0          1m           10.100.4.9    kubernetes   <none>           <none>
nginx_tomcat-service-59868b7dd6-xb8tq       1/1       Running   0          1m           10.100.4.10   kubernetes   <none>           <none>

### Service 정보 확인     
$ kubectl get service -n project -o wide
NAMESPACE              NAME                            TYPE         CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE     SELECTOR
nginx_tomcat           nginx_tomcat                    LoadBalancer 133.186.216.107 <none>        80/TCP                   8m4s    app=nginx_tomcat
mariadb                mariadb                         ClusterIP    <none>          <none>        3306/TCP                 18m4s   app=mariadb
```

{% endcode %}

### 3.8 공인 IP로 접속 한 화면    &#x20;

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Md0Oel5ov4zU-5D55n3%2F-Md0TjX4Oncq0KSKcMQm%2Fimage.png?alt=media\&token=2efd1b8a-ce91-43ee-9f57-0a048bd4c43f)

## 4. GitHub 정보 및 커뮤니티 블로그 소개     &#x20;

### 4.1 개발 환경

* Ubuntu/20.x (OS)
* mariadb/10.4.18 (DB Service)
* tomcat/9.0.45 (WAS Service)
* nginx/1.18.0 (WEB Service)
* OpenJDK/1.8.x
* Maven/3.8.1
* NodeJS/14.6.1

### 4.2 NHN Cloud Kubernetes & Docker 사용해 보기

#### A. DockerFile 을 이용하여 Docker Images 만들기(Tomcat, Mariadb)

* **Dockerfile 을 이용하여 Mariadb 이미지 만들기**

```
   - /install/mariadb/db_user.sql (DB 계정 스크립트)
   - /install/mariadb/devers.sql (DB 스키마 스크립트)
   - /install/mariadb/dockerfile (Docker Image 스크립트)
```

* **Dockerfile Build 방법(mariadb Image)**

```
   - /install/mariadb 의 폴더에 dockerfile 을 확인 후 아래 명령어 실행
     -> docker build -t tomcat_mariadb:mariadb .
   - docker images (tomcat_mariadb:mariadb 이미지 확인)
```

* **Dockerfile 을 이용하여 nginx\_tomcat 이미지 만들기**

```
   - /install/nginx_tomcat/apache-maven-3.8.1.tar.gz (maven src 파일)
   - /install/nginx_tomcat/tomcat-9.0.45.tar.gz (tomcat src 파일)
   - /install/nginx_tomcat/build.tar.gz (src build 파일)
   - /install/nginx_tomcat/dockerfile (Docker Image 스크립트)
   - /install/nginx_tomcat/default.conf (nginx 설정 파일)
   - /install/nginx_tomcat/nginx.conf (nginx 설정 파일)
```

* **Dockerfile Build 하는 방법(nginx\_tomcat Image)**

```
   - /install/nginx_tomcat 의 폴더에 dockerfile 을 혹인 후 아래 명령어 실행
     -> docker build -t tomcat_mariadb:nginx_tomcat .
   - docker images (tomcat_mariadb:nginx_tomcat 이미지 확인)
```

* **Docker Hub push 하는 방법**

```
   - docker login 을 함.
   - docker tag tomcat_mariadb:nginx_tomcat bchwang/tomcat_mariadb:nginx_tomcat (tag 설정)
   - docker tag tomcat_mariadb:mariadb bchwang/tomcat_mariadb:mariadb (tag 설정)
   - docker push bchwang/tomcat_mariadb:nginx_tomcat (docker hub 에 업로드 진행)
   - docker push bchwang/tomcat_mariadb:mariadb (docker hub 에 업로드 진행)
```

### B. Build 된 Tomcat, Mariadb Images 실행 하기

* **docker images 확인 하기**

```
   - docker images
```

* **Local Image 로 실행 하기**

```
   - docker run -d --name mariadb tomcat_mariadb:mariadb
   - docker run -d --name tomcat -p 80:80 --link mariadb tomcat_mariadb:nginx_tomcat
```

* **docker Hub Image 로 실행 하기**

```
   - docker run -d --name mariadb bchwang/tomcat_mariadb:mariadb
   - docker run -d --name tomcat -p 80:80 --link mariadb bchwang/tomcat_mariadb:nginx_tomcat
```

### C. Docker-Compose 사용하기

* **Local Images 로 실행 하기**

```
   - /install/docker-compose_local.yml (docker-compose 설정 값 Local Images 사용)
```

* **Docker Hub 에 Push 한 Images 로 실행 하기**

```
   - /install/docker-compose.yml (docker-compose 설정 값 Docker Hub Images 사용)
```

### D. NHN Cloud Kubernetes 로 사용하기

* **NHN Cloud 회원 가입 및 Console 로그인 : <http://toast.com>**
* **NHN Cloud Console 에 Kubernetes Manager Instance 생성**

```
   - NHN Cloud Console 접속 -> Compute -> Instance -> 인스턴스 생성
   - 이미지(Ubuntu Server 20.04 LTS) -> 인스턴스 이름(kube-manager) -> 인스턴스 타입(Standard : t2.c1m1) -> 키 페어 선택(생성 or 기존에 사용하던것)
     -> 블록 스토리지 타입(HDD or SDD) -> 블록 스토리지 크기(50~100GB) -> 인스턴스 생성
```

* **NHN Cloud Console 에서 Kubernetes 생성**

```
   - NHN Cloud Console 접속 -> Container -> Kubernetes -> 클러스터 생성
   - 클러스터 이름(kube-master) -> 인스턴스 타입(Standard : m2.c8m16) -> 노드 수(2~3개) -> 키 페어 선택(생성 or 기존에 사용하던것)
     -> 블록 스토리지 타입(HDD or SDD) -> 블록 스토리지 크기(50~100GB) -> 오토 스케일러(사용 or 사용 안 함) -> 클러스터 생성
```

* **NHN Cloud Console 에서 SSH 접속 설정**

```
   - NHN Cloud Console 접속 -> Network -> Security Groups -> Default 선택 -> 보안정책 생성 -> 포트: 22, 원격 공인IP 입력(ex 포트: 22, CIDR: 111.111.111.111/32) 후 확인
   - 자세한 사항은 https://docs.toast.com/ko/Compute/Instance/ko/overview/#linux (SSH 접속 방법) 참고
```

* **NHN Cloud 에서 생성된 Instance(Kube-manager) 접속 방법 및 Kubernetes 연결 방법**

```
   - https://doc.skill.or.kr/nhn-cloud#5-2-kube-manager-api 에서 NHN Cloud Kubernetes API 설정 방법
```

* **NHN Cloud 에서 Kubernetes 를 이용하여 서비스 사용하기**

```
   - /install/1.kubernetes_mariadb+service.yaml (mariadb Pod/Service 등 설정 값)
     -> kubectl apply -f 1.kubernetes_mariadb+service.yaml (mariadb pod 와 Service 실행) -> kubectl get pod -n project -o wide (Mariadb IP 확인)
   - /install/2.kubernetes_nginx+tomcat.yaml (tomcat Pod 설정 값)
     -> vi 2.kubernetes_nginx+tomcat.yaml (- ip: "10.100.4.9" 의 값을 Mariadb IP 로 수정) -> kubectl apply -f 2.kubernetes_nginx+tomcat.yaml (Nginx 와 Tomcat Pod 실행) 
   - Build 설정 파일
     - nginx+tomcat Server 접속
     - /home/dev/build/application.yml 에 DB 접속 정보 설정
     - /home/dev/deverse/frontend/.env.build 에 url 접속 정보 설정
```

## TIPs.1 DockerFile 기본 형식 자세히 알아 보기   &#x20;

### TIPs 1.1 DockerFile 기본 형식    &#x20;

| Command    | Description |
| ---------- | ----------- |
| FROM       | 베이스 이미지 지정  |
| RUN        | 명령어 실행      |
| CMD        | 데몬 실행       |
| LABEL      | 라벨 설정       |
| EXPOSE     | 포트 설정       |
| ENV        | 환경 변수 설정    |
| ADD        | 파일 추가       |
| COPY       | 파일 복사       |
| USER       | 사용자 설정      |
| WORKDIR    | 작업 디렉토리 지정  |
| VOLUME     | 볼륨 마운트      |
| ENTRYPOINT | 데몬 실행       |
| ONBUILD    | 빌드 후 실행 명   |

### TIPs 1.2 Docker Build 기본 형식    &#x20;

| Name, Shorthand         | Default | Description                                                                                       |
| ----------------------- | ------- | ------------------------------------------------------------------------------------------------- |
| --add-host              |         | Add a custom host-to-IP mapping (host:ip)                                                         |
| --build-arg             |         | Set build-time variables                                                                          |
| --cache-from            |         | Images to consider as cache sources                                                               |
| --cgroup-parent         |         | Optional parent cgroup for the container                                                          |
| --compress              |         | Compress the build context using gzip                                                             |
| --cpu-period            |         | Limit the CPU CFS (Completely Fair Scheduler) period                                              |
| --cpu-quota             |         | Limit the CPU CFS (Completely Fair Scheduler) quota                                               |
| --cpu-shares , -c       |         | CPU shares (relative weight)                                                                      |
| --cpuset-cpus           |         | CPUs in which to allow execution (0-3, 0,1)                                                       |
| --cpuset-mems           |         | MEMs in which to allow execution (0-3, 0,1)                                                       |
| --disable-content-trust | true    | Skip image verification                                                                           |
| --file , -f             |         | Name of the Dockerfile (Default is ‘PATH/Dockerfile’)                                             |
| --force-rm              |         | Always remove intermediate containers                                                             |
| --iidfile               |         | Write the image ID to the file                                                                    |
| --isolation             |         | Container isolation technology                                                                    |
| --label                 |         | Set metadata for an image                                                                         |
| --memory , -m           |         | Memory limit                                                                                      |
| --memory-swap           |         | Swap limit equal to memory plus swap: ‘-1’ to enable unlimited swap                               |
| --network               |         | <p> API 1.25+</p><p>Set the networking mode for the RUN instructions during build</p>             |
| --no-cache              |         | Do not use cache when building the image                                                          |
| --platform              |         | <p> experimental (daemon)API 1.32+</p><p>Set platform if server is multi-platform capable</p>     |
| --pull                  |         | Always attempt to pull a newer version of the image                                               |
| --quiet , -q            |         | Suppress the build output and print image ID on success                                           |
| --rm                    | true    | Remove intermediate containers after a successful build                                           |
| --security-opt          |         | Security options                                                                                  |
| --shm-size              |         | Size of /dev/shm                                                                                  |
| --squash                |         | <p> experimental (daemon)API 1.25+</p><p>Squash newly built layers into a single new layer</p>    |
| --stream                |         | <p> experimental (daemon)API 1.31+</p><p>Stream attaches to server to negotiate build context</p> |
| --tag , -t              |         | Name and optionally a tag in the ‘name:tag’ format                                                |
| --target                |         | Set the target build stage to build.                                                              |
| --ulimit                |         | Ulimit options                                                                                    |

### TIPs 1.3 Docker-Compose 기본 형식

| Command | Description                              |
| ------- | ---------------------------------------- |
| build   | Build or rebuild services                |
| config  | Validate and view the Compose file       |
| create  | Create services                          |
| down    | Stop and remove resources                |
| events  | Receive real time events from containers |
| exec    | Execute a command in a running container |
| help    | Get help on a command                    |
| images  | List images                              |
| kill    | Kill containers                          |
| logs    | View output from containers              |
| pause   | Pause services                           |
| port    | Print the public port for a port binding |
| ps      | List containers                          |
| pull    | Pull service images                      |
| push    | Push service images                      |
| restart | Restart services                         |
| rm      | Remove stopped containers                |
| run     | Run a one-off command                    |
| scale   | Set number of containers for a service   |
| start   | Start services                           |
| stop    | Stop services                            |
| top     | Display the running processes            |
| unpause | Unpause services                         |
| up      | Create and start containers              |
| version | Show version information and quit        |

| Name, Shorthand              | Description                                                                                                    |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------- |
| -f, --file FILE              | <p>Specify an alternate compose file<br>(default: docker-compose.yml)</p>                                      |
| -p, --project-name NAME      | <p>Specify an alternate project name <br>(default: directory name)</p>                                         |
| --profile NAME               | Specify a profile to enable                                                                                    |
| -c, --context NAME           | Specify a context name                                                                                         |
| --verbose                    | Show more output                                                                                               |
| --log-level LEVEL            | Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)                                                          |
| --ansi (never\|always\|auto) | Control when to print ANSI control characters                                                                  |
| --no-ansi                    | Do not print ANSI control characters (DEPRECATED)                                                              |
| -v, --version                | Print version and exit                                                                                         |
| -H, --host HOST              | Daemon socket to connect to                                                                                    |
| --tls                        | Use TLS; implied by --tlsverify                                                                                |
| --tlscacert CA\_PATH         | Trust certs signed only by this CA                                                                             |
| --tlscert CLIENT\_CERT\_PATH | Path to TLS certificate file                                                                                   |
| --tlskey TLS\_KEY\_PATH      | Path to TLS key file                                                                                           |
| --tlsverify                  | Use TLS and verify the remote                                                                                  |
| --skip-hostname-check        | Don't check the daemon's hostname against the name specified in the client certificate                         |
| --project-directory PATH     | <p>Specify an alternate working directory <br>(default: the path of the Compose file)</p>                      |
| --compatibility              | <p>If set, Compose will attempt to convert keys <br>in v3 files to their non-Swarm equivalent (DEPRECATED)</p> |
| --env-file PATH              | Specify an alternate environment file                                                                          |

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


# DockerFile 을 이용하여 나만의 Docker Image \[Tomcat+Jenkins] 만들기

\[설치 구성 : Centos 7.x, Tomcat 9.x,Jenkins 2.319.2] docker-compose.yml 설정 포함

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. 먼저 알아 두기     &#x20;

### 1.1 DockerFile 이란?

> DockerFile 은 코드의 형태로 인프라를 구성하는 방법을 텍스트 형식으로 저장해 놓은 파일이며 docker build 를 사용하여 자신만의 이미지를 만들 수 있다.

### 1.2 Docker Build 란?   &#x20;

> DockerFile 및 컨텍스트로부터 이미지를 빌드하는 Docker 명령

### 1.3 Docker-Compose 란?

> Compose는 멀티 컨테이너 도커 애플리케이션을 정의하고 실행하는 도구이다. YAML 파일을 사용하여 애플리케이션의 서비스를 구성하며 하나의 명령을 가지고 모든 컨테이너의 생성 및 시작 프로세스를 수행한다.

### 1.4 Jenkins 란?

> 소프트웨어 개발 시 [지속적 통합](https://ko.wikipedia.org/wiki/%EC%A7%80%EC%86%8D%EC%A0%81_%ED%86%B5%ED%95%A9)(continuous integration) 서비스를 제공하는 툴이다. 다수의 개발자들이 하나의 프로그램을 개발할 때 버전 충돌을 방지하기 위해 각자 작업한 내용을 공유 영역에 있는 Git등의 저장소에 빈번히 업로드함으로써 지속적 통합이 가능하도록 해 준다.
>
> 출처 :  <https://ko.wikipedia.org/wiki/%EC%A0%A0%ED%82%A8%EC%8A%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)>

## 2. DockerFile을 이용하여 만들어 보자!!!    &#x20;

### 2.1 서비스 설계 구성 &#x20;

|           구분          |     Service     |
| :-------------------: | :-------------: |
| Docker Hub Base Image | Centos 7.9.2009 |
|       Developer       |    OpenJDK11    |
|        Service        |   Tocmat 9.0.8  |
|      Jenkins Src      | Jenkins 2.319.2 |
|      Service Port     |        80       |

### 2.2 dockerfiles 폴더 구성       &#x20;

|                 폴더 및 파일                |                설명               |
| :------------------------------------: | :-----------------------------: |
|               dockerfile               |       DockerFile Build 파일       |
| apache-tomcat-9.0.8-pre-install.tar.gz |    Tomcat 설정 및 Jenkins 압축 파일    |
|           ./conf/context.xml           |     Tomcat Manager 접근 제어 설정     |
|            ./conf/server.xml           |       Tomcat Service 포트 설정      |
|         ./conf/tomcat-user.xml         | Tomcat Manager User/Password 설정 |
|           docker-compose.yml           |       docker-compose 실행 파일      |

{% file src="/files/DrUrFWQUinPk4UtAnBOE" %}
DockerFile\[Tomcat+Jenkins] 압축 파일    &#x20;
{% endfile %}

### 2.3 Docker Image 만들기(Tomcat + Jenkins)     &#x20;

{% code title="dockerfile" %}

```
FROM centos:7.9.2009

#서버 시간 설정
ENV TZ Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

#서버 홈폴더 설정
RUN mkdir /home/jenkins

#서버 yum update 및 openjdk 설치
RUN yum update -y && yum install epel-release java-11-openjdk-devel -y 

#tomcat+jenkins 압축 파일 복사
COPY apache-tomcat-9.0.8-pre-install.tar.gz /home/jenkins/apache-tomcat-9.0.8.tar.gz

#압축 해제
RUN cd /home/jenkins && tar -zxvf apache-tomcat-9.0.8.tar.gz

#서비스 포트 지정
EXPOSE 80

#작업 폴더 설정
WORKDIR /home/jenkins

#Tomcat 서비스 시작
CMD ["/home/jenkins/apache-tomcat-9.0.8/bin/catalina.sh", "run"]
```

{% endcode %}

{% file src="/files/Lton7Yii9SuejVw35XZ5" %}
dockerfile 원본 파일   &#x20;
{% endfile %}

### 2.4 DockerFile Build 후 Docker Hub 업로드 하기  &#x20;

{% tabs %}
{% tab title="Tomcat+Jenkins" %}
**Step1. docker loign** <br>

**Step2. 작성 한 DockerFile 에서 빌드 하기**

&#x20; **• docker build -t tomcat\_mariadb:jenkins1.0 .**

&#x20; **• docker images ## 로컬에 저장된 Docker Images 확인**<br>

**Step3. 로컬에 만든 이미지 실행 및 확인**

&#x20; **• docker run -d -p 80:80 tomcat\_mariadb:jenkins1.0**<br>

**Step4. Docker Hub 이미지 업로드**

&#x20; **• docker tag tomcat\_mariadb:jenkins1.0 bchwang/tomcat\_mariadb:jenkins1.0**

&#x20; **• docker push bchwang/tomcat\_mariadb:jenkins1.0**<br>

**Step5. Docker Hub 에 등록된 이미지 확인**

&#x20; **• Docker Hub 에 개인 개정으로 로그인 후 Docker Image 및 Tag 확인**\
\
**Step6. Docker Hub 에 등록된 이미지로 실행 하기**&#x20;

&#x20; **• docker run -d -p 80:80 bchwang/tomcat\_mariadb:jenkins1.0**
{% endtab %}
{% endtabs %}

## 3. docker 를 이용하여 실행 하기&#x20;

### 3.1 docker 실행 하기&#x20;

```
# docker run --name project1 -d -p 80:80 bchwang/tomcat_mariadb:jenkins1.0
Unable to find image 'bchwang/tomcat_mariadb:jenkins1.0' locally
jenkins1.0: Pulling from bchwang/tomcat_mariadb
Digest: sha256:a44086d7242cd88c5e1abef7a99c5a5bd5fe1762e5eaa8ce58c2232e75eeff05
Status: Downloaded newer image for bchwang/tomcat_mariadb:jenkins1.0
e54875e866040c63e383de6424a516398ebe7ef3235994d4a2d9c9ffa895cd49

# docker ps
CONTAINER ID   IMAGE                               COMMAND                  CREATED          STATUS          PORTS                NAMES
2c12c471ad47   bchwang/tomcat_mariadb:jenkins1.0   "/home/jenkins/apach…"   24 seconds ago   Up 22 seconds   0.0.0.0:80->80/tcp   project1

# docker logs -f project1
07-Feb-2022 13:29:42.336 INFO [Finalizing set up] jenkins.install.SetupWizard.init

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

75c34fe2059a4ec69b1d0e6e03e3ffed  #### Jenkins 초기 비밀번호    

This may also be found at: /root/.jenkins/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************
```

### 3.2 Tomcat+Jenkins 설정 확인  &#x20;

#### 3.2.1 Tomcat 설정 확인(server.xml)&#x20;

> Tomcat 서비스 포트(80) 설정 하기 위해 server.xml 파일을 수정 하여 적용
>
> 파일 위치 : /home/jenkins/apache-tomcat-9.0.8/conf
>
> ```
> <Connector port="80" protocol="HTTP/1.1"
>            connectionTimeout="20000"
>            redirectPort="8443" />
> ```

#### 3.2.2 Tomcat 설정 확인(tomcat-user.xml) &#x20;

> Tomcat Manager 로그인 권한 및 계정/비밀번호 설정
>
> &#x20;-> 계정 : admin, 비밀번호 : 1234567890&#x20;
>
> 파일 위치 : /home/jenkins/apache-tomcat-9.0.8/conf&#x20;
>
> ```
>   <role rolename="manager"/>
>   <role rolename="manager-gui" />
>   <role rolename="manager-script" />
>   <role rolename="manager-jmx" />
>   <role rolename="manager-status" />
>   <role rolename="admin"/>
>   <user username="admin" password="1234567890" roles="admin,manager,manager-gui, manager-script, manager-jmx,  manager-status"/>
> ```

#### 3.2.3 Tomcat 설정 확인(context.xml)&#x20;

> Tomcat Manager 접근 제한 설정
>
> &#x20;-> 제한 없음 설정    &#x20;
>
> 파일 위치 : /home/jenkins/apache-tomcat-9.0.8/webapps/manager/META-INF&#x20;
>
> ```
>    <!--Valve className="org.apache.catalina.valves.RemoteAddrValve"
>          allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /-->
> ```

## 4. docker-compose.yml 을 이용하여 실행 하기     &#x20;

### 4.1 docker-compose.yml 파일 &#x20;

```
version: '2'

services:
  tomcat_jenkins1.0:
    image: bchwang/tomcat_mariadb:jenkins1.0
    ports:
      - '80:80'
    volumes:
      # data 폴더와 instance 폴더 동기  
      - "./data:/home/jenkins/data:rw"
      # context.xml 파일(Tomcat Manager 접근 제한 설정)        
      #- "./conf/context.xml:/home/jenkins/apache-tomcat-9.0.8/webapps/manager/META-INF/context.xml"
      # server.xml 파일(Tomcat Serivce Port 설정)
      #- "./conf/server.xml:/home/jenkins/apache-tomcat-9.0.8/conf/server.xml"
      # tomcat-users.xml 파일(Tomcat Manager User/Password 설정 :: admin / 1234) 
      #- "./conf/tomcat-users.xml:/home/jenkins/apache-tomcat-9.0.8/conf/tomcat-users.xml"
```

{% file src="/files/fEycKXINVEWjw0b5zh13" %}
docker-compose.yml 파일 &#x20;
{% endfile %}

### 4.2 docker-compose 실행 방법  &#x20;

```
# docker-compose up -d
Creating network "jenkins_default" with the default driver
Creating jenkins_tomcat_jenkins1.0_1 ... done

# docker ps 
CONTAINER ID   IMAGE                               COMMAND                  CREATED         STATUS         PORTS                NAMES
450fb13bace8   bchwang/tomcat_mariadb:jenkins1.0   "/home/jenkins/apach…"   5 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp   jenkins_tomcat_jenkins1.0_1

# docker exec -it 450fb13bace8 /bin/bash
[root@450fb13bace8 jenkins]# ls
apache-tomcat-9.0.8  apache-tomcat-9.0.8.tar.gz  data
```

### 4.3 docker-compose 중지 방법   &#x20;

```
# docker-compose down
Stopping jenkins_tomcat_jenkins1.0_1 ... done
Removing jenkins_tomcat_jenkins1.0_1 ... done
Removing network jenkins_default
```

### 4.4 conf 폴더 파일 정보  &#x20;

> [#3.2-tomcat+jenkins](#3.2-tomcat+jenkins "mention")에서 설정 파일 정보 확인        &#x20;

## 5. Tomcat+Jenkins 접속 화면   &#x20;

### 5.1 Tomcat Manager 접속 화면  &#x20;

> <http://localhost/manager/html> 접속  &#x20;

![Tomcat Manager 접속 화면     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FPl6aaDCAmb2qH9F84TCQ%2Fimage.png?alt=media\&token=0c079b18-8831-46e1-a9cd-dc1f7b999a2d)

![Tomcat Manager Login 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FcaM3LlO8KVm5cpGx62ru%2Fimage.png?alt=media\&token=72098b91-5013-4d4c-b6f3-a9662f735bb0)

### 5.2 Jenkins 접속 화면    &#x20;

> <http://localhost/jenkins/> 접속 &#x20;

![Jenkis 접속 화면  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Fm8a0CJ50jI9SNLfunxca%2Fimage.png?alt=media\&token=9705e200-d341-4065-abca-c54b14ab349e)

![Jenkins Administrator Password 입력 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FiFmt5WKCF2mBr961BHqs%2Fimage.png?alt=media\&token=5bf472f0-6dbf-4461-ae91-39d92a774ab1)

![Tomcat catalina.out Log 파일에 Jenkins Administrator 접속 정보  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FTDgpo1CzB7GDtiWKubY2%2Fimage.png?alt=media\&token=e716c7d1-43ed-4541-a6b9-de9b0fedf7de)

![Jenkins Plugins Install 화면  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FR1rPwvuK5zHEYafsnXTA%2Fimage.png?alt=media\&token=f8b3d325-e76a-4de9-b00c-3b638501fca7)

![Jenkins Getting Started 화면  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FSP9nqypErtVf7vpCnC7P%2Fimage.png?alt=media\&token=73911cbb-a584-4528-9608-1c36d39f1e39)

![Jenkins Admin User 생성 화면    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FnB2VOWxRF4NhgdbVXd25%2Fimage.png?alt=media\&token=3183090a-afdf-4bbb-9859-75de1d8feaeb)

![Jenkins Instance Configuration 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FYmEIfDDB6g78ZZZ6t07J%2Fimage.png?alt=media\&token=9fbb4b33-3683-401a-9481-27df4c8fe4ad)

![Jenkins Start 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FaJCdejFow6bWntYDn95K%2Fimage.png?alt=media\&token=aa5b4a53-f3e5-4dcd-bbd3-28361e59066f)

![Jenkins 접속 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FdvYFfqzlu8bJVaeHyHEI%2Fimage.png?alt=media\&token=7845c8cc-4d90-4074-b4c4-5cc1882aa1da)

## 00. 오류 해결하기  &#x20;

### 00.1 Jenkins Administrator 초기 비밀번호&#x20;

> Jenkins Admin 초기 비밀번호는 /root/.jenkins/secrets/initialAdminPassword 에 저장되어 있음.         &#x20;

```
# docker ps
CONTAINER ID   IMAGE                               COMMAND                  CREATED          STATUS          PORTS                NAMES
e06afb6798ff   bchwang/tomcat_mariadb:jenkins1.0   "/home/jenkins/apach…"   57 minutes ago   Up 57 minutes   0.0.0.0:80->80/tcp   project1

# docker exec -it e06afb6798ff /bin/bash
[root@e06afb6798ff jenkins]# cd 

[root@e06afb6798ff ~]# ls -alh
total 44K
dr-xr-x--- 1 root root 4.0K Feb  7 15:20 .
drwxr-xr-x 1 root root 4.0K Feb  7 15:18 ..
-rw-r--r-- 1 root root   18 Dec 29  2013 .bash_logout
-rw-r--r-- 1 root root  176 Dec 29  2013 .bash_profile
-rw-r--r-- 1 root root  176 Dec 29  2013 .bashrc
drwxr-x--- 3 root root 4.0K Feb  7 15:20 .cache
-rw-r--r-- 1 root root  100 Dec 29  2013 .cshrc
drwxr-x--- 3 root root 4.0K Feb  7 15:18 .java
drwxr-x--- 9 root root 4.0K Feb  7 15:19 .jenkins
-rw-r--r-- 1 root root  129 Dec 29  2013 .tcshrc
-rw------- 1 root root 3.4K Nov 13  2020 anaconda-ks.cfg

[root@e06afb6798ff ~]# cd .jenkins/secrets
[root@e06afb6798ff secrets]# ls -al initialAdminPassword
-rw-r----- 1 root root 33 Feb  7 15:18 initialAdminPassword

[root@e06afb6798ff secrets]# cat initialAdminPassword
0bac68086c2042899be70b9d984bae6e
```

> 또는 Tomcat Logs 폴더의 catalina.out 에 Jenkins admin 정보가 남겨져 있음.  &#x20;

![Tomcat catalina.out 파일  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FgNGoiglfLP0idIqUQACo%2Fimage.png?alt=media\&token=6c3ed61c-16ca-4cc1-9082-7ddb5b5036c4)

### 002. Tomcat Manager 접속 에러 \[403 Access Denied]

![Tomcat Manager 403 Error](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FbPpVgTSxbbmynKZ7Trhn%2Fimage.png?alt=media\&token=d32c955c-c181-448b-a680-812c91f1e68d)

> 위의 그림과 같은 Tomcat Manager 접속 에러 \[403 Access Denied] 화면인 경우 context.xml 설정파일을 확인하여야 함. [#3.2.3-tomcat-context.xml](#3.2.3-tomcat-context.xml "mention")참고                &#x20;

### 003. Tomcat Manager Login 안됨 &#x20;

> Tomcat Manager 접속 하였을때 Login 이 안되는 경우 tomcat-users.xml 의 설정 값을 확인 하여야 함 . [#3.2.2-tomcat-tomcat-user.xml](#3.2.2-tomcat-tomcat-user.xml "mention") 참고          &#x20;

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


# Docker-Compose 를 이용하여 Yona 사용하기

21세기 협업 개발 플랫폼인 :: Yona-Project 를 누구나 손쉽게 하기 위해 개인적으로 만듦

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. Yona Project 란 무엇인가?    &#x20;

> #### &#x20;Yona 는 21세기 협업 개발 플랫폼입니다.
>
> * Git 저장소 기능이 내장된 설치형 이슈트래커
> * Naver, Naver Labs 를 비롯하여 게임회사, 통신회사 고객센터, 공공기관, 투자사, 학교, 기업등에서 수년 간 실제로 사용되어 왔고 개선되어 온(Real world battled) 애플리케이션입니다.   &#x20;

{% hint style="info" %}
자세한 사항은 [Yona-Project](https://github.com/yona-projects/yona) 에서 확인 하시기 바랍니다.&#x20;
{% endhint %}

## 2. Yona 의 주요기능은?

> * 서비스 종료나 데이터 종속 걱정없는 설치형
> * 프로젝트 기반의 유연한 이슈트래커와 게시판
>   * 편리한 프로젝트간 이슈 이동
>   * 서브 태스크 이슈
>   * 본문 변경이력 보기
>   * 이슈 템플릿 기능
> * 자체 내장된 코드 저장소
>   * Git/SVN 선택 가능
>   * 온라인 수정 및 커밋 지원
>   * 프로젝트 멤버만 코드에 접근 가능 기능 등
> * 블럭기반 코드리뷰
>   * 코드 블럭 및 리뷰 스레드 지원
>   * 리뷰 점수 지원
> * 그룹 기능
>   * 그룹 이슈 및 게시글 통합관리
>   * 그룹 프로젝트, 그룹 멤버
> * 한글 기반
>   * 프로젝트 이름 및 그룹 이름에 한글을 사용가능
> * LDAP 지원
>   * LDAP 장애시에도 사용가능한 기능 제공
> * 다른 제품이나 서비스로의 마이그레이션 기능 제공
>   * Github/Github Enterprise, 또 다른 Yona 인스턴스, Redmine 등
> * 로그인 관련 보안을 높일 수 있는 소셜로그인 지원

{% hint style="info" %}
자세한 사항은 [Yona-Project](https://github.com/yona-projects/yona) 에서 확인 하시기 바랍니다.&#x20;
{% endhint %}

## 3. Yona 의 라이센스는?

> Yona는 Apache 2.0 라이선스로 제공됩니다.

{% hint style="info" %}
자세한 사항은 [Yona-Project](https://github.com/yona-projects/yona) 에서 확인 하시기 바랍니다.&#x20;
{% endhint %}

## 4. dockerfile을 이용하여 만들어 보자!!!

### 4.1 서비스 설계 구성         &#x20;

| 구성                    | 설명                                                                                   |
| --------------------- | ------------------------------------------------------------------------------------ |
| Docker Hub Base Image | mariadb:10.3                                                                         |
| Source                | <https://github.com/yona-projects/yona>                                              |
| Install Files         | <https://github.com/yona-projects/yona/releases/download/v1.4.0/yona-v1.4.0-bin.zip> |
| Service Port          | 9000                                                                                 |

### 4.2 파일 구성   &#x20;

| 메인 폴더        | 파일                 | 설명                                                                                                                            |
| ------------ | ------------------ | ----------------------------------------------------------------------------------------------------------------------------- |
| yona-project |                    |                                                                                                                               |
|              | dockerfile         | dockerfile 설정 파일                                                                                                              |
|              | docker-compose.yml | docker-compose 실행 파일                                                                                                          |
|              | my.cnf             | mariadb 의 my.cnf 설정 파일                                                                                                        |
|              | db\_user.sql       | <p>DB User 사용자 생성 및 권한 설정    <br>비밀번호 변경이 필요 함.  </p><p>/yona/conf/application.conf 파일의 <br>maraidb 접속 ID/Password 를 수정  </p> |

> DB User 비밀번호 변경 시 아래의 값을 수정 하여야 합니다.
>
> `application.con 파일은 yona 를 처음 실행 해야 파일이 생성 됩니다.`
>
> 경로 /yona/conf/application.conf 파일
>
> {% code title="/yona/conf/application.conf" %}
>
> ```
> ...
> db.default.driver=org.mariadb.jdbc.Driver
> db.default.url="jdbc:mariadb://127.0.0.1:3306/yona?useServerPrepStmts=true"
> db.default.user=yona
> db.default.password="yonadan"
> ...
> ```
>
> {% endcode %}

{% file src="/files/-MfVCbbCUbu1IgcHrvzN" %}

### 4.3 DockerFile 을 이용하여 Docker Images 만들기&#x20;

{% code title="dockerfile " %}

```
### Base Image 지정
FROM mariadb:10.3

### TimeZone 환경 변수 지정
ENV TZ Asia/Seoul

### Mariadb root 비밀번호 설정
ENV MYSQL_ROOT_PASSWORD=root

### TimeZone 설정   
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

### 업데이트    
RUN apt update && apt -y install git vim wget openjdk-8-jdk unzip

### yona 및 mysql 설정파일   
RUN mkdir /yona-data
COPY my.cnf /etc/mysql/my.cnf

### yona 설치 파일 다운로드 및 압축 해제   
RUN wget https://github.com/yona-projects/yona/releases/download/v1.4.0/yona-v1.4.0-bin.zip
RUN unzip yona-v1.4.0-bin.zip
RUN mv yona-1.4.0 yona

### DB User 생성 및 권한 설정
ADD db_user.sql /docker-entrypoint-initdb.d/db_user.sql

WORKDIR /yona

EXPOSE 9000
```

{% endcode %}

{% file src="/files/-MfKkYqOrgIAj1tMSJH7" %}

### 4.4 DockerFile Build 하기   &#x20;

{% code title="dockerfile 을 build 하여 docker image 만들기" %}

```
$ docker build -t tomcat_mariadb:yona-v.1.4.0 .
[+] Building 0.2s (15/15) FINISHED
 => [internal] load build definition from Dockerfile                                                                      0.0s
 => => transferring dockerfile: 552B                                                                                      0.0s
 => [internal] load .dockerignore                                                                                         0.0s
 => => transferring context: 2B                                                                                           0.0s
 => [internal] load metadata for docker.io/library/mariadb:10.3                                                           0.0s
 => [ 1/10] FROM docker.io/library/mariadb:10.3                                                                           0.0s
 => [internal] load build context                                                                                         0.0s
 => => transferring context: 59B                                                                                          0.0s
 => CACHED [ 2/10] RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime && echo Asia/Seoul > /etc/timezone           0.0s
 => CACHED [ 3/10] RUN apt update && apt -y install git vim wget openjdk-8-jdk unzip                                      0.0s
 => CACHED [ 4/10] RUN mkdir /yona-data                                                                                   0.0s
 => CACHED [ 5/10] COPY my.cnf /etc/mysql/my.cnf                                                                          0.0s
 => CACHED [ 6/10] RUN wget https://github.com/yona-projects/yona/releases/download/v1.4.0/yona-v1.4.0-bin.zip            0.0s
 => CACHED [ 7/10] RUN unzip yona-v1.4.0-bin.zip                                                                          0.0s
 => CACHED [ 8/10] RUN mv yona-1.4.0 yona                                                                                 0.0s
 => CACHED [ 9/10] ADD db_user.sql /docker-entrypoint-initdb.d/db_user.sql                                                0.0s
 => CACHED [10/10] WORKDIR /yona                                                                                          0.0s
 => exporting to image                                                                                                    0.1s
 => => exporting layers                                                                                                   0.0s
 => => writing image sha256:66a6be3fde0d4a31fdbe18a57a2283e75cb858f16e3edf929295ae141d220c80                              0.0s
 => => naming to docker.io/library/tomcat_mariadb:yona-v.1.4.0                                                                      0.0s
Authenticating with existing credentials...
Login Succeeded
```

{% endcode %}

### 4.5 Build Image 를 이용하여 실행 해 보기   &#x20;

```
### Local docker images 검색   
$ docker images | findstr yona
bchwang/tomcat_mariadb                          yona-v.1.4.0          66a6be3fde0d   16 hours ago    1.24GB

### docker 실행하기 
$ docker run -d -p 80:900 tomcat_mariadb:yona-v.1.4.0
3d3811e3e7635545f0875e28f15cf79e128855b9c07ed07e0d59f8cd73bd58e3

### 실행된 docker 확인 
$ docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED                  STATUS         PORTS                                             NAMES
3d3811e3e763   yona-project:yona   "docker-entrypoint.s…"   Less than a second ago   Up 3 seconds   3306/tcp, 0.0.0.0:80->9000/tcp, :::80->9000/tcp   determined_moore

### 실행된 Container 에 접속 하기     
$ docker exec -it 3d3811e3e763 /bin/bash
root@3d3811e3e763:/yona/bin# ls
yona  yona.bat

### 실행된 Container 에 접속 하여 yona 실행 하기       
root@3d3811e3e763:/yona/bin# ./yona     ## ./yona & [백그라운드 실행]
Play server process ID is 213
[info] play - database [default] connected at jdbc:mysql://127.0.0.1:3306/yona
[info] play - Starting application default Akka system.
[debug] application - Registered AuthProvider 'google'
[debug] application - Registered AuthProvider 'github'
[info] play - Application started (Prod)
[info] application - User uploaded temporary files are cleaned up...(0 of 0)
[info] play - Listening for HTTP on /0.0.0.0:9000
```

## 5. Docker Hub 에 이미지 업로드  &#x20;

### 5.1 Docker push 를 이용하여 업로드 &#x20;

{% code title="docker push 를 이용하여 업로드" %}

```
### docker image tag 설정 
$ docker tag tomcat_mariadb:yona-v.1.4.0 bchwang/tomcat_mariadb:yona-v.1.4.0

### docker push 를 이용하여 업로드    
$ docker push bchwang/tomcat_mariadb:yona-v.1.4.0
The push refers to repository [docker.io/bchwang/tomcat_mariadb]
5f70bf18a086: Layer already exists
6921f1ef6bdd: Layer already exists
4679a8f17301: Pushed
b9bd63f53b44: Pushed
2834b665eb52: Pushed
e69d19316294: Layer already exists
3bff3ec352d8: Layer already exists
e9cf36b34289: Pushed
c4c2468cd25c: Layer already exists
791a7442f3ff: Layer already exists
19c8780ee26f: Layer already exists
4b9f2147a623: Layer already exists
337e89027ad2: Layer already exists
956b4f80a078: Layer already exists
df8b8ee18301: Layer already exists
7e50f83cc60c: Layer already exists
b98c96f5ae6b: Layer already exists
b699e149afa6: Layer already exists
0552d4cbc6e9: Layer already exists
a70daca533d0: Layer already exists
yona-v.1.4.0: digest: sha256:95eb1ac4fe0f6221aa008429cdd4e1da1003d364ad11695ad1feaa10f91e3564 size: 4504
```

{% endcode %}

### 5.2 Docker hub 에 접속 하여 업로드 된 이미지 확인

![그림. Docker Hub 사이트 접속 화면](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MfM8jkbCv80ZSP8cA4H%2F-MfMF7vwQ7rO6R5suVvP%2Fimage.png?alt=media\&token=ebfafaa6-5ba5-4a79-8610-8e646ad266f5)

## 6. Yona-Project 실행 하기  &#x20;

### 6.1 Docker-Compose.yml 설정 하기      &#x20;

{% code title="docker-compose.yml 파일" %}

```
version: '3.1'

services:

  yona:
    image: bchwang/tomcat_mariadb:yona-v.1.4.0
    restart: always
    ports:
      - 80:9000
```

{% endcode %}

{% file src="/files/-MfVCYs6J4r3sg2WTpoW" %}

### 6.2 웹 접속 하여 Admin 설정 하기    &#x20;

> 크롬을 통해 웹사이트에 접속 하여 Admin 의 비밀번호를 설정 한 후 다시 한번 yona 를 재시작 하고 Admin 으로 로그인 하고 사용 하면 됩니다.   &#x20;

```
### docker-compose.yml 실행   
$ docker-compose up -d
Starting yona_redmine_1 ... done

### 실행된 docker 확인 
$ docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED                  STATUS         PORTS                                             NAMES
3d3811e3e763   yona-project:yona   "docker-entrypoint.s…"   Less than a second ago   Up 3 seconds   3306/tcp, 0.0.0.0:80->9000/tcp, :::80->9000/tcp   determined_moore

### 실행된 Container 에 접속 하기     
$ docker exec -it 3d3811e3e763 /bin/bash
root@3d3811e3e763:/yona/bin# ls
yona  yona.bat

### 초 yona 실행 하기       
root@3d3811e3e763:/yona/bin# ./yona     ## ./yona & [백그라운드 실행]
Play server process ID is 213
[info] play - database [default] connected at jdbc:mysql://127.0.0.1:3306/yona
[info] play - Starting application default Akka system.
[debug] application - Registered AuthProvider 'google'
[debug] application - Registered AuthProvider 'github'
[info] play - Application started (Prod)
[info] application - User uploaded temporary files are cleaned up...(0 of 0)
[info] play - Listening for HTTP on /0.0.0.0:9000

### Admin 비밀번호 번경 후 yona 재시작 하기    
root@3d3811e3e763:/yona/bin# ./yona     ## ./yona & [백그라운드 실행]
Play server process ID is 213
[info] play - database [default] connected at jdbc:mysql://127.0.0.1:3306/yona
[info] play - Starting application default Akka system.
[debug] application - Registered AuthProvider 'google'
[debug] application - Registered AuthProvider 'github'
[info] play - Application started (Prod)
[info] application - User uploaded temporary files are cleaned up...(0 of 0)
[info] play - Listening for HTTP on /0.0.0.0:9000
```

![그림. 초기 접속 후 Admin 접속 정보 변경 후 yona 재시작 필요     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MfKpJ8UluoB_nYzR93y%2F-MfM8bXpDILe6azju7qu%2Fimage.png?alt=media\&token=f73c918f-1208-4ae8-ae3a-8bcdbde12d09)

![그림. Admin 설정 후 yona 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-MfVAK3yRAEu6r5r6C0R%2F-MfVBcbce-_RLfuPxKnk%2Fimage.png?alt=media\&token=3b5938d8-d9f1-481b-90c1-c1f0670bfe7d)

## 7. Yona-Project 에서 yona 설치 방법   &#x20;

> Yona 는 다음과 같은 2단계로 설치를 진행 합니다.

### 7.1 MariaDB 설치    &#x20;

> 자세한 사항은 홈페이지를 참고 하시기 바랍니다. [바로가기](https://github.com/yona-projects/yona/blob/next/docs/ko/install-mariadb.md)      &#x20;

### 7.2 Yona 설치  &#x20;

> 자세한 사항은 홈페이지를 참고 하시기 바랍니다. [바로가기](https://github.com/yona-projects/yona/blob/next/docs/ko/install-yona-server.md)    &#x20;

## 8 . 그 밖의 사항(Yona 실행 및 업그레이드/백업 및 복구/문제 해결)

> 그 밖에 사항에 대해서는 홈페이지를 참고 하시기 바랍니다. [바로가기](https://github.com/yona-projects/yona#yona-%EC%8B%A4%ED%96%89-%EB%B0%8F-%EC%97%85%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%9C%EB%B0%B1%EC%97%85-%EB%B0%8F-%EB%B3%B5%EA%B5%AC%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0)        &#x20;

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


# Docker-Compse 를 이용하여 Rocket.Chat 사용하기

Rocket.Chat 오픈 소스 사용하기(feat. hubot 사용하기)

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1.  Rocket.Chat 이란 무엇인가?

> [Rocket.Chat](https://rocket.chat/) 은 데이터 보호 수준이 높은 조직을 위해 JavaScript로 개발된 완전 맞춤형 오픈 소스 커뮤니케이션 플랫폼입니다.
>
> We are a MERN based application enabling real-time conversations between colleagues, with other companies or with your customers, regardless of how they connect with you. The result is an increase in productivity and customer satisfaction rates.
>
> Every day, tens of millions of users in over 150 countries and in organizations such as Deutsche Bahn, The US Navy, and Credit Suisse trust [Rocket.Chat](https://rocket.chat/) to keep their communications completely private and secure.
>
> * [Review product documentation](https://docs.rocket.chat/)
> * [Review developer documentation](https://developer.rocket.chat/)

## 2. Rocket.Chat 의 주요기능은?   &#x20;

> * 강력하고 유연한 커뮤니티케이션 도구&#x20;
> * 간편한 파일 공유, 제공 드래그 앤 드롭 지원.
> * 오디오 파일 공유&#x20;
> * 화상 채팅 지원       &#x20;
> * 별도의 채널 (공개, 비공개 옵션 지원)   &#x20;
> * 종단 간 암호화 지원    &#x20;
> * 무제한 메시지 기록 *(자체 관리 구성을 위한 서버 스토리지에 따라 다름.)* &#x20;
> * RSS 통합
> * 타사 응용 프로그램과 호&#x20;
> * 푸시 알람 지원
> * LiveChat 지원
> * 연중 무휴 24시간 지원
> * 다중 플랫폼 지원(Windows, macOS, Android, iOS 및 Gnu/Linux)      &#x20;
> * 게스트 엑세스      &#x20;

## 3. Rocket.Chat 라이센스는?  &#x20;

### **3-1 Paid help**

> Pay for support - [Pricing](https://rocket.chat/pricing)
>
> Email: <support@rocket.chat>

### **3-2 Seek free help**

> Patiently wait for a volunteer to consider helping you.&#x20;
>
> If you opt for community's help instead of paid support, please notice that:
>
> * Most people in the chat are volunteers who will try and help for free
> * Volunteers do this in their spare time and are not getting paid for this. Please respect them.
> * Just because it is urgent for **you** does mean that it is urgent for **them**
> * Please answer their questions patiently and help them try and understand your problem
> * Being rude to them will not help you at all
> * Please note that posting the same question in several channels will not help you
> * Please do **not** DM anyone unless you know them, or they DM you first
> * Please do **not** randomly use *@ people* or *@all*  hoping to get attention
> * Abuse of these things will **not** get any help but can get you muted, blocked, or banned.
> * Don't open a bug yet. When you ask in the channels or forums then devs or other community helpers will tell you if you really need to open an issue. Frequently if there really is a problem you won't be the first one to experience it, so always check github carefully for duplicates. Use lots of different search terms and make sure you check closed Issues as well (see below).
> * Do not ask the same question in multiple channels.  Use the channel (from mentioned) that you think is most relevant to your issues. [Support](https://open.rocket.chat/channel/support), [React-Native](https://open.rocket.chat/channel/react-native), [Ubuntu Snap](https://open.roocket.chat/channel/ubuntu-snap),[Raspberry Pi](https://open.rocket.chat/channel/raspberrypi), [Omnichannel](https://open.rocket.chat/channel/omnichannel), [Desktop](https://open.rocket.chat/channel/desktop), [Federation](https://open.rocket.chat/channel/federation)

## 4. **rocket.chat 공식 사이트**

> Rocket.Chat 공식 사이트 :  [`https://rocket.chat/`](https://rocket.chat/)&#x20;
>
> Rocket.Chat developer 공식 사이트 : [`https://developer.rocket.chat/`](https://developer.rocket.chat/)&#x20;
>
> Rocket.Chat Document 공식사이트 : [`https://docs.rocket.chat/`](https://docs.rocket.chat/) &#x20;

## 5. docker-compose.yml 다운로드 및 파일 내용     &#x20;

### 5.1 Rocket.Chat 사이트에서 docker-compose.yml 다운로드 경로  &#x20;

```
curl -L https://go.rocket.chat/i/docker-compose.yml -O
```

### 5.2 docker-compose.yml 파일 내용

```
version: '2'

services:
  rocketchat:
    image: registry.rocket.chat/rocketchat/rocket.chat:latest
    command: >
      bash -c
        "for i in `seq 1 30`; do
          node main.js &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"
    restart: unless-stopped
    volumes:
      - ./uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=http://localhost:3000
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - REG_TOKEN=${REG_TOKEN}
#       - MAIL_URL=smtp://smtp.email
#       - HTTP_PROXY=http://proxy.domain.com
#       - HTTPS_PROXY=http://proxy.domain.com
    depends_on:
      - mongo
    ports:
      - 3000:3000
    labels:
      - "traefik.backend=rocketchat"
      - "traefik.frontend.rule=Host: your.domain.tld"

  mongo:
    image: mongo:4.0
    restart: unless-stopped
    volumes:
     - ./data/db:/data/db
     #- ./data/dump:/dump
    command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
    labels:
      - "traefik.enable=false"

  # this container's job is just run the command to initialize the replica set.
  # it will run the command and remove himself (it will not stay running)
  mongo-init-replica:
    image: mongo:4.0
    command: >
      bash -c
        "for i in `seq 1 30`; do
          mongo mongo/rocketchat --eval \"
            rs.initiate({
              _id: 'rs0',
              members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"
    depends_on:
      - mongo

  # hubot, the popular chatbot (add the bot user first and change the password before starting this image)
  hubot:
    image: rocketchat/hubot-rocketchat:latest
    restart: unless-stopped
    environment:
      - ROCKETCHAT_URL=rocketchat:3000
      - ROCKETCHAT_ROOM=GENERAL
      - ROCKETCHAT_USER=bot
      - ROCKETCHAT_PASSWORD=botpassword
      - BOT_NAME=bot
  # you can add more scripts as you'd like here, they need to be installable by npm
      - EXTERNAL_SCRIPTS=hubot-help,hubot-seen,hubot-links,hubot-diagnostics
    depends_on:
      - rocketchat
    labels:
      - "traefik.enable=false"
    volumes:
      - ./scripts:/home/hubot/scripts
  # this is used to expose the hubot port for notifications on the host on port 3001, e.g. for hubot-jenkins-notifier
    ports:
      - 3001:8080

  #traefik:
  #  image: traefik:latest
  #  restart: unless-stopped
  #  command: >
  #    traefik
  #     --docker
  #     --acme=true
  #     --acme.domains='your.domain.tld'
  #     --acme.email='your@email.tld'
  #     --acme.entrypoint=https
  #     --acme.storagefile=acme.json
  #     --defaultentrypoints=http
  #     --defaultentrypoints=https
  #     --entryPoints='Name:http Address::80 Redirect.EntryPoint:https'
  #     --entryPoints='Name:https Address::443 TLS.Certificates:'
  #  ports:
  #    - 80:80
  #    - 443:443
  #  volumes:
  #    - /var/run/docker.sock:/var/run/docker.sock
```

{% file src="/files/Lpjoq6mt7f3i2hqnYMie" %}
Rocket.Chat docker-compose.yml
{% endfile %}

## 6. Docker-Compose 실행 방법 및 상태 확인    &#x20;

### 6.1 docker-compose 실행 방법 &#x20;

```
# docker-compose.exe up -d
[+] Running 3/5
 - Network rocket-chat_default                 Created          0.1s
 - Container rocket-chat_mongo_1               Started          4.3s
 - Container rocket-chat_mongo-init-replica_1  Started          5.5s
 - Container rocket-chat_hubot_1               Starting         5.7s
 - Container rocket-chat_rocketchat_1          Starting         5.7s
```

{% hint style="warning" %} <mark style="color:red;">**docker-compse up -d 로 실행하였을때 hubot instance 는 실행 되지 않는다!!!!!!**</mark>  &#x20;

Web Site 에 접속 하여 Bot 계정을 활성화 해야 함. [#8.-hubot](#8.-hubot "mention")  &#x20;
{% endhint %}

### 6.2 Containers 동작 방식 &#x20;

> 1. `MongDB` 서비스를 시작함.
> 2. `mongo-init-replica` 가 실행되고 `MongDB` 연결하고 초기화하며 자체적으로 종료 됨.
> 3. `mongo-init-replica` 가 정상 종료 된 후 `rocketchat` 서비스가 동작 함.&#x20;
> 4. `hubot` 은 instance 는 시작 되지 않으며 추가 작업이 필요 함.(추가 설정이 필요 함)      &#x20;
>    * MongDB 에서 계정을 생성 하여야 함.
>    * rocketchat 에 연결 하여 bot 계정 생성 하여야  함. &#x20;
>    * hubot instance 에 접속 하여 hubot Install and setting 을 진행 하여야 함.    &#x20;
> 5. hubot instance 를 재시작 함.
> 6. instance log 를 보며 상태를 확인 함.  &#x20;

### 6.3 docker ps 현황         &#x20;

```
# docker ps
CONTAINER ID   IMAGE                                                COMMAND                  CREATED         STATUS                         PORTS                    NAMES
7898b753a665   rocketchat/hubot-rocketchat:latest                   "/bin/sh -c 'node -e…"   2 minutes ago   Restarting (1) 2 seconds ago                            rocket-chat_hubot_1
e8e8d1aca084   registry.rocket.chat/rocketchat/rocket.chat:latest   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes                   0.0.0.0:3000->3000/tcp   rocket-chat_rocketchat_1
fbfc4a77b6b1   mongo:4.0                                            "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes                   27017/tcp                rocket-chat_mongo_1
```

{% hint style="info" %}
mongo-init-replica 의 Instance 는 정상 동작 후 사라진다.     &#x20;
{% endhint %}

### 6.4 Rocket.Chat 접속 화면&#x20;

![Rocat.Chat 접속 화면 ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FybpexOfuaXdB2Qt69yaj%2Fimage.png?alt=media\&token=2a0586d0-f909-4302-a673-3ae615d1d299)

### 6.5 docker-compose 폴더 설명 &#x20;

| 폴더                  | 파일                 | 설명                          |
| ------------------- | ------------------ | --------------------------- |
| rocket.chat         |                    |                             |
|                     | docker-compose.yml | docker-compose 실행 파일        |
| rocket.chat/data    |                    | mongodb data folder 및 files |
| rocket.chat/scripts |                    | robot scripts files         |
| rocket.chat/uploads |                    | uploads files               |

## 7. Rocket.Chat 세부 설정

{% hint style="info" %}
4.5 에서 docker-compose up -d 에서 실행 하면 rocket.chat 은 접속이 가능하나 hubot 이 정상 동작하지 않음.  &#x20;

이를 해결 하기 위해 와 같은 작업이 필요.  [#8.-hubot](#8.-hubot "mention")         &#x20;
{% endhint %}

### 7.1 처음 해야 할 사항.  &#x20;

#### 7.1.1. mongodb 로그 상태를 확인   &#x20;

```
# docker logs -f 1e4e0fb4f37a
2022-01-10T04:57:16.556+0000 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=1e4e0fb4f37a
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten] db version v4.0.27
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten] git version: d47b151b55f286546e7c7c98888ae0577856ca20
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten] modules: none
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten] build environment:
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten]     distmod: ubuntu1604
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten]     distarch: x86_64
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten]     target_arch: x86_64
2022-01-10T04:57:16.560+0000 I CONTROL  [initandlisten] options: { net: { bindIpAll: true }, replication: { oplogSizeMB: 128, replSet: "rs0" }, storage: { engine: "mmapv1", mmapv1: { smallFiles: true } } }
2022-01-10T04:57:16.577+0000 I STORAGE  [initandlisten]
2022-01-10T04:57:16.578+0000 I STORAGE  [initandlisten] ** WARNING: You have explicitly specified 'MMAPV1' storage engine in your
2022-01-10T04:57:16.578+0000 I STORAGE  [initandlisten] **          config file or as a command line option.  Support for the MMAPV1
2022-01-10T04:57:16.578+0000 I STORAGE  [initandlisten] **          storage engine has been deprecated and will be removed in
2022-01-10T04:57:16.578+0000 I STORAGE  [initandlisten] **          version 4.2. See http://dochub.mongodb.org/core/deprecated-mmapv1

## 생략 ## 

2022-01-10T04:58:25.040+0000 I INDEX    [conn23] build index on: rocketchat.rocketchat_avatars.files properties: { v: 2, key: { filename: 1, uploadDate: 1 }, name: "filename_1_uploadDate_1", ns: "rocketchat.rocketchat_avatars.files", background: false }
2022-01-10T04:58:25.040+0000 I INDEX    [conn23]         building index using bulk method; build may temporarily use up to 500 megabytes of RAM
2022-01-10T04:58:25.040+0000 I INDEX    [conn23] build index done.  scanned 0 total records. 0 secs
2022-01-10T04:58:25.046+0000 I STORAGE  [conn16] createCollection: rocketchat.rocketchat_avatars.chunks with generated UUID: 1744e3df-1e18-4b1d-bf0f-08a73f29ec22
2022-01-10T04:58:25.059+0000 I INDEX    [conn16] build index on: rocketchat.rocketchat_avatars.chunks properties: { v: 2, unique: true, key: { files_id: 1, n: 1 }, name: "files_id_1_n_1", ns: "rocketchat.rocketchat_avatars.chunks", background: false }
2022-01-10T04:58:25.059+0000 I INDEX    [conn16]         building index using bulk method; build may temporarily use up to 500 megabytes of RAM
2022-01-10T04:58:25.059+0000 I INDEX    [conn16] build index done.  scanned 0 total records. 0 secs
```

7.1.2 Rocket.Chat 로그 확인    &#x20;

```
# docker logs -f 4345bb3a319b
LocalStore: store created at
LocalStore: store created at
LocalStore: store created at
{"level":51,"time":"2022-01-10T05:15:12.246Z","pid":10,"hostname":"66324712c034","name":"Migrations","msg":"Not migrating, already at version 249"}
ufs: temp directory created at "/tmp/ufs"
Loaded the Apps Framework and loaded a total of 0 Apps!
+----------------------------------------------+
|                SERVER RUNNING                |
+----------------------------------------------+
|                                              |
|  Rocket.Chat Version: 4.2.2                  |
|       NodeJS Version: 12.22.1 - x64          |
|      MongoDB Version: 4.0.27                 |
|       MongoDB Engine: mmapv1                 |
|             Platform: linux                  |
|         Process Port: 3000                   |
|             Site URL: http://localhost:3000  |
|     ReplicaSet OpLog: Enabled                |
|          Commit Hash: ab3baf2f31             |
|        Commit Branch: HEAD                   |
|                                              |
+----------------------------------------------+
+----------------------------------------------------------------------+
|                              DEPRECATION                             |
+----------------------------------------------------------------------+
|                                                                      |
|  YOUR CURRENT MONGODB VERSION (4.0.27) IS DEPRECATED.                |
|  IT WILL NOT BE SUPPORTED ON ROCKET.CHAT VERSION 5.0.0 AND GREATER,  |
|  PLEASE UPGRADE MONGODB TO VERSION 4.2 OR GREATER                    |
|                                                                      |
+----------------------------------------------------------------------+
```

#### 7.1.3 Hubot 로그 확인   &#x20;

```
npm info it worked if it ends with ok
npm info using npm@2.15.11
npm info using node@v4.8.3
npm info package.json hubot-scripts@2.17.2 No license field.
npm info addNameTag [ 'hubot-seen', 'latest' ]
npm info addNameTag [ 'hubot-links', 'latest' ]
npm info attempt registry request try #1 at 5:51:26 AM
npm http request GET https://registry.npmjs.org/hubot-help
npm info attempt registry request try #1 at 5:51:26 AM
npm http request GET https://registry.npmjs.org/hubot-diagnostics

## 생략 ## 

hubot-seen@2.0.0 node_modules/hubot-seen
└── timeago.js@4.0.2
npm info ok
npm info it worked if it ends with ok
npm info using npm@2.15.11
npm info using node@v4.8.3
npm info preinstall rocketbot@0.0.0
npm info package.json hubot-scripts@2.17.2 No license field.
npm info build /home/hubot
npm info linkStuff rocketbot@0.0.0
npm info build /home/hubot/node_modules/hubot-links
npm info preinstall hubot-links@0.0.1
npm info linkStuff hubot-links@0.0.1
npm info install hubot-links@0.0.1
npm info postinstall hubot-links@0.0.1
npm info build /home/hubot/node_modules/hubot-rocketchat
npm info preinstall hubot-rocketchat@1.0.11
npm info linkStuff hubot-rocketchat@1.0.11
npm info install hubot-rocketchat@1.0.11
npm info postinstall hubot-rocketchat@1.0.11
npm info build /home/hubot/node_modules/hubot-seen
npm info preinstall hubot-seen@2.0.0
npm info linkStuff hubot-seen@2.0.0
npm info install hubot-seen@2.0.0
npm info postinstall hubot-seen@2.0.0
npm info install rocketbot@0.0.0
npm info postinstall rocketbot@0.0.0
npm info prepublish rocketbot@0.0.0
npm info ok
[Mon Jan 10 2022 05:52:35 GMT+0000 (UTC)] INFO Starting Rocketchat adapter version 1.0.11...
[Mon Jan 10 2022 05:52:35 GMT+0000 (UTC)] INFO Once connected to rooms I will respond to the name: bot
[Mon Jan 10 2022 05:52:35 GMT+0000 (UTC)] INFO Connecting To: rocketchat:3000
[Mon Jan 10 2022 05:52:35 GMT+0000 (UTC)] INFO Successfully connected!
[Mon Jan 10 2022 05:52:35 GMT+0000 (UTC)] INFO GENERAL
[Mon Jan 10 2022 05:52:35 GMT+0000 (UTC)] INFO Logging In
[Mon Jan 10 2022 05:52:35 GMT+0000 (UTC)] ERROR Unable to Login: {"isClientSafe":true,"error":403,"reason":"User not found","message":"User not found [403]","errorType":"Meteor.Error"} Reason: User not found
[Mon Jan 10 2022 05:52:35 GMT+0000 (UTC)] ERROR If joining GENERAL please make sure its using all caps.
[Mon Jan 10 2022 05:52:35 GMT+0000 (UTC)] ERROR If using LDAP, turn off LDAP, and turn on general user registration with email verification off.
```

{% hint style="danger" %}
로그를 확인 해 보니  "<mark style="color:red;">ERROR Unable to Login: {"isClientSafe":true,"error":403,"reason":"User not found","message":"User not found \[403]","errorType":"Meteor.Error"} Reason: User not found</mark>" 의 상태가 발생 됨.

Bot 계정을 만들지 않아서 생기는 ERROR. [#8.-hubot](#8.-hubot "mention")      &#x20;
{% endhint %}

### 7.2 Rocket.Chat Web Site 확인    &#x20;

#### 7.2.1 Rocket.Chat 접속 및 설정 하기 &#x20;

![Rocket.Chat 접속 화면](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FyRLts4qSl5uZQpK7LWIi%2Fimage.png?alt=media\&token=c553ba9c-3560-4078-a0cc-7e786e0570c7)

![Rocket.Chat 조직 정보 등록](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FatCvMq3FJGFmBnZqid7D%2Fimage.png?alt=media\&token=32bedded-607d-44c4-a4a9-368783a8c719)

![Rocket.Chat 서버 정보  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FDJyHFb2KUTiLhZYMoVhZ%2Fimage.png?alt=media\&token=5d3a7ced-44bf-4af8-b337-e03803f9530e)

![Rocket.Chat 서버 등록](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FF9P6uiDSLuBNl3pvV33F%2Fimage.png?alt=media\&token=c772b7b7-c090-4173-a9d2-38b206aaacda)

![Rocket.Chat 설정 후 로인 된 화면](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FJR8EN5qpGvt5z86uMbNL%2Fimage.png?alt=media\&token=d54031f8-18e5-4a2d-b405-518c29d8464f)

## 8. Hubot 설정 및 확인   &#x20;

### 8.1 docker-compose.yml 설정 확인&#x20;

```
  ### 생략 ### 
  
  hubot:
    image: rocketchat/hubot-rocketchat:latest
    restart: unless-stopped
    environment:
      - ROCKETCHAT_URL=rocketchat:3000         # Web 접속 Port 
      - ROCKETCHAT_ROOM=GENERAL                # GENERAL 에서 활성화    
      - ROCKETCHAT_USER=bot                    # Bot 계정  
      - ROCKETCHAT_PASSWORD=botpassword        # Bot 비밀번호    
      - BOT_NAME=bot                           # Bot Name 정보    
```

### 8.2 Rocket.Chat 에 Bot 계정 추가      &#x20;

#### 8.2.1 Rocket.Chat 계정 관리    &#x20;

![Rocket.Chat 계정 관리](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F7v5bX8K8C5knE5suITiH%2Fimage.png?alt=media\&token=b952b055-8f0f-499d-bf6e-97fa1278182a)

#### 8.2.2 Rocket.Chat Bot 계정 추가 &#x20;

> docker-compose.yml 에 설정한 Bot 의 이름과 비밀번호, 닉네임을 사용자 계정에 추가 (참고: [6.1](#6.1-docker-compose.yml))   &#x20;

![Rocket.Chat Bot 계정 추가](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FaHLEtQ9e4Jyguqk6eST2%2Fimage.png?alt=media\&token=2830caf0-caf4-408e-bd2c-5b5bce3bb8f4)

![Rocket.Chat bot help](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Fdc5jVRN6lb3sKjqJLuVL%2Fimage.png?alt=media\&token=e734ef97-a084-4e14-b926-3db0f082084a)

## 9. Hubot 사용해 보기 &#x20;

### 9.1 Hubot-diagnostics 기능   &#x20;

> * hubot ping - Reply with pong
> * hubot adapter - Reply with the adapter
> * hubot echo - Reply back with
> * hubot time - Reply with current time

### 9.2 external-scripts.json 파일 &#x20;

```
# ls
Procfile  README.md  bin  external-scripts.json  hubot-scripts.json  node_modules  package.json  scripts

# cat external-scripts.json
["hubot-help","hubot-seen","hubot-links","hubot-diagnostics"]
```

### 9.3 답변 추가 하기 &#x20;

#### 9.3.1 diagnostics.coffee 에 답변 추가   &#x20;

{% code title="/src/diagnostics.coffee" %}

```
# Description
#   hubot scripts for diagnosing hubot
#
# Commands:
#   hubot ping - Reply with pong
#   hubot adapter - Reply with the adapter
#   hubot echo <text> - Reply back with <text>
#   hubot time - Reply with current time
#
# Author:
#   Josh Nichols <technicalpickles@github.com>

module.exports = (robot) ->
  robot.respond /안녕하세요/i, (msg) ->
    msg.send "반가워요"

  robot.respond /하이/i, (msg) ->
    msg.send "반가워요"

  robot.respond /여기는 뭐 하는 사이트니/i, (msg) ->
    msg.send "여기는 채팅사이트에요"

  robot.respond /" "/i, (msg) ->
    msg.send "놀아주세요"

  robot.respond /"?"/i, (msg) ->
    msg.send "심심해요. 놀아줘요?"

  robot.respond /저기요/i, (msg) ->
    msg.send "네. 저 여기 있어요."

  robot.respond /어딧어/i, (msg) ->
    msg.send "여기 있어요."

  robot.respond /ADAPTER$/i, (msg) ->
    msg.send robot.adapterName

  robot.respond /ECHO (.*)$/i, (msg) ->
    msg.send msg.match[1]

  robot.respond /TIME$/i, (msg) ->
    msg.send "Server time is: #{new Date()}"

```

{% endcode %}

{% file src="/files/7FDo35PGQYlwbdGDubdY" %}
&#x20;\~/node\_modules/hubot-diagnostics/src/diagnostics.coffee
{% endfile %}

### 9.4 Hubot Container Restart

{% hint style="info" %}
diagnostics.coffee 에 내용을 추가 하면 반드시 Container 를 재시작 해 주어야 함.      &#x20;
{% endhint %}

```
# docker ps
CONTAINER ID   IMAGE                                                COMMAND                  CREATED             STATUS             PORTS                    NAMES
dfe211e2ca3c   rocketchat/hubot-rocketchat:latest                   "/bin/sh -c 'node -e…"   About an hour ago   Up 5 minutes       0.0.0.0:3001->8080/tcp   rocket-chat_hubot_1
5492e6042bd2   registry.rocket.chat/rocketchat/rocket.chat:latest   "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:3000->3000/tcp   rocket-chat_rocketchat_1
027d7c934cef   mongo:4.0                                            "docker-entrypoint.s…"   About an hour ago   Up About an hour   27017/tcp                rocket-chat_mongo_1

# docker restart dfe211e2ca3c
```

### 9.5 Hubot Container Logs&#x20;

```
# docker logs -f dfe211e2ca3c

## 생략 ## 

npm info prepublish rocketbot@0.0.0
npm info ok
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Starting Rocketchat adapter version 1.0.11...
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Once connected to rooms I will respond to the name: bot
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Connecting To: rocketchat:3000
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Successfully connected!
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO GENERAL
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Logging In
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Successfully Logged In
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Looking up Room ID for: GENERAL
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Joining Room: GENERAL
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO rid:  [ 'GENERAL' ]
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO All rooms joined.
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Successfully joined room: GENERAL
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Preparing Meteor Subscriptions..
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Subscribing to Room: __my_messages__
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Successfully subscribed to messages
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] INFO Setting up reactive message list...
[Tue Jan 11 2022 05:03:04 GMT+0000 (UTC)] WARNING Loading scripts from hubot-scripts.json is deprecated and will be removed in 3.0 (https://github.com/github/hubot-scripts/issues/1113) in favor of packages for each script.

Your hubot-scripts.json is empty, so you just need to remove it.
```

### 9.6 Rocket.Chat 사이트의 General 에서 Bot 과 대화 하기      &#x20;

![hubot-diagnostics 사용  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FbMxIBIXtOYC0mvhOE2gU%2Fimage.png?alt=media\&token=430853d2-1647-4588-a5f1-bc0acb09484e)

## 00. 오류 해결하기&#x20;

### 00.1 REG\_TOKEN Warring 발생 &#x20;

#### 00.1.1 level=warning msg="The \\"REG\_TOKEN\\" variable is not set. Defaulting to a blank string." 발생&#x20;

#### 00.1.2 level=warning msg="Found orphan containers (\[rocket-chat\_bot\_rasa\_1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up."

```
# docker-compose.exe up -d
time="2022-01-10T13:57:10+09:00" level=warning msg="The \"REG_TOKEN\" variable is not set. Defaulting to a blank string."
time="2022-01-10T13:57:11+09:00" level=warning msg="Found orphan containers ([rocket-chat_bot_rasa_1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up."
```

#### 00.1.1-2 해결 방안   &#x20;

> docker-compose.yml 에서 아래의 설정을 주석 처리 하여 다시 실행.
>
> &#x20; `#  - REG_TOKEN=${REG_TOKEN}`

### 00.2 hubot ERROR Unable to Login

#### 00.2.1 ERROR Unable to Login: {"isClientSafe":true,"error":403,"reason":"User not found","message":"User not found \[403]","errorType":"Meteor.Error"} Reason: User not found

#### 00.2.1 해결 방안&#x20;

> Rocket.Chat 에서 Bot 계정을 추가 하지 않아 발생한 문제임.
>
> [#8.-hubot](#8.-hubot "mention") 을 참고 하시기 바랍니다.  &#x20;

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


# \[DataUs] Open Data Quality - 공공데이터 품질 개선 도구 to GitHub

Open Data Quality\[ODQ] 공공데이터 품질 개선 도구

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. 먼저 알아두기   &#x20;

### 1.1 공공데이터란 무엇인가?&#x20;

> 데이터베이스, 전자화된 파일 등 공공기관이 법령 등에서 정하는 목적을 위하여 생성 또는 취득하여 관리하고 있는 광(光) 또는 전자적 방식으로 처리된 자료 또는 정보로서 다음과 같은 것을 지칭한다. 첫째, 「전자정부법」에 따른 행정정보, 둘째, 「국가정보화 기본법」에 따른 정보 중 공공기관이 생산한 정보, 셋째, 「공공기록물 관리에 관한 법률」에 따른 전자기록물 중 대통령령으로 정하는 전자기록물, 그 밖에 대통령령으로 정하는 자료 또는 정보가 있다. 따라서, 공공데이터는 개별 공공기관이 일상적 업무수행의 결과물로 생성 또는 수집‧취득한 다양한 형태(텍스트, 수치, 이미지, 동영상, 오디오 등)의 모든 자료 또는 정보를 대상으로 하며, "기계 판독이 가능한 형태"로 "제공"이되어야 한다. 여기서 "기계 판독이 가능한 형태"란 소프트웨어로 데이터의 개별 내용 또는 내부 구조를 확인하거나 수정, 변환, 추출 등 가공할 수 있는 상태를 말하며, "제공" 이란 공공기관이 이용자로 하여금 기계 판독이 가능한 형태의 공공데이터에 접근할 수 있게 하거나 이를 다양한 방식으로 전달하는 것을 말한다.\[1]
>
> 정부는 보유한 공공 정보를 적극적으로 개방하여 국민과 공유함으로써 소통과 협력을 확대하기 위해 공공데이터 정책을 추진하게 되었고, 2013년 7월 공공데이터의 제공 및 이용활성화에 관한 법률(약칭 : 공공데이터법)을 제정하고 10월부터 시행 되었다.\[2]
>
> 공공데이터 제공 및 이용 활성화에 관한 정책은 '행정안전부’가 총괄하며, 이 법률에 근거하여 2013년 11월, 정부나 공공기관이 보유한 공공데이터를 민간에서 쉽게 활용할 수 있도록 지원하기 위하여 한국정보화진흥원에 공공데이터활용지원센터’를 설치 하였다.\[3] 각 공공기관은 공공데이터제공책임관 및 실무자를 지정하고 관련 업무를 지원한다.\[4] 또한 정부는 공공데이터 관련 정책을 심의, 조정 및 그 추진사항을 점검하기 위하여 국무총리실 산하에 공공데이터전략위원회\[5]를 설립하였고, 공공기관의 공공데이터 제공거부 또는 중단문제 발생시 해결을 위한 공공데이터제공분쟁조정위원회\[6]를 설립하여 공공데이터 활성화 정책을 추진하고 있다.(참고 : [wiki](https://ko.wikipedia.org/wiki/%EA%B3%B5%EA%B3%B5_%EB%8D%B0%EC%9D%B4%ED%84%B0))&#x20;

### 1.2 공공데이터 개방

> 공공데이터 개방이란 정부, 지방자치단체 및 공공기관이 보유·관리하는 공공데이터를 이용자가 자유롭게 활용할 수 있도록 다양한 형태로 개방·제공하는 것이다. 대한민국 정부, 지방자치단체 및 공공기관은 공공데이터를 이용자가 자유롭게 활용할 수 있도록 다양한 형태로 개방·제공하고 있다. 단, 개인정보보호, 제3자의 권리(저작권 등)가 포함된 정보, 국가 안보와 질서에 관련한 정보 등 제외된다.
>
> 공공 데이터는 누구나 자유롭게 이용 할 수 있으며 공공데이터포털을 통해 국민이 쉽고 편리하게 공공데이터를 이용할 수 있도록 파일데이터, 오픈API, 시각화 등 다양한 방식으로 제공하고 있으며, 누구라도 쉽고 편리한 검색을 통해 원하는 공공데이터를 빠르고 정확하게 찾을 수 있다. (참고 : [wiki](https://ko.wikipedia.org/wiki/%EA%B3%B5%EA%B3%B5_%EB%8D%B0%EC%9D%B4%ED%84%B0))&#x20;

### 1.3 공공데이터 활용  &#x20;

> 정부는 공공데이터 이용에 대한 국민의 인식을 높이고 이용 활성화를 촉진하기 위하여, 공공데이터 활용 기업의 창업에서부터 성장까지 전과정을 지원한다. 공공데이터 활용 창업 공간인‘ 오픈스퀘어-D’와‘ 공공데이터 활용 창업경진대회’가 그 대표적인 예이다. 오픈스퀘어-D는 공공데이터에 대한 창의적인 아이디어를 가진 사람들이 경험과 기술을 교류하고, 사업화.창업으로 성장할 수 있도록 종합적으로 지원하는 열린공간이다. 오픈스퀘어-D는 창업자들을 위한 입주공간, 아이디어 교류 및 발전을 위한 협업공간, 서비스 개발에 필요한 테스트 및 데이터 분석을 위한 테스트 공간으로 구성되어 있다. 창업단계별 교육, 맞춤형 컨설팅, 투자유치 및 네트워킹 등 다양한 프로그램이 제공된다.‘ 공공데이터 활용 창업경진대회’는 공공데이터를 활용한 아이디어 또는 웹(앱) 제품 및 서비스 개발 아이템을 발굴하는 대회이다. 민간의 창의적인 아이디어를 공공데이터와 융합하여 새로운 비즈니스 모델을 발굴해 공공데이터 기반의 창업촉진 및 창업기업 육성을 목적으로 매년 1회 개최된다. 국민 누구나 참여가 가능하며, 수상자에게는 시상금뿐만 아니라 제품 및 서비스 홍보, 사무공간 지원, 투자유치, 창업컨설팅 등 다양한 혜택이 제공된다. (참고 : [wiki](https://ko.wikipedia.org/wiki/%EA%B3%B5%EA%B3%B5_%EB%8D%B0%EC%9D%B4%ED%84%B0))&#x20;

### 1.4 Open Data Quality(ODQ)란 무엇인가? &#x20;

> OQD는 UTF8-BOM으로 인코딩된 공공데이터 csv파일의 품질 개선 도구입니다.
>
> 데스크탑 크로스 플랫폼 프레임워크인 [Electron](https://www.electronjs.org/)으로 구성되었으며 HTML, CSS, JavaScript로 작성된 SPA입니다. (참고 : [GitHub](https://github.com/dataus-tech/ODQ))&#x20;

### 1.5 국내외 공공데이터 &#x20;

> * 한국 공공데이터 : <http://data.go.kr/>
> * 서울 공공데이터 : <http://data.seoul.go.kr/index.jsp> &#x20;
> * 미국 공공데이터 : <http://www.data.gov/>&#x20;
> * 영국 공공데이터 : <https://data.gov.uk/>&#x20;
> * 일본 공공데이터 : <http://data.go.jp/>  &#x20;

## 2. Open Data Quality(ODQ) 사용법

### 2.1 Open Data Quality(ODQ) 개요&#x20;

![그림. Open Data Quality(ODQ) 개요     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FNZiVwjPqWyFKfvb7sBfo%2Fimage.png?alt=media\&token=8ed5a432-be10-44b3-8136-e96d912e48c0)

### 2.2 Open Data Quality(ODQ) 룰셋 목록 &#x20;

| 명칭             | 설명                                     | 정비 로직                                                                                                                       |
| -------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| **문자열**        | **숫자를 제외한 모든 값 허용**                    | **자동 정비 불가**                                                                                                                |
| **사용자 지정 문자열** | **사용자가 지정한 형식의 문자열만 허용**               | -                                                                                                                           |
| **정수**         | 양의 정수,0,음의정수 값만 허용                     | 숫자를 제외한 모든 문자를 제거                                                                                                           |
| **사용자 지정 숫자**  | 소수점 자릿수, 숫자 길이, 양수 및 음수여부, 0여부         | -                                                                                                                           |
| **여부 (Y,N)**   | Y, N 값만 허용                             | <ol><li>대소문자 구분 없이 아래의 값을 허용 ( 'Y','N','O','X','NULL','false','1','0' )</li><li>Truthy 한 값들은 Y, Falsy한 값들은 N으로 정비</li></ol> |
| **여부값지정**      | **사용자가 지정한 문자열로만 이루어져 있는지 확인**         | -                                                                                                                           |
| **날짜**         | 날짜 양식 설정하여 확인                          | <ol><li>아래의 문자열을 하이픈(-)으로 치환 ( '.' , '/')</li><li>문자열 길이에 맞춰 적잘한 위치에 맞게 하이픈(-) 삽입 20220101 -> 2022-01-01</li></ol>          |
| **코드값지정**      | 입력한 텍스트 목록에 포함되는 값인지 확인                | 자동 정비 불가                                                                                                                    |
| **전화번호**       | 전화번호 - 정규식                             | <ol><li>8자리 숫자 -> XXXX-YYYY</li><li>11자리 숫자 -> 0NZ-XXXX-YYYY</li><li>13자리 숫자 -> 00N-PPP-QQQQQQQ</li></ol>                   |
| **우편번호**       | 우편번호 - 정규식                             | <ol><li>6자리 숫자는 하이픈을 붙임 (-)</li><li>4자리 숫자는, 숫자 앞에 0을 추가 3000 -> 03000</li></ol>                                            |
| **사업자번호**      | 사업자번호 - 정규식                            | 열자리 숫자로 이루어져 있는 값은 하이픈(-)을 삽입 101010001 -> 101-01-0001                                                                      |
| **패턴지정번호**     | **사용자가 지정한 형식의 숫자 및 하이픈으로 구성되 있는지 확인** | 숫자로만 이루어진 값은 하이픈(-)을 삽입                                                                                                     |

### 2.3 Open Data Quality(ODQ) 사용 방법  &#x20;

> 아래와 같은 방법으로 사용 하시면 됩니다. 자세한 사항은 참고 파일을 다운로드 하시기  바랍니다.      (참고 : [사용자 메뉴얼](https://github.com/dataus-tech/odq/wiki/ODQ-%EC%82%AC%EC%9A%A9%EC%9E%90-%EB%A9%94%EB%89%B4%EC%96%BC))     &#x20;

![그림. 파일선택 / 시작행 설정 화면          ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FwHOWqedZgH0NhhJ7td30%2Fimage.png?alt=media\&token=77fea935-d6d4-40d2-af05-005979d0cac1)

![ 그림.  룰셋선택 / 진단시작 화면            ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FKijGhFYzrthJgRsZfajV%2Fimage.png?alt=media\&token=8b4fee92-232b-4ea3-8fce-3332059b3ff7)

![그림. 진단결과 확인 화면           ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F1Eaak4MPIYoUFNWU1aKL%2Fimage.png?alt=media\&token=a25e4cbe-2dde-487f-b520-3f65d9ab42c4)

![그림. 오류 데이터 정비 화면         ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Fm05MU04wo6n4on7klgVN%2Fimage.png?alt=media\&token=4171a772-2e8e-4ef4-bf9f-8eb44b0c9258)

## 3. Open Data Quality(ODQ) 개발 환경 &#x20;

### 3.1 Open Data Quality(ODQ) 시스템 구성  &#x20;

| 패키지 명     | 버전     | 비고                                   |
| --------- | ------ | ------------------------------------ |
| Nginx     | 1.21.6 |                                      |
| Github 소스 | master | <https://github.com/dataus-tech/ODQ> |

### 3.2 Open Data Quality(ODQ) 설치 방법  &#x20;

#### 3.2.1 GitHub 소스 주소&#x20;

> GitHub 소스 주소 : <https://github.com/dataus-tech/ODQ> &#x20;

![그림. GitHub Site      ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FwsBv7t8goZtbyzf8K34T%2Fimage.png?alt=media\&token=5c38945d-4806-41e5-ac9c-258fe396e8f6)

#### 3.2.2 Git Source Clone   &#x20;

{% code title="Git Source Clone" %}

```
# git clone https://github.com/dataus-tech/ODQ.git /usr/share/nginx/html
# ls -alh /usr/share/nginx/html
total 124K
drwxr-xr-x 9 root root 4.0K Mar 15 01:55 .
drwxr-xr-x 1 root root 4.0K Mar 15 02:21 ..
-rw-r--r-- 1 root root  386 Mar 15 01:55 .eslintrc.js
drwxr-xr-x 8 root root 4.0K Mar 15 01:55 .git
-rw-r--r-- 1 root root  138 Mar 15 01:55 .gitignore
-rw-r--r-- 1 root root   29 Mar 15 01:55 .prettierignore
-rw-r--r-- 1 root root  268 Mar 15 01:55 .prettierrc.json
-rw-r--r-- 1 root root 1.2K Mar 15 01:55 README.md
-rw-r--r-- 1 root root  127 Mar 15 01:55 babel.config.json
drwxr-xr-x 2 root root 4.0K Mar 15 01:55 dist
drwxr-xr-x 3 root root 4.0K Mar 15 01:55 electron
-rw-r--r-- 1 root root  41K Mar 15 01:55 gdq-github.log
-rw-r--r-- 1 root root   78 Mar 15 01:55 index.html
-rw-r--r-- 1 root root  365 Mar 15 01:55 jest.config.js
-rw-r--r-- 1 root root 1.9K Mar 15 01:55 package.json
drwxr-xr-x 2 root root 4.0K Mar 15 01:55 public
drwxr-xr-x 9 root root 4.0K Mar 15 01:55 src
drwxr-xr-x 2 root root 4.0K Mar 15 01:55 testFiles
drwxr-xr-x 3 root root 4.0K Mar 15 01:55 tests
-rw-r--r-- 1 root root 2.7K Mar 15 01:55 webpack.config.js
```

{% endcode %}

#### 3.2.3 Nginx Service Start

{% code title="Nginx Service" %}

```
# nginx -g 'daemon on;'
2022/03/15 02:25:53 [notice] 618#618: using the "epoll" event method
2022/03/15 02:25:53 [notice] 618#618: nginx/1.21.6
2022/03/15 02:25:53 [notice] 618#618: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2022/03/15 02:25:53 [notice] 618#618: OS: Linux 5.10.16.3-microsoft-standard-WSL2
2022/03/15 02:25:53 [notice] 618#618: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022/03/15 02:25:53 [notice] 619#619: start worker processes
root@c896fdfd65f0:/usr/share/nginx# 2022/03/15 02:25:53 [notice] 619#619: start worker process 620
2022/03/15 02:25:53 [notice] 619#619: start worker process 621
2022/03/15 02:25:53 [notice] 619#619: start worker process 622
2022/03/15 02:25:53 [notice] 619#619: start worker process 623
```

{% endcode %}

#### 3.2.4 WEB Service 접속 화면   &#x20;

> <http://localhost> 접속 화면  &#x20;

![그림. Localhost 접속 화면       ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FiJPnOVqUO4OcAlQRo8pI%2Fimage.png?alt=media\&token=c5fbb654-845f-47f8-9427-eaad69433ea3)

### 3.3 Open Data Quality(ODQ) 사용 방법  &#x20;

#### 3.3.1 공공데이터 접속 후 CSV 파일 다운로드     &#x20;

> 공공데이터 접속(<https://data.go.kr>) 에서 필요한 공공데이터를 검색 후 CSV 파일을 다운로드 받아서 ODQ 프로그램을 통해 CSV 파일의 데이터 품질 검증 및 개선을 제공 합니다.      &#x20;
>
> "서울교통공사\_서울 도시철도 열차운행시각표" 검색하여 CSV 파일 [(다운로드) ](https://www.data.go.kr/cmm/cmm/fileDownload.do?atchFileId=FILE_000000002504178\&fileDetailSn=1\&dataNm=%EC%84%9C%EC%9A%B8%EA%B5%90%ED%86%B5%EA%B3%B5%EC%82%AC_%EC%84%9C%EC%9A%B8%20%EB%8F%84%EC%8B%9C%EC%B2%A0%EB%8F%84%20%EC%97%B4%EC%B0%A8%EC%9A%B4%ED%96%89%EC%8B%9C%EA%B0%81%ED%91%9C_20211229)&#x20;
>
> 공공데이터 사이트 :    [바로가기](https://www.data.go.kr/data/15098251/fileData.do)          &#x20;

![그림. 서울교통공사 서울 도시철도 열차운행시간표 CSV 다운로드                           ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FsbLXq6vb0w5b3v0SPKN4%2Fimage.png?alt=media\&token=54f81ef8-d13e-4eda-b677-7216956cfab2)

![그림. 다운로드한 공공데이터 CSV 파일              ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FE9Fv0lPfHkDkIRX1hC4o%2Fimage.png?alt=media\&token=a030d922-398e-4c90-82e3-58693f91768b)

![ 그림. ODQ 실행 후 CSV 파일 Loading 화면        ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FTTEjsDDV6WS7Nh17jtu9%2Fimage.png?alt=media\&token=2f327e6b-50ad-4074-ac84-923afe8ec7cb)

![그림.  룰셋 설정 및 진단 화면          ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FphdPL9VLfgO8WQW6gEIs%2Fimage.png?alt=media\&token=5a152680-ac05-4f64-910b-3df61ca02f9d)

![그림. 진단 후 결과 화면(오류 없음)         ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Fm1xjvwKkpBjOAFHJdN4i%2Fimage.png?alt=media\&token=96779bdc-909d-4610-bb01-f5c5360b5f3f)

![그림. 진단 후 결과 화면(오류 검출)          ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2F4qfzq1A7TDYHboESwcm0%2Fimage.png?alt=media\&token=f599d7bb-d57c-40c7-bafe-eac6db9b1ba7)

![그림. 진단 후 정비 화면       ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FHZafT3EfLCiM5IOxplum%2Fimage.png?alt=media\&token=44aeeb31-3de5-445e-8247-fbe246a8857f)

![그림. 정비파일 다운로드 화면              ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FIQMeEeysGCBThwLADghj%2Fimage.png?alt=media\&token=9a8ca2d8-e3f0-4687-bbe1-d8162366f531)

![그림. 진단결과 파일 정비 확인         ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FGWvF7OYL2oHzczgHBc80%2Fimage.png?alt=media\&token=09a0f30d-1769-4591-8d84-becab3be2fe4)

## 3. Open Data Quality(ODQ) 를 docker로 실행 하기   &#x20;

### 3.1 docker 로 실행  &#x20;

```
# docker run -d -p 80:80 bchwang/tomcat_mariadb:nginx-odq1.0
a47483bdd648b67d717e2d848153f77807ec1dd675c2dc17711d8ae390c54fd3
# docker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED          STATUS         PORTS                NAMES
a47483bdd648   bchwang/tomcat_mariadb:nginx-odq   "/docker-entrypoint.…"   11 seconds ago   Up 7 seconds   0.0.0.0:80->80/tcp   nifty_almeida
```

### 3.2 Web Service 화면 &#x20;

![그림. Web Service 접속 화면        ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FiJPnOVqUO4OcAlQRo8pI%2Fimage.png?alt=media\&token=c5fbb654-845f-47f8-9427-eaad69433ea3)

## 000. 그 외의 사항들     &#x20;

### 000.1 공공데이터 CSV 파일을 다운로드 받았는데 ODQ 로 열리지가 않아요.    &#x20;

> OQD는 UTF8-BOM으로 인코딩된 공공데이터 csv파일을 진단 하는 도구라 다른 인코딩으로 저장 되었을 때는 파일 정상적으로 보이지 않습니다. 에디터 프로그램을 사용하여 인코딩을 변경(UTF8 or UTF8-BOM)하여 사용 하시기 바랍니다.    &#x20;

![ 그림. 인코딩을 오류로 UTF-8 or UTF-8(BOM) 변경 해야함.            ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FWCsandH4HPA1gC9zeirH%2Fimage.png?alt=media\&token=6e105cb5-0079-4afb-9807-997fcfa6eccc)

![그림. 인코딩 변경 화면          ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FBQgLiQsls2T9G2pM9TMa%2Fimage.png?alt=media\&token=65e42dcb-b1f6-46a5-ba70-db73eb272fd2)

### 000.2 용량 제한이 있나요 ? &#x20;

> 용량에는 제한이 없지만 PC 상태에 따라 50\~100MB 까지 진단, 점검, 정비가 가능 합니다.&#x20;

### 000.3 그 이외의 문의 사항은????  &#x20;

> 각종 이슈 및 버그는 [여기](https://github.com/dataus-tech/odq/issues)로 문의 주시기 바랍니다.    &#x20;

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}


# 베라크립트(VeraCrypt) 을 이용하여 암호화된 가상 디스크 만들기

베라크립트(VeraCrypt), 안전한 가상 디스크 만들기.

## 베라크립트(VeraCrypt) 을 이용하여 암호화된 가상 디스크 만들기

### **베라크립트(VeraCrypt) 란 무엇인가?**

베라크립트(VeraCrypt) 는 OFTE를 위해 사용되는 오픈 소스 유틸리티이다. 파일 안에 암호화된 가상 디스크를 만들거나 파티션이라든지 완전한 기억 장치를 사전 부팅 인증을 사용하여 암호화할 수 있다. 베라크립트는 지금은 개발이 중단된 트루크립트 프로젝트의 포크이다.

<br>

### **그럼 이제 베라크립트(VeraCrypt) 를 설치 해 보자**

먼저 해당 홈페이지에 방문하여 파일을 다운로드 받습니다. - [사이트 바로가기](https://www.veracrypt.fr/en/Downloads.html) -&#x20;

<br>

Windows/macOS/Linux 등 다양한 OS 에 설치가 가능 합니다.

<br>

자신의 OS 에 맞는 파일을 다운로드 받으시고 실행 및 설치를 진행 하시기 바랍니다.

\-- 설치 는 생략 --

<br>

실행 하면 아래와 같은 화면을 보여 줍니다.

![](https://blog.kakaocdn.net/dn/y79Js/btrHIeh8peE/CuaKLHjY2y0dZNACvt13kk/img.png)

새로운 볼륨을 만들기 위해 "Create Volume" 을 클릭 합니다.

![](https://blog.kakaocdn.net/dn/bxMgiM/btrHIeJddrS/4fhChcKiaesWtXNi2e0Kx1/img.png)

위의 화면에서 "Next" 를 클릭 합니다.

그럼 아래의 화면처럼 Volume Location 화면이 보이며 "Select File..." 를 클릭 합니다.

![](https://blog.kakaocdn.net/dn/bjDuVm/btrHEXOXyIA/suYDF3H2VgCcbkWAXk36P0/img.png)

위의 화면에서 용량이 큰 드라이브를 선택하여 "자료 폴더" 등의 이름으로 폴더를 만들고 파일이름은 날짜 "20220719" 로 하였습니다.&#x20;

![](https://blog.kakaocdn.net/dn/owkYy/btrHIf2qUnS/V0ZdxM7t8jZuE8BRVxcM5k/img.png)

위의 화면처럼 경로와 파일명이 선택 되었습니다. "Next" 를 클릭 합니다.

아래와 같이 Encryption Algorithm 선택과 Hash Algorithom 을 선택 합니다.

![](https://blog.kakaocdn.net/dn/WfaBS/btrHJaTBJUE/nS5zYi78p3SXgqxOyqIu7k/img.png)

저는 Serpent(Twofish(AES)) 와 SHA-512 를 선택 하였습니다. "Next" 를 클릭 합니다.

![](https://blog.kakaocdn.net/dn/5eX2T/btrHIYTCGbI/0bHqNofATMPaDqr3wYTvFK/img.png)

위의 그림처럼 500 GB 로 설정 하여 "Next" 를 진행 합니다.

![](https://blog.kakaocdn.net/dn/cyBRsm/btrHIGySgTA/Ro0grimAsozhXHeWjcocY0/img.png)

위의 화면은 비밀번호를 입력하는 곳입니다. **숫자/영문자/특수문자를 포함하여 8자리 이상**으로 설정 하셔야 합니다.

해당 프로그램에서는 20자리 이상의 비밀번호를 입력 하라고 합니다. 전 숫자/영문자/특수문자를 포함한 8자리 이상으로 설정 하였습니다. "Next" 를 클릭 하여 진행 합니다.

![](https://blog.kakaocdn.net/dn/cbQdg6/btrHEYtRVJi/ud6unaqhSlMulxdHJazQOK/img.png)

위의 화면은 4G 이상의 큰 파일에 대한 설정 입니다. "yes or no"를 선택 후 "Next" 를 클릭 합니다.

![](https://blog.kakaocdn.net/dn/9bM1R/btrHJK1w8m5/tZPEqrORHNO3421O5K9fUK/img.png)

이제 Volume Format 을 진행 합니다. 먼저 Filesystem 은 "exFAT" 와 Cluster 는 "Default" 로 설정 해 주시면 됩니다.

또한 Quick Format, Dynamic 은 상황에 따라 체크 후 진행 하시면 됩니다. "Fromat" 을 클릭 하면 아래와 같은 화면이 진행 됩니다.

![](https://blog.kakaocdn.net/dn/bKB8Xk/btrHDQvIxz7/RSE5lOi4ZXgKyMmUORhM2K/img.png)

제 PC에서 500 GB 에 37분이 소요 되네요. Format 이 정상적으로 완료 되면 아래의 화면처럼 끝납니다.

![](https://blog.kakaocdn.net/dn/bk49gr/btrHIZSwTYP/MhQ4nvcTwaHL7obW77kRL1/img.png)

그럼 이제 연결 하는 방법을 보여드리겠습니다.

먼저 드라이브를 선택 한 후 "Volume" 에서 "Select File..." 을 클릭 후 해당 폴더의 파일을 선택 합니다.

여기서 "Never save history" 는 체크를 해제 합니다.

그리고 "Mount" 버튼을 클릭 합니다.

![](https://blog.kakaocdn.net/dn/cU9JZ1/btrHJy1fpuS/1HtBHcpaVCbxk2yQmW2nn1/img.png)

아래의 화면은 비밀번호를 입력 하는 부분입니다.

![](https://blog.kakaocdn.net/dn/bVyhmO/btrHIfuQv1m/2nqmjNXIpJPYRMi4GbFi8k/img.png)

비밀번호를 정상적으로 입력 하면 아래의 화면을 통해 Z 드라이브로 연결된 화면을 볼 수 있습니다.

![](https://blog.kakaocdn.net/dn/NbA3j/btrHIYe3Msl/PCLofcHvUuKRNqBTkKhiJ1/img.png)

탐색기를 열어서 Z 드라이브로 접속 하시면 됩니다.

![](https://blog.kakaocdn.net/dn/cnqY1z/btrHJa0Cidh/P3WZlY06KRlOcvLJq6OIm0/img.png)

로그오프나 재부팅 후엔 다시 VeraCrypt 를 실행하여 드라이브를 다시 마운트 해야 합니다.

<br>

### **\*\* 이제 안전하게 나의 자료를 보관 할 수 있습니다.**

\*\* 설치시 유의사항

| <p>i5 미만의 CPU에서는 시스템이 베라크립트를 버티지 못하는 경우가 종종 발생하고 있다.<br><br>PC 사용중 갑자기 컴퓨터가 멈춰버리거나 자동으로 재부팅 되는 경우가 있다.<br><br>노트북보다는 데스크톱에서 그나마 잘 동작하며, I7 이상의 CPU를 사용해야 문제 없이 동작한다.<br><br>하드웨어 가속인 AES-NI를 지원하는 프로세서라면 AES암호화 사용시 별 무리 없이 사용이 가능하다.<br><br><strong>간혹 부트로더를 멋대로 날려버려 블루스크린이 출력되는 경우가 있어 주의를 요한다.</strong><br><br>이에 대비해 백업본을 생성할 수 있으나, 백업본을 외부에 백업하면 베라크립트를 사용하는 의미가 없다는 모순이 생긴다. 노트북에서 분실시 데이터 유출 방지용으로 사용하는 정도에나 의미가 있다. 다만 이러한 경우는 TPM+비트락커로도 충분한 경우가 많다.</p> |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

\#베라크립트 #VeraCrypt #가상드스크 #암호화된 가상 디스크 만들기 #디스크 암호화 #설치시 유의사항 #안전한 디스크 #안전한 가상 디스크 #보안 #해킹


# 가비아 Apache SSL 보안인증서 to Tomcat SSL 보안인증서로 변경

\[SSL 보안인증서] Apache ssl 보안인증서를 Tomcat SSL 보안인증서로 변경 하기.

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. Apache SSL to Tomcat SSL 보안인증서로 변경하여 사용하기         &#x20;

{% code title="Apache SSL 보안인증서를 Tomcat SSL 보안인증서로 변경 하자   " %}

```
# ls
ChainBundle.crt         www.kr_key.pem         GLOBALSIGN_ROOT_CA.crt         www.kr_apache.crt

# openssl pkcs12 -export -in www.kr_apache.crt -inkey www.kr_key.pem -out www.kr.keystore -name tomcat
Enter Export Password: [비밀번호입력]
Verifying - Enter Export Password: [비밀번호입력]

# ls
ChainBundle.crt         www.kr_key.pem         GLOBALSIGN_ROOT_CA.crt         www.kr_apache.crt         www.kr.keystore

```

{% endcode %}

{% hint style="info" %}
• SSL 인증서 파일 : 도메인 파일명 (예시: [www.gabia.com.crt](http://www.gabia.com.crt))

• 중개 인증서 : ALPHASSL\_CA\_\_SHA256\_\_G2.crt

• 루트 인증서 : GLOBALSIGN\_ROOT\_CA.crt

• 발급된 인증서 종류에 따라 루트, 체인 인증서 파일명은 다를 수 있습니다.
{% endhint %}

## 2. 생성된 test.keystore 를 이용하여 Tomcat 설정 하기

{% code title="server.xml 파일     " %}

```
    <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true"
               keystoreFile="/home/centos/ssl/www.kr.keystore"
               keystorePass="[비밀번호]"
               sslProtocol="TLS" />
               
    <Connector port="8009" protocol="AJP/1.3" redirectPort="443" />
```

{% endcode %}

## 3. Tomcat server.xml 에서 HTTPS 로 자동 Redirect 설정      &#x20;

{% code title="server.xml 에서 HTTPS 로 자동 Redirect 설정 하기" %}

```
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />


<Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="443" />


<!-- JavaKeyStore 의 경우 -->
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true"
               keystoreFile="/home/centos/ssl/www.kr.keystore"
               keystorePass="[비밀번호]"
               sslProtocol="TLS" />


<Connector port="8009" protocol="AJP/1.3" redirectPort="443" />
```

{% endcode %}

## 4. Tomcat web.xml 에 설정     &#x20;

{% code title="web.xml 의 마지막 부분에 입력. 모든 url 의 패턴을 https 로 Redirect 하기    " %}

```
<web-app>

<!-- 마지막 부분에 아래의 값을 입력-->
<security-constraint>
    <web-resource-collection>
        <web-resource-name>SSL Forward</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

</web-app>
```

{% endcode %}

{% code title="web.xml 의 마지막 부분에 입력. 특정 url 의 패턴을 http or https 로 Redirect 하기  " %}

```
<security-constraint>
    <web-resource-collection>
        <web-resource-name>HTTPS or HTTP</web-resource-name>
        <url-pattern>/images/*</url-pattern>
        <url-pattern>/css/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>

```

{% endcode %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


# \[NoMoreRANSOM] 랜섬웨어 복구 프로그램 및 지원 사이트

노모어랜섬 사이트 참고

## \[NoMoreRANSOM] 랜섬웨어 복구 프로그램 및 지원 사이트

### 1.NoMoreRANSOM 사이트란?

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FBeKsfJ99VnhcoYBSNEub%2Fimage.png?alt=media&amp;token=19baea44-8e4d-4df4-9add-b52475e6699d" alt=""><figcaption><p>NoMoreRANSOME 사이트 </p></figcaption></figure>

### 2.랜섬웨어 해결사&#x20;

> 랜섬웨어에 걸린 PC 가 있다면 웹사이트 주소(.onino  등 포함), 비트코인 주소 등을 입력 해 주셔야 합니다.&#x20;
>
> 또한 감염 후 생성된 파일(readme 등)을 업로드 하여 확인  할 수 있습니다.

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FwNJXvUj2zBGBNSNo40uC%2Fimage.png?alt=media&amp;token=9a7f6aa9-bfee-4336-bea8-ae326226cdcd" alt=""><figcaption><p>랜섬웨어 해결사 </p></figcaption></figure>

### 3. 랜섬웨어 Q\&A

> 랜섬웨어에 관한 정보를 확인 할 수 있습니다.
>
> * 랜섬웨어의 역사
> * 랜섬웨어 유형
> * 랜섬웨어에 감염되었다면 비용을 지불해야 하나요?
> * 랜섬웨어에는 어떻게 감염되나요?
> * 랜섬웨어의 주된 피해자는 누구인가요?
> * 업체를 대상으로 한 랜섬웨어 공격이 증가 중인가요?
> * 왜 랜섬웨어에 대한 해결방안을 찾는 것이 이렇게 어렵나요?
> * 랜섬웨어 피해자들이 이 프로젝트를 이용해 파일들을 복구할 가능성은 얼마나 될까요?
> * '랜섬웨어 해결사' 코너가 무엇이고 어떻게 사용하나요?
> * 제가 감염된 랜섬웨어에 맞는 복호화 도구를 사용했는데 동작하지 않습니다. 왜 그럴까요?
> * 랜섬웨어로 암호화된 파일들을 복호화하는 것은 어떤 경우에 가능한가요?
> * 이 프로젝트는 어떻게 시작된 것인가요?
> * 우리나라에 비슷한 시도가 있나요?

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FhNKHRHJBhNhaPj5QeySv%2Fimage.png?alt=media&amp;token=a13cf8b8-afdf-4378-b936-972e5436747b" alt=""><figcaption><p>랜섬웨어 Q&#x26;A</p></figcaption></figure>

### 4. 랜섬웨어 예방법

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FZDyE6laGqHi0fT90sFGw%2Fimage.png?alt=media&amp;token=6a617629-13f9-4b52-b1be-e6541da03593" alt=""><figcaption><p>랜섬웨어 예방법</p></figcaption></figure>

### 5. 복구 프로그램(무료 배포)

> 다양한 복구 프로그램을 보유 하고 있습니다. 검색을 통해 확인 해 보시기 바랍니다.
>
> *<mark style="color:red;">**복구 프로그램 무료 배포**</mark>*&#x20;

{% hint style="warning" %}
주의! 복구 프로그램 실행 전에 매뉴얼을 읽어 보시기 바랍니다.
{% endhint %}

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FJTY5xtTnmFYNEGp4weQr%2Fimage.png?alt=media&amp;token=9d6c2cc6-a708-487b-a542-7e8ab761bf66" alt=""><figcaption><p>랜섬웨어 복구 프로그램 </p></figcaption></figure>

### 6. 랜섬웨어 신고하기

> 랜섬웨어에 감염되었다면 아래 링크를 클릭하여 경찰청 사이버안전국 홈페이지에서 범죄 신고를 할 수 있으며, 전국 경찰서 사이버팀에도 직접 방문 후 신고 접수가 가능합니다.

<figure><img src="https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FtObjWn8W4DFoB26NOetz%2Fimage.png?alt=media&amp;token=37b61800-4141-42a1-87d7-fb1bfc70ee7e" alt=""><figcaption><p>랜섬웨어 신고하기</p></figcaption></figure>

## 홈페이지 : [NoMoreRANSOM 바로가기](https://www.nomoreransom.org/)

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}

{% embed url="<https://sul.skill.or.kr>" %}
보안 업데이트 정보 사이트
{% endembed %}


# \[KISA] 랜섬웨어 복구도구 모음

\[KISA] 랜섬웨어 복구도구 모음

## \[KISA] 랜섬웨어 복구도구 모음

### **\* Hive 랜섬웨어 통합 복구도구(버전1\~버전4)**

#### [1. Hive\_Ransomware\_Integrated\_Decryption\_Tool.zip \[53.0K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000417\&MNK=MN_0000001279) [2. Hive\_Ransomware\_Integrated\_Decryption\_Tool\_User\_Manual(ENG).pdf \[715.7K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000422\&MNK=MN_0000001279) [3. Hive\_랜섬웨어\_통합\_복구도구\_사용\_매뉴얼.pdf \[784.6K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000423\&MNK=MN_0000001279)

### **\* Ragnar 랜섬웨어 복구도구**

#### [1. Ragnar\_랜섬웨어\_복구도구\_사용\_매뉴얼.pdf \[467.8K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000414\&MNK=MN_0000001279) [2. Ragnar\_Ransomware\_Decryption\_Tool.zip \[5.7M\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000415\&MNK=MN_0000001279)

### **\* Darkside 랜섬웨어 복구도구**

#### [1. 복구 도구 및 자세한 설명 바로가기](https://www.bitdefender.com/blog/labs/darkside-ransomware-decryption-tool/)

### **\* REvil/Sodinokibi 랜섬웨어 복구도구**

#### [1. 복구 도구 및 자세한 설명 바로가기](https://www.bitdefender.com/blog/labs/bitdefender-offers-free-universal-decryptor-for-revil-sodinokibi-ransomware/)

### **\* Djvu 랜섬웨어 복구도구**

#### [1. 복구 도구 및 자세한 설명 바로가기](https://www.emsisoft.com/ransomware-decryption-tools/stop-djvu)

### **\* LooCipher 랜섬웨어 복구도구**

#### [1. LooCipher\_랜섬웨어\_복구도구\_사용\_매뉴얼.pdf \[184.9K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000390\&MNK=MN_0000001279) [2. LooCipher\_decryptor.zip \[86.6K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000391\&MNK=MN_0000001279) [3. LooCipher\_Ransomware\_Decryption\_Tool\_Instruction\_Manual.pdf \[131.1K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000405\&MNK=MN_0000001279)

### **\* SimpleLocker 랜섬웨어 복구도구**

#### [1. SimpleLocker 랜섬웨어 암호기능 분석 보고서.pdf \[449.7K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000240\&MNK=MN_0000001279) [2. SImplelocker 복구도구 사용 매뉴얼.pdf \[171.4K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000301\&MNK=MN_0000001279) [3. SImplelocker decryptiontool user manual.pdf \[120.1K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000302\&MNK=MN_0000001279) [4. decrypt simplelocker.zip \[4.0M\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000303\&MNK=MN_0000001279)

### **\* Magniber 랜섬웨어 복구도구**

#### [1. Magniber 랜섬웨어 암호기능 분석 보고서.pdf \[580.5K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000239\&MNK=MN_0000001279) [2. decrypt magniber(.kgpvwnr).zip \[2.4M\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000298\&MNK=MN_0000001279) [3. Magniber 복구도구 사용 매뉴얼.pdf \[173.7K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000299\&MNK=MN_0000001279) [4. Magniber decryption tool user manual.pdf \[123.0K\] ](https://seed.kisa.or.kr/async/MultiFile/download.do?FS_KEYNO=FS_0000000300\&MNK=MN_0000001279)

<br>

피해 당하지 않게 조심 하시기 바랍니다.

또한 피해 보신 분들은 KISA 에 스팸 신고도 해 주시기 바랍니다.

<br>

출처 : [KISA 바로가기](https://seed.kisa.or.kr/)&#x20;

<br>


# \[외부 링크] 자료 모음 공유

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 제목 : \[외부 링크] 자료 모음 공유

### [리스트 1. \[KISA\] ISMS-P 인증기준 안내서 \[PDF\]](https://isms.kisa.or.kr/board/file/bbs_0000000000000014/16/FILE_000000000000813/20220422162425837-610988933)          &#x20;

### [리스트 2. \[KISA\] ISMS-P 세부점검 항목 공지(22.04.22) \[xlsx\]   ](https://isms.kisa.or.kr/board/file/bbs_0000000000000014/15/FILE_000000000000812/20220422162324297-2020526241)

### [리스트 3. \[KISA\] ISMS-P 인증제도 안내서(2021.7) \[PDF\]](https://isms.kisa.or.kr/board/file/bbs_0000000000000014/14/FILE_000000000000750/202107141700113011901763919.pdf)   &#x20;

### [리스트 4. \[KISA\] 정보보호 관리체계(ISMS) 인증제도 안내서(2017.04) \[PDF\]](https://isms.kisa.or.kr/board/file/bbs_0000000000000001/47/FILE_000000000000233/2017051013165572729)  &#x20;

### [리스트 5. \[KISA\] PIMS 인증제도 안내서(1권) - 제도운영편 \[PDF\] ](https://isms.kisa.or.kr/board/file/bbs_0000000000000002/16/FILE_000000000000218/201704061142399370)    &#x20;

### [리스트 6. \[KISA\] PIMS 인증제도 안내서(1권) - 인증기준편 \[PDF\]](https://isms.kisa.or.kr/board/file/bbs_0000000000000002/16/FILE_000000000000219/2017040611423996823)

### [리스트 7. \[KISA\] PIMS\_인증기준\_세부점검항목(2016.11.09) \[xlsx\]](https://isms.kisa.or.kr/board/file/bbs_0000000000000002/14/FILE_000000000000103/2017032716401700938)

### [리스트 8. \[KT Cloud\] KT Cloud 보안가이드](https://cloud.kt.com/download/KT_Cloud_securityguide_v1.0.pdf)

### [리스트 9. \[과학기술정보통신부\] 민간분야 주요정보통신기반시설 클라우드 이용 가이드라인](https://www.krcert.or.kr/filedownload.do?attach_file_seq=2737\&attach_file_id=EpF2737.pdf)

### [리스트 10. \[nCloud\] Naver Cloud Platform 보안가이드](https://www.ncloud.com/api/support/download/5/97)

### [리스트 11. \[KT Cloud\] KT Cloud 보안백서](https://cloud.kt.com/download/KT_Cloud_securitybook_v1.0.pdf)

### [리스트 12. \[ADT캡스/Infosec\] 클라우드보안가이드(컨테이너 보안)-Docker, Kubernetes](http://www.skinfosec.com/liveFile/eqstinsight-file/happyFileDown.do?fileName=20190621080345E90N.pdf\&orgFileName=2019_%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EB%B3%B4%EC%95%88%EA%B0%80%EC%9D%B4%EB%93%9C%EB%9D%BC%EC%9D%B8_Docker%26amp;Kubernetes_fv.pdf\&boardSeq=927)

### [리스트 13. \[ADT캡스/Infosec\] 2021 클라우드 보안 가이드 GCP](https://infosec.adtcaps.co.kr/happyFile/liveFile/downFile/2021%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EB%B3%B4%EC%95%88%EA%B0%80%EC%9D%B4%EB%93%9C_GCP.pdf?fileName=20210518155640gTwh.pdf)

### [리스트 14. \[ADT캡스/Infosec\] 2021 클라우드 보안 가이드 Azure](https://infosec.adtcaps.co.kr/happyFile/liveFile/downFile/2021%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EB%B3%B4%EC%95%88%EA%B0%80%EC%9D%B4%EB%93%9C_Azure.pdf?fileName=20210518155554jbpg.pdf)

### [리스트 15. \[ADT캡스/Infosec\] 2021클라우드보안가이드 AWS](https://infosec.adtcaps.co.kr/happyFile/liveFile/downFile/2021%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EB%B3%B4%EC%95%88%EA%B0%80%EC%9D%B4%EB%93%9C_AWS.pdf?fileName=20210518155411xKMV.pdf)

### [리스트 16. \[KISA\] 웹 에디터 보안 가이드](https://www.krcert.or.kr/filedownload.do?attach_file_seq=3712\&attach_file_id=EpF3712.pdf) <a href="#id-16-kisa" id="id-16-kisa"></a>

### [리스트 17. \[NHN Cloud\] NHN Cloud | On.1 2022 클라우드 트렌드](https://rl4jhpd88.toastcdn.net/presentation/NHNCloudOn1-2022%EB%85%84%20%EC%A3%BC%EC%9A%94%20%EA%B8%B0%EC%88%A0%20%ED%8A%B8%EB%A0%8C%EB%93%9C%20%EC%98%88%EC%B8%A1%EA%B3%BC%20%EC%9D%B4%ED%95%B4_%EC%B5%9C%EC%9C%A4%EC%84%9D.pdf)

### [리스트 18. \[NHN Cloud\] NHN Cloud | On.2 Cloud by default, Cloud NATIVE by default](https://rl4jhpd88.toastcdn.net/presentation/NHNCloudOn2-Cloud%20by%20default%20Cloud%20NATIVE%20by%20default_%EA%B9%80%EB%AA%85%EC%8B%A0.pdf)

### [리스트 19. \[NHN Cloud\] NHN Cloud | On.3 Cloud, AI and Fashion](https://rl4jhpd88.toastcdn.net/presentation/NHNCloudOn3-Cloud%20AI%20and%20Fashion_%EC%84%9D%EC%84%A0%ED%9D%AC.pdf)

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="info" %}
**NHN Cloud&#x20;**<mark style="color:red;">**사용자 가이드**</mark> : <https://doc.skill.or.kr/nhn-cloud-user-guide>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


# \[KISA Insight 2023 Vol.03] ChatGPT(챗GPT) 보안 위협과 시사점

노모어랜섬 사이트 참고

## \[KISA Insight 2023 Vol.03] ChatGPT(챗GPT) 보안 위협과 시사점

### □ ChatGPT가 출시되면서 혁신적인 기능으로 인해 주목을 받고 있지만, 그에 따른 부작용으로 인한 다양한 보안 이슈도 발발

∙ ChatGPT의 혁신적인 결과물 생산으로 출시됨과 동시에 폭발적인 관심을 받았으며, 비즈니스 과정에서 생산성을 향상시키고, 의료, 법률, 미디어 등 다양한 산업 분야에 활용되어 큰 영향을 줄 수 있음 ∙ 거짓 답변을 사실처럼 대답하거나, 최신 정보에 대한 내용은 답변하지 못하는 등 다양한 한계점이 존재하며, ChatGPT 활용 과정에서 다양한 부작용 발생 가능

### □ 보안 전문가들은 ChatGPT가 사이버 범죄에 악용될 수 있다고 전망하며, 해외 주요국 및 기업 등에서는 인공지능에 대한 규제 논의가 촉진되고 있음

∙ ChatGPT 개발사인 OpenAI는 ChatGPT가 안전하게 활용될 수 있도록, 해당 서비스의 활용을 허용하지 않는 용도를 제시 ∙ 보안 전문가들도 ChatGPT가 좋은 목적으로 활용될 수 있고 사이버보안 활동에도 도움을 줄 수 있지만, 사이버 범죄에도 얼마든지 활용될 수 있음을 강조 ∙ 이탈리아는 ChatGPT 접속을 일시적으로 차단하였다가 OpenAI의 보안 조치 후 다시 해제하였으며, EU나 미국 등에서 인공지능 규제에 대한 논의 촉진

### □ ChatGPT의 결과물이 사이버 공격에 악용되거나, 민감정보 유출 및 결과물 오남용 문제가 발생할 수 있으며, 인공지능 모델에 대한 공격도 고려 필요

∙ 공격자들은 피싱 메일 작성, 악성코드 생성 등 ChatGPT의 결과물을 사이버 공격에 활용하거나, ChatGPT를 통해 사이버 위협 행위에 대한 도움을 받을 수 있음 ∙ 무분별한 입력으로 민감정보의 유출 가능성이 존재하며, ChatGPT의 잘못된 결과물 생산은 잘못된 정보의 오용 및 확산이나 다양한 보안 문제 등을 야기할 수 있음 ∙ 인공지능 모델 고유의 보안 위협이 존재하며, 개발 단계부터 안전한 활용단계까지 보안 위협에 대한 대응방안 마련 필요

## 홈페이지 : [KISA 바로가기](https://www.kisa.or.kr/)

## 파일 다운로드 : [\[KISA Insight 2023 Vol.03\] ChatGPT(챗GPT) 보안 위협과 시사점(최종).pdf](https://www.kisa.or.kr/post/fileDownload?menuSeq=20301\&postSeq=18\&attachSeq=1\&lang_type=KO)

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}

{% embed url="<https://sul.skill.or.kr>" %}
보안 업데이트 정보 사이트
{% endembed %}


# \[nCloud] Ubuntu 20.04 불필요한 계정 삭제 방법

nCloud Ubuntu 20.04 불필요한 계정 삭제 방법

## \[nCloud] Ubuntu 20.04 불필요한 계정 삭제 방법

> 네이버 클라우드에서 불필요한 계정을 삭제 하기 위해 아래와 같은 작업이 필요 함.

### 점검 항목 설명&#x20;

> ```
> 시스템 계정 중 불필요한 계정(퇴직, 전직, 휴직 등의 이유로 사용하지 않는 계정 및 장기적으로 사용하지 않는 계정 등)이 존재하는지 점검
> 아래의 Default 계정은 반드시 삭제
> adm, lp, sync, shutdown, halt, news, uucp, operator, games, gopher, nfsnobody, squid
>
> (PCI/DSS) 90 이상 접속하지 않은 계정 삭제
> ```

### 권고 설정 및 판단 기준 &#x20;

> 불필요한 계정이 존재하지 않는 경우 양호

### 조치 방법&#x20;

> ```
> 현재 등록된 계정 현황 확인 후 불필요한 계정 삭제
> Step 1) 서버에 등록된 불필요한 사용자 계정 확인
> Step 2) userdel 명령으로 불필요한 사용자 계정 삭제
> #userdel <user_name>
>
> ※ /etc/passwd 파일에서 계정 앞에 #을 삽입하여도 주석처리가 되지 않으므로, 조치 시에는 반드시 계정을 삭제하도록 권고함
> ```

### \*\* 시스템 에서 확인 및 제거 방법

> 아래의 방법으로 불필요한 계정을 삭제 함.&#x20;

```
########## 네이버 클라우드 플랫폼에서는 계정을 삭제 하더라도 리부팅 되면 유저가 다시 생성 됨.
########## 이를 해결하기 위해 아래와 같은 방법으로 처리 함.

########## 아래의 명령어는 관리되는 유저와 그룹 확인이 가능
# /usr/bin/systemd-sysusers --cat-config

########## 계정 삭제
# userdel lp
# userdel sync
# userdel games
# userdel uucp
# userdel news

########## 재부팅 후에도 계정이 생성 되지 않게 설정 (basic.conf 에서 아래의 계정을 삭제 후 저장)
# vi /usr/lib/sysusers.d/basic.conf
u sync       4:65534 - /bin                 /bin/sync
u games      5:60    - /usr/games           /usr/sbin/nologin
u lp         7       - /var/spool/lpd       /usr/sbin/nologin
u news       9       - /var/spool/news      /usr/sbin/nologin
u uucp       10      - /var/spool/uucp      /usr/sbin/nologin
```


# 조직 및 운영 보안(OPS)

Andorid 사이트 참고

## 조직 및 운영 보안

> 우수한 보안 관행의 기초는 조직 내에서 시작됩니다.

## 보안 및 개인정보보호팀 구축 <a href="#create-a-team" id="create-a-team"></a>

> 전담 보안 및 개인정보보호팀을 구축하고 이 조직의 리더를 정하세요.
>
> * **보안팀 구축:**
>   * 최소 한 명의 직원이 보안, 개인 정보 보호 및 사고 대응을 담당하도록 합니다.
>   * 이 팀의 임무와 업무 범위를 정의합니다.
>   * 보안 관리자, 보안 엔지니어, 사고 관리자와 관련된 조직도 및 업무 설명을 수립합니다.
>   * 직원 또는 외부 계약직을 고용하여 이러한 역할을 충원합니다.
> * **SDL(보안 개발 수명 주기) 정의**: SDL은 다음과 같은 영역을 포괄해야 합니다.
>   * 제품 보안 요구사항
>   * 위험 분석 및 위협 모델링
>   * 애플리케이션 및 코드의 [정적 및 동적 분석](https://source.android.com/docs/security/test/fuzz-sanitize?hl=ko)
>   * 제품의 최종 보안 검토 프로세스
>   * 사고 대응
> * **조직 위험 평가**: 위험 평가를 마련하고 이러한 위험을 제거하거나 완화하기 위한 계획을 수립합니다.

## 빌드 인증 프로세스 <a href="#build-verification" id="build-verification"></a>

> 기존 내부 빌드 인증 및 승인 프로세스의 허점을 평가합니다.
>
> * 빌드 내 [PHA(잠재적으로 위험한 애플리케이션)](https://developers.google.com/android/play-protect/phacategories?hl=ko) 발생으로 이어질 수 있는 현재의 빌드 인증 프로세스의 모든 문제점을 파악합니다.
> * 사내 [AOSP](https://android.googlesource.com/) 패치의 경우에도 코드 검토 및 승인 프로세스가 마련되어 있는지 확인합니다.
> * 다음과 같은 영역에 제어 기능을 구현하여 빌드 무결성을 개선합니다.
>   * **변경사항 추적**: 소프트웨어 엔지니어를 추적하고 변경 로그를 유지합니다.
>   * **위험 평가**: 앱에서 사용하는 권한을 평가하고 코드 변경사항의 수동 검토를 요구합니다.
>   * **모니터링**: 권한 있는 코드에 대한 변경사항을 평가합니다.

## 소스 코드 변경 추적 <a href="#source-code-change-tracking" id="source-code-change-tracking"></a>

> 소스 코드 또는 서드 파티 앱/바이너리/SDK에 대한 의도하지 않은 수정을 모니터링합니다.
>
> * **파트너십 평가**: 다음 단계에 따라 기술 파트너와의 협업에 따른 위험을 평가합니다.
>   * 특정 공급업체와의 협업에 따른 위험을 평가하는 방법에 관한 기준을 수립합니다.
>   * 공급업체를 대상으로 사고를 어떻게 해결하고 보안 및 개인 정보 보호를 어떻게 관리할지 묻기 위한 양식을 작성합니다.
>   * 주기적인 감사로 상대의 주장을 검증합니다.
> * **변경사항 추적**: 어떤 회사와 직원이 소스 코드를 수정하고 주기적인 감사를 시행하는지 기록하여 적절한 변경사항만 적용되도록 합니다.
> * **기록 유지**: 어떤 회사가 서드 파티 바이너리를 빌드에 추가하는지 기록하고, 이러한 앱이 어떤 기능을 수행하고 어떤 데이터를 수집하는지를 문서화합니다.
> * **계획 업데이트**: 공급업체가 제품의 온전한 수명을 위한 소프트웨어 업데이트를 제공하도록 합니다. 예기치 못한 취약점을 해결해야 하는 경우 공급업체의 지원이 요구될 수 있습니다.

## 소스 코드 무결성 및 계보의 유효성 검사 <a href="#validate-source-code" id="validate-source-code"></a>

> ODM(원래의 기기 제조업체), OTA(무선 업데이트) 또는 이동통신사가 공급한 소스 코드를 확인하고 유효성을 검사합니다.
>
> * **인증서 서명 관리**
>   * HSM(하드웨어 보안 모듈) 또는 보안 클라우드 서비스에 키를 보관합니다 (공유하면 안 됨).
>   * 인증서 서명에 대한 액세스가 관리 및 감사되는지 확인합니다.
>   * 모든 코드 서명이 빌드 시스템에서 이루어지도록 합니다.
>   * 분실한 키를 취소합니다.
>   * 권장사항에 따라 키를 생성합니다.
> * **새 코드 분석** 보안 코드 분석 도구로 새로 추가된 코드를 테스트하여 새로운 취약점이 유입되지 않았는지 확인합니다. 또한 전체 기능을 분석하여 새로운 취약점의 수식을 감지합니다.
> * **게시 전 검토** 프로덕션에 게시하기 전에 소스 코드 및 서드 파티 앱에서 보안 취약점을 찾습니다. 예를 들면 다음과 같습니다.
>   * 앱에서 보안 통신을 사용하도록 요구합니다.
>   * 최소 권한의 원칙을 따르고 앱이 작동하기 위해 필요한 최소의 권한 모음을 부여합니다.
>   * 데이터가 보안 채널을 통해 저장 및 전송되도록 합니다.
>   * 서비스 종속 항목을 최신 상태로 유지합니다.
>   * SDK 및 오픈소스 라이브러리에 보안 패치를 적용합니다.

## 사고 대응 <a href="#incident-response" id="incident-response"></a>

> Android는 강력한 보안 커뮤니티가 문제를 찾는 데 기여할 수 있다고 믿습니다. 따라서 외부 당사자가 기기 관련 보안 문제를 문의할 수 있도록 방법을 마련하여 게시해야 합니다.
>
> * **연락처 설정**: <security@your-company.com>과 같은 이메일 주소나 제품과 관련된 잠재적인 보안 문제 신고 절차가 명확히 설명되어 있는 웹사이트를 만듭니다([예](https://security.samsungmobile.com/securityReporting.smsb)).
> * **취약점 포인트 제도(VRP) 수립**: 유효한 제출 내용에 대해서는 금전적 보상을 제공함으로써 외부 보안 연구자가 제품에 영향을 미치는 보안 취약점 보고서를 제출하도록 권장합니다([예](https://www.google.com/about/appsecurity/android-rewards/?hl=ko)). 심각도가 매우 높은 취약점의 경우 $5,000, 심각도가 높은 취약점의 경우 $2,500와 같이 업계에서 경쟁력 있는 수준의 보상을 제공하는 것이 좋습니다.
> * **업스트림 프로젝트 변경에 참여**: 여러 기기 제조업체의 Android 플랫폼이나 기기에 영향을 미치는 보안 문제를 인지한 경우 [보안 버그 신고](https://g.co/AndroidSecurityReport)를 제출하여 Android 보안팀에 문의합니다.
> * **우수 보안 관행 장려**: 기기와 관련된 서비스, 구성요소 및 코드를 제공하는 하드웨어 및 소프트웨어 공급업체의 보안 관행을 사전에 평가합니다. 공급업체에서 책임지고 우수한 보안 관행을 유지하도록 합니다.

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}

{% embed url="<https://sul.skill.or.kr>" %}
보안 업데이트 정보 사이트&#x20;
{% endembed %}


# 시스템 보안 권장사항(SYSTEM)

Andorid 사이트 참고

## 시스템 보안 권장사항

> 이 섹션에는 핵심적인 Android 운영체제 및 기기의 보안 확인을 위한 권장사항이 포함되어 있습니다.

## 생체 인식 인증 <a href="#biometric-authentication" id="biometric-authentication"></a>

> 사용자 인증을 위해 [생체 인식 데이터](https://source.android.com/security/biometric?hl=ko)를 신중하게 수집, 저장 및 처리합니다. 다음을 확인하세요.
>
> * 생체 인식을 비롯한 다른 형식의 인증을 사용하기 전에 기본 인증 방식을 요구합니다.
> * 인증 귀속 키가 개입되는 트랜잭션(예: 결제)에 얼굴 인식 등의 수동적 생체 인식 모달리티를 사용 중인 경우 의도를 나타내기 위한 명시적인 확인을 요구합니다.
> * 72시간마다 기본 인증 방식을 요구합니다.
> * 모든 생체 인식 데이터 및 취급과 관련하여 완벽한 보안이 적용된 파이프라인을 사용합니다.
> * 생체 인식 데이터(원시 센서 측정값 및 파생 특성 포함)를 기기 외부로 전송하지 않습니다. 가능한 경우 이러한 데이터를 [TEE(신뢰할 수 있는 실행 환경)](https://source.android.com/security/trusty?hl=ko) 또는 보안 요소와 같은 격리된 보안 환경에 보관합니다.
>
> 생체 인식을 포함하는 기기는 [BiometricPrompt API](https://developer.android.com/preview/features/security?hl=ko#fingerprint-auth)를 지원해야 합니다. 이 API는 생체 인식 기반 인증을 앱에서 활용할 수 있도록 공통적이고 일관적인 인터페이스를 앱 개발자에게 제공합니다. [강력한 생체 인식](https://source.android.com/security/biometric?hl=ko#strong-weak-unlocks)만 `BiometricPrompt`와 통합 가능하며 통합 시 [Android 호환성 정의 문서](https://source.android.com/compatibility/cdd?hl=ko)(CDD) 가이드라인을 따라야 합니다.
>
> 생체 인식 가이드라인에 관한 자세한 내용은 [생체 인식 HAL 구현 가이드라인](https://source.android.com/security/biometric?hl=ko#hal-implementation)을 참조하세요.

## SELinux <a href="#selinux" id="selinux"></a>

> SELinux는 다수의 Android 보안 모델을 정의하고 시행합니다. SELinux의 올바른 사용은 Android 기기의 보안에 매우 중요하며, 보안 취약성의 영향을 줄이는 데 도움이 될 수 있습니다. 따라서 모든 Android 기기는 [강력한 SELinux 정책](https://source.android.com/security/selinux/device-policy?hl=ko#granting_the_dac_override_capability)을 구현해야 합니다.
>
> * 최소 권한 정책을 구현합니다.
> * `CAP_DAC_OVERRIDE`, `CAP_SYS_ADMIN`, 및 `CAP_NET_ADMIN` 권한을 부여하지 않도록 합니다.
> * 시스템 데이터를 SD 카드에 기록하지 않습니다.
> * `gpu_device`, `audio_device` 등 제공된 드라이버 액세스 유형을 사용합니다.
> * 프로세스, 파일 및 SELinux 유형에 의미있는 이름을 사용합니다.
>   * 기본 라벨이 사용되지 않도록 하고 라벨에 액세스 권한이 부여되지 않도록 합니다.
> * 기기별 정책은 기기에서 실행되는 모든 정책의 5\~10%를 차지해야 합니다. 맞춤설정이 20% 이상이라면 과도한 권한을 부여받은 도메인과 유효하지 않은 정책이 포함되어 있다고 거의 확신할 수 있습니다. 불필요하게 큰 정책은 더 큰 부팅 이미지를 요구하고 런타임 정책 조회 시간에 부정적인 영향을 미침으로써 메모리와 디스크 공간을 낭비합니다.

## SELinux 정책의 동적 로드 <a href="#dynamic-loading-selinux-policy" id="dynamic-loading-selinux-policy"></a>

> Android 기기에서는 SELinux 정책을 동적으로 로드하면 안 됩니다. 동적으로 로드할 경우 다음과 같은 문제가 발생할 수 있습니다.
>
> * 중요 보안 패치가 수락되지 않습니다.
> * 정책을 다시 로드하는 과정에서 기기의 루팅 기능이 노출됩니다.
> * 정책 업데이터에 대한 중간자(man-in-the-middle) 공격의 벡터가 노출됩니다.
> * 정책 업데이트 오류로 인해 기기가 제대로 작동하지 않습니다.

## 백도어 <a href="#backdoors" id="backdoors"></a>

> Android 앱에는 정상적인 보안 메커니즘을 우회하는 시스템이나 데이터에 액세스하기 위한 백도어 또는 수단이 없어야 합니다. 여기에는 진단, 디버깅, 개발 또는 개발자에게 알려진 보안 비밀에 의해 관리되는 보증 수리 특별 액세스가 포함됩니다. 백도어를 예방하는 방법은 다음과 같습니다.
>
> * 업계에서 인정하는 앱 취약성 스캔 도구를 사용하여 모든 타사 앱을 스캔합니다.
> * 타사 라이브러리를 비롯한 민감한 액세스 권한이 있는 모든 코드에 대한 코드 검토를 수행합니다.
> * Google Play에 앱을 업로드하여 스캔하는 방식으로 Google Play 프로텍트를 활용합니다. Google Play에 게시하지 않고도 스캔할 앱을 업로드 할 수 있습니다.
> * release 빌드에 진단 또는 수리에 초점을 맞춘 도구를 미리 로드하지 않습니다. 이러한 도구는 특정 문제의 해결을 위해 요구되는 경우에만 설치하세요. 또한 이러한 도구는 계정 관련 데이터를 처리하거나 업로드해서는 안 됩니다.

## 개발 도구 <a href="#development-tools" id="development-tools"></a>

> 디버깅, 테스트 및 진단 도구와 같은 개발 도구는 작동 방식 및 수집되는 데이터를 드러내어 기기의 의도되지 않은 보안 결함을 야기하는 경우가 많습니다. 개발 도구가 이를 프로덕션 빌드로 전환하지 않도록 하려면 다음을 수행하세요.
>
> * 시스템 이미지를 사용하기 전에 사내 디버그 및 테스트 도구 해시 차단 목록을 수립하고, 이러한 APK 관련 빌드를 스캔합니다.
> * 업계에서 인정하는 앱 취약성 스캔 도구를 사용하여 모든 자사 앱을 스캔합니다.
> * 주요 업데이터 전에(특히 앱이 타사에 의해 개발된 경우) 타사 앱 보안 테스트 업체를 고용하여 기기의 모든 중요한 진단 앱을 평가합니다.
> * 지원 세션 도중 구두나 채팅을 통해 사용자만 도구를 사용 설정할 수 있도록 합니다. 필요한 진단 정보를 수집한 후에는 동의 관련 아티팩트를 저장하고 도구를 사용 중지합니다.
> * 사용자가 이동통신사 계정에서 액세스 가능한 로그에 이 도구의 사용 기록을 저장합니다.
> * 도구에 의해 수집된 모든 PII(개인 식별 정보) 또는 기기 원격계측 데이터가 국가와 관련된 익명처리, 유지 및 삭제 관행의 적용을 받는지 확인합니다. 지원 통화와 관련된 데이터만 수집해야 합니다. 이 데이터는 각 호출 후에 삭제되어야 합니다.
> * 키 입력 로깅, 마이크 사용 또는 카메라 사용처럼 스파이웨어에 사용될 수 있는 기술이 명시적인 사용자의 동의없이 사용되지 않도록 해야 합니다. 이렇게 개인정보 침해 여지가 있는 방식을 활용하는 앱은 사용자가 동의해야 하는 개인정보처리방침과 더불어 매우 밀접한 방식으로 공개되어야 합니다. 이러한 앱은 사용자의 명시적인 동의없이 사용 설정하면 안 됩니다.
>
> 공개 및 동의 구현 시에 참조하면 좋은 몇 가지 추가적인 권장사항은 다음과 같습니다.

### 인앱 공개 <a href="#in-app-disclosure" id="in-app-disclosure"></a>

> * 인앱으로 직접 앱의 일반적인 사용법을 표시합니다. 사용자가 메뉴나 설정으로 이동할 필요가 없습니다.
> * 수집되는 데이터 유형과 데이터가 어떻게 사용되는지 설명합니다.
> * 이러한 정보는 개인정보처리방침이나 서비스 약관에 기재하지 않는 것이 좋습니다. 개인정보 또는 민감한 데이터 수집과 관련이 없는 다른 공개에는 포함하면 안 됩니다.

### 동의 요청 <a href="#request-consent" id="request-consent"></a>

> * 동의 의사가 확실해야 합니다. 공개 대화상자에서 나가는 행위 (탭해서 나가기, 뒤로 버튼이나 홈 버튼 누르기 포함)를 동의 의사로 간주하면 안 됩니다.
> * 명확하고 분명한 방식으로 동의 요청 대화상자를 표시합니다.
> * 사용자가 동의 의사를 확실하게 표현하도록 요구해야 합니다 (예: 탭 동작으로 동의, 음성 명령).
> * 확실한 동의 의사 없이 개인정보 또는 민감한 데이터를 수집하면 안 됩니다.
> * 메시지가 자동으로 닫히거나 만료되면 안 됩니다.

## AOSP의 내장된 기능 <a href="#embedded-functionality-in-aosp" id="embedded-functionality-in-aosp"></a>

> AOSP에 추가 기능을 내장할 경우 예기치 못한 동작과 결과로 이어질 수 있으므로 조심해야 합니다.
>
> * 다른 기본 앱(예: 검색 엔진, 웹브라우저, 런처)을 사용하고 데이터를 기기 외부로 전송하는 내용을 공개할 의향이 있는지 사용자에게 물어봐야 합니다.
> * AOSP APK가 AOSP 인증서로 서명되었는지 확인합니다.
> * 회귀 테스트를 실행하고 변경 로그를 유지하여 AOSP APK에 코드가 추가되었는지 확인합니다.

## 보안 업데이트 <a href="#security-updates" id="security-updates"></a>

> Android 기기는 출시 후 최소 2년간 지속적인 보안 지원을 받아야 합니다. 여기에는 알려진 보안 취약점 해결을 위한 정기적인 업데이트도 포함됩니다.
>
> * SoC 공급업체와 같은 하드웨어 파트너와 협력하여 Android 기기의 모든 구성요소와 관련된 적절한 지원 계약을 수립합니다.
> * 최소한의 사용자 상호작용으로 보안 업데이트를 설치할 수 있도록 하여 사용자가 Android 기기에 업데이트를 수락 및 설치할 가능성을 높입니다. [원활한 시스템 업데이트](https://source.android.com/devices/tech/ota/ab?hl=ko) 또는 이와 동등한 보안 기능을 구현하는 것이 좋습니다.
> * [Android 보안 게시판](https://source.android.com/security/bulletin?hl=ko)에 선언된 Android SPL(보안 패치 수준)의 누적 요구사항을 이해해야 합니다. 예를 들어 2018-02-01 보안 패치 수준을 사용하는 기기는 이 보안 패치 수준과 관련된 모든 문제와 이전 보안 게시판에 보고된 모든 문제의 수정사항을 포함해야 합니다.

### 동적 커널 업데이트 <a href="#dynamic-kernel-updates" id="dynamic-kernel-updates"></a>

> 중요한 시스템 구성 요소는 동적으로 수정하면 안 됩니다. 동적 커널 업데이트가 긴급한 위협을 예방하는 데 도움이 된다는 연구가 있기는 하지만 현재로서는 예상 비용이 이점보다 큽니다. 대신 강력한 OTA 업데이트 방식을 구축하여 취약성 보호를 빠르게 배포하는 것이 좋습니다.

## 키 관리 <a href="#key-management" id="key-management"></a>

> 효과적인 키 관리 정책과 관행을 유지하여 서명 키의 보안을 보장하세요.
>
> * 외부 단체와 서명 키를 공유하지 않습니다.
> * 서명 키가 손상되면 새 키를 생성하고 향후의 모든 앱을 이중 서명합니다.
> * 다중 인증 액세스를 요구하는 보안 수준이 높은 모듈 하드웨어나 서비스에 모든 키를 보관합니다.

## 시스템 이미지 서명 <a href="#system-image-signing" id="system-image-signing"></a>

> 시스템 이미지 서명은 기기의 무결성을 파악하는 데 매우 중요합니다.
>
> * 공개적으로 알려진 키로 기기에 서명하지 않습니다.
> * 민감한 키 취급을 위한 업계 표준 관행(감사 가능한 제한적인 액세스를 제공하는 HSM(하드웨어 보안 모듈 포함)과 일치하는 방식으로 기기 서명 키를 관리합니다.

## 잠금 해제할 수 없는 부트로더 <a href="#unlockable-bootloaders" id="unlockable-bootloaders"></a>

> 다수의 Android 기기는 잠금 해제를 지원합니다. 따라서 기기 소유자가 시스템 파티션을 수정하거나 맞춤 운영체제를 설치할 수 있습니다. 일반적인 사용 사례로는 타사 시스템 이미지를 설치하거나 기기에서 시스템 수준 개발을 실행하는 경우 등이 있습니다. 예를 들어 Google Nexus 또는 Pixel에서 시스템 이미지를 잠금 해제하려면 사용자는 다음 메시지에 표시되는 `fastboot oem unlock`을 실행해야 합니다.

{% hint style="danger" %}
**부트로더를 잠금 해제하시겠습니까?**

부트로더를 잠금 해제하면 이 전화에 맞춤 운영체제 소프트웨어를 설치할 수 있습니다.

맞춤 OS는 원래 OS와 동일한 테스트를 거치지 않으며, 휴대전화, 그리고 설치된 앱이 더 이상 제대로 작동하지 않는 원인이 될 수도 있습니다.

또한 개인 정보에 무단으로 액세스하는 것을 방지하기 위해 부트로더를 잠금 해제하면 전화에서 모든 개인 정보가 삭제됩니다('초기화').

볼륨 크게/작게 버튼을 눌러 예 또는 아니요를 선택합니다. 그런 다음 전원 버튼을 눌러 다음 단계를 진행합니다.

**Yes**: 부트로더를 잠금 해제합니다(보증이 취소될 수 있음).

**No**: 부트로더를 잠금 해제하거나 전화를 다시 시작하지 않습니다.
{% endhint %}

> 잠금 해제할 수 있는 Android 기기는 잠금 해제 전에 모든 사용자 데이터를 안전하게 삭제하는 것이 좋습니다. 잠금 해제 시 모든 데이터를 제대로 삭제하지 않으면 물리적으로 근접한 공격자가 Android 사용자의 기밀 데이터에 무단으로 액세스하도록 허용할 수 있습니다. 사용자 데이터가 공개되지 않도록 하려면 잠금 해제를 지원하는 기기에 관련 기능을 제대로 구현해야 합니다.
>
> * 사용자가 잠금 해제 명령을 확인하면 기기에서 즉시 데이터 완전 삭제를 시작해야 합니다. `unlocked` 플래그는 보안 삭제가 완료될 때까지 설정하면 안 됩니다.
> * 보안 삭제를 완료할 수 없는 경우 기기는 잠금 상태를 유지해야 합니다.
> * 기본 블록 기기에서 지원한다면 `ioctl(BLKSECDISCARD)` 또는 이와 동등한 것을 사용해야 합니다. 삽입된 MultiMediaCard(eMMC) 기기의 경우 Secure Erase 또는 Secure Trim 명령어를 사용함을 의미합니다. eMMC 4.5 이상에서는 Sanitize 작업에 이어 일반적인 Erase 또는 Trim을 사용함을 뜻합니다.
> * `BLKSECDISCARD`를 기본 블록 기기에서 지원하지 않는다면 그 대신에 `ioctl(BLKDISCARD)`를 사용해야 합니다. eMMC 기기에서는 이것이 일반적인 Trim 작업입니다.
> * `BLKDISCARD`가 지원되지 않는다면 전부 0으로 블록 기기를 덮어쓰는 것도 허용됩니다.
> * 사용자는 파티션을 플래시하기 전에 사용자 데이터를 완전 삭제할 수 있어야 합니다. 예를 들어 Nexus 기기는 `fastboot oem lock` 명령어를 사용하여 사용자 데이터를 완전 삭제합니다.
> * 기기에서는 efuse 또는 유사 메커니즘을 통해 기기의 잠금 해제 또는 다시 잠금 여부를 기록할 수 있습니다. 그러나 부트로더를 후속 초기화로 다시 잠그면 기기의 전체 기능이 복원되는 것이 좋습니다.
>
> 이러한 요구사항을 통해 잠금 해제 작업 완료 시 모든 데이터가 제거됩니다. 이러한 보호 기능을 구현하지 못하면 [보통 수준의 보안 취약점](https://source.android.com/security/overview/updates-resources?hl=ko#severity)으로 간주됩니다.
>
> 잠금 해제된 장치는 `fastboot oem lock` 명령어를 사용하여 다시 잠금 처리할 수 있습니다. 부트로더를 잠금 처리하면 원래 기기 제조업체 OS에서 제공한 것과 동일한 사용자 데이터 보호 기능을 새로운 맞춤 OS에서도 사용할 수 있습니다. 예를 들어 기기가 다시 잠금 해제되면 사용자 데이터가 완전 삭제됩니다.

## 기기 펜테스팅 <a href="#device-pentesting" id="device-pentesting"></a>

> 기기는 배송 전에 자격을 갖춘 펜테스터에 의한 검토를 거쳐야 합니다. 펜테스팅으로 기기는 내부 OEM 보안 안내뿐만 아니라 여기에 명시된 보안 안내까지 준수했다고 입증받아야 합니다.

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}

{% embed url="<https://sul.skill.or.kr>" %}
보안 업데이트 정보 사이트&#x20;
{% endembed %}


# 앱 보안 권장사항(APP)

Andorid 사이트 참고

## 앱 보안 권장사항

> 이 섹션에는 Android 기기의 앱 보안을 보장하기 위한 권장사항이 포함되어 있습니다.

## 소스 코드 검토 <a href="#source-code-review" id="source-code-review"></a>

> 소스 코드 검토를 통해 이 문서에 설명된 문제를 비롯한 광범위한 보안 문제를 알아낼 수 있습니다. Android에서는 수동 및 자동 소스 코드 검토를 모두 실행할 것을 적극 권장합니다.
>
> * 적용 범위 확인을 위한 검토를 실시할 경우 다음과 같은 포괄적인 보안 지침을 따릅니다. 관련 있는 내부 또는 외부 표준을 활용하여 일관되고 완전한 검토가 이루어지도록 합니다.
> * Android SDK를 사용 중인 모든 앱 코드에 [Android 스튜디오 린터](https://developer.android.com/studio/write/lint?hl=ko)와 같은 린터를 실행하고 모든 식별된 문제를 수정합니다.
> * 버퍼 오버플로 및 하나 차이 오류와 같은 메모리 관리 문제를 감지할 수 있는 자동화된 도구를 사용하여 네이티브 코드를 분석합니다.
> * Android 빌드 시스템은 [AddressSanitizer](https://source.android.com/devices/tech/debug/asan?hl=ko) 및 [UndefinedBehaviorSanitizer](https://source.android.com/devices/tech/debug/sanitizers?hl=ko#undefinedbehaviorsanitizer) 등의 여러 LLVM 새니타이저를 지원합니다. 이러한 새니타이저는 메모리 관련 문제의 런타임 분석 용도로 사용할 수 있습니다. [libFuzzer](https://source.android.com/devices/tech/debug/libfuzzer?hl=ko)를 통해 Android에서 지원되는 퍼징과 결합할 경우 새니타이저는 추가적인 조사가 필요한 독특한 극단적 사례를 드러낼 수 있습니다.
> * 지식이 풍부한 보안 평가자가 암호법, 결제 처리 및 개인 식별 정보 처리처럼 위험이 높은 코드를 검토해야 합니다.

## 자동화된 테스트 <a href="#automated-testing" id="automated-testing"></a>

> 자동화된 테스트는 광범위한 보안 문제를 감지하는 데 도움이 될 수 있으며 정기적으로 실행해야 합니다.
>
> * 개발 프로세스 전반에 걸쳐 최신 버전의 [CTS](https://source.android.com/compatibility/cts?hl=ko)를 정기적으로 실행하여 조기에 문제를 감지하고 수정 시간을 단축합니다. Android에서는 하루에 여러 번 빌드되는 자동 빌드 프로세스에서 CTS를 지속적 통합의 일부로 사용합니다.
> * 잘못된 형식의 입력을 사용한 테스트(퍼징 테스트)를 비롯한 인터페이스 보안 테스트를 자동화합니다. Android의 빌드 시스템은 퍼징 테스트 작성을 위한 [libFuzzer](https://source.android.com/devices/tech/debug/libfuzzer?hl=ko)를 지원합니다.
>
> ### 취약점 스캔 <a href="#vulnerability-scanning" id="vulnerability-scanning"></a>
>
> 취약점 스캔은 사전 설치된 앱에 알려진 보안 취약점이 없는지 확인하는 데 도움을 줄 수 있습니다. 고급 감지 기능은 이러한 취약점을 해결하고 사용자와 기기에 미칠 위험을 예방하는 데 필요한 시간과 비용을 줄여줍니다.
>
> * 업계에서 인정하는 앱 취약성 스캔 도구를 사용하여 사전 설치된 모든 앱을 스캔하고 감지된 취약점을 해결합니다.

## 잠재적으로 위험한 애플리케이션 <a href="#phas" id="phas"></a>

> 기기에 사전 설치된 앱이 [잠재적으로 위험한 애플리케이션](https://developers.google.com/android/play-protect/phacategories?hl=ko)(PHA)이 아니어야 합니다. 기기에 포함된 모든 앱의 동작에 관한 책임은 본인에게 있습니다. 기기 실행 전에 사전 로드된 모든 앱의 취약점을 스캔해야 합니다.
>
> PHA 및 Play 스토어에서 Google이 이러한 앱을 차단하는 방법에 관한 자세한 내용은 [Google Play 프로텍트 개발자 문서](https://developers.google.com/android/play-protect/?hl=ko)를 참조하세요.

## 앱 설치 및 권한 <a href="#app-permissions" id="app-permissions"></a>

> 사전 설치된 앱에 과도한 권한이 부여되면 보안 위험이 생길 수 있습니다. 사전 설치된 앱의 권한을 필요한 최소 수준으로 제한하고 불필요한 권한에 액세스하지 않는지 확인하세요. 앱 권한은 [AndroidManifest.xml](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/AndroidManifest.xml)에 설명되어 있습니다.
>
> * 불필요한 권한을 사전 설치된 앱에 부여하지 않습니다. 아주 민감한 권한이 포함될 수 있으므로 시스템 권한이 있는 앱을 꼼꼼히 검토합니다.
> * 요청된 모든 권한이 특정 앱의 기능에 관련되고 필요한 것인지 확인합니다.
> * `INSTALL_PACKAGES` 권한을 사용하는 모든 사전 설치된 앱의 사용자 공개 정보가 있는지 확인합니다.
> * 개발자에게 앱을 UID 0으로 설치하지 않아야 하는 계약적 의무가 있는지 확인합니다.
> * 개발자의 네트워크를 통해 설치될 모든 앱의 매니페스트에서 선언된 권한을 평가합니다.
> * 앱을 기기에 게재하기 전에 개발자에게 [Google Safe Browsing API](https://developers.google.com/safe-browsing/?hl=ko)를 사용하여 자동 업데이터 및 설치 프로그램 앱의 모든 다운로드된 URL을 스캔해야 할 계약적 의무가 있는지 확인합니다.

## 앱 서명 <a href="#app-signing" id="app-signing"></a>

> 앱 서명은 기기 보안에서 중요한 역할을 하며 권한을 확인하고 소프트웨어를 업데이트하기 위한 용도로 사용됩니다. 앱 서명에 사용할 키를 선택할 때는 앱이 단일 기기에만 사용할 수 있는지, 아니면 여러 기기에 걸쳐 공용으로 사용할 수 있는지를 고려하는 것이 중요합니다.
>
> * 앱이 AOSP 개발자 키와 같은 공개적으로 알려진 키로 서명되지 않았는지 확인합니다.
> * 앱 서명에 사용된 키가 민감한 키 취급을 위한 업계 표준 관행(감사 가능한 제한적인 액세스를 제공하는 HSM(하드웨어 보안 모듈) 포함)과 일치하는 방식으로 관리되는지 확인합니다.
> * 앱이 플랫폼 키로 서명되지 않았는지 확인합니다. 플랫폼 키로 서명할 경우 매우 강력하고 운영체제 구성요소만 사용하도록 되어있는 플랫폼 서명 권한에 앱이 액세스할 수 있습니다. 시스템 앱은 독점 권한을 사용해야 합니다.
> * 패키지 이름이 같은 앱이 다른 키로 서명되지 않았는지 확인합니다. 이는 다른 기기의 앱을 구축하는 경우, 특히 플랫폼 키를 사용할 때 자주 발생합니다. 앱이 기기 독립형인 경우 여러 기기에 동일한 키를 사용하세요. 앱이 기기 전용인 경우 기기 및 키별로 고유한 패키지 이름을 생성하세요.

## 앱 및 프로세스 분리 <a href="#isolating-apps-and-processes" id="isolating-apps-and-processes"></a>

> Android [샌드박스 모델](https://source.android.com/security/app-sandbox?hl=ko)은 제대로 사용할 경우 앱 및 프로세스와 관련된 추가적인 보안 기능을 제공합니다.

### 루트 프로세스 분리 <a href="#isolating-root-processes" id="isolating-root-processes"></a>

> 루트 프로세스는 권한 에스컬레이션 공격의 가장 빈번한 표적이며 루트 프로세스 수를 줄이면 권한 에스컬레이션의 위험도 감소합니다.
>
> * 기기에서 최소로 필요한 코드를 루트로 실행하는지 확인합니다. 가능하다면 루트 프로세스가 아닌 일반 Android 프로세스를 사용하세요. 프로세스를 기기에서 루트로 실행해야 한다면 프로세스를 AOSP 기능 요청에 문서화하여 공개적으로 검토할 수 있습니다.
> * 가능한 경우 루트 코드는 신뢰할 수 없는 데이터로부터 분리해야 하며 IPC(프로세스 간 통신)를 통해 액세스해야 합니다. 예를 들어 루트 기능을 바인더를 통해 액세스 가능한 소규모 서비스로 축소하고 서명 권한이 있는 서비스를 권한이 낮거나 없는 앱에 노출시켜 네트워크 트래픽을 처리합니다.
> * 루트 프로세스는 네트워크 소켓에서 수신 대기하면 안 됩니다.
> * 루트 프로세스에는 자바 VM과 같은 범용 런타임을 포함하면 안 됩니다.

### 시스템 앱 분리 <a href="#isolating-system-apps" id="isolating-system-apps"></a>

> 일반적으로 사전 설치된 앱은 공유된 시스템의 고유 식별자(UID)로 실행되면 안 됩니다. 앱에서 시스템의 공유된 UID나 다른 권한이 있는 서비스(예: 휴대전화)를 사용해야 하는 경우 앱은 사용자가 설치한 타사 앱에 의해 액세스 가능한 어떠한 서비스, broadcast receiver 또는 콘텐츠 제공업체도 내보내면 안 됩니다.
>
> * 기기에서 최소로 필요한 코드를 시스템으로 실행하도록 합니다. 가능하다면 시스템 UID를 재사용하기보다는 자체 UID가 있는 Android 프로세스를 사용하세요.
> * 가능하다면 신뢰할 수 없는 데이터에서 시스템 코드를 분리하고 다른 신뢰할 수 있는 프로세스에만 IPC를 노출해야 합니다.
> * 시스템 프로세스는 네트워크 소켓에서 수신 대기하면 안 됩니다. 이는 CTS 요구사항입니다.

### 프로세스 분리 <a href="#isolating-processes" id="isolating-processes"></a>

> Android 애플리케이션 샌드박스는 루트 프로세스 및 디버거를 비롯한 시스템의 다른 프로세스로부터 분리가 예상되는 앱을 제공합니다. 앱과 사용자가 디버깅을 특별히 사용 설정하지 않는 한 이러한 예상을 위반하는 앱이 없어야 합니다.
>
> * 문서화된 Android 디버깅 메서드를 사용하지 않는 한 루트 프로세스가 개별 앱 데이터 폴더 내의 데이터에 액세스하지 않도록 합니다.
> * 문서화된 Android 디버깅 메서드를 사용하지 않는 한 루트 프로세스가 앱의 메모리에 액세스하지 않도록 합니다.
> * 다른 앱이나 프로세스의 데이터나 메모리에 액세스하는 어떠한 앱도 기기에 포함되지 않도록 합니다.

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}

{% embed url="<https://sul.skill.or.kr>" %}
보안 업데이트 정보 사이트&#x20;
{% endembed %}


# 네트워크 보안 권장사항(NETWORK)

Andorid 사이트 참고

## 네트워크 보안 권장사항

> 이 섹션에는 Android 기기의 네트워크 통신 보안을 확립하기 위한 권장사항이 포함되어 있습니다.

## 수신 소켓 보안 설정 <a href="#securing-listening-sockets" id="securing-listening-sockets"></a>

> 수신 소켓을 사용할 때는 주의가 필요합니다. 일반적으로는 기기에 수신 소켓이 열려있으면 안 되며, 이는 소켓이 원격 공격자가 기기에 쉽게 액세스할 수 있게 해주는 벡터 역할을 하기 때문입니다.
>
> * Android 기기는 기본적으로 또는 특히 부팅 시에 노출시키는 인터넷 수신 소켓의 수를 최소화해야 합니다. 기본적으로 부팅 시에는 인터넷을 수신하는 소켓이 없어야 합니다.
>   * 루트 프로세스 및 시스템 UID(고유 식별자)가 소유한 루트 프로세스는 어떠한 수신 소켓도 노출시키면 안 됩니다.
> * 수신 소켓은 OTA 업데이트 없이 사용 중지할 수 있어야 합니다. 이는 서버 또는 사용자 기기 설정 변경을 통해 실행할 수 있습니다.
> * 로컬 IPC를 사용하는 소켓의 경우 앱이 그룹으로 제한된 액세스 권한이 있는 UNIX 도메인 소켓을 사용해야 합니다. IPC의 파일 설명자를 생성하고 이를 특정 UNIX 그룹의 +RW로 지정합니다. 모든 클라이언트 앱은 이 UNIX 그룹 내에 속해야 합니다.
> * 여러 개의 프로세스를 가진 일부 기기(예: 앱 프로세서 별도의 라디오/모뎀)는 네트워크 소켓을 사용하여 프로세서 간에 통신합니다. 이러한 경우 프로세서 간 통신에 사용되는 네트워크 소켓은 분리된 네트워크 인터페이스를 사용하여 미승인 앱이 기기에 액세스하지 못하도록 해야 합니다(즉, iptable을 사용하여 다른 앱이 기기에 액세스하지 못하도록 방지).
> * 수신 포트를 처리하는 데몬은 잘못된 형식의 데이터에 강해야 합니다. 승인되지 않은 클라이언트를 사용하여 포트에 퍼즈 테스트를 실행해야 하며, 가능한 경우에는 승인된 클라이언트를 사용해야 합니다. 비정상 종료에 관한 후속 조치를 취하려면 버그를 신고합니다.
>
> [Android 호환성 테스트 모음](https://source.android.com/docs/core/tests?hl=ko)(CTS)에는 열린 수신 포트가 있는지 확인하기 위한 테스트가 포함되어 있습니다.

## ADB 사용 중지 <a href="#disable-adb" id="disable-adb"></a>

> ADB(Android 디버그 브리지)는 중요한 개발 및 디버깅 도구이지만 통제된 보안 환경에서 사용하도록 되어 있으며 일반 용도로 사용 설정하면 안 됩니다.
>
> * ADB가 기본으로 사용 중지되어 있는지 확인합니다.
> * ADB에서 사용자가 연결을 수락하기 전에 이를 사용 설정해야 하는지 확인합니다.

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}

{% embed url="<https://sul.skill.or.kr>" %}
보안 업데이트 정보 사이트&#x20;
{% endembed %}


# 하드웨어 보안 권장사항(HARDWARE)

Andorid 사이트 참고

## 하드웨어 보안 권장사항

> 이 페이지에는 Android 기기에 있는 하드웨어가 기기 보안을 위협하는 대신 기기의 전반적인 보안 수준을 높이는 데 기여하도록 하기 위한 권장사항이 포함되어 있습니다.

## 기기 메모리 <a href="#device-memory" id="device-memory"></a>

Android 기기의 메모리를 선택할 때는 잠재적인 보안 장단점을 이해하는 것이 중요합니다. 예를 들어 특정 유형의 메모리는 [Rowhammer](https://en.wikipedia.org/wiki/Row_hammer) 형식의 공격이 실행되도록 할 수 있습니다.

* Android 기기는 Rowhammer 형식의 공격에 대한 완화 기능이 포함되어 있는 메모리를 사용해야 합니다. 기기 제조업체는 메모리 제조업체와의 밀접한 협력을 통해 추가적인 세부정보를 확인해야 합니다.

## StrongBox Keymaster <a href="#strongbox-keymaster" id="strongbox-keymaster"></a>

> 기기에서 제공되는 암호화 키를 안전하게 보관하고 처리하는 것이 중요합니다. 이 경우 일반적으로 Android 기기에서 TEE(신뢰할 수 있는 실행 환경)와 같은 분리된 환경에 구현된 하드웨어 지원 Keymaster가 활용됩니다. 또한 변조 방지 하드웨어에 구현되는 [StrongBox Keymaster](https://developer.android.com/preview/features/security?hl=ko#hardware-security-module)도 지원하는 것이 좋습니다.
>
> * StrongBox Keymaster는 분리형 CPU, 보안 저장소, 고품질 순수 난수 생성기, 변조 방지 패키징 및 부채널 방지 기능을 갖춘 환경에서 실행해야만 StrongBox Keymaster로 승인받기 위한 요구사항을 충족할 수 있습니다. 요구사항에 관한 자세한 내용은 Android 9 CDD, 섹션 9.11.2를 참조하세요.

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}

{% embed url="<https://sul.skill.or.kr>" %}
보안 업데이트 정보 사이트&#x20;
{% endembed %}


# 개인정보 보호/보안 권장사항(PRIVAY)

Andorid 사이트 참고

## 개인정보 보호/보안 권장사항

> 이 페이지에는 Android 사용자가 데이터를 제대로 관리할 수 있도록 하기 위한 데이터 수집 가이드 및 권장사항 모음이 포함되어 있습니다.

## 데이터 로깅 <a href="#logging-data" id="logging-data"></a>

> 데이터를 로깅하면 데이터의 노출 위험이 증가하고 시스템 성능은 저하됩니다. 민감한 사용자 데이터를 로깅한 결과로 공공 보안 사고가 여러 차례 발생했습니다.
>
> * SD 카드에 로깅하지 않습니다.
> * 앱 또는 시스템 서비스는 민감한 정보를 포함할 수 있는 타사 앱에서 제공하는 데이터를 로깅하면 안 됩니다.
> * 앱의 핵심 기능을 굳이 제공해야 하지 않는 이상 앱은 개인 식별 정보(PII)를 정상 작업의 일부로 로깅해서는 안 됩니다.
>
> CTS에는 로그에 민감할 수 있는 정보가 있는지 확인하는 테스트가 있습니다.

## 측정항목 수집 <a href="#metrics-collection" id="metrics-collection"></a>

> 측정항목 수집은 앱 사용량을 이해하고 전반적인 사용자 경험을 개선하기 위한 중요한 부분일 수 있습니다. 하지만 너무 광범위한 측정항목 수집 역시 사용자 개인정보 보호에 위험을 야기할 수 있습니다.
>
> * 측정항목은 가능한 한 수집하지 않는 것이 좋습니다.
>   * 측정항목을 수집해야 하는 경우에는 먼저 명시적이고 정보에 입각한 의미있는 사용자 동의를 요청해야 합니다.
> * 몇 가지 예외를 제외하고는 서비스의 신뢰성을 지원하는 데 필요한 측정항목만 수집합니다.
> * [하드웨어 식별자](https://developer.android.com/training/articles/user-data-ids?hl=ko)와 같은 식별 가능하거나 민감할 수 있는 데이터는 가능한 한 수집하지 않는 것이 좋습니다.
> * 데이터가 충분히 집계되었는지 확인하고 가능한 한 익명처리합니다.

## 스파이웨어 <a href="#spyware" id="spyware"></a>

> 스파이웨어는 사용자가 모르게 사용자나 기기에 관한 정보를 수집하는 데 목적을 두고 사용자 정보를 동의없이 다른 단체에 전송할 수 있는 소프트웨어로 정의됩니다.
>
> * 고지 없이 또는 사용자가 예상치 못한 방식으로 다음과 같은 사용자 또는 기기 데이터를 전송할 경우 스파이웨어로 간주합니다(이 목록에는 주요 예시가 포함되어 있지만 전체 목록은 아님).
>   * 사용자 연락처 정보(이름, 전화번호, 이메일)
>   * 사진 또는 기타 파일
>   * 사용자 이메일의 내용
>   * 통화 기록
>   * SMS 기록
>   * 웹 기록
>   * 브라우저 북마크
>   * 다른 앱의 비공개 정보(비공개 `/data/` 디렉터리)
>   * 오디오 또는 통화 녹음
>   * 비밀번호
>   * OAuth 토큰
>   * 위치
> * 모든 앱은 설치 전에 사용자에게 적절한 설명을 고지해야 합니다.

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}

{% embed url="<https://sul.skill.or.kr>" %}
보안 업데이트 정보 사이트&#x20;
{% endembed %}


# 피싱 사이트 확인 하는 방법

피싱 사이트 확인 하는 방법

## **피싱 사이트 확인 하는 방법**

아무생각 없이 메일이나 문자로 URL 을 눌렀을때 애매한 도메인인 경우 찜찜한 느낌을 감출 수 없을 것입니다.

저도 애매하게 도메인을 누르고 확인 한게 한두번이 아니라서요.

그래서 찾아 보니 외국에서 PhshTank 라는 사이트에서 피싱 여부를 확인 해 주네요.

확실한 피싱과 아직 알려지지 않은 피싱을 검색해 줍니다.

### **Site 바로가기 :** [**https://www.phishtank.com/**](https://www.phishtank.com/)

홈페이지에 들어가면 ""Found a Phishing Site?"" 에 도메인을 입력 하고 엔터를 눌러 주면 아래와 같은 결과를 보여줍니다.

<figure><img src="https://blog.kakaocdn.net/dn/c26UVI/btrNbZgude1/K5RFwMHNDY0kaxOkaPb8gk/img.png" alt=""><figcaption></figcaption></figure>

엔터 또는 ""Is it a phish?"" 을 클릭 하면 아래와 같이 결과를 보여 줍니다.

<figure><img src="https://blog.kakaocdn.net/dn/bj0HuV/btrNeHypOut/5qFLUACtFCmukyqRqk07ek/img.png" alt=""><figcaption></figcaption></figure>

여기에서 ""Screenshot of site :: 사이트 스크린샷"", ""View site in frame :: 프레임에서 사이트 보기"", ""View technical details :: 기술 세부 정보""를 볼 수 있습니다.

* **""Screenshot of site :: 사이트 스크린샷""** 은 해당 사이트를 스크린해 온 이미지 입니다.

<figure><img src="https://blog.kakaocdn.net/dn/mQ9ql/btrNcBeRj0R/4jwJ39qDnukHw6wvFXkTwK/img.png" alt=""><figcaption></figcaption></figure>

* **"View site in frame :: 프레임에서 사이트 보기""** 은 해당 사이트를 접속하는 화면입니다. 접속하시면 피해가 갈 수 있으니 조심하시기 바랍니다.

<figure><img src="https://blog.kakaocdn.net/dn/qYGGm/btrNdTy6rpU/CxNbfuNouGLwZzDo30APkK/img.png" alt=""><figcaption></figcaption></figure>

* **"View technical details :: 기술 세부 정보""** 은 해당 사이트를 스크린해 온 이미지 입니다.

<figure><img src="https://blog.kakaocdn.net/dn/bFwEeG/btrNcz2o9cK/7QkQrMBoTKt6x4EdaZ6ar1/img.png" alt=""><figcaption></figcaption></figure>

피해가 가기전에 피싱 사이트를 신고 하시기 바랍니다.

### **KISA 바로가기(피싱ㆍ스미싱 사고) :** [**https://www.krcert.or.kr/consult/phishing.do**](https://www.krcert.or.kr/consult/phishing.do)

피해가 없으시길 바랍니다.

<br>

\#피싱 #피싱 사이트 #피싱 사이트 확인 #phishtank #phishtank 사용법 #피싱 확인 # 피싱ㆍ스미싱 사고 #피싱신고 #스미싱신고


# \[Youtube] succulent

Youtube

### 취미 생활로 하고 있는거에요.

## Youtube : [바로가기](https://www.youtube.com/channel/UCJPsXdhcSLsf49CWNaHtnFA)

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트&#x20;
{% endembed %}

{% embed url="<https://sul.skill.or.kr>" %}
보안 업데이트 정보 사이트
{% endembed %}


# TEST-1 Page

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

Security Site

<https://github.com/Hack-with-Github/Awesome-Hacking>

<https://github.com/qazbnm456/awesome-web-security>

<https://www.youtube.com/watch?v=R-17jY00lIQ>


# TEST Page

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

<https://getbootstrap.com/docs/5.0/utilities/spacing/>

<https://tcpschool.com/css/intro>

<https://developer.mozilla.org/ko/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout>

<https://www.colorzilla.com/gradient-editor/>

> sudo apt-get install mariadb-server
>
> CREATE DATABASE redmine CHARACTER SET utf8mb4;
>
> GRANT ALL PRIVILEGES ON redmine.\* TO 'redmine'@'localhost' IDENTIFIED BY 'redmine-123'; FLUSH PRIVILEGES;
>
> sudo apt-get install apache2 libapache2-mod-passenger
>
> sudo apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev libsqlite3-dev
>
> sudo apt-get install redmine redmine-mysql
>
> PassengerDefaultUser www-data PassengerRoot /usr/lib/ruby/vendor\_ruby/phusion\_passenger/locations.ini PassengerDefaultRuby /usr/bin/ruby
>
> rvm use ruby-2.6.0\@rails5.2.2 --create
>
> sudo ln -s /usr/share/redmine/public /var/www/html/redmine
>
> vi /etc/apache2/sites-available/redmine.conf
>
> vi /etc/apache2/sites-available/000-default.conf CustomLog ${APACHE\_LOG\_DIR}/access.log combined  RailsBaseURI /redmine PassengerResolveSymlinksInDocumentRoot on
>
> $ sudo touch /usr/share/redmine/Gemfile.lock
>
> $ sudo chown www-data:www-data /usr/share/redmine/Gemfile.lock
>
> sudo apt-get install graphicsmagick-libmagick-dev-compat libmagickcore-dev libmagickwand-dev
>
> sudo apt-get install libmagickwand-dev imagemagick
>
> > CREATE DATABASE redmine CHARACTER SET utf8mb4;
> >
> > GRANT ALL PRIVILEGES ON redmine.\* TO 'redmine'@'localhost' IDENTIFIED BY 'redmine-123';
> >
> > FLUSH PRIVILEGES;
> >
> > apt-get install ruby ruby-dev gem
> >
> > sudo apt-get install apache2 libapache2-mod-passenger
> >
> > sudo vi /etc/apache2/mods-available/passenger.conf
> >
> > PassengerDefaultUser www-data
> >
> > sudo ln -s /usr/share/redmine/public /var/www/html/redmine
> >
> > sudo vi /etc/apache2/sites-available/redmine.conf
> >
> > apt-get install libmysqlclient-dev gem install mysql2 -v '0.5.3'
> >
> > /usr/local/lib/ruby/gems/2.6.0/gems/passenger-6.0.10/bin/passenger
>
> \*\* plugin 추가 :&#x20;
>
> ```
> bundle exec rake redmine:plugins:migrate RAILS_ENV=production
> ```

> ">\<svg/onload=alert(1)>
>
> ">\<svg/onload=alert(document.cookie)>
>
> ">\<svg/onload=alert(document.session)>
>
> ">\<svg/onload=alert(window\.cookie)>
>
> ">\<svg/onload=alert(document.domain)>
>
> ">\<svg/onload=alert(document.origin)>
>
> ">\<iframe id="result" sandbox="allow-scriopts allow-modals"\</iframe>
>
> \<script>console.log("xsstest:"+window\.origin)\</script>
>
> test"/>
>
> test"/>alert(document.cookie)
>
> \="" onmouseover="alert('moitest')
>
> \="" onMouseOver="alert('moitest')
>
> \<P onmouseover=alert(document.cookie);moitest\</P>
>
> ">\</a> ![](http://test.go.kr)

> docker run -p 80:9000 -d --name some-mariadb -e MARIADB\_ROOT\_PASSWORD=project-admin123 -e MARIADB\_DATABASE=yona -e MARIADB\_USER=yona -e MARIADB\_PASSWORD=yonadan mariadb:10.3
>
> docker run -p 80:9000 -d --name yona -e MARIADB\_ROOT\_PASSWORD=project-admin123 mariadb:10.3
>
> apt update apt install -y git vim wget openjdk-8-jdk unzip
>
> mysql -u root -p create user 'yona'@'localhost' IDENTIFIED BY 'project-yona123'; create database yona DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4\_bin ; GRANT ALL ON yona. *to 'yona'@'localhost'; GRANT ALL ON yona.* to 'yona'@'127.0.0.1'; GRANT ALL PRIVILEGES ON *.* TO 'yona'@'localhost' WITH GRANT OPTION; FLUSH privileges;
>
> mysql -u yona -p'yonadan' use yona
>
> 사용자 권한 확인 ---- 확인 할것....

##

##

##

## Amazon Web Service Simple monthly Calculator&#x20;

* <https://calculator.s3.amazonaws.com/index.html>

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Me9-b5CkhuxeSyeuSI0%2F-Me93rIF1S5DoqrITc_U%2Fimage.png?alt=media\&token=ac0592e1-e697-426d-b75e-ecec4a375b53)

## AWS 모든 서비스 리전에 대한 왕복 시간을 표시

* <https://clients.amazonworkspaces.com>

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Me96oMZHXFALOxhUvgX%2F-MeOSVgclOQ-MTgGeOwm%2Fimage.png?alt=media\&token=197fe428-aef4-4cad-b08e-3c859508caaa)

## NHN Cloud Calculator&#x20;

* <https://www.toast.com/kr/pricing/calculator>

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Me93tLTYQ9Xg7eN10dq%2F-Me94TDxlYyW71VkXmRB%2Fimage.png?alt=media\&token=f3df3939-bad8-482a-8d6a-c1d65cb0bea5)

* 접속 시간 TEST Site
  * <https://www.dotcom-tools.com/website-speed-test>

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Me8z55O0L4KjQMyyUR0%2F-Me9-DatWXCdJ8eVBTut%2Fimage.png?alt=media\&token=92f6d5ee-6a0e-43b9-b528-1dfdf0c4c317)

![](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MXjvaK4Gw77FbwOuHWJ%2F-Me8z55O0L4KjQMyyUR0%2F-Me8zziesvKVr8P1GZy4%2Fimage.png?alt=media\&token=292adf21-5ca6-4baf-9930-ede5ae61b3e5)

* 성능 테스트
  * apache2-utils 를 설치
    * ab -n 10000 -c 10 <http://google.com/>

{% code title="Apache Bench 사용법" %}

```
# ab -n 1000 -c 10 http://doc.skill.or.kr/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking doc.skill.or.kr (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        cloudflare
Server Hostname:        doc.skill.or.kr
Server Port:            80

Document Path:          /
Document Length:        0 bytes

Concurrency Level:      10
Time taken for tests:   2.515 seconds
Complete requests:      1000
Failed requests:        351
   (Connect: 0, Receive: 0, Length: 351, Exceptions: 0)
Non-2xx responses:      1000
Total transferred:      277068 bytes
HTML transferred:       5616 bytes
Requests per second:    397.66 [#/sec] (mean)
Time per request:       25.147 [ms] (mean)
Time per request:       2.515 [ms] (mean, across all concurrent requests)
Transfer rate:          107.60 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        5    8   1.6      8      18
Processing:     9   17   5.5     15      55
Waiting:        9   16   5.4     15      54
Total:         16   25   5.5     23      62

Percentage of the requests served within a certain time (ms)
  50%     23
  66%     26
  75%     27
  80%     28
  90%     31
  95%     35
  98%     40
  99%     43
 100%     62 (longest request)
```

{% endcode %}

{% code title="Apache Bench 옵션 " %}

```bash
# ab
ab: wrong number of arguments
Usage: ab [options] [http[s]://]hostname[:port]/path
Options are:
    -n requests     Number of requests to perform
    -c concurrency  Number of multiple requests to make at a time
    -t timelimit    Seconds to max. to spend on benchmarking
                    This implies -n 50000
    -s timeout      Seconds to max. wait for each response
                    Default is 30 seconds
    -b windowsize   Size of TCP send/receive buffer, in bytes
    -B address      Address to bind to when making outgoing connections
    -p postfile     File containing data to POST. Remember also to set -T
    -u putfile      File containing data to PUT. Remember also to set -T
    -T content-type Content-type header to use for POST/PUT data, eg.
                    'application/x-www-form-urlencoded'
                    Default is 'text/plain'
    -v verbosity    How much troubleshooting info to print
    -w              Print out results in HTML tables
    -i              Use HEAD instead of GET
    -x attributes   String to insert as table attributes
    -y attributes   String to insert as tr attributes
    -z attributes   String to insert as td or th attributes
    -C attribute    Add cookie, eg. 'Apache=1234'. (repeatable)
    -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
                    Inserted after all normal header lines. (repeatable)
    -A attribute    Add Basic WWW Authentication, the attributes
                    are a colon separated username and password.
    -P attribute    Add Basic Proxy Authentication, the attributes
                    are a colon separated username and password.
    -X proxy:port   Proxyserver and port number to use
    -V              Print version number and exit
    -k              Use HTTP KeepAlive feature
    -d              Do not show percentiles served table.
    -S              Do not show confidence estimators and warnings.
    -q              Do not show progress when doing more than 150 requests
    -l              Accept variable document length (use this for dynamic pages)
    -g filename     Output collected data to gnuplot format file.
    -e filename     Output CSV file with percentages served
    -r              Don't exit on socket receive errors.
    -m method       Method name
    -h              Display usage information (this message)
    -I              Disable TLS Server Name Indication (SNI) extension
    -Z ciphersuite  Specify SSL/TLS cipher suite (See openssl ciphers)
    -f protocol     Specify SSL/TLS protocol
                    (SSL2, TLS1, TLS1.1, TLS1.2 or ALL)
    -E certfile     Specify optional client certificate chain and private key
```

{% endcode %}

kubectl create namespace test

kubectl create deployment nginx --image nginx --namespace test kubectl create deployment httpd --image httpd --namespace test

kubectl expose deployment nginx --port 80 --target-port 80 --type LoadBalancer --namespace test --load-balancer-ip 133.186.153.62

kubectl delete service nginx --namespace test

supported values: "ClusterIP", "ExternalName", "LoadBalancer", "NodePortㄱ 시"

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: http-echo
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
        image: hashicorp/http-echo
        args: ["-text", "hello-world"]
        ports:
        - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: http-echo
  annotations:
    loadbalancer.openstack.org/keep-floatingip: "true"
spec:
  ports:
  - port: 5678
    protocol: TCP
    targetPort: 5678
  selector:
    app: http-echo
  loadBalancerIP: 133.186.215.195
  type: LoadBalancer



#####  annotations:    ## 오브젝트 선언형 관리 
#####    loadbalancer.openstack.org/keep-floatingip: "true"    ## 구성    
#####  loadBalancerIP: 133.186.215.195
#####  type: LoadBalancer
```

참고 : <https://kubernetes.io/ko/docs/tasks/manage-kubernetes-objects/declarative-config/>

#### 4. 명령어를 이용하여 간단하게 등록 해 보자.

> nginx 서비스를 LoadBalancer 의 공인IP 설

```
# test namespace create
$ kubectl create namespace test
namespace/test created

# test namespace nginx deployment create
$ kubectl create deployment nginx --image nginx --namespace test
deployment.apps/nginx created

# nginx deployment 외부에서 접속 가능한 네트워크 생성 (LoadBalancer Service:80, IP:133.186.153.62)
$ kubectl expose deployment nginx --port 80 --target-port 80 --type LoadBalancer --namespace test --load-balancer-ip 133.186.153.62
service/nginx exposed

# nginx LoadBalancer service 확인 
# 웹 브라우저에서 해당 EXTERNAL -IP 접속     
ubuntu@kube-manager:~$ kubectl get service --namespace test
NAME    TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
nginx   LoadBalancer   10.254.249.48   133.186.153.62   80:30905/TCP   6m28s
```

nginx (<https://hub.docker.com/_/nginx>) + tomcat (<https://hub.docker.com/_/tomcat>) + mariadb (<https://hub.docker.com/_/mariadb>) or cubrid (<https://hub.docker.com/r/cubrid/cubrid>)

#### nginx

```
web:
  image: nginx
  volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf:ro
  command: [nginx-debug, '-g', 'daemon off;']
```

#### nginx docker&#x20;

```
$ docker run --name nginx -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -v /some/content:/usr/share/nginx/html:ro -d -p 8080:80 -p 443:443 nginx
===================================================
$ docker run --name tmp-nginx-container -d nginx
$ docker cp tmp-nginx-container:/etc/nginx/nginx.conf /host/path/nginx.conf
$ docker rm -f tmp-nginx-container
====================================================
```

#### nginx docker-compose.yml

```
web:
  image: nginx
  volumes:
   - ./templates:/etc/nginx/templates
  ports:
   - "8080:80"
  environment:
   - NGINX_HOST=foobar.com
   - NGINX_PORT=80
```

#### Tomcat

```
$ docker run -it --rm tomcat:9.0
$ docker run -it --rm -p 8888:8080 tomcat:9.0
```

#### tomcat docker-compose.yml

```
  tomcat:
    image: tomcat:10.0.5-jdk8-openjdk
    container_name: tomcat
    restart: always
    # volumes:
    #   - "./tomcat_src_conf/conf/catalina.properties:/usr/local/tomcat/conf/catalina.properties"
    #   - "./tomcat_src_conf/conf/logging.properties:/usr/local/tomcat/conf/logging.properties"
    #   - "./tomcat_src_conf/conf/server.xml:/usr/local/tomcat/conf/server.xml"
    #   - "./tomcat_src_conf/conf/web.xml:/usr/local/tomcat/conf/web.xml"
    #   - "./tomcat_src_conf/webapps:/usr/local/tomcat/webapps"
    links:
      - mariadb
    ports:
      - 8080:8080
```

#### mariadb

```
$ docker run -p 127.0.0.1:3306:3306  --name some-mariadb -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb:tag

$ docker network create some-network # Create the network
$ docker run --net some-network --name some-mariadb -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb:tag

$ docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

```

#### mariadb docker-compose.yml

```
# Use root/example as user/password credentials (https://hub.docker.com/_/mariadb)
version: '3.1'

services:

  mariadb:
    image: mariadb:10.4.18
    container_name: mariadb
    restart: always
#    command: mysqld --innodb-buffer-pool-size=20M
#    volumes:
#      - "./mariadb:/var/lib/mysql:rw"
#      - "./conf:/etc/mysql"
    environment:
      - "MYSQL_DATABASE=wp"
      - "MYSQL_USER=wp"
      - "MYSQL_PASSWORD=wp123"
      - "MYSQL_ROOT_PASSWORD=wordpress123"
#      - "WSREP_CLUSTER_ADDRESS=gcomm://192.168.11.253,192.168.11.7,192.168.11.26"
#      - "WSREP_PROVIDER_OPTIONS=ist.recv_addr=192.168.11.253"
#      - "WSREP_NODE_NAME=db1"
#      - "WSREP_NODE_ADDRESS=192.168.11.253"
#      - "WSREP_SST_AUTH"
#      - "WSREP_SST_METHOD=xtrabackup-v2"
    ports:
      - "3306:3306"
      - "4567:4567"
      - "4568:4568"
      - "4444:4444"
#    mem_limit: 3g
#    cpuset: 0,1
```

#### cubrid

{% code title="Start Containers for Broker and DB Server" %}

```
#Start a Server instance as follows:
docker run -d -e 'CUBRID_COMPONENTS=SERVER' --name server-container-name cubrid:tag

#And Start a Broker instance as follows:
docker run -d -e 'CUBRID_COMPONENTS=BROKER' -e 'CUBRID_DB_HOST=cubrid_server' -e 'CUBRID_DB=dbname' --name broker-container-name --link cubrid_server:server-container-name cubrid:tag
```

{% endcode %}

```
#Create a isolated network for HA
docker network create --driver bridge cubrid_ha_net

#Start a Master instance (with Broker) as follows:
docker run -d --net=cubrid_ha_net -e 'CUBRID_COMPONENTS=HA' -e 'CUBRID_DB_HOST=master:slave' -e 'CUBRID_DATABASE=db' --hostname master --name master cubridkr/cubrid:10.2.0.8797

#Start a Slave instance (with Broker) as follows:
docker run -d --net=cubrid_ha_net -e 'CUBRID_COMPONENTS=HA' -e 'CUBRID_DB_HOST=master:slave' -e 'CUBRID_DATABASE=db' --hostname slave --name slave cubridkr/cubrid:10.2.0.8797

#The following command runs a cubrid command inside an existing master container instance:
docker exec -it master
su cubrid 
cubrid hb status
```

{% code title="CUBRID HA 시작 및 확인" %}

```
# CUBRID HA 시작(마스터 노드)
[master]$ cubrid heartbeat start

# CUBRID HA 시작(슬레이브 노드)
[slave]$ cubrid heartbeat start

# CUBRID HA 상태 확인(각 노드)
[master]$ cubrid heartbeat status
[slave]$ cubrid heartbeat status

# CUBRID HA 상태 확인(각 노드)

[master]$ cubrid changemode db@localhost
The server 'db@localhost''s current HA running mode is active.
[slave]$ cubrid changemode db@localhost
The server 'db@localhost''s current HA running mode is standby.
```

{% endcode %}

{% code title="CUBRID HA 동작 여부 확인" %}

```
# 마스터 노트
[master]$ csql -u dba db@localhost -c "create table abc(a int, b int, c int, primary key(a));"
[master]$ csql -u dba db@localhost -c "insert into abc values (1,1,1);"

# 슬래이브 노
[slave]$ csql -u dba db@localhost -l -c "select * from abc;"
=== <Result of SELECT Command in Line 1> ===
<00001> a: 1
        b: 1
        c: 1
```

{% endcode %}

{% code title="브로커 설정, 시작 및 확인" %}

```
[master]$ cubrid broker start
@ cubrid broker start
++ cubrid broker start: success

[master]$ cubrid broker status
@ cubrid broker status
% testdb_RWbroker
---------------------------------------------------------
ID   PID   QPS   LQS PSIZE STATUS
---------------------------------------------------------
 1  9532     0     0  48120  IDLE
```

{% endcode %}

3tier 구성하기

httpd + tomcat + mysql 설정

#### httpd 설

apt update && apt install httpd && systemctl start httpd.service

web root : /var/www/html        &#x20;

httpd log Directory : /var/log/httpd

\--- httpd.conf 설정

```
Includ conf.modules.d/*.conf
LoadModule Proxy_module modules/mod_proxy.so
LoadModule Proxy_connect_module modules/mod_proxy_connect.so
LoadModule Proxy_http_moduel modules/mod_proxy_http.so

.....

<VirtualHost *:80>
    ProxyRequests On
    ProxyPreserveHost On
    
    <Proxy *>
        Order deny,allow
        Allow from all
        SerEnv force-proxy-request-1.0.1
        SetEne proxy-nokeepalive 1
        SetEnv Proxy-initial-not-pooled 1
    </Proxy>
    
    ProxyPass "/servlet/" "http://이동할서버IP:Port/" ttl=60
    ProxyPassMatch "^/.*\.(jsp|do)$" "http://이동할서버IP:Port/"
    
    Timeout 120
</VirtualHost>
```

httpd log : tail -f access\_log

/var/www/html/default.html

\----- web1 server

```
<html>
<head>
<title> test httpd 01 server </title>
<body> httpd start (web1) </body>
</html>
```

\---- web2 server&#x20;

```
<html>
<head>
<title> test httpd 02 server </title>
<body> httpd start (web2) </body>
</html>
```

\--- db 연결 페이지 (web1/2 포함)

```
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%
<%@ page import="java.sql.*"%>
<h2> jdbc driver test 1 </h2>

<%
    Connection conn=null;
    try{
        String jdbUrl="jdbc:mysql://testdb-dns-name/database-name>";
        String dbId="user-name";
        String dbPass="user-password";
        
        Class.forName("com.mysql.jdbc.Driver");
        conn=DriverManager.getConnection(jdbcUrl,dbId,dbPass);
        out.println("was01-db connect sussess");
    }catch(Exception e){
        e.printStackTrace();
    }
%>
```

apache 재시작&#x20;

systemctl restart httpd.service

#### tomcat 설

apt update && apt install openjdk && apt install tomcat

service tomcat start

tomcat log Directory : /usr/local/tomcat/logs

web root : /usr/local/tomcat/webapps/ROOT/default.jsp

\--- tomcat1 server

```
<%@ page contentType="text/html; chareset=UTF-8"%>
<html>
<head>
<title> Test Tomcat 01 </title>
<body>
    tomcat test(was1)
    now_time : <%= new java.util.Date()%>
</body>
</html>
```

\--- tomcat2 server

```
<%@ page contentType="text/html; chareset=UTF-8"%>
<html>
<head>
<title> Test Tomcat 02 </title>
<body>
    tomcat test(was2)
    now_time : <%= new java.util.Date()%>
</body>
</html>
```

service tomcat restart

#### mysql

apt update && apt install mysql


# 2023 Year IP Addr List

한국인터넷정보센터.한국 참고

2023 년도 국가별 IP 대역 리스트 입니다.&#x20;

참고 하시기 바랍니다.

{% file src="/files/yslqXKRosrUPmndm3Bsi" %}
2023년도 국가별 IP 현황
{% endfile %}

{% embed url="<https://doc.skill.or.kr>" %}
NHN Cloud 정보 사이트
{% endembed %}

{% embed url="<https://sul.skill.or.kr>" %}
보안 업데이트 정보 사이트
{% endembed %}


