1일차

Docker ?

  • 리눅스 컨테이너를 이여 -> 서비스 패키징 배포, 경량의 가상화 플랫폼

    • 패키징과 배포! 가 더 알맞다.

  • Go 언어로 개발되어 있음

  • 라이센스 : CE, 엔터프라이즈 (상용) : 기술지원 및, 안정적으로 사용

    • 기본적으로는 오픈소스, 아파치 2.0

    • RESTful 하다.

왜 도커를 사용해야 하는가?

  • The Matrix From Hell

    • 다양한 HW / SW 를 소싱, 배포를 해야 할 경우의 수가 많다. 이거를 관리하는 효율적인 문제가 필요

    • 환경세팅을 일일이 해야하는 번거로움... 발생 -> 해결책으로 도커를 사용..

  • 컨테이너로 독립적인 모듈을 구성하여 배포하기만하면됨

맥에서 ㅌ아파치 톰캣 설치

1.2.3.4.5 단계

윈도우에서 톰캣설치

1.2.3.4.5 단계 .... 환경, HW 별 설치해야하는 것도 다르지만....

  • 도커로 컨테이너화 하여 일관성있게 동일하게 배포가 가능

  • 어떤 OS/ Device 에서도 동일한 방식으로 베포가 가능

도커는 가볍다?

  • VM에 비해 이미지 파일 크기가 작고, 빠르게 이미지들 만들고 실행 가능

  • 기존의 하이퍼바이저에 비해 엄청 경량!!

  • 불변의 인스트럭처

    • 이미지 기반의 애플리케이션 배포 패러다임

    • 많은 서버를 동적으로 관리하는 클라우드 환경에서 효과적으로 유연하게 배포 가능

    • 인프라 자체가 관리가능

    • Stateless 하고 :

    • Scable하고 : 동일

    • 이미지 기반의 어플리케이션 배포

  • 도커는 변경 불가능한 인프라를 가능하게 한다.

구글에서 모든것 , 컨테이너 러닝중인

  • Limited Isolation

  • Released CGroups

  • Released LMCTFX

  • Using ..?

도커가 성공한 이유

리눅스 컨테이너는 소개된지 10년이 지난 기술이지만, 설정이 복잡하고 ㅏ용하기 어려워 널리 사용 되지 못햇음 -> 도커는 사용이 쉽다

도커의 시작

  • dotCloud 의 Solomon Hykes가 PyCon2013에 소개

  • 명령 예 : docker run busybox echo "hello world"

    • 일련의 과정을 ..

    • 컨테이너 생성

    • 네트워크 인터페이스를 만들어? 붙이고 컨테이너를

  • CE ,EE 버전으로 나누어 져있음

    • CE : 무료, 최신, 클라이언트 위주(개발자, 리눅스, 클라우드)

    • 쿠베 도입 -> CE 써도 무방함

도커 클라이언트

  • 도커 엔진과 통신하느 프로그램 , 윈도우 맥, 리누긋

  • CLI 클라이언트 위주로 교육 예정

  • 도커 데스크탑 : 리눅스, 맥, 리눅스

  • Docker Toolbox : 도커 데스크탑의 이전버전 -> 데스크탑으로 안 되는 경우 사용

  • CE for Mac : 기반 기술이 다름

  • CE for window : Hyper-v 기술을 기반으로 한다

  • 가장 좋은 환경은 Linux에 최적화

  • Kitemetic

    • 템플릿 기반으로 , 컨테이너 관리하는 GUI

  • Docker Host OS

    • Ubuntu, CenOS , RHEL

    • COntainer OS( Core OS)

    • Debian, SUSE, Fedora, ETC ...

    • 64 ㅣ트 리눅스 커널 버전 3.10 이상 환경, 도커 엔진이설치된 환경

도커 엔진

  • 어플리케이션 을 컨테이너로 만들고 실행하게 해주는 데몬

  • Swarm , Kube~통합

  • Client -> REST API -> server(docker daemon)

  • 가상머신이 올라와 있는 상태

  • 도커 엔진이 스웜이나 여러가지와 통합되서 오케스트레이션잉 가능해짐

윈도우 는 도커 호스트 OS 일까?

하나의 도커 명령어로 도커가 뜨게.. 윈도우용 ... 버그도 많지만, 현재는 최적화가 잘 되어 있음

도커 머신

로컬, 리모트 서버에 도커 엔진을 설치하고 설정을 자동으로 해주는 프로비저닝 클라이언트

도커 허브

  • 도커 이미지를 관리하는 저장소

  • 오픈소스 공식 이미지 관리

  • 공개 , 비공개, 유/무료

Docker Trusted Registry

  • 유료

  • 도커 이미지 저장소를 구축

  • 설치형 인증지원

  • 레지스트리 (무료), DTR (유료)

DUCP - 비추

  • Docker Universal Control Plan

  • 도커 클러스터 관리도구

  • 설치형(유료)

Docker Data Center

  • DUCP + DTR

Docker Cloud - 강추

  • 도커 이미지, 컨테이너 관리르 지원

  • 공개 비공개 클라우드 관리 가능

  • tutum 을 인수해서 통합

보안

모든 보안 실력자를 스카웃 -> 보안 이슈 모든 문제점을 해결 -> 돈으로 해결

Docker

  • 수많은 IoT 장비에도 적용 됨

명령어

# Server, Clinet 정보 나옴, 버전 맞춰야됨
$docker version

# 도커 서버 정보를 자세히 볼 수 있음
$docker info

# run -> 이미지 생성 후 실행까지, 이미지가 있으면 실행만하고, 로컬 이미지를 그대로 사용하게 됨
$docker run hello-world

# -a 옵션 : 모든 컨테이너 확인
$docker ps -a

공유폴더 확인

  • 설정 -> Resources -> Advanced -> Disk image location

Hypervisor

  • 호스트컴퓨터에서 다수의 운영체제 를 동시에 실행하ㅣㄱ 위한 논ㄴ리적 플랫폼

  • aka 가상화 머신 모니터 가상화 머신 매니저

  • 타입 1,2

Type 1

  • 하드웨어에서 직접 실행되는

  • infra -> Hyper ->VM(Guest OS 를 할당해서 가져감으로 용량이 큼)

Type 2

  • OS 위에서 실행되는

  • 도커는 여기 유형에 속한다고 보면됨

  • infra -> host os -> docker -> container(Guest OS를 안가져감)

  • 도커는 Host OS 를 공유

  • 단점은 ... Host OS의 의존도가 높아지게

리눅스 컨테이너

단일 리눅스 호스트사에서 여러개 격리된.. 리눅스 시ㅡ템을 실행하기 위한 OS 수준의 실행

  • Libvirt

    • 가상 호스트를 관리하는 툴킷

  • OpenVZ : 패러럴즈의 베이스가 됨

  • Imctfy

  • Warden

  • libContainer

  • libvirt, systemd

containerd

  • 컨테이너 라이프 사이클 관리

  • OCI(Open Container Initiative)에 의해 관리

  • Docker 엔진의 코어 런타임 -> containerd 기반이다? , 오픈소스화 되어 있다...

도커 아키텍처

클라이언트 환경변수

도커 호스트 를 어떻게 알고 바라 보느냐... -> 클라이언트 환경변수 를 통해 알아봄

## 기본적으로 TCP 통신
export DOCKER_TLS_VERIFY = "1"
export DOCKER_HOST="tcp://ip:port" # 2376 포트는 통신 기본 포트
export DOCKER_CERT_PATH="/User/{user}/.docker/machine/machines/fc-docker"

기반 기술

  • Namespaces : 프로세스별 리소스 격리

    • 가벼운 프로세스 가상화 기술

    • 격리 된 작업공간 : 컨테이너

    • 유형 6가지

  • cgroups (Control Groups) : 리소스 관리

    • 특정 컨테이너가 지정한 ㅋ만큼 리소스를 쓰도록 제한

    • 실행중인 어플리케이션이 원하는 만큼 리소스를 사용하게 함

    • memory, cpuset, net_prio,

Union Filesystem

  • 리눅스 파일 시슽ㅁ : ext4, btrfs, xfs

  • 다른 파일 ㅣ스템을 , Union mount 하도록 해주는 리눅스 파일 시스템 서비스

  • 브랜치 : 여러개 나누어진 파일 시스템을 하나의 파일시스템 사용하게 해줌

    • read-only 레이러들의 통합

권한 수준

  • root 사용자와 동일한 수준의 권한이 필요

  • docker 데몬을 실행하기 위해서는 root 사용자 필요

  • TCP 포트가 아닌 Unix 소켓과 데몬이 바인딩 하기 떄문

    • 보안 떄문, TCP 포트 외부 노출은 보안 위험한 행위

  • 사용자그룹 ; docker

  • 사용자 : docker

    • 도커 허브의 대부분 사용자 이름이 docker 이다. 안맞을 경우 권한 문제 등.. 에러 발생 할 수 있음

    • 따라서 도커이미지를 쓸때는 이름을 docker로 사용하는게 낫다

  • 보안 상의 이유 -> root 권한으로 인한 우려

도커이미지

  • 배포 ?? 이미즐 만드는 것이 가장 처음해야 할 일

  • 컨테이너를 만들기 위한 템플릿

  • 읽기 전용 파일시스템으로 도커를 서비스 를 배포하는 최소 단위

  • 한가지이미지는 한가지 유형의 컨테이너를 만드는것

  • 레이어 파일 시스템으로 각 파일 시스템이 곧 이미지

    • bootfs -> base image -> image -> image .... -> container 순으로 로딩

    • 위의 구조가 또 하나의 이미지가 될 수 있고, 이미지 기반으로(최소 단위) 구성을 하여 또 구성하고 또 구성하는 형식

    • 그래서 레이어 파일 시스템이다

    • 그래서 이미지는 변형되어서는 안됨 -> 읽기 전용 -> 이뮤터블

bootfs

union mount

read-only 파일 시스템을 root 파일 시스템 위에 쌓는 구조 여러구조

cow (copy-on-write)

  • 이미지 파일 공유 효율ㅇ을 높이기 위한 전략

  • 가능한 적은 카피본을 얻기 위한 자업

  • 논리적 참조를 통해 캐시화?

  • 참조하는 경우 -? 동일한 파일을 공유

  • r/w 시작하는 경우 -? 공유하던 파일을 새로 복사후 참조 변경, copy-up: 최초 복사하는 행위

  • read-only 형식으로 레어이 구성하는게 효율적

    • 이미지가 커지면 도커의 효율도 떨어지기 마련이다

도커이미지 저장 위치

  • 도커 호스트 서버의 파일 시스템

  • 도커 루트 디렉토리 아래 -> 커스텀 세팅 가능

    • 설정 -> 리소스 -> 로케이션

    • 도커 옵션 ?

베이스 이미지

  • 이미지 부모가 되는 이미지

  • 송식 베이스 이미지는 ubuntu 였지만, alpine으로 변경 됨

  • 공식 베이스 이미지ㄴ 변경의 의미는 ???

  • alpine + docker?

    • 용량이 많이 줄어듬, 100M -> 5M

  • 이미지 줄이는 방법 : 베이스 이미지는 잘 선택 하는 것

도커는 어떻게 이미지의 변경된 부분만 저장하는가

  • git 과 유사

  • 변경된 부분 -> hash 값 생성 -> 저장 -> 바뀐부분만 가져와서 Merge를 함 -> 이미지 재정의

  • 변경된 부분만 푸쉬하고 풀하는 구조

Dockerfile

나만의 이미지를 만들기 위해, 설치할 SW, 필요한 설정을 정의하는 파일 이미지제작 과정을 투명하게 함 Configuration Management 에서 말하는 프로비즈넝 역할 : 왠만한 작업을 다 사용자화 해서 구성을 할 수 있다

  • # 주석, 보통 버전 명시

  • FROM : 도커파일일 만들기 위한 베이스 이미지 정의

  • RUN : 명령어. 쉘스크립트 명령어라고 보면됨

  • EXPOSE 80 : 80 포트로 서비스 해라

도커 실습

# 이미지 검색
$docker search 이미지명

# 이미지 다운
$docker pull 이미지명

# 로컬 이미지 확인
$docker images

# image 실행
$docker run 이미지명 [여러가지 옵션 설정 및 파라미터]

dockerfile 로 나만의 이미지 만들기

# 도커 파일 만들기
$mkdir docker_test # 디렉터리 생성
$vi Dockerfile
FROM base이미지                 # (ex, 도커 서치로 찾은 이미지:tag)
RUN 이미지에 적용할 명령어          # 리눅스 명령어를 실행 
EXPOSE 80                      # 공개하는 포트를 정의
ENV NGINX_VERSION 1.11.5      # 환경변수 정의
ADD 
COPY jenkins.sh /usr/local/bin/jenkins.sh # 파일을 복사 
ENTRYPOIN ["/bin/tini","..."]                    # 이미지 실행 명령을 재정의 한다, CMD 보다 더 많이 사용 하기도함
VOLUME /var/lib/mysql         # 바인딩 디렉토리를 정의, 많이 사용함
USER  jenkins                 # 사용자를 지정한다. 이 사용자가 도커호스트에도 존재해야한다. 볼륨 바인딩할때 에러가 날 수 있음
WORKDIR /data                 # 작업위치릴 찌정한다
# 이미지 빌드 후 실행되는 명령어를 지정한다. 거의 사용할 일이 없다
ONBUILD  RUN /user/local/bin/python-build --dir /app/src                      
CMD 이미지에서 실행 최종명령어       # 이미지를 실행하는 명령 지정 1번만 실행, 최종명령어

# 이미지 만들기 만들 이미지명
$docker build hello-test

# 이미지 실행 만든 이미지명
$docker run hello-test

# 히스토리
$docker history 이미지명:태그

# 이미지 삭제
docker rmi 이미지명 # 컨테이너 삭제후 이미지 삭제 필요

# 컨테이너 삭제
docker rm 컨테이너이름

도커 이미지를 줄이는 방법

  • 가벼운 베이스 이미지를 사용한다

  • Dockerfile 명령을 체인(파이프라인)으로 사용한다

    • RUN a | b -> 레이어 1개

    • RUN a, RUN b -> 레이어 2개

    • 불필요한 레이어를 늘리지 말자 !!

  • 빌드 도구를 설치하지 않는다.

    • maven 같은..

    • 따로 빌드 구성

  • 패키지 관리자를 정리한다.

    • apt clear

도커 컨테이너

이미지를 실행한 상태, 인스턴스

  • 읽기/쓰기가 가능한 파일시스템

  • 실행 독립 애플리케이션, 독립적인 인스턴스

  • 컨테이너는 가상서버가 아니다. 엄밀히 프로세스다

# 컨테이너 실행 
$docker run -e MYSQL_ROOT_PASSWORD='1234' --name mysqldb mysql:latest
$docker run -P # 포트 자동 바인딩
$docker run -p 80:80 # 포트 바인딩

# 마운트 된 후 변경 시 적용이 됨. 로딩 하는 최초를 통해 와칭을 하고 있다면 운영중에도 변경이 반영 될 수 있음
# 이부분은 좀더 서치 후 정립
$docker run -v /home/docker/nginx.conf:/etc/nginx/nginx.conf # 볼륨바인딩 홈서버:컨테이너


# 컨테이너 강제 삭제
$docker rm -f 컨테이너이름

# 용량확인
$docker ps -s # 용량이  나옴 -> 실제 물리크기(가상크기)


# 컨테이너의 모든 정보를 알 수 있음 -> 이정보를 통해 응용할 줄 알아야됨
# 그래야 시스템을 좀 더 효율적으로 운영할 수 있음
$docker inspect 컨테이너명

# 두개의 컨테이너 연결
# A컨테이너 -> B컨테이너
# 1. jenkins 컨테이너  실행 -> 2. nginx 컨테이너 실행
$docker run -d -p 8080:8080 -p 5000:5000 --name myjenkins jenkins

# --link 컨테이너명:이미지명 옵션으로 컨테이너 연결 
$docker_test docker run -d -p 80:80 \
-v /Users/myungsubso/Desktop/docker_test/jenkins/nginx.conf:/etc/nginx/nginx.conf \
--link myjenkins:jenkins -d nginx

VM활용

  • 도커머신

  • 베어그란트

도커머신

  • 가상서버 관리하는데 편리함,

  • 가상서버에 도커엔진을 설치 할 수 있게 도와주는 도구

  • 로컬에 도커엔진 설치

  • 리모트서버에 도커엔진 설치

  • boot2ocker (개발용, 운영용 아님)

  • 주요명령어

    • docker-machine start, stop, ssh, ..... 등등 많음

    • docker-machie ls (생선된 서버 조회)

    • docker-machine create -d virtualbox my-dev (가상서버 하나 생성)

Vagrant

  • 다양한 가상머신을 동일한 방식으로 만들고 관리할 수 있는 도구

  • VirtualBox, VMware, AWS 등 지원

  • 루비언어를 Vagrantfile에 필요한 설정을 정의

  • Vagrant 박스이미지 만들어져 있는 것 많음

CoreOS

# 실행  깃 폴더내 
$vagrant up

# 머신확인
$vagrant status

# 머신접속
$vagrant ssh core-01

# 머산에서 도커 실행하면됨
$docker ps
$docker run hello-world

Last updated