Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker

1,327 views

Published on

요즘 규모에 상관 없이 서버를 운영하는 웹서비스 업체에서는 도커라는 주제가 화두입니다. 오히려 발빠른 개발자나 운영자들은 이미 도커를 이용하여 서비스를 운영하고 있지요. 본 세션은 도커의 기술적인 내용 보다는 사용자 입장에서 알아야 할 내용을 중심으로 구성됩니다.

Published in: Technology
  • Be the first to comment

XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker

  1. 1. 누구세요? • 김훈민. (동생 이름이 정음) • 결혼 3년차 남편이자 두 아이의 아빠. • ~2011 웹 개발. • ~2014 성능팀, 오픈소스 메모리 캐시인 Arcus 개발/운영. • ~2015 빌드 배포 시스템인 nDeploy팀 소속.
  2. 2. 다룰 내용 • Docker & Linux Container • Tutorial • Container Orchestration
  3. 3. 지옥에서 온 테이블 node.js 웹 서버 Java API 서버 MySQL 서버 메시지 큐 서버 개발자 PC 동료 PC 팀 개발 장비 QA 개발 장비 스테이징 장비 리얼 장비 * Table based on http://www.slideshare.net/dotCloud/docker-intro-november
  4. 4. 지옥에서 온 테이블 node.js 웹 서버 Java API 서버 MySQL 서버 메시지 큐 서버 개발자 PC 동료 PC 팀 개발 장비 QA 개발 장비 스테이징 장비 리얼 장비 * Table based on http://www.slideshare.net/dotCloud/docker-intro-november
  5. 5. 공용 장비에 손을 대는 순간...
  6. 6. 가상 머신으로 해결!? • 개발 및 배포 환경을 어느 정도 표준화 할 수 있습니다. • 하지만 최초 설정 이후에는 마찬가지 비용이 발생합니다. • 시스템 설정 변경 • 시스템 라이브러리 업그레이드 • … H/W OS Hypervisor VM VM
  7. 7. 지옥에서 온 테이블 2 핸드폰 시계 옷장 피아노 기차 물류창고 지게차 항구 배 트럭
  8. 8. http://aceno1.co.kr/box/box1
  9. 9. 표준화된 컨테이너 핸드폰 시계 옷장 피아노 기차 물류창고 지게차 항구 배 트럭
  10. 10. 각 플랫폼, 모듈을 어디에서든 실행할 수 있는 코드를 위한 컨테이너가 있으면 되겠네요!
  11. 11. 리눅스 컨테이너 • 이미 오래 전 부터 LinuX Container 라는 기능이 있었습니다. • 호스트 환경과 독립된 리눅스 시스템(컨테이너)를 실행하기 위한 시스템 레벨의 가상화 방법. (Hypervisor 없는 VM?) • cgroup • namespace • chroot • Linux Security Modules(LSM), Mandatory Access Control(MAC)
  12. 12. cgroup • 2006년 구글에서 개발하여 2.6.24 커널에 포함. • 각종 시스템 리소스에 대한 접근 제어와 리소스 제약을 담당. • 각 리소스는 subsystem이라 부릅니다. • /sys/fs/cgroup 디렉토리에서 각 subsystem을 확인할 수 있음. • 만약 /sys 디렉토리가 없다면: • sudo mount -t sysfs sysfs /sys
  13. 13. cgroup subsystem • /sys/fs/cgroup • /cpu, /cpuacct, /cpuset • /memory • /blkio • /devices • /freezer, /perf_event https://www.kernel.org/doc/Documentation/cgroups/
  14. 14. namespace • 글로벌 리소스에 대한 프로세스 수준의 격리(isolation)를 제공. • MNT (마운트 지점, 파일시스템) • PID (프로세스) • NET (NIC, 라우팅) • IPC (System V IPC 리소스) • UTS (호스트/도메인 이름) • USER (UID + GID) • 격리된 프로세스는 자기 자신이 시스템에서 유일하다고 착각한다: /proc/1 https://www.kernel.org/doc/Documentation/namespaces/
  15. 15. chroot • 프로세스의 root 디렉토리를 변경 할 수 있다. • chroot • parent 디렉토리를 유지하면서 root 디렉토리를 마운트. • pivot_root • parent 디렉토리 없이 root 디렉토리를 마운트.
  16. 16. https://access.redhat.com/articles/1353593
  17. 17. 리눅스 컨테이너 • 어플리케이션을 격리(isolate)하고 패키징(package) 합니다. • 물리/VM 장비의 여러 요소들을 격리해줍니다. • 리소스 (CPU, 메모리, I/O 등) — cgroup • 네임스페이스 (PID, USER, NET 등) — namespace • 파일시스템 — chroot
  18. 18. * http://www.darkroastedblend.com/2006/12/biggest-ships-in-world-part-3.html
  19. 19. 리눅스 컨테이너를 생성하고 실행하며 배포하는 방식을 대중화 한 플랫폼.
  20. 20. Docker • Docker • Daemon (libcontainer+libnetwork) • Client • Docker Hub: 컨테이너를 유통하는 서비스. • …
  21. 21. Docker • 도커 Daemon을 통해 리눅스 컨테이너를 실행하면: • 도커 이미지를 이용하여 새로운 컨테이너를 위한 파일 시스템을 구성합니다. • 컨테이너를 위한 네트워킹 설정을 변경해줍니다. • 격리된 컨테이너 프로세스를 실행합니다.
  22. 22. Docker Toolbox • 윈도우와 맥에 도커 개발 환경을 꾸며 줍니다. • https://www.docker.com/docker-toolbox • 맥에서는 homebrew로 설치 가능. • $ brew install Caskroom/cask/dockertoolbox
  23. 23. Docker Toolbox • docker: 도커 클라이언트. • docker-machine: 도커 서버를 실행할 수 있는 VM 관리. • docker-compose: 여러 개의 도커 컨테이너를 실행. • kitematic: 개발 장비의 도커 컨테이너를 쉽게 관리할 수 있는 앱. • virtualbox: VM
  24. 24. docker-machine • $ docker-machine create -d virtualbox dev • dev라는 이름을 가진 virtualbox 도커 VM을 생성. • $ docker-machine ls • 생성된 도커 VM 리스트를 확인. • $ docker-machine ssh dev • dev VM에 접속.
  25. 25. docker-machine • $ docker-machine env dev • dev 도커 VM을 사용할 수 있는 환경변수 설정을 확인한다. • $ eval $(docker-machine env dev) • 현재 쉘에서 dev 도커 VM을 사용할 수 있도록 환경변수를 설정. • $ docker-machine stop dev • $ docker-machine rm dev
  26. 26. docker • $ docker run -it --rm busybox top • -it : 실행된 컨테이너와 상호작용 할 수 있도록 설정. • --rm : 컨테이너 실행이 끝나면 삭제. • busybox : 실행할 컨테이너. • top : 컨테이너가 실행할 명령의 옵션.
  27. 27. docker • $ docker ps • $ docker logs <container_id> • $ docker rm <container_id> • $ docker rmi <image_id> • $ docker exec <container_id> <command>
  28. 28. XpressEngine
  29. 29. 이렇게 구성하려 합니다 XE Core MariaDB :80 :3306 https://github.com/hoonmin/xecore
  30. 30. Docker Image • <네임스페이스>/<이름>:<태그> • mariadb:latest • php:5.6-apache • hoonmin/xecore:1.8.14 • hoonmin/xecore:latest
  31. 31. Dockerfile FROM php:5.6-apache RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev && rm -rf /var/lib/apt/lists/* # 필요한 PHP extension을 설치 합니다. RUN docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr && docker-php-ext-install gd RUN docker-php-ext-install mysqli # XE Core를 다운로드 합니다. RUN curl -o /var/www/xe.tar.gz -OL https://github.com/xpressengine/xe-core/releases/download/1.8.14/xe.1.8.14.tar.gz # 호스트의 저장소와 연결할 수 있는 볼륨을 정의합니다. VOLUME /var/www/html WORKDIR /var/www/html # 실행 커맨드 CMD ["apache2-foreground"]
  32. 32. Docker Image • docker build -t hoonmin/xecore:1.8.14 . • -t : 빌드 할 이미지 이름 • hoonmin : 이미지의 네임스페이스 (그룹) • xecore : 이미지 이름 • 1.8.14 : 이미지의 태그 • . : Dockerfile이 위치한 디렉토리
  33. 33. Docker Container: xecore • docker run -it --rm hoonmin/xecore:1.8.14 • -it : foreground로 동작시키는 경우, 쉘에서 상호작용 가능하게. • --rm : 실행이 끝난 컨테이너를 삭제합니다. • hoonmin/xecore:1.8.14 : 이미지 이름 • docker ps • 실행 중인 도커 컨테이너의 리스트를 확인합니다.
  34. 34. Docker Container: mariadb • docker run -d -e MYSQL_ROOT_PASSWORD=root --name db --p 3306:3306 mariadb • -d : background 프로세스로 동작시킵니다. • -e : 컨테이너 안에서 사용될 환경 변수를 설정합니다. • --name : 컨테이너의 이름을 지정합니다. • -p 3306:3306 : 컨테이너가 노출한 포트를 호스트의 포트와 매 핑합니다. <host_port>:<container_port>
  35. 35. Docker Hub • https://hub.docker.com/ • 회원 가입이 필요합니다. • docker login • docker push hoonmin/xecore:1.8.14
  36. 36. DB를 밖으로 노출하기 싫어요 XE Core MariaDB :80
  37. 37. Link • 같은 호스트에 있는 컨테이너를 연결하여 호스트에 포트를 노출시 키지 않아도 직접 통신할 수 있게 해줍니다. • docker run -d --name db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=xe -e MYSQL_USER=xe -e MYSQL_PASSWORD=xe mariadb • docker run -d -p 80:80 --link db:db hoonmin/xecore:1.8.14 • --link <name>:<alias>
  38. 38. 두 컨테이너를 함께 실행할 수 없나요? XE Core MariaDB :80docker-compose XE Core :80
  39. 39. docker-compose • 여러 개의 도커 컨테이너를 묶어 함께 실행할 수 있습니다. • docker-compose.yml 파일을 정의해야 합니다. • docker-compose up -d • up : 정의된 컨테이너를 실행. • -d : 백그라운드로 실행. docker-compose.yml xecore: image: hoonmin/xecore:1.8.14 ports: - 80:80 db: image: mariadb environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: xe MYSQL_USER: xe MYSQL_PASSWORD: xe ports: - 3306:3306
  40. 40. 도커 호스트가 여러 개 XE Core :80XE Core :80 XE Core MariaDB :80XE Core :80
  41. 41. docker-swarm • 여러 개의 도커 호스트를 마치 하나인 것 처럼 묶어주는 서비스. • master는 node를 관리하며 도커 API 와 동일한 API를 제공. Master Node
  42. 42. docker-swarm 설치 • docker run swarm create : 토큰값 확인 • docker-machine create -d virtualbox --swarm --swarm- master --swarm-discovery token:// d9a8bec868295f81eb28b331c7d8ac8b swarm-master • docker-machine create -d virtualbox --swarm --swarm- discovery token://d9a8bec868295f81eb28b331c7d8ac8b swarm-node-01
  43. 43. swarm을 이용하여 배포 • eval $(docker-machine env --swarm swarm-master) • swarm-master 도커 VM 환경에서 swarm API를 사용. • docker-compose up -d • 도커 컨테이너가 swarm-master, swarm-node-01 두 대의 서 버에 적절히 배분되어 실행됩니다. • docker-compose scale xecore=2 • xecore 컨테이너의 개수를 2개로 늘립니다.
  44. 44. DB 연결이 안되는데요…? XE Core :80XE Core :80 XE Core MariaDB :80XE Core :80
  45. 45. docker overlay networking XE Core :80XE Core :80 XE Core MariaDB :80XE Core :80 overlay my_net
  46. 46. docker networking • libnetwork • 도커의 네트워크 관련 코드가 들어 있는 라이브러리. • 도커 1.7 부터 실험적으로 포함되었다가 1.9 버전에서 정식 출시. • docker network ls • docker network create -d overlay my_net
  47. 47. built-in overlay network • overlay network • 같은 L2 (MAC) 네트워크에 연결되어 있지 않은 서버들이 서로 L2 통신을 할 수 있도록, 터널링 등의 기술을 활용.
  48. 48. networking을 위한 도커 VM • docker-machine create -d virtualbox consul • docker $(docker-machine config consul) run -d -p 8500:8500 -h consul progrium/consul -server -bootstrap • docker-machine create -d virtual box • --swarm —swarm-master • --swarm-discovery="consul://$(docker-machine ip consul):8500” • --engine-opt="cluster-store=consul://$(docker-machine ip consul):8500 • --engine-opt=“cluster-advertise=eth1:0” swarm-master
  49. 49. 다시 docker-compose • 도커 1.9 부터 docker-compose와 networking이 연동됩니다. • docker-compose --x-networking --x-network- driver=overlay up -d • --x-networking : networking 실험 기능을 활성화 합니다. • - -x-network-driver : networking 드라이버를 선택합니다. • null, host, bridge, overlay, calico, …
  50. 50. Docker Networking
  51. 51. 컨테이너 하나 docker0 (10.1.15.1/24) veth2c8f4f4 (10.1.15.2/24) NGINX veth13f8c56 eth0 (192.168.0.100)
  52. 52. 컨테이너 둘 docker0 10.1.15.1/24 eth0 (veth2c8f4f4) 10.1.15.2/24 NGINX veth13f8c56 eth0 192.168.0.100 eth0 (veth80d8ec5) 10.1.15.3/24 JENKINS vetha451781
  53. 53. NGINX 포트를 노출 docker0 10.1.15.1/24 eth0 (veth2c8f4f4) 10.1.15.2/24 NGINX:80 eth0 192.168.0.100 eth0 (veth80d8ec5) (10.1.15.3/24) JENKINS:8080 DNAT :80 —> 10.1.15.2:80 (iptables) -p 80:80
  54. 54. NGINX와 JENKINS 연결 docker0 10.1.15.1/24 eth0 (veth2c8f4f4) 10.1.15.2/24 NGINX:80 eth0 192.168.0.100 eth0 (veth80d8ec5) (10.1.15.3/24) JENKINS:8080 DNAT :80 —> 10.1.15.2:80 (iptables) link JENKINS_PORT_8080_TCP
  55. 55. 호스트가 다르다면? docker0 10.1.15.1/24 eth0 (veth2c8f4f4) 10.1.15.2/24 NGINX:80 eth0 192.168.0.100 docker0 10.1.20.1/24 eth0 (veth80d8ec5) 10.1.20.2/24 JENKINS:8080 eth0 192.168.0.200 DNAT 80 DNAT 8080
  56. 56. 포트가 여러 개 필요하다면? docker0 10.1.15.1/24 eth0 (veth2c8f4f4) 10.1.15.2/24 NGINX:80 eth0 192.168.0.100 DNAT 80 docker0 10.1.20.1/24 eth0 10.1.20.2/24 JENKINS:8080 eth0 192.168.0.200 eth0 (10.1.20.3/24) JENKINS:8080 ?
  57. 57. Overlay Network docker0 10.1.15.1/24 eth0 (veth2c8f4f4) 10.1.15.2/24 NGINX:80 eth0 192.168.0.100 docker0 10.1.20.1/24 eth0 10.1.20.2/24 JENKINS:8080 eth0 192.168.0.200 eth0 (10.1.20.3/24) JENKINS:8080
  58. 58. CoreOS Flannel docker0 10.1.15.1/24 eth0 (veth2c8f4f4) 10.1.15.2/24 NGINX:80 eth0 192.168.0.100 docker0 10.1.20.1/24 eth0 10.1.20.2/24 JENKINS:8080 eth0 192.168.0.200 eth0 (10.1.20.3/24) JENKINS:8080 flannel.1 10.1.15.0/16 flannel.1 10.1.20.0/16 overlay vxlan
  59. 59. TIPS
  60. 60. Timezone • 도커 컨테이너가 실행될 때 timezone이 디폴트로 맞춰집니다. • 그런데 이 timezone을 설정할 좋은 방법이 아직은 없습니다. • https://github.com/docker/docker/issues/12084 • -v /etc/localtime:/etc/localtime로 볼륨 설정. • ENTRYPOINT에 별도의 스크립트를 둬서 런타임에 설정.
  61. 61. Private Registry • docker run -d -p 5000:5000 registry:2.2 • 예전 v1 버전은 가능하면 사용하지 마세요. • 꼭 필요하다면 검색기능 OFF • LDAP 등의 인증을 붙이려면 별도의 인증 서버를 사용해야 합니다. • https://github.com/cesanta/docker_auth • UI가 필요한 경우: • https://github.com/SUSE/Portus
  62. 62. 스토리지 드라이버 • DeviceMapper • 스토리지 pool 크기에 주의. (100GB default) • AUFS, Overlay (추천) • 비슷한 성향의 파일시스템. Overlay는 3.18 커널부터 지원. • 파일 개수가 많아지면 느려지거나 쓰기가 불가능해질 수 있다. • overlay는 inode 개수를 모니터링 해주어야 한다. (df -ih) • BTRFS
  63. 63. docker-proxy • 포트를 publish 하면 다음과 같이 두 개의 장치가 마련됩니다. • iptables DNAT rule, docker-proxy 프로세스 • 왜 뜨는가? • 도커 호스트에서 localhost:<published_port>로 접근하기 위함. • https://github.com/docker/docker/issues/8356 • 없애는 방법 (2.6.x 커널 제외) • docker daemon --userland-proxy=false ..

×