# 2일차

## 도커 호스트 구성 유스케이스

2일차

* <http://www.authorstream.com/Presentation/k16wire-4234251-devops-docker-v6/>

### 독립 된 로컬 개발환경

* 로컬 설정에 영향을 받지 않는 독립된 개발환경을 구성
* **Vagrant** **Docker Machine** 을 이용하면 일관된 인터페이스 로 구성이 가능
* <http://docs.vagrantup.com/v2/docker/>
* 로컬임에도 불구하고 **멀티 서버 환경을 구성**할 수 있음 -> 가장 이점이므로 이것을 사용하는 것임

#### 실환경 구성

* 다른서버에서 도커 서버 설치를하고 다른 서버에서 클라이은트 사용하여 리모트 원격 접속을 가능하게해야한다.
* VM에 컨테이너를 몇개를 넣는 것이 맞느냐
* 싱글 서버 도커 host
  * 물리 서버 1대로 도커 환경&#x20;
  * 싱글 서버 도커 Host + VM
* 도커 호스트 클러스터

### 도커 이미지 백업

* 도커 이미지를 파일로 저장하고 불러옴
* 인터넷 연결이 안되서 이미지 다운이 안되는 경우
* 이미지 크기에 따라 저장/로딩에 시간이 오래 걸림
* 레지스트리 없이 시용이 가능

#### 이미지를 파일로 복사

```bash
$ docker save busybox > busybox.tar
$ docker load < busybox.tar # ? 확인하기
```

컨테이너 내부에 어떤 내부의 데이터도 존재 해서는 안된다 컨테이너를 무상태로 띄워야한다

* v옵션으로 바인딩 처리 -> **마운트**

```bash
# v옵션 마운트
$ docker run -e MY_ROOT_PASSWORD='1234' \
--name mysql -d -v /mysqldata:/var/lib/mysql mysql:5.7

$ docker run -e MY_ROOT_PASSWORD='1234' \
--name mysql -d -v /mysqldata:/var/lib/mysql \
-v /mysqldata/my.cnf:/home/lib/mysql/my.conf mysql:5.7
```

#### 데이터 컨테이너

* 다른컨테이너에 볼륨을 공유하기 위한 컨테이너

```bash
# -v옵션 : 마운트 시켜서 데이터 공유
$ docker run --name mydata -v /data/app1 busybox true

# 참조하도록 하여 공유
$ docker run -it --volumes-from mydata ubuntu

# --rm 옵션 : 컨테이너 실행하여 접속하고 exit -> 종료 -> 컨테이너 삭제 
$ docker run -it --rm ubuntu
```

### Docker Compose

* 여러개 컨테이너를 동시에 실행하게 해줌
* 여러개 컨테이너 구성된 어플리케이션을 만들고 관리 할 수 있게 해주는 도구
* CLI 기반 인터페이스&#x20;
* docker-compose.yml
* `단일 서버 기준 -> 단점`
* 다양한 옵션을 정의할 수 있음 -> **매번 옵션을 줄 필요 없음**

```bash
# 데톱, 툴박스 -> 설치되 엉있음
# 수동설치
$ curl -L "~~~~"
$ chmod +x /usr/local/bin//docker-compose
```

* 어플리케이션을 만드는 **서비스를 정의하는 yaml 파일**
* 버전별로 작성차이가 있다. 현재 3버전까지 있음

#### 도커 컴포즈 주요 설정 타입

* image : 빌드할 이미지 지정
* build : 빌드 할 때 적용할 옵션을 설정
* links : 다른 서비스에 컨테이너를 연결한다
* external-links : 현재 docker-compose.yml 외부에서 시작된 컨테이너를 연결함
* ports: vhxmfmf emfjsosek
* expose : 호스트바이닏ㅇ 없이 포트를 드러낸다
* volumes : 호스트와 컨테이너 특정 패스를 마운트함
* volumes\_from : 다른 서비스나 컨테이너로 부터 볼륨을 마운트
* environment : 환경변수를 정의한다
* env\_file : 환경벼수를 정의하는 파일을 지정
* extends: 다른 서비스 설정을 상속
* net : 네트워크 모드
* dns : 사설dns 서버를 지정한다
* dns\_search : 사설 dns 서버를 도메인으로 지정한다

#### 도커컴포즈 주요 명령어

* docker-compose up
* docker-compose up -d
* docker-compose up -d no-create
* docker-compose ps
* docker-compose down
* docker-compose

#### link의 원리

* 싱글 호스트에서 가능.
* link를 걸면 도커 엔진이 컨테이너 host파일에 필요한정보를 주입시킨다

#### 예제 실행

```yaml
version: '3'
services:
  mydb:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=Passw0rd
    ports:
      - 3306:3306
    volumes:
      - $(pwd)/my.cnf:/etc/mysql/conf.d/my.cnf
      - $(pwd)/db_master:/var/lib/mysql
```

```bash
# 실행
$ docker-compose -f mysql.yml up -d

# docker-compose.yml 디폴트 파일로 인식 하여 실행
$ docker-compose up -d

# mywas 컨테이너를 3개 실행
# 세션클러스터링 등 처리가 추가로 필요함, 라운드로빈, 스테키 세션 등...?
$ docker-compose up -d --scale mywas=3

#컨테이너 확인
$ docker-compose ps 

# -f 옵션 : tail 처럼 계쏙 쭉 볼 수 있음
$ docker-compose logs -f
```

### 도커허브

* 도커 이미지를 push & pull
* 공식저장소 -> officail 마크
* 모든 이미지를 믿을 수 없다.
* 공개저장소는 무료, 비공개 저장소는 유료
* 레파지토리 당 1개의 이미지

```bash
# 허브 로그인
$ docker login

# docker tag 이미지아이디 저장소/이미지:태그명
# 태깅하여 꼭 등록하여야한다
$ docker tag ~~
$ docker images # 확인 레파지토리만 다르고 다 같은거

# push
$ docker push 레파지토리:태그

# 삭제
$ docker rmi 이미지아이디
```

### 레지스트리

* 도커이미지를 저장하고 공유할수 있는 서버
* 오픈소스 , 아파치 라이센스
* v1,v2 호환 되지 않음
* v2 추천, 브이원 버그 많음

```bash
# 생성 및 실행
$ docker run -d -p 5000:5000 --name myregistry registry:2

# push
$ docker push localhost:5000/docker-whale:latest

# pull 하기전 삭제
$ docker rmi localhost:5000/docker-whale:latest

# pull
$ docker pull localhost:5000/docker-whale:latest

# 레지스트리 저장소
# 바인딩 -> 로컬 or 클라우드에 백업

$ docker run -d -p 5000:5000 -v $(pwd)/registry-data:/var/lib/registry --name myregistry registry:2
```

* 클라우드 이미미 저장소
  * s3 : aws s3bucket
  * azure : ms blob starage
  * swift : Openstack Swift
  * oss : oss
* 보안
  * TLS 적용, 도메인 지원
  * Let's Encrypt 추천
  * 접근 권한 관리
    * 인증 : nginx 를 활용한 basic auth
    * api 게이트 등... jwt
    * 이미지 무결성 : ssh 사이닝
* 팁
  * 네이밍 기준 : 루트 , Repo 명
  * 이미지 데이터 관리 : gc 필요
  * 성능이슈
    * 대용량 레지스트리 (이미지 풀 시간 등, 공간 중요)
    * 분산 레지스트리
    * 토렌토 활용 ??

```yaml
# 1. registry.yml 작성 -> git 으로 관리


# 2. docker-compose.yml 작성
```

* nexus, docker hub, amazon, 등 / 상용 무료 사용

### 개발환경 구성

개발에 필요한 도커 도구로 구성해보기

#### Docker CI Tool Stack

![](/files/-M3YlGA9P9DPh0ps1170)

1. docker-ci 머신생성
2. docker-ci 머신 연결
3. github 레파지터리 연결
4. tool-stack 실행
5. 각 서버에 접속한다

```bash
$ docker-machine create -d virtualbox docker-ci

$ eval $(docker-machine env docker-ci)
```

개발을 위한 도구들 !\[사진찍기]

1. GitLab
   * 데이터 저장 위치
     * /var/opt/gitlab
     * /var/log/gitlab :로그
     * /etc/gitlab : 설정정보
   * 80, 443, 22 : 사용 포트
   * gitlab-ce 실행
   * gitlab.yml 작성 -> 도커 컴포즈로 실행
2. Yona
   * 프로젝트 단위로 형상관리 , 이슈 관리, 코드리뷰, 게시판을 지원하는 협업 개발 플랫폼,
   * 요비의 후속
   * 요나 설치
     * docker run \~
3. gogs

   * go로 개발된 git 서비스, 가볍고 빠름
   * 웹콘솔 지원

     \`\`\`bash

     **데이터**

     $ docker run --name=gogs-data --entrypoint /bin/true gogs/gogs

   **실행**

   $ docker run -d --name=gogs --volumes-from gogs-data -p 10022:22  -p 3000:3000 gogs/gogs \`\`\`
4. nxues
   * 도커 이미지 프록시, maven 레파지토리 대용으로 많이 사용함

     ```
     $ docker rund -d --name nexus-data   ~~~~ 뒤에 더
     ```
5. nGrinder
   * 서버에 대한 성능 테스틀 ㄷ위한 오픈소스
   * 성능 테스틀 위한 웹 UI
   * Agent와 Controller
6. redmine
   * 위키
   * 이슈 관리등 ...&#x20;
7. 미디어위키
   * 위키미디아&#x20;
   * LocalSettings.php -> 위키에 어떻게 적용?

### 도커 CI 환경구성

* github & DockerHub -> 가장 빠름... 그러나 픈해야한다는거
* github에 도커 이미지 빌드를 위한 소스 파일추가
* DockerHub에서 'Create Automated Build'
* github 레파지토리연결
* 빌드 트리거 실행

#### Jenkins & Docker

* 도커 이미지를 빌드.테스트.배포 Jenkins 활용&#x20;
* Jenkins Master Slave를 도커로 실행
* 일반 : user -> repo -> ci server -> app server deploy
* 도커 : user -> repo -> ci server (image build) -> **registry push** ->(pull) Host deploy
  * war -> 이미지빌드 -> 태깅 -> 레지스트리 푸쉬

#### DND (Docker in Docker)

* Docker 컨테이너가 Docker 명령어를 실행할 수 있게...
* Docker **소켓 파일에 대한 접근권한**
* Docker 클라이언트, **실행 권한**

#### JEnkins blueocean

* <https://jenkins.io/doc/book/>

1. 도커 이미지빌드용 젠킨스 컨테이너 실행

   ```bash
   docker run -d --name myjenkins \              
   -p 8080:8080 \
   -u root \
   -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
   ```
2. jenkins 암호 입력
   1. docker exec myjenkins cat /var/jenkins\_home/secrets/initialAdminPassword
3. jenkins 콘솔접속

#### 젠킨스 스크립트 작성

1. General
   * Github Project : 등록
   * 매개변수 필요시, -> 타입, 키-값 설정 (ex TAG -> latest)
2. 소스코드관리
   * Git&#x20;
   * Git 인증정보 추가 (**UsernameAndPassowrd** -> 깃유저명, 깃패스워드, 젠킨스 ID), **ssh 키 인증이 안전함**
3. 빌드

```bash
# 1. 이미지 빌드 
$ docker build -t docker-whale .

# 2. 레지스트리 태깅 / ${변수명} -> 젠킨스에서 사용할 수 있고, 위에 매개변수 설정한 것을 이용할 수 잇음
$ docker tag docker-whale devso/docker-whale:${TAG}

# 3. 레지스트리 -> 도커허브 로그인
$ docker login -u 도커허브아이디 -p 도커허브패스워드

# 4. 레지스트리에 이미지 푸쉬 
$ docker push devso/docker-whale
```

#### 마스터-슬레이브 구성

* 다양한 환경의 빌드 진행이 가능
* 오래 거릴는 빌드를 슬레이브에 위임 가능
* Jenkins를 여러개 사용하는 것에 빌해 관리가 용이
* Jenkins Docker plugin 설치
* Jenkins에 cloud 영역을 설정
* Docker Template를 추가한다
* Slave가 빌드하는 Job을 정의한다

#### 멀티 스테이지 빌드

* 이미지 빌드의 어려움
* 컴파일 테스트 패키징 ,etc
* 도커 이미지 빌드 전에 어플리케이션을 빌드해야함

```bash
FROM ~~ AS build-env


FROM ~~
COPY --from=build-env target/app.jar app.jar
RUN java -jar app.jar
```

#### 싱글빌드, 멀티빌드 예

* <https://github.com/alexellis/href-counter.git>

```bash
$ docker build -t href-counter . -f Dockerfile
```


---

# 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://ssosso.gitbook.io/study/os-and-infra-and-system/devops/docker-kubernetes-devops/2.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.
