2015年9月10日 星期四

試玩 Docker 紀錄 - 1

試玩 Docker 紀錄

參考:

Docker實作入門-OpenFoundry

docker on Linux Mint初體驗

在 Ubuntu/Linux Mint 環境記得要用 docker.io 而不是 docker,因為 docker 這個名稱好像已經被一個別的工作列小圖示套件先佔用了。由於一開始這個沒搞清楚,照著教學操作時弄得好亂。原來只要把指令的 docker 換成 docker.io 即可。

測試環境:

edward ~ $ uname -a
Linux edward-Mint15-Cite 3.13.0-33-generic #58-Ubuntu SMP Tue Jul 29 16:45:05 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

下載

edward ~ $ sudo apt-get update
edward ~ $ sudo apt-get install docker.io
正在讀取套件清單... 完成
正在重建相依關係          
正在讀取狀態資料... 完成
下列的額外套件將被安裝:
  aufs-tools cgroup-lite
建議套件:
  debootstrap lxc rinse
下列【新】套件將會被安裝:
  aufs-tools cgroup-lite docker.io
升級 0 個,新安裝 3 個,移除 0 個,有 44 個未被升級。
需要下載 4,207 kB 的套件檔。
此操作完成之後,會多佔用 25.0 MB 的磁碟空間。
(...中間省略)
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Processing triggers for ureadahead (0.100.0-16) ...
ureadahead will be reprofiled on next reboot
設定 aufs-tools (1:3.2+20130722-1.1) ...
設定 docker.io (1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1) ...
新增 `docker' 群組 (GID 126) ...
完成。
docker.io start/running, process 6286    ###這裡其實就已經啟動docker.io了
設定 cgroup-lite (1.9) ...
cgroup-lite start/running
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
Processing triggers for ureadahead (0.100.0-16) ...

接著要「檢視一下 docker 是否安裝成功」就遇到問題:

edward ~ $ sudo docker info
2015/09/10 22:47:25 Cannot connect to the Docker daemon. Is 'docker -d' running on this host?

但是明明有安裝了:

edward ~ $ docker version
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.2.1
Git commit (client): 990021a
2015/09/10 22:51:04 Get http:///var/run/docker.sock/v1.12/version: dial unix     /var/run/docker.sock: permission denied

只好執行 docker -d

edward ~ $ sudo docker -d
2015/09/10 22:57:37 docker daemon: 1.0.1 990021a; execdriver: native;     graphdriver:
[c9df1395] +job serveapi(unix:///var/run/docker.sock)
[c9df1395] +job initserver()
[c9df1395.initserver()] Creating server
2015/09/10 22:57:37 Listening for HTTP on unix (/var/run/docker.sock)
[c9df1395] +job init_networkdriver()
[c9df1395] -job init_networkdriver() = OK (0)
2015/09/10 22:57:38 WARNING: Your kernel does not support cgroup swap limit.
Error loading docker apparmor profile: exec: "/sbin/apparmor_parser": stat     /sbin/apparmor_parser: no such file or directory ()
[c9df1395] -job initserver() = ERR (1)
2015/09/10 22:57:38 Error loading docker apparmor profile: exec:     "/sbin/apparmor_parser": stat /sbin/apparmor_parser: no such file or directory     ()
# 到這裡必須按 Ctrl-C 才能離開

安裝 apparmor

因為上面有錯誤訊息說 Error loading docker apparmor profile: exec: "/sbin/apparmor_parser": stat /sbin/apparmor_parser: no such file or directory () ,所以要安裝 apparmor:

edward ~ $ sudo apt-get install apparmor

嘗試啟動 docker 服務,但是不行:

edward ~ $ sudo service docker start
sudo: timestamp too far in the future: Sep 10 23:11:13 2015
[sudo] password for edward:
docker: unrecognized service

不行是應該的,因為要寫 docker.io 才對:

edward ~ $ sudo service docker.io start
docker.io start/running, process 8470

再看 info 就可以了:

edward ~ $ sudo docker.io info
[sudo] password for edward:
Containers: 0
Images: 0
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Dirs: 0
Execution Driver: native-0.2
Kernel Version: 3.13.0-33-generic
WARNING: No swap limit support

登入 Docker Hub

接著上Docker Hub註冊一組帳號密碼,就可以登入 Docker Hub了:

edward ~ $ sudo docker login
[sudo] password for edward:
Username: XXXXXXXXX
Password:
Email: XXXXXXXX@gmail.com
Login Succeeded

啟動一個 CentOS 7 的容器(container)來顯示 uname 系統資訊:

edward ~ $ sudo docker.io run centos:centos7 /bin/uname -a
[sudo] password for edward:
Unable to find image 'centos:centos7' locally   #centos是repo名稱,centos7則是tag名稱
Pulling repository centos    #本機找不到該image時,就會去線上的repository找
0f73ae75014f: Download complete
47d44cb6f252: Download complete
f6f39725d938: Download complete
f9a8cbc8dd13: Download complete
f37e6a610a37: Download complete
Linux 7845411ac2b0 3.13.0-33-generic #58-Ubuntu SMP Tue Jul 29 16:45:05 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

可以看到執行的結果還是顯示出底層主機的資訊…

求助:顯示說明資訊

edward ~ $ docker.io --help

(比起 man docker.io 會比較詳細), 也可以針對特定指令例如:

edward ~ $ docker.io run --help

以互動模式進入容器的終端機

  • -t 開啟 tty 進入容器
  • -i 透過 STDIN 與容器進行互動

    edward ~ $ sudo docker.io run -t -i centos:centos7 bash bash-4.2# whoami root

退出容器(會結束掉這個運行中的容器。下次再執行將會是重新開一個容器)

用指令 exit 或者 Ctrl-D 來結束正在運行中的容器:

bash-4.2# exit
exit

退出 tty 終端機但保持容器運行

按Ctrl + P,再按Ctrl + Q ,就可以跳離開這個容器的tty。

如果只是退出終端機,容器仍在繼續運行,就必須要學會如何管理容器。

取得 Container ID

edward ~ $ sudo docker.io run -t -i centos:centos7 bash
root@6870de310b50 / $uname -n
6870de310b50              #每一個容器都有一個唯一的 CONTAINER ID
bash-4.2# PS1="\u@\h \w \$"
root@6870de310b50 / $            #這個 6870de310b50 就是 CONTAINER ID

用 docker ps 查看運行中的容器

Docker client 提供了 docker ps 可以查看目前開啟且正在執行的容器:

edward ~ $ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6870de310b50        centos:centos7      bash                12 minutes ago      Up 12 minutes                           cranky_hoover       
edward ~ $

cranky_hoover是容器名稱,而6870de310b50是container ID,兩者都可以用來指稱特定的容器。

回到容器的終端機 tty

對於沒有關閉(stop)的容器,可以利用容器名稱(或Container ID)指定在容器中執行指令:

edward ~ $ sudo docker.io attach cranky_hoover bash
bash-4.2#

雖然看資料也可以用這個指令達成一樣的目的:

edward ~ $ sudo docker.io exec -t -i cranky_hoover bash

但是無法執行,help檔也查不到 exec 這個指令。

接著按 Ctrl-P 然後 Ctrl-Q 退出終端機。回到host本機的指令環境。

停止容器運作

使用 docker stop指令來停止背景運行中的容器。

edward ~ $ sudo docker.io stop 6870de310b50
6870de310b50

查看所有容器

使用 docker ps -a 來查看所有未被刪除的容器:

edward ~ $ sudo docker.io ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
6870de310b50        centos:centos7      bash                25 minutes ago      Exited (-1) 45 seconds ago                         cranky_hoover          
a69f74cf6f23        centos:centos7      bash                34 minutes ago      Exited (0) 33 minutes ago                          high_poincare          
0bc4a3bc4420        centos:centos7      /bin/date           46 minutes ago      Exited (0) 46 minutes ago                          backstabbing_wozniak   
7845411ac2b0        centos:centos7      /bin/uname -a       About an hour ago   Exited (0) About an hour ago                       jolly_ritchie

啟動已被停止的容器

使用 docker start 來重新啟動已經被停止的容器:

edward ~ $ sudo docker.io start 6870de310b50
6870de310b50

刪除不需要的容器

以 docker rm 來刪除不需要的容器

edward ~ $ sudo docker.io rm jolly_ritchie
jolly_ritchie