天天看點

十二、Docker基本指令-容器類

容器是 Docker 的另一個核心概念。 簡單來說,容器是鏡像的一個運作執行個體。所不同的是,鏡像是靜态的隻讀檔案,而容器帶有運作時需要的可寫檔案層,同時,容器中的應用程序處于運作狀态。

如果認為虛拟機是模拟運作的一整套作業系統(包括核心、 應用運作環境和其他系統環境)和跑在上面的應用。 那麼 Docker 容器就是獨立運作的一個(或一組)應用,以及它們必需的運作環境。

1、初體驗容器

基于centos鏡像啟動docker容器,列印"hello world "

[root@hadoop108 ~]# docker run centos:7.5.1804 /bin/echo "hello world"

2、建立容器

[root@hadoop108 ~]# docker create -i -t centos:7.5.1804 /bin/bash

[root@hadoop108 ~]# docker create -i -t -h hadoop102 --name centos-hadoop102 -d centos:7.5.1804 /bin/bash

3、檢視容器

1)檢視運作狀态的容器

[root@hadoop108 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

2)檢視所有狀态的容器

[root@hadoop108 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

bf2f501bb6e2 centos:7.5.1804 "/bin/bash" 9 seconds ago Created wizardly_lumier

4、啟動容器

[root@hadoop108 ~]# docker start bf2f501bb6e2

[root@hadoop108 ~]# docker ps

5、背景啟動容器

[root@hadoop108 ~]# docker start -d bf2f501bb6e2

尖叫提示:參數-d表示背景啟動

6、一步完成建立和啟動容器

1)建立和啟動容器一步完成,并且進入容器裡面

[root@hadoop108 ~]# docker run -i -t centos:7.5.1804 /bin/bash

前面的操作是先建立容器, 然後再啟動容器. 也可以使用run來直接建立并啟動容器

說明

(1)檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載下傳;

(2)利用鏡像建立一個容器,并啟動該容器;

(3)配置設定一個檔案系統給容器,并在隻讀的鏡像層外面挂載一層可讀寫層

2)啟動背景容器

[root@hadoop108 ~]# docker run -i -t -d centos:7.5.1804 /bin/bash

[root@hadoop108 ~]# docker run -i -t -h hadoop102 --name centos-hadoop102 -d centos:7.5.1804 /bin/bash

說明:建立一個互動式的容器

-i: 允許你對容器内的标準輸入 (STDIN) 進行互動

-t: 在新容器内指定一個僞終端或終端。

-h 配置容器的主機名

--name 給容器起名字

-d 背景啟動

7、啟動mysql容器

啟動容器時,給容器附名稱,設定密碼,映射端口

[root@hadoop108 ~]# docker run -p 3306:3306 --name firstmysql -e MYSQL_ROOT_PASSWORD=000000 -d mysql:5.7

尖叫提示:參數-t 打開僞終端,參數-i标準輸出, 退出僞終端 【Ctrl】+【D】 或者 exit

ctrl + p -> ctrl + q 退出容器,如果容器不是背景啟動的,也不會死掉

8、停止容器

[root@hadoop108 ~]# docker stop bf2f501bb6e2

9、重新開機容器

[root@hadoop108 ~]# docker restart bf2f501bb6e2

10、進入容器

[root@hadoop108 ~]# docker exec -i -t bf2f501bb6e2 /bin/bash

[root@bf2f501bb6e2 /]#

通過指定 -it參數來保持标準輸入打開, 并且配置設定一個僞終端。可以看到會打開一個新的 bash 終端,在不影響容器内其他應用的前提下,使用者可以與容器進行交五

11、退出容器

[root@bf2f501bb6e2 /]# exit

exit

[root@hadoop108 ~]#

Ctrl + p -> Ctrl +q

12、删除容器

1)删除已經停止的容器

[root@hadoop108 ~]# docker rm 1b29d1601792

1b29d1601792

2)删除運作狀态的容器

[root@hadoop108 ~]# docker stop bf2f501bb6e2

[root@hadoop108 ~]# docker rm bf2f501bb6e2

3)強制删除容器

[root@hadoop108 ~]# docker rm -f bf2f501bb6e2

13、容器運作完自動删除

[root@hadoop108 ~]# docker run --rm centos:7.5.1804 /bin/echo "helloworld"

14、擷取所有容器的id

[root@hadoop108 ~]# docker ps -a -q

15、殺死所有的docker容器

[root@hadoop108 ~]# docker kill $(docker ps -a -q)

[root@hadoop108 ~]# docker stop $(docker ps -a -q)

16、删除所有的docker容器

[root@hadoop108 ~]# docker rm -f $(docker ps -a -q)

[root@hadoop108 ~]# docker ps -aq | xargs docker rm -f

[root@hadoop108 ~]# docker rm -f `docker ps -a -q`

17、導入和導出容器

某些時候,需要将容器從一個系統遷移到另外一個系統,此時可以使用 Docker 的導入 和導出功能,這也是 Docker 自身提供的一個重要特性。

為了測試容器是否導出和導入成功, 我們在centos容器中建立一個新的檔案

1)準備操作

[root@hadoop108 ~]# docker create -it centos:7.5.1804 /bin/bash

[root@hadoop108 ~]# docker ps -a

2)導出容器

導出容器是指,導出一個已經建立的容器到一個檔案,不管此時這個容器是否處于運作狀态.

[root@hadoop108 ~]# docker export 36712e68abdc > export_centos1.tar

[root@hadoop108 ~]# docker export -o export_centos2.tar 36712e68abdc

[root@hadoop108 ~]# docker export 36712e68abdc > './export_centos3.tar'

[root@hadoop108 ~]# docker export -o './export_centos4.tar' 36712e68abdc

[root@hadoop108 ~]# docker export 36712e68abdc > "./export_centos5.tar"

[root@hadoop108 ~]# docker export -o "./export_centos6.tar" 36712e68abdc

3)導入容器

[root@hadoop102 ~]# docker import export_centos1.tar export/centos:1.0.0

[root@hadoop108 ~]# docker import export_centos1.tar -- export/centos:1.0.0

4)使用新的鏡像啟動容器

[root@hadoop108 ~]# docker images

[root@hadoop108 ~]# docker run -it export/centos:1.0.0 /bin/bash

[root@1e7429044e63 /]#

18、檢視容器詳情

[root@hadoop108 ~]# docker container inspect 1e7429044e63

會以 json 格式傳回包括容器 Id、建立時間、路徑、狀态、鏡像、配置等在内的各項資訊

19、檢視容器内程序

這個子指令類似于 Linux 系統中的 top 指令, 會列印出容器内的程序資訊, 包括 PID 、 使用者、時間、指令等

[root@hadoop108 ~]# docker top 1e7429044e63

尖叫提示:容器必須是啟動狀态

20、檢視容器統計資訊

[root@hadoop108 ~]# docker stats --no-stream 1e7429044e63

會顯示 CPU 、記憶體、存儲、網絡等使用情況的統計資訊

21、容器和主機之間複制檔案

容器和主機之間進行檔案複制的時候, 要保證容器已經啟動

1)Linux資料準備

[root@hadoop108 ~]# vim a.txt

I Love Docker

2)從主機複制到容器裡面

[root@hadoop108 ~]# docker cp a.txt 1e7429044e63:/opt

3)進入容器檢視

[root@hadoop108 ~]# docker exec -i -t 1e7429044e63 /bin/bash

4)容器資料修改

[root@1e7429044e63 opt]# vim a.txt

I Love Docker

I Love Linux

5)從容器複制資料到主機

[root@hadoop108 ~]# docker cp 1e7429044e63:/opt/a.txt ./

22、不進入容器,執行指令

[root@hadoop108 ~]# docker exec 1e7429044e63 ls -l /opt

[root@hadoop108 ~]# docker exec 1e7429044e63 cat /opt/a.txt

[root@hadoop108 ~]# docker exec 1e7429044e63 whoami

[root@hadoop108 ~]# docker exec 1e7429044e63 ps

[root@hadoop108 ~]# docker exec 1e7429044e63 ps aux

23、檢視容器的通路日志

[root@hadoop108 ~]# docker logs 1e7429044e63

24、擷取容器的PID

[root@hadoop108 ~]# docker inspect -f "{{ .State.Pid}}" 1e7429044e63

25、nsenter方式進入容器

[root@hadoop108 ~]# docker inspect -f "{{ .State.Pid}}" 1e7429044e63

13187

[root@hadoop108 ~]# nsenter --help

[root@hadoop108 ~]# nsenter -t 13187 -m -u -i -n -p

26、檢視主機資訊

在容器中執行,可以看到主控端資訊,隔離性略差

[root@1e7429044e63 /]# cat /proc/cpuinfo

[root@1e7429044e63 /]# free -m

[root@1e7429044e63 /]# Top

27、以腳本的方式進入容器

docker_in 腳本

[root@hadoop108 ~]# touch docker_in.sh

[root@hadoop108 ~]# chmod 755 docker_in.sh

[root@hadoop108 ~]# vim docker_in.sh

#!/bin/bash

# Use nsenter to access docker

docker_in(){

NAME_ID=$1

PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)

nsenter -t $PID -m -u -i -n -p /bin/bash

}

docker_in $1

[root@hadoop108 ~]# ./docker_in.sh mysql

root@9894fb3a1733:/#

-t -> --target

-m -> --mount

-u -> --uts

-i -> --ipc

-n -> --net

-p -> --pid

執行腳本,傳入的參數是容器的名字或ID