1. 程式人生 > 資訊 >清華大學智慧產業研究院張亞勤:推出 AIoT 綠色計算,提質增效節能減排

清華大學智慧產業研究院張亞勤:推出 AIoT 綠色計算,提質增效節能減排

目錄

1.Docker run 基本原理

2.Docker的底層原理

Docker 是如何工作的?

Docker 是一個Client -Server 架構的系統,Docker的守護程序執行在主機上,通過Socket從客戶端訪問。

Docker-Server 接收到 Docker-Client的指令後,就會執行這個指令!

3.Docker 為什麼 比 虛擬機器 快

Docker 有著比虛擬機器更少的 抽象層

Docker 利用的是宿主機的核心,而vm 是需要guest os

所以說,新建一個容器時,docker 不需要想虛擬機器那樣重新載入一個作業系統核心,避免引導。虛擬機器是載入guest os,虛擬機器啟動是分鐘級別的,而docker是直接利用宿主機作業系統,是秒級別的,省略了這個複雜的過程


4.Docker 命令

docker version # 顯示Docker的版本
docker info # 顯示docker的系統資訊,包括映象和容器的數量
docker --help # 幫助文件

4.1 映象命令

4.1.1 docker images

檢視所有本地主機上的映象

[root@qiaoba ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 8 days ago 13.3kB

#解釋
# REPOSITORY 映象的倉庫
# TAG 映象的標籤
# IMAGE ID 映象的Id
# CREATED 映象建立時間
# SIZE 映象的大小

# 可選項
-a ,--all #列出所有的映象
-q,--quiet #只顯示映象的Id

去 dockerhub上搜素映象

[root@qiaoba /]# docker search mysql --filter=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11496 [OK]
mariadb MariaDB Server is a high performing open sou… 4362 [OK]

4.1.3 docker pull

下載映象

# 下載映象 dockers pull 映象名稱:<tag> (如果不寫tag ,預設就是latest)
[root@qiaoba /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
07aded7c29c6: Already exists # 分層下載
f68b8cbd22de: Already exists
30c1754a28c4: Already exists
1b7cb4d6fe05: Already exists
79a41dc56b9a: Already exists
00a75e3842fb: Already exists
b36a6919c217: Already exists
5e11fe494f45: Pull complete
9c7de1f889a7: Pull complete
cf6a13d05a76: Pull complete
fc5aa81f393a: Pull complete
Digest: sha256:360c7488c2b5d112804a74cd272d1070d264eef4812d9a9cc6b8ed68c3546189 #簽名
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7 # docker的真實地址

4.1.4 docker rmi

刪除映象

docker rmi -f <容器Id> #刪除單個映象
docker rmi -f <映象Id> <映象Id> <映象Id> # 刪除多個映象(用空格隔開)
docker rmi -f $(docker iamges -aq) # 刪除所有映象

4.2 容器命令

4.2.1 下載一個centos 映象

docker pull centos

4.2.2 新建容器並啟動

docker run [可選引數] image

# 引數說明
--name ="name" #容器名稱,用來區分容器
-d #後臺執行方式
-it #使用互動方式執行,進入容器檢視內容
-p # 指定容器的埠 -p 8080:8080
-p ip :主機埠:容器埠
-P 主機埠:容器埠
-p 容器埠

# 測試 啟動並進入容器
[root@qiaoba ~]# docker run -it centos /bin/bash
[root@8418f3caf1d4 /]#

#從容器中退回主機
[root@8418f3caf1d4 /]# exit
exit
[root@qiaoba ~]#

4.2.3 列出所有執行中的容器

#docker ps
#引數說明
-a #列出所有正在執行的容器,順帶列出歷史執行過的容器
-n=? # 顯示最近?個執行過的容器

[root@qiaoba ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

# 列出曾經執行過的容器
#dockerps -a
[root@qiaoba ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8418f3caf1d4 centos "/bin/bash" 4 minutes ago Exited (0) 4 minutes ago musing_poincare
beefbd5d7c9e centos "/bin/bash" 31 minutes ago Exited (0) 22 minutes ago objective_robinson
7aaf98ea1cc1 feb5d9fea6a5 "/hello" 17 hours ago Exited (0) 17 hours ago
[root@qiaoba ~]#


4.2.4 退出容器

exit #退出並停止容器
Ctrl + P+Q #僅僅退出容器

[root@qiaoba /]# docker run -it centos /bin/bash
[root@71d02cb57b70 /]# [root@qiaoba /]#
[root@qiaoba /]#
[root@qiaoba /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71d02cb57b70 centos "/bin/bash" 20 seconds ago Up 18 seconds zen_grothendieck

4.2.5 刪除容器

docker rm 容器Id #刪除指定容器
docker rm -f $(docker ps -aq) #刪除所有的容器
docker ps -a -q |xargs docker mr #刪除所有的容器

4.2.6 啟動和停止容器

docker start <容器Id> #啟動容器
docker restart <容器Id> #重啟容器
docker stop <容器Id> #停止當前正在執行的容器
docker kill <容器Id> #強制停止當前容器

4.3 常用其他命令

4.3.1 後臺啟動命令

# docker run -d <映象名>
[root@qiaoba /]# docker run -d centos
ad6997dd92a7214145f2bbc619e82ffa324055fa2f39ecb26cc9b2faa7bc2fb5
[root@qiaoba /]#

#問題 發現 docker ps 沒有哪個centos程序
[root@qiaoba /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 常見的坑,容器使用後臺執行 就必須要有一個前臺程序,docker發現沒有應用,就會自動停止
# 如 nginx 容器啟動後,發現自己沒有提供服務,就回立即停止程序,就沒有程式了

4.3.2 檢視日誌

docker logs -f -t --detail <容器Id>

#引數說明
-tf #顯示日誌
--tail number #顯示日誌條數
#首先執行映象
[root@qiaoba /]# docker run -d centos /bin/bash -c "while true;do echo fangtao;sleep 1;done"
9196b775af92ab76711c06ba01a7edb37c978c3179e4edd80b5a1233adad1237
[root@qiaoba /]#
#檢視容器日誌
[root@qiaoba /]# docker logs -tf --tail 5 9196b775af92ab7671
2021-10-03T02:23:49.871672439Z fangtao
2021-10-03T02:23:50.880792692Z fangtao
2021-10-03T02:23:51.892953069Z fangtao
2021-10-03T02:23:52.903638624Z fangtao
2021-10-03T02:23:53.912244596Z fangtao
2021-10-03T02:23:54.917903650Z fangtao
2021-10-03T02:23:55.926644943Z fangtao

4.3.3 檢視容器中的程序資訊

# 命令 docker top <容器Id>
[root@qiaoba /]# docker top 9196b775af92ab7671
UID PID PPID C STIME TTY TIME CMD
root 70992 70973 0 10:23 ? 00:00:00 /bin/bash -c while true;do echo fangtao;sleep 1;done
[root@qiaoba /]#

4.3.4 檢視容器的元資料

# 命令 docker inspect <容器Id>
[root@qiaoba /]# docker inspect 9196b775af92ab7671
#如下輸出:
[
{
"Id": "9196b775af92ab76711c06ba01a7edb37c978c3179e4edd80b5a1233adad1237",
"Created": "2021-10-03T02:23:39.063246554Z",
"Path": "/bin/bash",
"Args": [
"-c",
"while true;do echo fangtao;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 70992,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-10-03T02:23:39.777514963Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/9196b775af92ab76711c06ba01a7edb37c978c3179e4edd80b5a1233adad1237/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/9196b775af92ab76711c06ba01a7edb37c978c3179e4edd80b5a1233adad1237/hostname",
"HostsPath": "/var/lib/docker/containers/9196b775af92ab76711c06ba01a7edb37c978c3179e4edd80b5a1233adad1237/hosts",
"LogPath": "/var/lib/docker/containers/9196b775af92ab76711c06ba01a7edb37c978c3179e4edd80b5a1233adad1237/9196b775af92ab76711c06ba01a7edb37c978c3179e4edd80b5a1233adad1237-json.log",
"Name": "/goofy_jackson",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/01b73f3669effc94b765bb581a60e5d5d461ca6e76708c47eb5c5f2a628be02b-init/diff:/var/lib/docker/overlay2/86561cf93b73316988bbcc6aa9182cb6dd8b4818a556f4e733367b88f4c745f3/diff",
"MergedDir": "/var/lib/docker/overlay2/01b73f3669effc94b765bb581a60e5d5d461ca6e76708c47eb5c5f2a628be02b/merged",
"UpperDir": "/var/lib/docker/overlay2/01b73f3669effc94b765bb581a60e5d5d461ca6e76708c47eb5c5f2a628be02b/diff",
"WorkDir": "/var/lib/docker/overlay2/01b73f3669effc94b765bb581a60e5d5d461ca6e76708c47eb5c5f2a628be02b/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "9196b775af92",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash",
"-c",
"while true;do echo fangtao;sleep 1;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "e6fa0edbd22c10ad34ad97b0556249429b1acf868b7a6b1d8c4f320c042fdf99",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/e6fa0edbd22c",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "163e2cb4291cadfbec96eea645f860b2a25e7cd30dd108fa0bbe5af61ba44bbc",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "ba370f9a5b3cc21eac53a2d93184397506430301e8731b7ab2f63d018a8f4e18",
"EndpointID": "163e2cb4291cadfbec96eea645f860b2a25e7cd30dd108fa0bbe5af61ba44bbc",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]

4.3.4 進入當前正在執行的容器

# 我們通常都是使用後臺方式執行的,需要進入容器,修改一些配置

#方式一 docker exec -it 容器Id bashShell

#測試
[root@qiaoba /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9196b775af92 centos "/bin/bash -c 'while…" 6 minutes ago Up 6 minutes goofy_jackson
[root@qiaoba /]# docker exec -it 9196b775af92 /bin/bash
[root@9196b775af92 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@9196b775af92 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 02:23 ? 00:00:00 /bin/bash -c while true;do echo fangtao;sleep 1;done
root 766 0 0 02:36 pts/0 00:00:00 /bin/bash
root 787 1 0 02:36 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 788 766 0 02:36 pts/0 00:00:00 ps -ef

#方式二 docker attach <容器Id>
#測試
[root@qiaoba ~]# docker attach 9196b775af92
#正在執行的程式碼

#區別
#docker exec #進入容器後開啟一個新的終端,可以在裡面操作
#docker attach #進入容器正在執行的終端,不會開啟新的終端

4.3.5 從容器拷貝檔案到主機

#命令 docker cp <容器Id>:檔案目錄 本地檔案目錄

#啟動容器
root@qiaoba ~]# docker run -it centos /bin/bash
[root@3b054cdc2238 /]# docker ps
bash: docker: command not found
[root@3b054cdc2238 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@3b054cdc2238 /]# cd home
[root@3b054cdc2238 home]# ls
[root@3b054cdc2238 home]# touch fangtao.java
[root@3b054cdc2238 home]# vi fangtao.java
[root@3b054cdc2238 home]# ls
fangtao.java
[root@3b054cdc2238 home]# exit
exit
[root@qiaoba ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@qiaoba ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b054cdc2238 centos "/bin/bash" 2 minutes ago Exited (0) 5 seconds ago fervent_swirles
#拷貝容器中指定的檔案到本地目錄
[root@qiaoba ~]# docker cp 3b054cdc2238:/home/fangtao.java /home
#去本地目錄檢視拷貝的檔案
[root@qiaoba ~]# cd /home
[root@qiaoba home]# cat fangtao.java
public class fangtao{
public static void main(String[] args){
System.Out.println("hello world");
}
}
[root@qiaoba home]#
#拷貝是一個手動過程 ,後面可以使用 -v 卷技術,可以實現 容器目錄 到本地目錄的資料同步

5.總結

5.1 命令小結

attach #當前shell下attach連線指定執行映象
build #通過Dockerfile定製映象
commit #提交當前容器為新的映象
cp #從容器中拷貝指定檔案或者目錄到宿主機中
create #建立一個新的容器,同run 但不啟動容器
diff #檢視docker容器變化
events #從docker服務獲取容器實時事件
exec #在已存在的容器上執行命令
export #匯出容器的內容流作為一個tar歸檔檔案(對應import)
history #展示一個映象形成歷史
images #列出系統當前映象
import #從tar包中的內容建立一個新的檔案系統映像(對應export)
info #顯示系統相關資訊
inspect #檢視容器詳細資訊
kill #kill指定docker容器
load #從一個tar包中載入一個映象(對應save)
login #註冊或者登陸一個docker源伺服器
logout #從當前Docker registry退出
logs #輸出當前容器日誌資訊
pause #暫停容器
port #檢視對映埠對應的容器內部源埠

ps #列出容器列表
pull #從docker映象源伺服器拉取指定映象或者庫映象
push #推送指定映象或者庫映象至docker源伺服器
rename #重新命名容器
restart #重啟執行的容器
rm #移除一個或者多個容器
rmi #移除一個或多個映象(無容器使用該映象才可以刪除,需要刪除相關容器才可以繼續或者-f強制刪除)
run #建立一個新的容器並執行一個命令
save #儲存一個映象為一個tar包(對應load)
search #在docker hub中搜索映象
start #啟動容器
stats #統計容器使用資源
stop #停止容器
tag #給源中映象打標籤
top #檢視容器中執行的程序資訊
unpause #取消暫停容器
version #檢視容器版本號
wait #擷取容器停止時的退出狀態值