> For the complete documentation index, see [llms.txt](https://ssosso.gitbook.io/study/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ssosso.gitbook.io/study/os-and-infra-and-system/devops/docker-kubernetes-devops/2.md).

# 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
```
