2일차

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

2일차

독립 된 로컬 개발환경

  • 로컬 설정에 영향을 받지 않는 독립된 개발환경을 구성

  • Vagrant Docker Machine 을 이용하면 일관된 인터페이스 로 구성이 가능

  • 로컬임에도 불구하고 멀티 서버 환경을 구성할 수 있음 -> 가장 이점이므로 이것을 사용하는 것임

실환경 구성

  • 다른서버에서 도커 서버 설치를하고 다른 서버에서 클라이은트 사용하여 리모트 원격 접속을 가능하게해야한다.

  • VM에 컨테이너를 몇개를 넣는 것이 맞느냐

  • 싱글 서버 도커 host

    • 물리 서버 1대로 도커 환경

    • 싱글 서버 도커 Host + VM

  • 도커 호스트 클러스터

도커 이미지 백업

  • 도커 이미지를 파일로 저장하고 불러옴

  • 인터넷 연결이 안되서 이미지 다운이 안되는 경우

  • 이미지 크기에 따라 저장/로딩에 시간이 오래 걸림

  • 레지스트리 없이 시용이 가능

이미지를 파일로 복사

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

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

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

# 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

데이터 컨테이너

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

# -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 기반 인터페이스

  • docker-compose.yml

  • 단일 서버 기준 -> 단점

  • 다양한 옵션을 정의할 수 있음 -> 매번 옵션을 줄 필요 없음

# 데톱, 툴박스 -> 설치되 엉있음
# 수동설치
$ 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를 걸면 도커 엔진이 컨테이너 host파일에 필요한정보를 주입시킨다

예제 실행

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
# 실행
$ 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개의 이미지

# 허브 로그인
$ docker login

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

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

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

레지스트리

  • 도커이미지를 저장하고 공유할수 있는 서버

  • 오픈소스 , 아파치 라이센스

  • v1,v2 호환 되지 않음

  • v2 추천, 브이원 버그 많음

# 생성 및 실행
$ 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 필요

    • 성능이슈

      • 대용량 레지스트리 (이미지 풀 시간 등, 공간 중요)

      • 분산 레지스트리

      • 토렌토 활용 ??

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


# 2. docker-compose.yml 작성
  • nexus, docker hub, amazon, 등 / 상용 무료 사용

개발환경 구성

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

Docker CI Tool Stack

  1. docker-ci 머신생성

  2. docker-ci 머신 연결

  3. github 레파지터리 연결

  4. tool-stack 실행

  5. 각 서버에 접속한다

$ 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

    • 위키

    • 이슈 관리등 ...

  7. 미디어위키

    • 위키미디아

    • LocalSettings.php -> 위키에 어떻게 적용?

도커 CI 환경구성

  • github & DockerHub -> 가장 빠름... 그러나 픈해야한다는거

  • github에 도커 이미지 빌드를 위한 소스 파일추가

  • DockerHub에서 'Create Automated Build'

  • github 레파지토리연결

  • 빌드 트리거 실행

Jenkins & Docker

  • 도커 이미지를 빌드.테스트.배포 Jenkins 활용

  • 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

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

    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

    • Git 인증정보 추가 (UsernameAndPassowrd -> 깃유저명, 깃패스워드, 젠킨스 ID), ssh 키 인증이 안전함

  3. 빌드

# 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

  • 도커 이미지 빌드 전에 어플리케이션을 빌드해야함

FROM ~~ AS build-env


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

싱글빌드, 멀티빌드 예

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

Last updated