試玩 Docker 紀錄
參考:
在 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