008JAVA入門——編譯型語言和解釋型語言、JAVA程式執行機制
Docker命令
實驗環境為
centos7
執行第一個容器
首先檢視docker資訊:
$ sudo docker info
建立容器:
$ sudo docker run -i -t ubuntu /bin/bash
這裡建立了ubuntu
的映象,並在容器中運行了/bin/bash
命令啟動了一個Bash shell;首先docker回檢查本地是否有ubuntu
映象,如果本地沒有,則會連線官網的Docker Hub Registry,檢視是否有該映象,如果有就會自動下載該映象的最新版本;其中引數-i
保證容器中STDIN是開啟的,-t
為建立的容器分配一個偽tty終端,使用這兩個引數,新容器才能提供一個互動式的shell。
執行之後就回執行容器中的/bin/bash
命令,就可以看到容器內的shell了:
root@db99828a1442:/#
其中a7d8sdfe9s8c
為該容器的唯一ID,檢查容器的主機,
root@db99828a1442:/# hostname
a7d8sdfe9s8c
發現容器的主機名就是該容器的ID;檢查容器hosts
檔案,
root@db99828a1442:/# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 db99828a1442
Docker已經在hosts
檔案中為該容器的IP地址添加了一條主機配置項。檢查容器網路配置,
root@db99828a1442:/# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:2/64 scope link valid_lft forever preferred_lft forever
可以看到這裡有lo
環回介面,還有IP為172.17.0.2
的標準eth0
網路介面,和普通宿主機是完全一樣的。
檢查容器的程序,
root@db99828a1442:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 4232 1984 ? Ss+ 12:52 0:00 /bin/bash
root 18 0.0 0.1 5888 1480 ? R+ 12:59 0:00 ps aux
容器中同樣可以安裝軟體包,
root@db99828a1442:/# apt-get install vim
看見在容器中的所有操作都和完整系統是相同的。
當工作結束需要退出時,輸入exit
就可以返回宿主機了。但是同樣會導致容器停止執行。這時因為執行容器時指定的命令為/bin/bash
,一旦退出容器,/bin/bash
命令也就結束了,這時容器也就會隨之停止執行。
但是容器仍然是存在的,可以在宿主機中檢視,
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db99828a1442 ubuntu "/bin/bash" 13 days ago Exited eager_kalam
檢視當前系統中容器的所有容器,docker ps
只能看到正在執行的容器;docker ps -a
可以顯示所有容器,不管是否執行。
docker
的ps
命令和系統的ps
命令類似,可以通過指定-l
標誌,列出最後一個執行的容器,不管是否執行;通過指定--format
標誌,控制輸出格式。
如果想要重新啟動已經停止的容器,可以使用下面的命令,
$ sudo docker start db99
當然這裡同樣可以使用
db99828a1442
,或者容器名ubuntu
來啟動容器。
除了使用start
命令,也可以使用restart
命令重啟容器,
$ sudo docker restart db99828a1442
這時執行docker ps
就可以看到執行的容器了。
連線容器
附著
附著類似與“螢幕共享”,使用下面的命令,
sudo docker attach db99
如果容器正在執行,就會附著到容器上。但是如果要退出附著的話,使用exit
,但是這時容器同樣會退出。
EXEC
在Docker 1.3
之後,可以通過docker exec
命令在容器內部額外啟動新程序。可以在容器內執行的程序有兩種:後臺任務和互動式任務。後臺任務在容器中執行且沒有互動需求,而互動式任務則保持在前臺執行。
在容器中執行後臺任務,
$ sudo docker exec -d db99 touch /root/hello
這裡-d
標誌表明需要執行一個後臺程序,之後指定容器名以及要執行的命令。
也可以在容器中執行互動命令,
$ sudo docker exec -t -i db99 /bin/bash
這條命令在容器中建立了新的bash
會話,這樣就可以在容器中執行其他命令了。如果退出當前會話,容器不會停止。
容器的日誌
在Docker中可以通過docker logs
命令來獲取容器的日誌,
$ sudo docker logs db99
Docker會輸出最後幾條日誌並返回。同樣可以使用-f
標誌監控Docker日誌,
$ sudo docker logs -f db99
使用
Ctrl+C
退出日誌跟蹤
也可以使用--tail
標誌獲取最後的幾條日誌,
$ sudo docker logs --tail 10 db99
顯示最後10條日誌;
$ sudo docker logs --tail 0 -f db99
跟蹤容器的最新日誌;
也可以加上-t
標誌位日誌加上時間戳,
$ sudo docker logs -ft db99
從Docker 1.6
開始,可以通過--log-driver
選項來控制容器所用的日誌驅動,
$ sudo docker run --log-driver='syslog' -d ubuntu /bin/sh -c "while true; do echo hello world; sleep1; done"
這裡syslog
,會將容器的日誌輸出重定向到Syslog
,同時將禁止docker logs
。
容器的程序
在Docker中使用docker top
檢視容器內執行的程序,
$ sudo docker top db99
該命令可以看到容器內所有程序、執行程序的使用者及程序ID。
容器的統計資訊
同時,還可以使用docker stats
命令,顯示容器一個或多個容器的統計資訊,
$ sudo docker stats db99
該命令能看到一個守護式容器的列表,以及它們的CPU、記憶體、網路I/O及儲存I/O的效能和指標。
停止容器守護程序
要停止容器的守護程序,使用命令docker stop
,
$ sudo docker stop db99
同時可以使用docker kill
命令,
$ sudo docker kill db99
自動重啟容器
如果由於某種錯誤而導致容器停止執行,可以通過--restart
標誌,讓Docker自動重新啟動該容器。--restart
標誌會檢查容器的退出程式碼,並據此來決定是否需要重啟容器。Dockers預設是不會重啟容器的。
$ sudo docker run --restart=always -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
這裡--restart=always
,意味著無論容器的退出程式碼是什麼,Docker都會重啟該容器,除了always
,還可以設定為on-failure
,這樣只有容器的退出程式碼不為0時,才會自動重啟,另外on-failure
還接受一個可選的重啟次數引數,
--restart=on-failure:5
--restart
標誌是Docker 1.2.0
引入的
容器的詳細資訊
可以使用docker inspect
來獲取容器的詳細資訊,
$ sudo docker inspect db99
該命令會返回容器的配置資訊,包括名稱、命令、網路配置以及其它資訊。
同時可以指定--format
或-f
標誌篩選結果,
$ sudo docker inspect --format='{{.State.Running}}' db99
上面的命令會返回容器的執行狀態;
$ sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' db99
該命令返回容器的IP地址;
--format
可以指定多個容器,或多個條件,
$ sudo docker inspect --format=''{{.Name}} {{.State.Running}}'' db99 s8zd
刪除容器
如果容器不再使用,可以使用docker rm
命令刪除,
$ sudo docker rm db99
從Docker 1.6.2
開始,可以通過給docker rm
命令指定-f
標誌刪除執行中的Docker容器;在此版本之前,必須先使用docker stop
或docker kill
命令停止容器。
目前沒有辦法一次刪除所有容器,但是可以使用下面命令,
$ sudo docker rm `sudo docker ps -a -q`
其中-a
標誌意味著列出所有容器,-q
標誌表示只返回容器的ID。