Docker Study: 두 판 사이의 차이

Ubuntu Korea Community Wiki
둘러보기로 이동 검색으로 이동
imported>Janghe11
 
(사용자 6명의 중간 판 79개는 보이지 않습니다)
1번째 줄: 1번째 줄:
== 2016년 9월 21일 ==
Network : pdf 파일 보름 내로 다시 만들어서 드립니다. <br/>
Clustering & network -> Swarm(https://docs.docker.com/swarm/)<br/>
container 생성 후 동작 중간에 자원 performance 조절은 불가<br/>
docker run 옵션에서 제공하며, lxd에 비해 cgroup을 통해 조절되는 parameter의 양이 적음.
Storage : https://docs.docker.com/engine/userguide/storagedriver/selectadriver/ <br/>
You can set the storage driver by passing the --storage-driver=<name> option to the dockerd command line, or by setting the option on the DOCKER_OPTS line in the /etc/default/docker file. -> 우분투 버그 <br/>
/etc/docker/ 에 daemon.json 파일을 생성하고 { "storage driver : zfs" } 입력하고 저장 <br/>
storage drive는 여러가지가 제공되나, host machine에서는 하나만 사용해야 함.<br/>
AUFS http://www.joinc.co.kr/w/man/12/docker/aufs<br/>
union mount<br/>
CoW : 변경점만 write한다
whitout : Image layer는 R/O이니<br/>
whiteout이 마치 지워진것처럼 인식하게 함.<br/>
아직 rename은 특정 조건에서 제대로 안될수도 있음.<br/>
ZFS http://www.howtogeek.com/175159/an-introduction-to-the-z-file-system-zfs-for-linux/<br/>
https://docs.docker.com/engine/userguide/storagedriver/zfs-driver/<br/>
Security https://docs.docker.com/engine/security/security/
도커 컨테이너는 보통 제한된 Capability 를 가지고 실행된다.
capability 는 root/non-root 디렉터리를 fine-grained 접근 제어 시스템으로 바꾼다.
(루트 기반의 시스템 관리 권한은 각 앱이나 프로세스별 권한으로 세분화 한다.)
예 : 웹서버가 80번 포트에 바인드 할때, 루트로 바인드 하지 않고,
net_bind_service 같은 전용 권한으로 바인드 한다.
보통의 서버는 많은 프로세스를 루트 권한으로 실행해야 하는 경우가 많다.
도커 컨테이너 내부에서 대부분의 경우 루트 권한이 필요하지 않다.
ssh 연결은 도커 호스트 머신에 의해 실행된다.
cron 은 플렛폼 전체적으로 실행되기 보단, 사용자 프로세스로 실행되어야 한다
로그 관리는 도커 또는  Loggy, Splunk 같은 제3자 서비스로 관리된다.
하드웨어 관리는 udev 로 실행 되어야 한다.
네트워크 관리는 도커 컨테이너 밖에서 일어난다.
그러므로 컨테이너의 루트는 호스트의 루트보다 훨씬 적은 privileges 를 가지고 있다.
예를 들어 아래와 같은 것이 가능해진다.
모든 마운트 작업 거부
raw 소켓 접근 거부
일부 파일시스템 작업 거부
모듈 로딩 거부
(기타 등등...)
이는 침입자가 컨테이너에서 루트로 상승을 한다 해도 큰 영향을 주지 않음을 의미한다.
도커 컨체이너에서는 기본적으로 아래와 같이 필요한 capability 를 제외하고 모두 드롭한다.
Linux Capability : http://man7.org/linux/man-pages/man7/capabilities.7.html
Arch Wiki - Capability : https://wiki.archlinux.org/index.php/Capabilities
Docker Docs - Linux Kernel Capabilities : https://docs.docker.com/engine/security/security/#/linux-kernel-capabilities
Default Docker Container Capability List - https://github.com/docker/docker/blob/master/oci/defaults_linux.go#L64-L79
Docker Run Reference - Capability 추가 및 제거 옵션 : https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities
== 2016년 9월 7일  ==
LXD 소개, 기본 사용법, 구조.
http://www.ubuntu.com/cloud/lxd
공유 문서
https://docs.google.com/document/d/1Hza6Me_xQU5XWhhCkki3vP7EEJgUEaoAHr34oqWjTcw/edit?usp=sharing
== 2016년 8월 31일 ==
Android App on ChromeBook 관련 기사
http://www.androidauthority.com/run-android-apps-chromebook-703248/
Google I/O Chromebook 관련 영상
https://youtu.be/yDy1WWUdlY8?t=4m40s
이 영상에서 Android App들을 돌리는 시연 영상이 공개됨
Tech Bits - Running Android apps in Docker using Googles ARC Welder
http://thshaw.blogspot.kr/2015/07/running-android-apps-in-docker-using.html
https://chrome.googleblog.com/2016/05/the-google-play-store-coming-to.html
https://support.google.com/chromebook/answer/1086915
https://insights.ubuntu.com/2016/06/14/universal-snap-packages-launch-on-multiple-linux-distros/
http://snapcraft.io/
https://blog.jessfraz.com/post/docker-containers-on-the-desktop/
* 웬만한 GUI application들은 docker run시에 data volume (-v) 옵션을 주어야 제대로 작동한다.
* https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes
== 2016년 8월 24일 ==
* 유용 링크: https://github.com/wscherphof/oracle-12c#build < 설명: '''Oracledb''' 를 '''Oracle Linux 7 Docker image'''에서 설치하고 돌릴 수 있게 Dockerfile들을 제공한다. 자세한 것은 직접 방문해서 보면 된다. 친절하게 다 안내가 되어있다. 개발자가 사용한 '''Oracledb'''는  '''Oracle Database 12c Enterprise Edition Release 12.1.0.2.0''' 에서 실험이 진행되었다.
Oracle에서 아예 공식 블로그와 자사 Github에 Oracle DB를 컨테이너 상에서 매우 쉽게 돌릴수 있도록 설명서와 프로그램들을 짜서 동봉 하였다. 그냥 다운로드 해서 쓰면 된다. 나머지 서비스나 라이선스 문제는 알아서 하면 될 것이다.
링크: https://blogs.oracle.com/developer/entry/creating_and_oracle_database_docker
설명 간단 요약: 블로그 내용을 간단하게 요약하면 먼저 oracle.com에서 자신이 쓸 DB의 버젼과 일반용, 기업용을 상세히 고려해서 자신에게 맞는 것을 다운로드 한다.
그 다음에 docker-images-master/OracleDatabase/dockerfiles라는 폴더에 Oracle DB 버젼으로 이름지어진 폴더들이 있다. 자신의 버젼에 맞는 폴더에 다운로드한 모든 걸 옮겨 넣은 후에 OracleDatabase에
buildDockerImage.sh 라는 것을 실행 시킨다. 실행 거부가 되면 해당 shell 스크립트 파일의 속성-권한-> 파일을 실행 프로그램으로 실행을 체크, 아니면 간단하게 chmod +x buildDockerImage.sh 하면 된다.
그다음 이걸 실행 시키면서 반드시 옵션을 주어야 한다. 일반용인지 기업용인지를 반드시 명시하면 이미지가 자동 빌드된다. 그러면 반드시 docker 에서 Oracle DB 이미지가 보여야 한다. ./buildDockerImage.sh --help 를 통해 어떤 옵션을 줄 수 있는지 보면 된다.(필자의 경우 -e 옵션으로 기업용 버젼을 설치해 보았다.)
다 만들어진 이미지를 이제 Port 1521로 호스트와 연결 지어주면 끝난다. 하지만 비밀번호가 자동 생성 되는데 run 명령어를 입력하는 순간 첫 줄에 비밀번호가 무엇인지 보이게 된다. 반드시 그 비밀번호를 빨리 소유한다. 안 그럼 다시 만들어야 한다.
sqldeveloper로 연결해 보면 아주 재대로 돌아가는 것을 볼 수 있을 것이다.
* vagrant 와 비슷 = http://www.libvirt.org/ 가상머신 관리 application. vagrant는 virtualbox를 지원.
* coreos https://discorery.etcd.io/<token> 이 token을 내가 원하는대로 생성이 가능? 아니면 자릿수만 맞춰서 난수로 clustering 서버에 제공?
* Core OS - Clustering Guide : https://coreos.com/etcd/docs/latest/clustering.html#discovery
* 따로 설정을 하지 않아도 어플리케이션이 실행되는 coresos 1이 죽으면 다른 cores 2, 3 등에서 실행이 된다. **
* 개발, 테스트, 운영을 통합 -> 실제로 굉장히 도입해 볼만함. 똑같은 환경. 특정 컨테이너의 특정한 커밋을 올려보고 테스트. 기본 모듈 개발 시 컨테이너에 장점. 특히 웹 개발.
* http://clusterlabs.org/wiki/Pacemaker
* clustering이 아직 생각보다 안정적이진 않다. cluster를 이용하기 때문에 생기는 또 다른 문제가 생길 것. etc는 누가 관리 할것이며...
* 구조 파악 : 네트웍, 스토리지, 시큐리티, (자원관리 -> cgroup을 어떻게 docker가 활용하는가?)
* 네트웍(장태희) : 1. packet이 host에서 container까지 들어가는 path 확인 2. docker 의 network mode가 있는데 mode 별로 path가 어떻게 잡히는지 3. network 구성이 바꿀 수 있는 방법이 무엇이 있는지. https://docs.docker.com/v1.10/engine/userguide/networking/ https://docs.docker.com/engine/userguide/networking/
* 스토리지(이희찬) : 1. docker 가 어떻게 host의 storage를 mount 해서 쓰는지 2. docker와 gfs의 다른 대안이 있는지 https://docs.docker.com/engine/userguide/storagedriver/selectadriver/ https://docs.docker.com/engine/userguide/storagedriver/aufs-driver/
* 시큐리티(한영빈) : 1. POSIX Capability를 이용한 Security control (어떤 process의 permission으로 network를 컨트롤 한다 안한다 등) previleged vs unprevileged
* 참고 : http://www.slideshare.net/janghoonsim/docker-container-and-lightweight-virtualization
== 2016년 8월 17일 ==
* container가 돌아가고 있는 상태에서 업데이트가 가능? -> container기반 서비스에서 지향하는 것 == 기존의 것을 upgrade 하는 것보다 부시고 새로 만드는 것!
* Load balancer 가 이미지 스위칭을 담당
* MS Azure
** https://azure.microsoft.com/ko-kr/documentation/articles/xplat-cli-install/
** https://azure.microsoft.com/ko-kr/documentation/articles/xplat-cli-connect/
* http://trace32.com/wiki/index.php/Remote_API
* http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter14/01 -> sudo apt-get install python-docker 로 한방에 설치 가능
* Remote API 부분은 공식 문서를 참조하는 것이 조금 더 도움이 되는 것 같다.
** Docker Remote API : https://docs.docker.com/engine/reference/api/docker_remote_api/
** Docker Remote API v1.24 : https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/
* Remote API의 핵심은 Remote API!
* 다음주는 15번 부터
* dockerd 옵션
* dockerd remote API 지원 service 로 실행하기 
1) /lib/systemd/system/docker.service 파일 수정
<nowiki>[Service] section 에
EnvironmentFile=-/etc/default/docker <- 추가
ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd:// <- 수정</nowiki>
2) /etc/default/docker 파일 수정
<nowiki>DOCKER_OPTS="-H tcp://0.0.0.0:4243" 추가</nowiki>
3) 서비스 재시작
<nowiki>- systemctl daemon-reload
- service docker stop/start</nowiki>
* 도커 구조 파악
* container live migration 내용이 없다. https://en.wikipedia.org/wiki/Live_migration
* https://criu.org/Docker
== 2016년 8월 10일 ==
== 2016년 8월 10일 ==
* 출석 : 한영빈, 장태희 / 결석 : 심장훈(스케줄), 이희찬(병결)
* 출석 : 한영빈, 장태희 / 결석 : 심장훈(스케줄), 이희찬(병결)
4번째 줄: 153번째 줄:
* git에서 특정 이벤트가 발생하면 실행되는 스크립트가 hook인데, 이벤트 중에 push가 해당
* git에서 특정 이벤트가 발생하면 실행되는 스크립트가 hook인데, 이벤트 중에 push가 해당
* post-receive는 서버측 스크립트
* post-receive는 서버측 스크립트
* heroku(https://www.heroku.com/) / dokku(http://dokku.viewdocs.io/dokku/)와 비슷하게 세팅하여 작동되는것 같다.(http://blog.nacyot.com/articles/2014-01-30-deploying-application-with-dokku/)
* 모니터링 서버를 localhost에 세팅 해도 되는가? -> 루프백 관련 문제 발생할듯.(http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter09/01)
* 모니터링과 어플리케이션 서버를 하나의 서버에 설치해도 되는가? -> Diamond 와 Graphite의 노출 포트가 겹치지 않도록 설정하면 가능함.
* rrdtool 을 이용하여 서버 모니터링을 한다고도 함.
* Graphite 사용 화면(그래프를 제대로 보려면, 최소 14시간 기다려야 제대로 된 간지나는(?) 그래프를 볼 수 있음)
[[파일:Example graphite usage.png]]
* <모니터링 서버 주소>/grafana 로 접속하면, grafana 로 데이터를 볼 수 있음.
[[파일:Example grafana usage.png]]


== 2016년 8월 3일 ==
== 2016년 8월 3일 ==

2016년 9월 22일 (목) 09:19 기준 최신판

2016년 9월 21일[편집]

Network : pdf 파일 보름 내로 다시 만들어서 드립니다.
Clustering & network -> Swarm(https://docs.docker.com/swarm/)
container 생성 후 동작 중간에 자원 performance 조절은 불가
docker run 옵션에서 제공하며, lxd에 비해 cgroup을 통해 조절되는 parameter의 양이 적음.

Storage : https://docs.docker.com/engine/userguide/storagedriver/selectadriver/
You can set the storage driver by passing the --storage-driver=<name> option to the dockerd command line, or by setting the option on the DOCKER_OPTS line in the /etc/default/docker file. -> 우분투 버그
/etc/docker/ 에 daemon.json 파일을 생성하고 { "storage driver : zfs" } 입력하고 저장
storage drive는 여러가지가 제공되나, host machine에서는 하나만 사용해야 함.

AUFS http://www.joinc.co.kr/w/man/12/docker/aufs
union mount
CoW : 변경점만 write한다 whitout : Image layer는 R/O이니
whiteout이 마치 지워진것처럼 인식하게 함.
아직 rename은 특정 조건에서 제대로 안될수도 있음.

ZFS http://www.howtogeek.com/175159/an-introduction-to-the-z-file-system-zfs-for-linux/
https://docs.docker.com/engine/userguide/storagedriver/zfs-driver/

Security https://docs.docker.com/engine/security/security/

도커 컨테이너는 보통 제한된 Capability 를 가지고 실행된다.

capability 는 root/non-root 디렉터리를 fine-grained 접근 제어 시스템으로 바꾼다. (루트 기반의 시스템 관리 권한은 각 앱이나 프로세스별 권한으로 세분화 한다.) 예 : 웹서버가 80번 포트에 바인드 할때, 루트로 바인드 하지 않고, net_bind_service 같은 전용 권한으로 바인드 한다.

보통의 서버는 많은 프로세스를 루트 권한으로 실행해야 하는 경우가 많다.

도커 컨테이너 내부에서 대부분의 경우 루트 권한이 필요하지 않다. ssh 연결은 도커 호스트 머신에 의해 실행된다. cron 은 플렛폼 전체적으로 실행되기 보단, 사용자 프로세스로 실행되어야 한다 로그 관리는 도커 또는 Loggy, Splunk 같은 제3자 서비스로 관리된다. 하드웨어 관리는 udev 로 실행 되어야 한다. 네트워크 관리는 도커 컨테이너 밖에서 일어난다.

그러므로 컨테이너의 루트는 호스트의 루트보다 훨씬 적은 privileges 를 가지고 있다. 예를 들어 아래와 같은 것이 가능해진다. 모든 마운트 작업 거부 raw 소켓 접근 거부 일부 파일시스템 작업 거부 모듈 로딩 거부 (기타 등등...)

이는 침입자가 컨테이너에서 루트로 상승을 한다 해도 큰 영향을 주지 않음을 의미한다. 도커 컨체이너에서는 기본적으로 아래와 같이 필요한 capability 를 제외하고 모두 드롭한다.

Linux Capability : http://man7.org/linux/man-pages/man7/capabilities.7.html Arch Wiki - Capability : https://wiki.archlinux.org/index.php/Capabilities Docker Docs - Linux Kernel Capabilities : https://docs.docker.com/engine/security/security/#/linux-kernel-capabilities Default Docker Container Capability List - https://github.com/docker/docker/blob/master/oci/defaults_linux.go#L64-L79 Docker Run Reference - Capability 추가 및 제거 옵션 : https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities


2016년 9월 7일[편집]

LXD 소개, 기본 사용법, 구조.

http://www.ubuntu.com/cloud/lxd

공유 문서 https://docs.google.com/document/d/1Hza6Me_xQU5XWhhCkki3vP7EEJgUEaoAHr34oqWjTcw/edit?usp=sharing

2016년 8월 31일[편집]

Android App on ChromeBook 관련 기사 http://www.androidauthority.com/run-android-apps-chromebook-703248/

Google I/O Chromebook 관련 영상 https://youtu.be/yDy1WWUdlY8?t=4m40s 이 영상에서 Android App들을 돌리는 시연 영상이 공개됨

Tech Bits - Running Android apps in Docker using Googles ARC Welder http://thshaw.blogspot.kr/2015/07/running-android-apps-in-docker-using.html

https://chrome.googleblog.com/2016/05/the-google-play-store-coming-to.html

https://support.google.com/chromebook/answer/1086915

https://insights.ubuntu.com/2016/06/14/universal-snap-packages-launch-on-multiple-linux-distros/

http://snapcraft.io/

https://blog.jessfraz.com/post/docker-containers-on-the-desktop/

2016년 8월 24일[편집]

  • 유용 링크: https://github.com/wscherphof/oracle-12c#build < 설명: Oracledb 를 Oracle Linux 7 Docker image에서 설치하고 돌릴 수 있게 Dockerfile들을 제공한다. 자세한 것은 직접 방문해서 보면 된다. 친절하게 다 안내가 되어있다. 개발자가 사용한 Oracledb는 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 에서 실험이 진행되었다.

Oracle에서 아예 공식 블로그와 자사 Github에 Oracle DB를 컨테이너 상에서 매우 쉽게 돌릴수 있도록 설명서와 프로그램들을 짜서 동봉 하였다. 그냥 다운로드 해서 쓰면 된다. 나머지 서비스나 라이선스 문제는 알아서 하면 될 것이다. 링크: https://blogs.oracle.com/developer/entry/creating_and_oracle_database_docker

설명 간단 요약: 블로그 내용을 간단하게 요약하면 먼저 oracle.com에서 자신이 쓸 DB의 버젼과 일반용, 기업용을 상세히 고려해서 자신에게 맞는 것을 다운로드 한다. 그 다음에 docker-images-master/OracleDatabase/dockerfiles라는 폴더에 Oracle DB 버젼으로 이름지어진 폴더들이 있다. 자신의 버젼에 맞는 폴더에 다운로드한 모든 걸 옮겨 넣은 후에 OracleDatabase에

buildDockerImage.sh 라는 것을 실행 시킨다. 실행 거부가 되면 해당 shell 스크립트 파일의 속성-권한-> 파일을 실행 프로그램으로 실행을 체크, 아니면 간단하게 chmod +x buildDockerImage.sh 하면 된다.

그다음 이걸 실행 시키면서 반드시 옵션을 주어야 한다. 일반용인지 기업용인지를 반드시 명시하면 이미지가 자동 빌드된다. 그러면 반드시 docker 에서 Oracle DB 이미지가 보여야 한다. ./buildDockerImage.sh --help 를 통해 어떤 옵션을 줄 수 있는지 보면 된다.(필자의 경우 -e 옵션으로 기업용 버젼을 설치해 보았다.)

다 만들어진 이미지를 이제 Port 1521로 호스트와 연결 지어주면 끝난다. 하지만 비밀번호가 자동 생성 되는데 run 명령어를 입력하는 순간 첫 줄에 비밀번호가 무엇인지 보이게 된다. 반드시 그 비밀번호를 빨리 소유한다. 안 그럼 다시 만들어야 한다. sqldeveloper로 연결해 보면 아주 재대로 돌아가는 것을 볼 수 있을 것이다.

2016년 8월 17일[편집]

1) /lib/systemd/system/docker.service 파일 수정

[Service] section 에 
EnvironmentFile=-/etc/default/docker <- 추가
ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd:// <- 수정

2) /etc/default/docker 파일 수정

DOCKER_OPTS="-H tcp://0.0.0.0:4243" 추가

3) 서비스 재시작

- systemctl daemon-reload
- service docker stop/start

2016년 8월 10일[편집]

파일:Example graphite usage.png

  • <모니터링 서버 주소>/grafana 로 접속하면, grafana 로 데이터를 볼 수 있음.

파일:Example grafana usage.png

2016년 8월 3일[편집]

출석 : 한영빈, 이희찬, 심장훈, 장태희

    • snapshot? commit으로 사용 하면 되지만 개념이 미묘하게 차이가 있는 듯.
    • 파일들의 위치 : /var/lib/docker -> containers, volumes
    • 완벽한 sandbox 형태를 제공하지는 않는다. 접근이 가능하기 때문에 Host가 파일 변경은 수월하나 보안적으로는 취약함.
    • CMD + ENTRYPOINT
    • CMD는 Dockerfile에서 한 번만 정의 가능 / ENTRYPOINT는 Dockerfile에서 한 번만, 명령어에서 옵션을 주면 CMD 옵션을 덮어쓰게 됨.
  • 다음 주 8, 9 해오기

2016년 7월 27일[편집]

커리큘럼 작성[편집]

- Windows, OS X: Kitematic(Docker에서 공식적으로 권장함.) --> https://kitematic.com/

- 운영체제 전부 지원:Simple Docker UI.--> https://chrome.google.com/webstore/detail/simple-docker-ui/jfaelnolkgonnjdlkfokjadedkacbnib?hl=ko(2016-7-27일 기준으로 Windows용 Docker Beta 버젼을 쓴다면 조금 설정이 바로 보고 쓰기에 좀 번거롭다. Windows 사용자라면 Kitematic을 쓰는게 훨씬 편하다.)

  • 1주차 : 1 ~5장 Docker 살펴보기
  • 2주차 : 5 ~7장
  • 3주차 : 8 ~9장
  • 4주차 : 10 ~ 15장
  • 5주차 : 16 ~ 20장
  • 6주차 :
  • 7주차 :
  • 8주차 :

- 장훈님 : container의 성능 자체에 관심 /

  • version : 1.10 stable로 맞추기
  • http://m.blog.daum.net/sunwookim77/104
  • docker 다운 받은 image를 삭제 하고 싶으면 image를 사용한 모든 container를 서비스 중지하고 삭제 하여야 함.
  • sudo docker exec -i -t hello-nginx /bin/bash -> -i -t 옵션이 뒤에 가면 먹히지 않는다. 옵션 지정 위치가 중요.