Docker 這東西我注意很久了,但一直以為他就一個 VM Guest Machine 的 Adapter 之類的東西,然後可以 remote 一些指令。不過我誤解了,因為如果只是這樣,應該紅不起來。看到這本書 Docker —— 從入門到實踐 裡面提到一段和 VM 的比較,如下圖節錄:
這段很吸引我,我想『感覺』一下啟動的『秒級』是啥感覺,還有效能接近『原生』。。。這太有吸引力了!!然後還是可以快速建立測試環境,也符合我現在想要的,甚至可以不用像 OpenStack 那麼複雜的安裝和設置,而且要很多 resource (就是機器要很強啦) 。。。
以下是我的感動筆記。。。。 XDD
Enviornment
Install
直接安裝下載的 Boot2Docker-1.4.1.pkg , 跟一般在 Mac 上安裝軟體一樣
到 LaunchPad 點選 boot2docker, 會開始初始化, 我的過程如下, 看起來應該沒問題:init boot2docker 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 rick@iWish:22:39:27 ~$ bash unset DYLD_LIBRARY_PATH ; unset LD_LIBRARY_PATHmkdir -p ~/.boot2dockerif [ ! -f ~/.boot2docker/boot2docker.iso ]; then cp /usr/local/share/boot2docker/boot2docker.iso ~/.boot2docker/ ; fi /usr/local/bin/boot2docker init /usr/local/bin/boot2docker up $(/usr/local/bin/boot2docker shellinit) docker version rick@iWish:22:39:27 ~$ unset DYLD_LIBRARY_PATH ; unset LD_LIBRARY_PATH rick@iWish:22:39:27 ~$ mkdir -p ~/.boot2docker ocker.iso ~/.boot2docker/ ; fi-f ~/.boot2docker/boot2docker.iso ]; then cp /usr/local/share/boot2docker/boot2d rick@iWish:22:39:27 ~$ /usr/local/bin/boot2docker init Generating public/private rsa key pair. ... omitted ... rick@iWish:22:40:11 ~$ docker version Client version: 1.4.1 Client API version: 1.16 Go version (client): go1.3.3 Git commit (client): 5bc2ff8 OS/Arch (client): darwin/amd64 Server version: 1.4.1 Server API version: 1.16 Go version (server): go1.3.3 Git commit (server): 5bc2ff8 rick@iWish:22:40:12 ~$
Install Image from Docker Hub - CentOS 我習慣使用 CentOS,就先來一個漱漱口,指令:docker pull centos
。Docker 會到一個叫做 Docker Hub 的地方抓指定的 image,Docker Hub 上有很多各式各樣的 映像檔分類 。以下是我抓的過程:
docker pull centos 1 2 3 4 5 6 rick@iWish:22:40:12 ~$ docker pull centos centos:latest: The image you are pulling has been verified 511136ea3c5a: Pull complete 5b12ef8fd570: Pull complete 34943839435d: Pull complete Status: Downloaded newer image for centos:latest
這個過程會抓到的是最新的 CentOS 7,如果想要指定版本,那就要下 docker pull centos:centos6
Run command in CentOS docker run
是用來執行 container 裏的程式,後面可以帶參數,跑完後 container 就結束了,我執行幾個 linux command:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 rick@iWish:23:19:44 ~$ docker run centos /bin/echo 'hello' hello rick@iWish:23:19:56 ~$ docker run centos /bin/cat /etc/issue \S Kernel \r on an \m rick@iWish:23:22:41 ~$ docker run centos /bin/cat /etc/fstab LABEL=_/ / ext4 defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /dev/shm tmpfs defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 rick@iWish:23:22:47 ~$ docker run centos /bin/df Filesystem 1K-blocks Used Available Use% Mounted on rootfs 19049892 310512 17748656 2% / none 19049892 310512 17748656 2% / tmpfs 1028332 0 1028332 0% /dev shm 65536 0 65536 0% /dev/shm /dev/sda1 19049892 310512 17748656 2% /etc/hosts tmpfs 1028332 0 1028332 0% /proc/kcore
可以這樣想像,guest machine 不用真的開起來,然後就可以執行 container 裡面的程式。如果想開啟 shell:docker run -t -i centos /bin/bash
,-t
是虛擬終端機,-i
是開啟 stdin,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 rick@iWish:23:28:15 ~$ docker run -t -i centos [root@983b17e4470a /] / [root@983b17e4470a /] total 52 0 lrwxrwxrwx 1 root root 7 Dec 2 14:58 bin -> usr/bin 0 drwxr-xr-x 5 root root 380 Dec 17 15:28 dev 4 drwxr-xr-x 46 root root 4096 Dec 17 15:28 etc 4 drwxr-xr-x 2 root root 4096 Jun 10 2014 home 0 lrwxrwxrwx 1 root root 7 Dec 2 14:58 lib -> usr/lib 0 lrwxrwxrwx 1 root root 9 Dec 2 14:58 lib64 -> usr/lib64 4 drwx------ 2 root root 4096 Dec 2 14:58 lost+found 4 drwxr-xr-x 2 root root 4096 Jun 10 2014 media 4 drwxr-xr-x 2 root root 4096 Jun 10 2014 mnt 4 drwxr-xr-x 2 root root 4096 Jun 10 2014 opt 0 dr-xr-xr-x 93 root root 0 Dec 17 15:28 proc 4 dr-xr-x--- 2 root root 4096 Dec 2 15:00 root 4 drwxr-xr-x 7 root root 4096 Dec 2 15:00 run 0 lrwxrwxrwx 1 root root 8 Dec 2 14:58 sbin -> usr/sbin 4 drwxr-xr-x 3 root root 4096 Dec 2 15:00 selinux 4 drwxr-xr-x 2 root root 4096 Jun 10 2014 srv 0 dr-xr-xr-x 13 root root 0 Dec 17 15:28 sys 4 drwxrwxrwt 2 root root 4096 Dec 17 15:28 tmp 4 drwxr-xr-x 13 root root 4096 Dec 2 14:58 usr 4 drwxr-xr-x 18 root root 4096 Dec 2 14:59 var [root@983b17e4470a /] Filesystem Size Used Avail Use% Mounted on rootfs 19G 305M 17G 2% / none 19G 305M 17G 2% / tmpfs 1005M 0 1005M 0% /dev shm 64M 0 64M 0% /dev/shm /dev/sda1 19G 305M 17G 2% /etc/hosts tmpfs 1005M 0 1005M 0% /proc/kcore [root@983b17e4470a /] Linux 983b17e4470a 3.16.7-tinycore64 [root@983b17e4470a /] root [root@983b17e4470a /] bash: netstat: command not found [root@983b17e4470a /] bash: ifconfig: command not found [root@983b17e4470a home] exit rick@iWish:23:33:43 ~$
試了一些基本的東西,看看系統狀態,不過可以發現 netstat
、ifconfig
都無法執行,應該需要額外設置 eth 之類的東西吧。
LAMP 我最常用的 LAMP 組合,找了適當的 image 裝: docker pull dockerfiles/centos-lamp
也可以先用 docker search [keyword]
找找看,下面是搜尋的結果 - 一堆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 rick@iWish:23:33:45 ~$ docker search lamp NAME DESCRIPTION STARS OFFICIAL AUTOMATED tutum/lamp LAMP image - Apache listens in port 80, an... 41 [OK] dockerfiles/centos-lamp 6 [OK] tehes/superdevlamp Complete optimized LAMP stack for Drupal d... 4 ricardoamaro/drupal-lamp https://github.com/ricardoamaro/docker-dru... 4 rpawel/lamp55-joomla 3 ... 太多了,省略 ... rick@iWish:23:43:29 ~$ docker pull dockerfiles/centos-lamp Pulling repository dockerfiles/centos-lamp 666d59f8429d: Download complete 539c0211cd76: Download complete 1b522efc5462: Download complete 46d50bbca148: Download complete 082a6a05108d: Download complete f1c190401f1a: Download complete 987fe7539090: Download complete 7bfe4ff4df41: Download complete 720bdd4ad932: Download complete 27a235cf3931: Download complete 837dfe4536e0: Download complete f977418995c6: Download complete d638bd947021: Download complete dc5d255a48c7: Download complete b1089d528d27: Download complete bc3211f4cc3e: Download complete 62d8c4d27eed: Download complete Status: Downloaded newer image for dockerfiles/centos-lamp:latest
參數 -d
是啟動成 daemon。接續的 -p 49001:80
是指定和 local machine port mapping: 49001 對應到 80
start daemon 1 2 rick@iWish:23:56:40 ~$ docker run -d -p 49001:80 dockerfiles/centos-lamp aef450a7b2092b0a5699e23bf48a01766ca2d6b9e08741f11864510aa326097c
檢查 Daemon 狀態:
docker ps 1 2 3 4 rick@iWish:23:57:34 ~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aef450a7b209 dockerfiles/centos-lamp:latest "supervisord -n" 21 seconds ago Up 21 seconds 22/tcp, 0.0.0.0:49001->80/tcp stoic_franklin rick@iWish:23:59:29 ~$
打開瀏覽器,開啟 URL: http://localhost:49001
應該會看到 apache 的畫面 不過其實我沒跑成功, 待研究
結論 『感覺』過後,其實還不賴!真的『秒殺』的啟動時間。接下來我還想繼續是一些東西,像是:
MySQL, MongoDB, Memcache
Java Container: Tomcat / Jetty
Multiple docker container
Config network for docker container
Docker life-cycle
How to backup? portable?
如果跟我同樣再觀望,可以去官方的 Try It! 先試看看。
延伸閱讀
Reference