容器是 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