新手入門	
  
Yiling	
  Lai	
  	
  2015/06/04	
  
指令練習	
  
h1ps://goo.gl/F6L5iy	
  
(h1ps://github.com/azole/docker-­‐demo)	
  
Development	
   Test	
   ProducJon	
  
Development	
   Test	
   ProducJon	
  
Container	
  
•  Container	
  技術則是直接將⼀一個應⽤用程式所
需的相關程式碼、函式庫、環境配置檔都
打包起來建⽴立沙箱執⾏行環境。 	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10個Q&A快速認識Docker	
  
貨櫃的故事	
  
h1p://mrjamie.cc/2011/09/21/shipping-­‐container/	
  
Image	
  and	
  Container
•  Image:	
  可用來重複建立自己需要的
container	
  
•  Container:	
  一個獨立的運行空間	
  	
  
docker run -it node:0.10.38 /bin/bash
Image	
   Container
RUN
Demo1,	
  Demo2	
  
啟動	
  node	
  的執行環境	
  
docker run -it node:0.10.38 /bin/bash
à 建立一個 container,內建有 node
0.10.38 的執行環境
-­‐t	
  選項讓Docker分配⼀一個虛擬終端(pseudo-­‐1y)並綁定到容器的標準輸⼊入上	
  
-­‐i	
  則讓容器的標準輸⼊入保持打開	
  
Image	
  
Container
Image	
  
PULL
RUN
Registry
Local
Image	
   Container
RUN
Container
RUN
Demo3	
  
Image	
  
Container
Image	
  
PULL
Container’
RUN
CHANGE
Image	
  
Commit
Registry
Local
Container (writable)
Base	
  Image:	
  CentOS
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
1.1	
  執行	
  (run)	
  CentOS	
  image	
  à	
  container	
  
Base	
  Image:	
  CentOS
Container: yum update
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
1.1	
  執行	
  (run)	
  CentOS	
  image	
  à	
  container	
  
1.2	
  進行更新	
  yum	
  update	
  
Base	
  Image:	
  CentOS
Image	
  A:	
  Updated
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
1.1	
  執行	
  (run)	
  CentOS	
  image	
  à	
  container	
  
1.2	
  進行更新	
  yum	
  update	
  
1.3	
  存成(commit)	
  image	
  à	
  只會存	
  diff	
  
	
  	
  	
  	
  	
  	
  	
  à	
  現在有	
  	
  2	
  個不同的	
  images	
  
	
  	
  	
  à	
  Base	
  Image	
  為	
  Image	
  A	
  的	
  Parent
參考
parent	
  
Image
Base	
  Image:	
  CentOS
Image	
  A:	
  Updated
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
2.1	
  執行	
  (run)	
  image	
  A	
  à	
  container	
  
	
  	
  	
  	
  	
  	
  	
  à	
  會連	
  Base	
  Image	
  都載入	
  
Container
參考
parent	
  
Image
Base	
  Image:	
  CentOS
Image	
  A:	
  Updated
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
2.1	
  執行	
  (run)	
  image	
  A	
  à	
  container	
  
2.2	
  安裝	
  apache	
  
Install Apache
參考
parent	
  
Image
Base	
  Image:	
  CentOS
Image	
  A:	
  Updated
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
2.1	
  執行	
  (run)	
  image	
  A	
  à	
  container	
  
2.2	
  安裝	
  apache	
  
2.3	
  存成(commit)	
  image	
  B	
  
	
  	
  	
  	
  	
  	
  	
  à	
  只存	
  diff	
  
	
  	
  	
  	
  	
  	
  	
  à	
  A	
  為	
  B	
  的 Parent	
  Image
Image	
  B:	
  Apache
參考
parent	
  
Image
參考
parent	
  
Image
Base	
  Image:	
  CentOS
Image	
  A:	
  Updated
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
3.1	
  執行	
  (run)	
  image	
  B	
  à	
  container	
  
	
  	
  	
  	
  	
  	
  	
  à	
  載入	
  Base	
  Image	
  &	
  Image	
  A	
  
Image	
  B:	
  Apache
Container
參考
parent	
  
Image
參考
parent	
  
Image
Base	
  Image:	
  CentOS
Image	
  A:	
  Updated
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
3.1	
  執行	
  (run)	
  image	
  B	
  à	
  container	
  
3.2	
  安裝	
  PHP	
  5.3	
  
Image	
  B:	
  Apache
PHP 5.3
參考
parent	
  
Image
參考
parent	
  
Image
Base	
  Image:	
  CentOS
Image	
  A:	
  Updated
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
3.1	
  執行 (run)	
  image	
  B	
  à	
  container	
  
3.2	
  安裝	
  PHP	
  5.3	
  
4.1	
  執行 (run)	
  image	
  B	
  à	
  container	
  
Image	
  B:	
  Apache
PHP 5.3
 Container
參考
parent	
  
Image
參考
parent	
  
Image
Base	
  Image:	
  CentOS
Image	
  A:	
  Updated
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
3.1	
  執行 (run)	
  image	
  B	
  à	
  container	
  
3.2	
  安裝	
  PHP	
  5.3	
  
4.1	
  執行 (run)	
  image	
  B	
  à	
  container	
  
4.2	
  安裝	
  PHP	
  5.4	
  
Image	
  B:	
  Apache
PHP 5.3
 PHP 5.4
參考
parent	
  
Image
參考
parent	
  
Image
Base	
  Image:	
  CentOS
Image	
  A:	
  Updated
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
5.1	
  執行 (run)	
  image	
  A	
  à	
  container	
  
Image	
  B:	
  Apache
PHP 5.3
 PHP 5.4
Container
參考
parent	
  
Image
參考
parent	
  
Image
Base	
  Image:	
  CentOS
Image	
  A:	
  Updated
Read-­‐Write	
  	
  
Layer
Read-­‐Only	
  	
  
Image
5.1	
  執行 (run)	
  image	
  A	
  à	
  container	
  
5.2	
  安裝	
  Nginx	
  	
  
Image	
  B:	
  Apache
PHP 5.3
 PHP 5.4
Nginx
基本概念
•  Image:	
  一個唯讀的模板,可用來建立
container。	
  
•  Container:	
  從	
  image	
  建立的執行實例,可以
被啟動、停止、刪除等,每個	
  container	
  之
間都是隔離的。	
  
•  Repository:	
  類似 git,裡頭有許多	
  image	
  可
供使用。	
  
– 公開的:Docker	
  Hub	
  	
  (類似 github)	
  
– 私有:可以透過	
  docker-­‐registry	
  建立	
  	
  
Image	
  
Container
Image	
  
PULL
Container’
RUN
CHANGE
Image	
  
Commit
PUSH
Registry
Local
Image	
  
Dockerfile
•  只是一個文字檔:	
  文件、版控、易於傳遞	
  
docker build -t azole/nginx .
# This is a nginx server
FROM debian
MAINTAINER azole <azole@pchome.com.tw>
RUN apt-get -qq update
RUN apt-get -y install nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Image	
  Dockerfile
BUILD
Demo4	
  
Container
Websrv
Docker0 Bridge
(172.17.42.1)
docker	
  run	
  -­‐-­‐name	
  websrv	
  -­‐d	
  –p	
  8080:80	
  azole/nginx	
  
eth0
eth0
Host
port	
  80
port	
  8080
Demo5	
  
Container
Websrv
Docker0 Bridge
(172.17.42.1)
docker	
  run	
  -­‐-­‐name	
  websrv	
  -­‐d	
  -­‐p	
  8080:80	
  	
  -­‐-­‐privileged=true	
  	
  
	
  	
  	
  	
  -­‐v	
  /home/azole/websrv:/var/www/html	
  azole/nginx
eth0
eth0
Host
port	
  80
port	
  49161
Local	
  FS
webapp1
webapp2
webapp3
 path/www
Demo6	
  
Container
Websrv
Docker0 Bridge
(172.17.42.1)
docker	
  run	
  -­‐-­‐name	
  webdb	
  -­‐d	
  redis	
  
docker	
  run	
  -­‐-­‐name	
  websrv	
  -­‐d	
  -­‐P	
  -­‐-­‐link	
  webdb:mysql	
  	
  
	
  	
  	
  	
  -­‐v	
  /home/azole/webapp2:/var/www/html	
  	
  
	
  	
  	
  	
  -­‐-­‐privileged	
  =true	
  azole/nginx
eth0
eth0
Host
port	
  80
port	
  49161
Link
Local	
  FS
webapp1
webapp2
webapp3
 path/www
Container
webdb
Demo7	
  
boot2docker	
  
•  For	
  mac	
  and	
  windows	
  
docker client
Boot2docker VM (VirtualBox VM)
	
  
	
  
	
  
	
  
Docker	
  Daemon	
  
Container Container Container
mac	
  /	
  windows
•  boot2docker	
  init	
  
•  boot2docker	
  start	
  
•  boot2docker	
  shellinit	
  
•  boot2docker	
  ip	
  
To	
  connect	
  the	
  Docker	
  client	
  to	
  the	
  Docker	
  daemon,	
  please	
  set:	
  
	
  	
  	
  	
  export	
  DOCKER_HOST=tcp://192.168.59.103:2376	
  
	
  	
  	
  	
  export	
  DOCKER_CERT_PATH=/Users/mtk10862/.boot2docker/certs/boot2docker-­‐vm	
  
	
  	
  	
  	
  export	
  DOCKER_TLS_VERIFY=1	
  
 
	
  
	
  
Docker	
  Daemon	
  
Container Container Container
linux
eth0
docker client
Boot2docker VM (192.168.59.103)
	
  
	
  
	
  
Docker	
  Daemon	
  
Container Container Container
mac	
  /	
  windows
eth0
http://192.168.59.103:49154
docker client
http://localhost:49154
極小化	
  redis	
  image	
  
•  請參考:追求極簡化	
  Docker	
  image	
  之路	
  -­‐	
  
William	
  Yeh	
  
參考資料	
  
•  10個Q&A快速認識Docker	
  
•  《Docker	
  ——	
  從⼊入⾨門到實踐-­‐》正體中⽂文版	
  
•  h1ps://github.com/William-­‐Yeh/docker-­‐
workshop	
  
•  追求極簡化	
  Docker	
  image	
  之路	
  -­‐	
  William	
  Yeh	
  
指令練習	
  
•  h1ps://github.com/azole/docker-­‐demo/	
  

20150604 docker 新手入門

  • 1.
  • 2.
  • 3.
    Development   Test   ProducJon  
  • 4.
    Development   Test   ProducJon  
  • 5.
    Container   •  Container  技術則是直接將⼀一個應⽤用程式所 需的相關程式碼、函式庫、環境配置檔都 打包起來建⽴立沙箱執⾏行環境。                                                                                                                            -­‐  10個Q&A快速認識Docker  
  • 6.
  • 8.
    Image  and  Container • Image:  可用來重複建立自己需要的 container   •  Container:  一個獨立的運行空間     docker run -it node:0.10.38 /bin/bash Image   Container RUN Demo1,  Demo2  
  • 9.
    啟動  node  的執行環境   docker run -it node:0.10.38 /bin/bash à 建立一個 container,內建有 node 0.10.38 的執行環境 -­‐t  選項讓Docker分配⼀一個虛擬終端(pseudo-­‐1y)並綁定到容器的標準輸⼊入上   -­‐i  則讓容器的標準輸⼊入保持打開  
  • 11.
  • 12.
  • 13.
  • 14.
    Container (writable) Base  Image:  CentOS Read-­‐Write     Layer Read-­‐Only     Image 1.1  執行  (run)  CentOS  image  à  container  
  • 15.
    Base  Image:  CentOS Container:yum update Read-­‐Write     Layer Read-­‐Only     Image 1.1  執行  (run)  CentOS  image  à  container   1.2  進行更新  yum  update  
  • 16.
    Base  Image:  CentOS Image  A:  Updated Read-­‐Write     Layer Read-­‐Only     Image 1.1  執行  (run)  CentOS  image  à  container   1.2  進行更新  yum  update   1.3  存成(commit)  image  à  只會存  diff                à  現在有    2  個不同的  images        à  Base  Image  為  Image  A  的  Parent 參考 parent   Image
  • 17.
    Base  Image:  CentOS Image  A:  Updated Read-­‐Write     Layer Read-­‐Only     Image 2.1  執行  (run)  image  A  à  container                à  會連  Base  Image  都載入   Container 參考 parent   Image
  • 18.
    Base  Image:  CentOS Image  A:  Updated Read-­‐Write     Layer Read-­‐Only     Image 2.1  執行  (run)  image  A  à  container   2.2  安裝  apache   Install Apache 參考 parent   Image
  • 19.
    Base  Image:  CentOS Image  A:  Updated Read-­‐Write     Layer Read-­‐Only     Image 2.1  執行  (run)  image  A  à  container   2.2  安裝  apache   2.3  存成(commit)  image  B                à  只存  diff                à  A  為  B  的 Parent  Image Image  B:  Apache 參考 parent   Image 參考 parent   Image
  • 20.
    Base  Image:  CentOS Image  A:  Updated Read-­‐Write     Layer Read-­‐Only     Image 3.1  執行  (run)  image  B  à  container                à  載入  Base  Image  &  Image  A   Image  B:  Apache Container 參考 parent   Image 參考 parent   Image
  • 21.
    Base  Image:  CentOS Image  A:  Updated Read-­‐Write     Layer Read-­‐Only     Image 3.1  執行  (run)  image  B  à  container   3.2  安裝  PHP  5.3   Image  B:  Apache PHP 5.3 參考 parent   Image 參考 parent   Image
  • 22.
    Base  Image:  CentOS Image  A:  Updated Read-­‐Write     Layer Read-­‐Only     Image 3.1  執行 (run)  image  B  à  container   3.2  安裝  PHP  5.3   4.1  執行 (run)  image  B  à  container   Image  B:  Apache PHP 5.3 Container 參考 parent   Image 參考 parent   Image
  • 23.
    Base  Image:  CentOS Image  A:  Updated Read-­‐Write     Layer Read-­‐Only     Image 3.1  執行 (run)  image  B  à  container   3.2  安裝  PHP  5.3   4.1  執行 (run)  image  B  à  container   4.2  安裝  PHP  5.4   Image  B:  Apache PHP 5.3 PHP 5.4 參考 parent   Image 參考 parent   Image
  • 24.
    Base  Image:  CentOS Image  A:  Updated Read-­‐Write     Layer Read-­‐Only     Image 5.1  執行 (run)  image  A  à  container   Image  B:  Apache PHP 5.3 PHP 5.4 Container 參考 parent   Image 參考 parent   Image
  • 25.
    Base  Image:  CentOS Image  A:  Updated Read-­‐Write     Layer Read-­‐Only     Image 5.1  執行 (run)  image  A  à  container   5.2  安裝  Nginx     Image  B:  Apache PHP 5.3 PHP 5.4 Nginx
  • 26.
    基本概念 •  Image:  一個唯讀的模板,可用來建立 container。   •  Container:  從  image  建立的執行實例,可以 被啟動、停止、刪除等,每個  container  之 間都是隔離的。   •  Repository:  類似 git,裡頭有許多  image  可 供使用。   – 公開的:Docker  Hub    (類似 github)   – 私有:可以透過  docker-­‐registry  建立    
  • 27.
  • 28.
    Dockerfile •  只是一個文字檔:  文件、版控、易於傳遞   docker build -t azole/nginx . # This is a nginx server FROM debian MAINTAINER azole <azole@pchome.com.tw> RUN apt-get -qq update RUN apt-get -y install nginx EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] Image  Dockerfile BUILD Demo4  
  • 30.
    Container Websrv Docker0 Bridge (172.17.42.1) docker  run  -­‐-­‐name  websrv  -­‐d  –p  8080:80  azole/nginx   eth0 eth0 Host port  80 port  8080 Demo5  
  • 31.
    Container Websrv Docker0 Bridge (172.17.42.1) docker  run  -­‐-­‐name  websrv  -­‐d  -­‐p  8080:80    -­‐-­‐privileged=true            -­‐v  /home/azole/websrv:/var/www/html  azole/nginx eth0 eth0 Host port  80 port  49161 Local  FS webapp1 webapp2 webapp3 path/www Demo6  
  • 32.
    Container Websrv Docker0 Bridge (172.17.42.1) docker  run  -­‐-­‐name  webdb  -­‐d  redis   docker  run  -­‐-­‐name  websrv  -­‐d  -­‐P  -­‐-­‐link  webdb:mysql            -­‐v  /home/azole/webapp2:/var/www/html            -­‐-­‐privileged  =true  azole/nginx eth0 eth0 Host port  80 port  49161 Link Local  FS webapp1 webapp2 webapp3 path/www Container webdb Demo7  
  • 33.
    boot2docker   •  For  mac  and  windows   docker client Boot2docker VM (VirtualBox VM)         Docker  Daemon   Container Container Container mac  /  windows
  • 34.
    •  boot2docker  init   •  boot2docker  start   •  boot2docker  shellinit   •  boot2docker  ip   To  connect  the  Docker  client  to  the  Docker  daemon,  please  set:          export  DOCKER_HOST=tcp://192.168.59.103:2376          export  DOCKER_CERT_PATH=/Users/mtk10862/.boot2docker/certs/boot2docker-­‐vm          export  DOCKER_TLS_VERIFY=1  
  • 35.
          Docker  Daemon   Container Container Container linux eth0 docker client Boot2docker VM (192.168.59.103)       Docker  Daemon   Container Container Container mac  /  windows eth0 http://192.168.59.103:49154 docker client http://localhost:49154
  • 37.
    極小化  redis  image   •  請參考:追求極簡化  Docker  image  之路  -­‐   William  Yeh  
  • 38.
    參考資料   •  10個Q&A快速認識Docker   •  《Docker  ——  從⼊入⾨門到實踐-­‐》正體中⽂文版   •  h1ps://github.com/William-­‐Yeh/docker-­‐ workshop   •  追求極簡化  Docker  image  之路  -­‐  William  Yeh  
  • 39.

Editor's Notes

  • #4 開發環境 每個新進同仁、每台新電腦的工作環境? 不同的專案相依的環境不同(環境、相依函式庫、套件等版本)。 測試環境 通常測試機不會有太多台… 不同團隊之間的溝通成本… 平行測試? 正式環境 建置 與測試環境的差異,不一樣的話測試等於白測… 擴充
  • #5 開發環境 每個新進同仁、每台新電腦的工作環境? 不同的專案相依的環境不同(環境、相依函式庫、套件等版本)。 測試環境 通常測試機不會有太多台… 不同團隊之間的溝通成本… 平行測試? 正式環境 建置 與測試環境的差異,不一樣的話測試等於白測… 平行擴充
  • #9 Demo1, Demo2
  • #13 Demo3
  • #15 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #16 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #17 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #18 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #19 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #20 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #21 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #22 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #23 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #24 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #25 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #26 OS 基礎映象檔的用途是讓 Container 擁有這 OS 的檔案系統,例如使用 ubuntu 基礎映象檔就可以讓 Container 建立 ubuntu 的根目錄架構,而不是用來執行一個 OS 執行實例。
  • #27 私有倉庫這邊,還能透過設定將 images 儲存到 S3 上去。
  • #29 Demo4
  • #31 在預設的情況下,container可以主動存去外部網路的連接,但外部網路無法存取倒容器內。 Demo5
  • #32 Demo6
  • #33 Demo7
  • #34 The application includes a VirtualBox Virtual Machine (VM), Docker itself, and the Boot2Docker management tool.
  • #35 192.168.59.103
  • #37 傳統 VM 是在OS外來建立虛擬環境,透過Hypervisor在Host中模擬一套完整的硬體環境資源,目標是建立一個可以用來執行整套作業系統的沙箱獨立執行環境,所以VM做出來的是一個一個可以獨立安裝 OS 的「盒子」。 而 Container 是在OS內的核心系統層來打造虛擬執行環境,透過共用Host OS的作法,取代一個一個Guest OS的功用。 Container也因此被稱為是OS層的虛擬化技術。 Container 很輕、很快,啟動速度是秒級,可以大量節約開發、測試與部署的時間。 Docker 抛弃传统VM试图模拟完整机器的思路,而是以应用为单元进行"集装封箱"