1. 程式人生 > 其它 >008JAVA入門——編譯型語言和解釋型語言、JAVA程式執行機制

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可以顯示所有容器,不管是否執行。

dockerps命令和系統的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 stopdocker kill命令停止容器。

目前沒有辦法一次刪除所有容器,但是可以使用下面命令,

$ sudo docker rm `sudo docker ps -a -q`

其中-a標誌意味著列出所有容器,-q標誌表示只返回容器的ID。