1、docker的常用命令
1.1、幫助命令
docker version # 顯示docker的版本信息
docker info # 顯示docker的系統信息,包括鏡像和容器的數量
docker 指令 --help # 查看某個指令的幫助命令
可以通過docker --help查看docker常用命令,也可以在官網查看。
docker命令官網查詢地址:Reference | Docker Docs
1.2、鏡像命令
docker images # 查看本機的鏡像信息
docker search 鏡像名 # 搜索鏡像
docker pull 鏡像名[:tag] # 下載鏡像,可以指定鏡像的版本tag,默認是最新版本
docker rmi -f 鏡像名或鏡像id # 刪除鏡像
docker rmi -f 鏡像id1 鏡像id2 鏡像id3 # 刪除多個鏡像
docker rmi -f $(docker images -aq) # 刪除所有的鏡像
1.docker images??????? # 查看本機的鏡像信息
字段解釋:
REPOSITORY:鏡像的倉庫源
TAG:鏡像的標簽
IMAGE ID:鏡像的id
CREATED:鏡像的創建時間
SIZE:鏡像的大小
2.docker search 鏡像名????? # 搜索鏡像
也可以通過DockerHub官網搜索:https://hub.docker.com/search?q=
3.docker pull 鏡像名[:tag]????? # 下載鏡像,可以指定鏡像的版本tag,默認是最新版本
從DockerHub上看一下mysql的版本,下載指定的版本:
4. 刪除鏡像
docker rmi -f 鏡像名或鏡像id # 刪除鏡像
docker rmi -f 鏡像id1 鏡像id2 鏡像id3 # 刪除多個鏡像
docker rmi -f $(docker images -aq) # 刪除所有的鏡像
1.3、容器命令
docker run [可選參數] 鏡像名 # 運行鏡像,創建容器
docker ps [可選參數] # 查看正在運行的容器
exit # 容器停止并退出
Ctrl + P + Q # 退出容器,但容器并未停止
docker rm 容器id # 刪除指定的容器,不能刪除正在運行的容器,可使用-f強制刪除
docker rm [-f] $(docker ps -aq) # 刪除所有的容器,-f 表示強制刪除,包括運行的容器
docker ps -aq | xargs docker rm # 刪除所有的容器
docker start 容器id # 啟動容器
docker restart 容器id # 重啟容器
docker stop 容器id # 停止當前正在運行的容器
docker kill 容器id # 強制殺死當前容器
1.docker run [可選參數] 鏡像名????? # 運行鏡像,創建容器
可選參數說明:
--name??? # 給容器起個名字,用于區分容器
-d???????? # 以后臺方式運行
-it???????? # 以交互方式運行,進入容器查看內容
-p?? #指定容器端口,如-p 8080,常用的是將主機端口與容器端口進行映射,即-p 主機端口:容器端口,如-p 8090:8090。還有一種方式指定主機ip,-p 主機ip:主機端口:容器端口。
-P?? # 隨機指定端口
只有有了鏡像,才可以創建容器,運行鏡像,就是創建了一個容器。
先下載一個centos鏡像:
再運行鏡像,創建容器:
2.docker ps [可選參數]????? # 查看正在運行的容器
可選參數說明:
-a???? # 查看所有容器,包括曾經運行的容器
-n=??? # 查看最近創建的容器,例如查看最近創建的兩個容器:-n=2
-q???? # 只顯示容器的編號CONTAINER ID
3.退出容器
exit??? # 容器停止并退出
Ctrl + P + Q??? # 退出容器,但容器并未停止
4.刪除容器
docker rm 容器id??? # 刪除指定的容器,不能刪除正在運行的容器,可使用-f強制刪除
docker rm [-f] $(docker ps -aq)??? # 刪除所有的容器,-f 表示強制刪除,包括運行的容器
docker ps -aq | xargs docker rm?? # 刪除所有的容器
5.啟動和停止容器
docker start 容器id??? # 啟動容器
docker restart 容器id??? # 重啟容器
docker stop 容器id??? # 停止當前正在運行的容器
docker kill 容器id??? # 強制殺死當前容器
1.4、其他常用命令
docker run -d 鏡像名 #容器啟動后,docker發現該容器沒有提供服務,就會自動停止容器
docker logs -tf --tail 10 容器id # 查看指定容器的日志信息
docker top 容器id # 查看容器中進程信息
docker inspect 容器id # 查看容器的元數據
docker exec -it 容器id /bin/bash # 進入當前正在運行的容器,開啟一個新的終端
docker attach 容器id # 進入容器,并使用正在運行的終端,不會開啟新的終端
docker cp 容器id:容器內路徑 主機路徑
docker stats 容器id # 查看容器占用CPU和內存信息
1.后臺啟動容器
docker run -d 鏡像名? #容器啟動后,docker發現該容器沒有提供服務,就會自動停止容器
2.查看容器日志
docker logs -tf --tail 10 容器id??? # 查看指定容器的日志信息
參數說明:--tail 10 表示查看10條日志,不加tail表示查看所有日志。
3.查看容器中進程信息
docker top 容器id????? # 查看容器中進程信息
docker inspect 容器id?? # 查看容器的元數據
4.進入當前正在運行的容器
通常容器都是以后臺方式運行的,如果需要進入容器,修改一些配置,則可以使用docker exec命令。
docker exec -it 容器id /bin/bash??? # 進入當前正在運行的容器,開啟一個新的終端
docker attach 容器id??? # 進入容器,并使用正在運行的終端,不會開啟新的終端
5、將容器內的文件復制到主機上
docker cp 容器id:容器內路徑 主機路徑
6、docker stats 容器id??? # 查看容器占用CPU和內存信息
1.5、命令小結
練習:使用docker安裝nginx、tomcat
練習1:使用docker安裝nginx
1、搜索nginx鏡像,docker search nginx,建議到DockerHub官網上搜索,可以看到版本
2、下載nginx鏡像,docker pull nginx[:tag]
3、運行nginx鏡像,啟動容器,docker run -d --name nginx01 -p 8090:80 nginx
啟動命令參數說明:-d 以后臺方式運行,--name 給容器命名,-p 8090:80將主機端口8090與容器端口80進行映射。
端口映射:
在瀏覽器上輸入虛擬機ip:主機映射端口號,并且防火墻開通主機映射端口號。
練習2:使用docker部署tomcat
docker run -it --rm tomcat:9.0
--rm 表示容器用完退出之后就刪除,一般用來測試,不建議這樣使用。
練習3:使用docker安裝elasticsearch
docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.7.0
由于elasticsearch運行非常耗內存,所以通過-e ES_JAVA_OPTS參數限制其占用內存大小。
啟動elasticsearch容器之后,通過curl localhost:9200進行測試是否啟動成功。
ElasticSearch啟動時,會占用兩個端口9200和9300。
9200 是ES節點與外部通訊使用的端口。它是http協議的RESTful接口,各種CRUD操作都是走的該端口。
9300是ES節點之間通訊使用的端口。它是tcp通訊端口,集群間和TCPclient都用此接口。
練習4:使用docker安裝portainer可視化界面
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
2、docker鏡像講解
鏡像是什么?
鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基于運行環境開發的軟件,它包含運行某個軟件所需的所有內容,包括代碼、運行時庫、環境變量和配置文件。
所有的應用,直接打包docker鏡像,就可以直接跑起來!
得到鏡像的方式:
·從遠程倉庫下載
·朋友拷貝給你
·自己制作一個鏡像 DockerFile
2.1、docker鏡像加載原理
1. UnionFS(聯合文件系統)
UnionFS(聯合文件系統):Union文件系統(UnionFS)是一種分層、輕量級并且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。Union文件系統是Docker鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄。
2. Docker鏡像加載原理
docker鏡像實際由一層一層的文件系統(UnionFS)組成,基礎的鏡像都會包含bootfs和rootfs。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導加載kernel, Linux則啟動時會加載bootfs文件系統,在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核。當boot加載完成之后整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。
rootfs(root file system)在bootfs之上,包含的就是典型Linux系統中的/dev、/proc、/bin、/etc等標準目錄和文件。rootfs就是各種不同的操作系統發行版,比如Ubuntu、Centos等。
[root@localhost ~]# docker images centos
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 3 months ago 237MB
平時安裝虛擬機的centos都是好幾個GB,為什么使用Docker拉取的鏡像才200MB?
這是因為對于一個精簡的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序就可以了,因為底層直接用Host的kernel,自己只需要提供rootfs就可以了。由此可見對于不同的linux發行版,bootfs基本是一致的,rootfs會有差別,因此不同的發行版可以公用bootfs。
所有的Docker鏡像都起始于一個基礎鏡像層,當進行修改或增加新的內容時,就會在當前鏡像層之上,創建新的鏡像層。
舉一個簡單的例子,假如基于Ubuntu Linux 16.04創建一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加Python包,就會在基礎鏡像層之上創建第二個鏡像層;如果繼續添加一個安全補丁,就會創建第三個鏡像層。該鏡像當前已經包含3個鏡像層,如下圖所示(這只是一個用于演示的簡單例子)。
在添加額外的鏡像層的同時,鏡像始終保持是當前所有鏡像層的組合,理解這一點非常重要。下圖中舉了一個簡單的例子,每個鏡像層包含3個文件,而鏡像包含了來自兩個鏡像層的6個文件。
Docker鏡像的特點:
Docker鏡像都是只讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部!這一層就是通常說的容器層,容器之下的都叫鏡像層!
2.2、提交鏡像
提交容器成為一個新的鏡像:
docker commit -m= "描述信息" -a= "作者" 容器id 目標鏡像名:[tag]
下面首先通過默認的tomcat鏡像啟動一個容器,接著修改容器中的webapps,然后將修改后的容器提交成為一個新的tomcat鏡像。