# 빠른 개발을 위한 docker 활용법(5분 완성)

{% 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)](/files/-MYcnfN3vUp5eINxRmY7)

### 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 실행](/files/-MYJnvL229mI2sC9yFQk)
{% 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 중지](/files/-MYJoldgk8AL9PX_iLFY)
{% 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 재시작](/files/-MYMqF3zMdGHHKwquujW)
{% endtab %}
{% endtabs %}

### Step 4. WordPress 접속 및 설정     &#x20;

{% tabs %}
{% tab title="1. wordpress 접속" %}

```
크롬에서 localhost:8080 으로 접속   
wordpress 셋팅 후 사용   
```

![그림. 크롬으로 localhost:8080 접속 화면](/files/-MYMsknWMlwRduND5sFG)
{% 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 상태 정보](/files/-MYItwUQvSr7yn3oD3Ss)
{% 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 연결 설정 방법](/files/-MYIvEl_BrFJizJc2pnd)
{% endtab %}

{% tab title="3. slave-db 연결 상태 확인" %}

```bash
docker exec -it slave-db /bin/bash
mysql -u root -p
mysql> SHOW SLAVE STATUS\G
```

![그림. Slave 연결 상태 확인](/files/-MYIyTlCNsegK7xScmXC)
{% 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;
```

![](/files/-MYJ0xH0GX5J8wlsxjoU)
{% endtab %}

{% tab title="2. slave-db Replication 데이터 확인" %}

```bash
$ mysql -u root -p
mysql> use user001db; 
mysql> select * from user001table;
```

![](/files/-MYJ1KYfbl_tRlquw5eq)
{% endtab %}

{% tab title="3. slave-db 에서 slave 상태 확인" %}

```bash
$ mysql -u root -p
mysql> SHOW SLAVE STATUS\G 
mysql> select * from user001table;
```

![](/files/-MYJ1jNBApPZfYsjJ7Dc)
{% 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
```

![](/files/-MYJ9yobeGlFp0YOmC-U)
{% endtab %}

{% tab title="3. slave-db 확인 방법" %}

```bash
docker exec -it slave-db /bin/bash
mysql -u root -p
SHOW SLAVE STATUS\G
```

![](/files/-MYJ9a3Xl94IjI-CuJyh)
{% 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
```

![](/files/-MYJAV4oKC2vGuJat6Wq)
{% 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 확인](/files/-MYcSxuBFCIId_5kBqOj)
{% endtab %}

{% tab title="2. TensorFlow 크롬 접속" %}

```
Docker 로그를 통해 token 을 이용하 크롬에 접속  
```

![그림. docker 로그를 통해 URL 접속 ](/files/-MYcTNHXfmnMfivxn6gX)
{% endtab %}

{% tab title="3. Jupyter 접속 화면" %}

```
크롬에 URL 을 정상적으로 입력 하면 아래와 같은 화면을 볼 수 있음 
```

![그림. 정상적으로 접속 된 화면](/files/-MYcTpKfW5W53JaRHgxK)
{% endtab %}
{% endtabs %}

### Step 5. TensorFlow 실행 및 저장     &#x20;

{% tabs %}
{% tab title="1. Jupyter tutorial 리스트" %}

```
크롬 localhost:8888 접속 후 tensorflow-tutorials 폴더 확인
```

![그림. TensorFlow Tutorial 목록 확인   ](/files/-MYnYJOn28yefWgheslt)
{% endtab %}

{% tab title="2. Jupyter tutorial 실행" %}

```
ipynb 파일 클릭 후 아래와 같이 확인
상단에 Run or restart 버튼을 클  
```

![그림. Jupyter 실행 및 중지/재시작](/files/-MYccDaxUrrfGn1dqxAO)

&#x20;
{% endtab %}

{% tab title="3. Jupyter tutorial 업로드" %}

```
Main 화면에서 Upload 버튼 클릭 후 파일 선택  
업로드 후에 2번과 같이 진행    
```

![그림. ipynb 파일 업로드](/files/-MYcczq6P-Xw_gi-2eeG)
{% endtab %}

{% tab title="4. Jupyter tutorial 결과 및 저장" %}

```
진행 결과 확인 
결과 확인(Running) 및 파일 저장(File > Save as)     
```

![그림. Running 탭에서 진행 결과 확인     ](/files/-MYcda9qUqmKJSGT8yJW)

![그림. 결과 파일 저장(File -> Save as)     ](/files/-MYceyGZASsVhxKkNq4b)

![그림. 저장 파일은 로컬시스템 및 가상화 시스템 경로 확인    ](/files/-MYcfVgLaWBy-lPwY43k)
{% 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 페이지](/files/-MYllF9DSVqP6zGDCxUU)
{% endtab %}

{% tab title="2. Hadoop Cluster 확인 " %}

```
 크롬으로 localhost:8088 접속
```

![그림. Hadoop Cluster 페이지  ](/files/-MYlmXPh7KgiqpcdISVT)
{% endtab %}

{% tab title="3. Hadoop Dfshealth 확인  " %}

```
 크롬으로 localhost:50070 접속
```

![그림. Hadoop dfshealth 페이지 ](/files/-MYln3zvMpaqBm5dDrgH)
{% endtab %}

{% tab title="4. Hadoop Datanode 확인 " %}

```
크롬으로 localhost:50075 접속 
```

![그림. Hadoop datanode 페이지 ](/files/-MYlnRSZEaBCbha9hqq3)
{% endtab %}

{% tab title="5. Hadoop Status 확인" %}

```
크롬으로 localhost:50090 접속 
```

![그림. Hadoop status 페이지 ](/files/-MYlnjhWw5yKRaGpjL5m)
{% 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 페이지](/files/-MYm0GV8FcHY4ydUCIzk)
{% endtab %}

{% tab title="5. Hadoop HDFS Browse Directory 확인 " %}

```
크롬에서 localhost:50070 으로 접속하여 Utilities > Browse Directory 로 이동      
해당 폴더 에 들어가서 파일을 클릭 하면 상세 정보 및 파일 다운로드가 가능    
```

![그림. Hadoop HDFS Browse Directory 페이지](/files/-MYm0p60wybKbsBCIucL)

![그림. Hadoop HDFS 에 파일 다운로드 및 상세 보기  ](/files/-MYm1Yv83vtpCbXqJS-6)
{% 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 사이트   ](/files/-M_d7z-37iGHvnyvLA1K)

#### 1.3 Docker hub 에서 검색한 tomcat 상세 정보   &#x20;

![그림. Docker hub 의 tomcat Description 정보     ](/files/-M_d8SIpcL2JCdf5pzEH)

![그림. Docker hub 의 tomcat Tag 정보   ](/files/-M_d91_acb7ir8wT8X5v)

### 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.skill.or.kr/master.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
