參考鏈接:https://blog.csdn.net/leilei1366615/article/details/106267225
文章目錄
(一)docker 基礎(chǔ)命令
(二)docker 鏡像命令
(三)docker 容器命令
(四)自己提交一個(gè)鏡像
(五)docker 運(yùn)維命令
個(gè)人理解 docker中的鏡像 就像是咱們java 中的Class 配猫,而容器呢 是基于這個(gè)鏡像構(gòu)建出的實(shí)例 類似于咱java 中 根據(jù)Class構(gòu)造出的一個(gè)個(gè)實(shí)例對(duì)象 逝钥,本人是初學(xué)者 理解有誤還請(qǐng)見諒踢故,并麻煩您說說您的看法讓彼此相互學(xué)習(xí)…
按我理解 簡(jiǎn)言之
docker 鏡像: ----java中 class
docker容器 : ----java中 class new 出來的實(shí)例對(duì)象
本篇文章不僅僅是生硬的命令大全,也是我個(gè)人對(duì)docker學(xué)習(xí)使用的一步步總結(jié),通過一個(gè)個(gè)示例來加深各位看官對(duì)docker相關(guān)命令的理解以及記憶咖熟,在有趣的同時(shí)穿插知識(shí)點(diǎn),您花費(fèi)半小時(shí)時(shí)間,照著我的思路走一遍除破,一定會(huì)有所收獲。
(一)docker 基礎(chǔ)命令
啟動(dòng)docker
systemctl start docker
#關(guān)閉docker
systemctl stop docker
#重啟docker
systemctl restart docker
#docker設(shè)置隨服務(wù)啟動(dòng)而自啟動(dòng)
systemctl enable docker
#查看docker 運(yùn)行狀態(tài)
#------如果是在運(yùn)行中 輸入命令后 會(huì)看到綠色的active
systemctl status docker
#查看docker 版本號(hào)信息
docker version
docker info
docker 幫助命令
忘記了某些命令便可使用此進(jìn)行查看與回顧
docker --help
比如 咱忘記了 拉取命令 不知道可以帶哪些參數(shù) 咱可以這樣使用
docker pull --help
(二)docker 鏡像命令
查看自己服務(wù)器中docker 鏡像列表
- docker images
搜索鏡像
docker search 鏡像名
- docker search --filter=STARS=9000 mysql 搜索 STARS >9000的 mysql 鏡像
拉取鏡像 不加tag(版本號(hào)) 即拉取docker倉(cāng)庫(kù)中 該鏡像的最新版本latest 加:tag 則是拉取指定版本
- docker pull 鏡像名
- docker pull 鏡像名:tag
拉取最新版 mysql
咱再來拉取一個(gè)指定版本號(hào) 鏡像 至于版本號(hào)呢 可以在docker hub中查看
docker官方鏡像搜索
例如 拉取 mysql 5.7.30 ------------------這里出現(xiàn)了一些小東西 感覺挺新奇的 隨著學(xué)習(xí)深入再回過頭來看吧
為什么提示文件存在 >>>> 請(qǐng)戳: docker 文件分層與數(shù)據(jù)卷掛載
運(yùn)行鏡像 ----咱拉取一個(gè)tomcat 跑起來試一試
docker run 鏡像名
docker run 鏡像名:Tag
docker pull tomcat
docker run tomcat
發(fā)現(xiàn)咱運(yùn)行后 出現(xiàn)tomcat 默認(rèn)占用的8080 端口 說明該鏡像已經(jīng)是啟動(dòng)了 琼腔,但是 咱好像鼠標(biāo)沒有回到咱服務(wù)器上了 瑰枫,這怎么辦呢 ?
使用 Ctrl+C (注:此方式雖然可以退出容器丹莲,但此種命令操作方式卻是錯(cuò)誤的光坝,詳細(xì)緣由請(qǐng)見下文的容器命令)
docker中 run 命令是十分復(fù)雜的 有什么持久運(yùn)行 映射端口 設(shè)置容器別名 數(shù)據(jù)卷掛載等
一通測(cè)試,發(fā)現(xiàn)我們拉了好多鏡像了甥材,但我們現(xiàn)在根本用不著盯另,這些無(wú)用鏡像怎么刪除呢?
刪除鏡像 ------當(dāng)前鏡像沒有被任何容器使用才可以刪除
#刪除一個(gè)
docker rmi -f 鏡像名/鏡像ID
#刪除多個(gè) 其鏡像ID或鏡像用用空格隔開即可
docker rmi -f 鏡像名/鏡像ID 鏡像名/鏡像ID 鏡像名/鏡像ID
#刪除全部鏡像 -a 意思為顯示全部, -q 意思為只顯示ID
docker rmi -f $(docker images -aq)
#強(qiáng)制刪除鏡像
docker image rm 鏡像名稱/鏡像ID
鏡像的基礎(chǔ)命令就到這里 下方會(huì)使用更復(fù)雜的 docker run 命令 來根據(jù)鏡像啟動(dòng)容器
保存鏡像
將我們的鏡像 保存為tar 壓縮文件 這樣方便鏡像轉(zhuǎn)移和保存 ,然后 可以在任何一臺(tái)安裝了docker的服務(wù)器上 加載這個(gè)鏡像
命令:
# docker save 鏡像名/鏡像ID -o 鏡像保存在哪個(gè)位置與名字
docker save tomcat -o /myimg.tar
#保存鏡像任務(wù)執(zhí)行完畢洲赵,我們來看下指定位置下是否有該tar鸳惯?
#加載鏡像
#任何裝 docker 的地方加載鏡像保存文件,使其恢復(fù)為一個(gè)鏡像
docker load -i 鏡像保存文件位置
加載文件 恢復(fù)為鏡像
查看鏡像 測(cè)試鏡像功能是否正常
我們來把解壓的鏡像 run一下。
鏡像標(biāo)簽
有的時(shí)候呢叠萍,我們需要對(duì)一個(gè)鏡像進(jìn)行分類或者版本迭代操作芝发,比如我們一個(gè)微服務(wù)已經(jīng)打?yàn)閐ocker鏡像,但是想根據(jù)環(huán)境進(jìn)行區(qū)分為develop環(huán)境與alpha環(huán)境苛谷,這個(gè)時(shí)候呢辅鲸,我們就可以使用Tag,來進(jìn)對(duì)鏡像做一個(gè)標(biāo)簽添加腹殿,從而行進(jìn)區(qū)分独悴;版本迭代邏輯也是一樣,根據(jù)不同的tag進(jìn)行區(qū)分
app:1.0.0 基礎(chǔ)鏡像
分離為開發(fā)環(huán)境
app:develop-1.0.0
分離為alpha環(huán)境
app:alpha-1.0.0
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag 源鏡像名:TAG 想要生成新的鏡像名:新的TAG
如果省略TAG 則會(huì)為鏡像默認(rèn)打上latest TAG
docker tag aaa bbb
上方操作等于 docker tag aaa:latest bbb:test
ex:
我們根據(jù)鏡像 quay.io/minio/minio 添加一個(gè)新的鏡像 名為 aaa 標(biāo)簽Tag設(shè)置為1.2.3
docker tag quay.io/minio/minio:1.2.3 aaa:1.2.3
我們根據(jù)鏡像 app-user:1.0.0 添加一個(gè)新的鏡像 名為 app-user 標(biāo)簽Tag設(shè)置為alpha-1.0.0
- docker tag app-user:1.0.0 app-user:alpha-1.0.0
(三)docker 容器命令
前言已經(jīng)說了 docker 容器 就好比 咱java中的new出來對(duì)象(docker run 鏡像 產(chǎn)生一個(gè)該鏡像具體容器實(shí)例),docker 容器的啟動(dòng)需要 鏡像的支持
先放上 docker 容器查看命令
查看正在運(yùn)行容器列表
- docker ps
查看所有容器 -----包含正在運(yùn)行 和已停止的
- docker ps -a
容器怎么來呢 可以通過run 鏡像 來構(gòu)建 自己的容器實(shí)例
運(yùn)行一個(gè)容器
-it 表示 與容器進(jìn)行交互式啟動(dòng) -d 表示可后臺(tái)運(yùn)行容器 (守護(hù)式運(yùn)行) --name 給要運(yùn)行的容器 起的名字 /bin/bash 交互路徑
- docker run -it -d --name 要取的別名 鏡像名:Tag /bin/bash
例如我們要啟動(dòng)一個(gè)redis 把它的別名取為redis001 并交互式運(yùn)行 需要的命令 —我這里指定版本號(hào)為5.0.5
1. 拉取redis 鏡像
docker pull redis:5.0.5
2.命令啟動(dòng)
- docker run -it -d --name redis001 redis:5.0.5 /bin/bash
3.查看已運(yùn)行容器
- docker ps
發(fā)現(xiàn)看到了 redis 使用了6379 端口 那么我們?cè)陉P(guān)閉防火墻或開啟了安全組的情況下 是否可以進(jìn)行訪問呢赫蛇?
為了 區(qū)分 咱們使用linux 命令 查看一下
netstat是控制臺(tái)命令,是一個(gè)監(jiān)控TCP/IP網(wǎng)絡(luò)的非常有用的工具绵患,它可以顯示路由表、實(shí)際的網(wǎng)絡(luò)連接以及每一個(gè)網(wǎng)絡(luò)接口設(shè)備的狀態(tài)信息
- netstat -untlp
驚訝的發(fā)現(xiàn)悟耘,我們r(jià)edis容器啟動(dòng)占用的 6379端口netstat 沒有顯示出來落蝙?什么情況?趕緊使用 redis desktop manger 連接測(cè)試一下
為什么不行呢 已經(jīng)確定了 docker 中 redis 容器已經(jīng)是在運(yùn)行中 且占有端口 6379啊筏勒?
因?yàn)椋赫加玫?379端口 僅僅是在容器中內(nèi)部本身的端口,與宿主機(jī)的6379端口并無(wú)聯(lián)系移迫,我們通過宿主機(jī)Ip:6379訪問此redis示例,那自然是找不到的喲管行!
這里厨埋,來補(bǔ)充一點(diǎn)Docker容器的知識(shí)!
每一個(gè) Docker容器都是獨(dú)立和安全的應(yīng)用平臺(tái)(我們可以理解為捐顷,每一個(gè)docker容器都相當(dāng)于在我們的服務(wù)器上占用資源然后開辟了屬于自己的一個(gè)空間(也可以理解為服務(wù)器))
這是Docker 一大特點(diǎn)荡陷,每個(gè)容器之間環(huán)境都是隔離的!!!
我們甚至可以在一個(gè)服務(wù)器上,使用docker鏡像迅涮,來跑出N個(gè) mysql實(shí)例(盡管废赞,他們的默認(rèn)端口都是一樣的,但還是那句話叮姑,容器間唉地,環(huán)境是隔離的。A容器中的3306 與B容器的3306毫無(wú)關(guān)系传透,因?yàn)槠洳辉谝粋€(gè)世界呀!)
默認(rèn)情況下耘沼,我們是無(wú)法通過宿主機(jī)(安裝docker的服務(wù)器)端口來直接訪問容器的 ,因?yàn)閐ocker容器自己開辟空間的端口與宿主機(jī)端口沒有聯(lián)系…
如果外部想要訪問容器,那必須得讓容器中的端口與宿主機(jī)的端口建立聯(lián)系綁定起來朱盐,這個(gè)正式的概念叫做 容器端口映射
有了端口映射群嗤,我們就可以將宿主機(jī)端口與 容器端口綁定起來,比如 我們建立宿主機(jī)的6379端口與容器redis6379端口綁定起來托享,那么再訪問宿主機(jī)Ip:6379 就可以訪問到對(duì)應(yīng)容器了骚烧!
接下來 進(jìn)行 容器端口映射演示
首先停止容器
先停止咱之前運(yùn)行的 redis 容器
- docker stop 容器名/容器ID
然后刪除容器 -----不經(jīng)意間 咱發(fā)現(xiàn)已經(jīng)運(yùn)行過這么多容器了 咱進(jìn)行清理一下
#刪除一個(gè)容器
docker rm -f 容器名/容器ID
#刪除多個(gè)容器 空格隔開要?jiǎng)h除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#刪除全部容器
docker rm -f $(docker ps -aq)
這樣 容器就已經(jīng)刪除完畢了 ,咱們接著弄 前邊說的 端口映射
容器端口與服務(wù)器端口映射
命令:
-p 宿主機(jī)端口:容器端口
還是使用前方的 redis 鏡像 嘗試 將6379端口 映射到服務(wù)器的8888 如果成功了的話 那么咱們?cè)L問服務(wù)器的8888端口就會(huì)訪問到咱們的 docker 中 的容器 redis002
-p 8888:6379 解析 將容器內(nèi)部的 6379端口與docker 宿主機(jī)(docker裝在哪臺(tái)服務(wù)器 哪臺(tái)服務(wù)器就是宿主機(jī))8888 端口進(jìn)行映射 那通過外部訪問宿主機(jī)8888端口 即可訪問到 docker 容器 6379 端口了
docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash
在運(yùn)行后 發(fā)現(xiàn)服務(wù)器的 8888 端口顯示已被docker-proxy 所占用了 那么此時(shí)咱再用工具進(jìn)行連接測(cè)試呢闰围?
那么容器端口映射有沒有什么限制呢赃绊?
有的,雖說每個(gè)容器之間羡榴,環(huán)境都是隔離的碧查,但是宿主機(jī)每個(gè)端口都是一個(gè),8888端口被redis002容器綁定了校仑,那么其他所有的容器都不可以使用8888這個(gè)端口了!!!
有時(shí)候忠售,我們需要進(jìn)入容器內(nèi)部,修改其配置文件迄沫,那么如何才能進(jìn)入容器內(nèi)呢稻扬?
進(jìn)入容器方式一 這里咱就進(jìn)入 前面的 redis001容器
docker exec -it 容器名/容器ID /bin/bash
#進(jìn)入 前面的 redis001容器
docker exec -it redis001 /bin/bash
可以看到 我已經(jīng)從主機(jī)alibyleilei 跳到了容器ID 對(duì)應(yīng)下的 /data 已經(jīng)是進(jìn)入到容器內(nèi)部了
進(jìn)入容器方式二 —推薦使用 exec 方式
docker attach 容器名/容器ID
那怎么退出容器呢 ?
從容器內(nèi) 退出到自己服務(wù)器中 需注意 兩個(gè)退出命令的區(qū)別
-----直接退出 未添加 -d(持久化運(yùn)行容器) 時(shí) 執(zhí)行此參數(shù) 容器會(huì)被關(guān)閉
exit
優(yōu)雅提出 --- 無(wú)論是否添加-d 參數(shù) 執(zhí)行此命令容器都不會(huì)被關(guān)閉
Ctrl + p + q
停止容器
docker stop 容器ID/容器名
重啟容器
docker restart 容器ID/容器名
啟動(dòng)容器
docker start 容器ID/容器名
kill 容器
docker kill 容器ID/容器名
容器文件拷貝 —無(wú)論容器是否開啟 都可以進(jìn)行拷貝
#docker cp 容器ID/名稱:文件路徑 要拷貝到外部的路徑 | 要拷貝到外部的路徑 容器ID/名稱:文件路徑
#從容器內(nèi) 拷出
docker cp 容器ID/名稱: 容器內(nèi)路徑 容器外路徑
#從外部 拷貝文件到容器內(nèi)
docker cp 容器外路徑 容器ID/名稱: 容器內(nèi)路徑
查看容器日志
docker logs -f --tail=要查看末尾多少行 默認(rèn)all 容器ID
我們?cè)谶\(yùn)維的時(shí)候羊瘩,通常給一些軟件喜歡設(shè)置開機(jī)自啟動(dòng)泰佳,例如 mysql盼砍、redis,這樣測(cè)試環(huán)境服務(wù)器重啟時(shí)可節(jié)省不少運(yùn)維時(shí)間成本,那么我們?nèi)绻莇ocker容器 是否也可以設(shè)置開機(jī)自啟動(dòng)容器呢逝她?
答案是 OKKKKK!
啟動(dòng)容器時(shí)浇坐,使用docker run命令時(shí) 添加參數(shù)--restart=always 便表示,該容器隨docker服務(wù)啟動(dòng)而自動(dòng)啟動(dòng)
ex:
docker run -itd --name redis002 -p 8888:6379 --restart=always redis:5.0.5 /bin/bash
這個(gè)時(shí)候有小伙伴著急了黔宛,我都已經(jīng)啟動(dòng)一個(gè)容器好久了近刘,跑了很多數(shù)據(jù)了,現(xiàn)在才告訴我可以設(shè)置自啟動(dòng)臀晃?我把容器刪了再啟動(dòng)觉渴,我數(shù)據(jù)咋辦?徽惋?疆拘?
哎!小伙汁寂曹,這個(gè)時(shí)候不要慌,我告訴你兩個(gè)辦法回右!
方法一:擔(dān)心數(shù)據(jù)丟了隆圆,這說明你在跑容器的時(shí)候沒有進(jìn)行數(shù)據(jù)掛載吧?翔烁?渺氧?
你問我,什么是數(shù)據(jù)掛載蹬屹?
簡(jiǎn)單來講侣背,就是將容器內(nèi)的數(shù)據(jù)與外部宿主機(jī)文件綁定起來,類似一個(gè)雙持久化慨默,當(dāng)容器刪除時(shí)贩耐,宿主機(jī)文件數(shù)據(jù)目錄仍在,下次啟動(dòng)容器只要將數(shù)據(jù)目錄指向宿主機(jī)數(shù)據(jù)所在位置即可恢復(fù)厦取!
具體請(qǐng)參考:docker 文件分層與數(shù)據(jù)卷掛載
命令:
-v 宿主機(jī)文件存儲(chǔ)位置:容器內(nèi)文件位置
如此操作潮太,就將 容器內(nèi)指定文件掛載到了宿主機(jī)對(duì)應(yīng)位置,-v命令可以多次使用虾攻,即一個(gè)容器可以同時(shí)掛載多個(gè)文件
-v 宿主機(jī)文件存儲(chǔ)位置:容器內(nèi)文件位置 -v 宿主機(jī)文件存儲(chǔ)位置:容器內(nèi)文件位置 -v 宿主機(jī)文件存儲(chǔ)位置:容器內(nèi)文件位置
示例:
# 運(yùn)行一個(gè)docker redis 容器 進(jìn)行 端口映射 兩個(gè)數(shù)據(jù)卷掛載 設(shè)置開機(jī)自啟動(dòng)
docker run -d -p 6379:6379 --name redis505 --restart=always -v /var/lib/redis/data/:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis.conf redis:5.0.5 --requirepass "password"
此方法完了你很無(wú)語(yǔ)铡买?那還不是得刪容器?是呀霎箍!沒錯(cuò)奇钞!那么為什么你有數(shù)據(jù)恢復(fù)需求而沒有想到數(shù)據(jù)持久化,數(shù)據(jù)恢復(fù)備份漂坏,數(shù)據(jù)卷掛載景埃?自己DEMO的吃虧媒至,是為了平時(shí)開發(fā)少扣腦殼多摸魚!
方法二:不想刪容器纠亚,又想讓這個(gè)容器設(shè)置開機(jī)自啟動(dòng)塘慕,那么我們修改其啟動(dòng)配置即可!
命令:
docker update --restart=always 容器Id 或者 容器名
#或
docker container update --restart=always 容器Id 或者 容器名
如上蒂胞,雖然不刪容器就設(shè)置了自啟動(dòng)需求滿足了图呢,但是,危不危險(xiǎn)骗随,這個(gè)容器有沒有需要數(shù)據(jù)恢復(fù)的情況蛤织?自己考量吧!:枞尽指蚜!
更換容器名
想給容器換個(gè)霸氣炫酷吊炸天的名字?
docker rename 容器ID/容器名 新容器名
ex:
(四)自己提交一個(gè)鏡像
我們運(yùn)行的容器可能在鏡像的基礎(chǔ)上做了一些修改涨椒,有時(shí)候我們希望保存起來摊鸡,封裝成一個(gè)更新的鏡像,這時(shí)候我們就需要使用 commit 命令來構(gòu)建一個(gè)新的鏡像
docker commit -m="提交信息" -a="作者信息" 容器名/容器ID 提交后的鏡像名:Tag
我們拉取一個(gè)tomcat鏡像 并持久化運(yùn)行 且設(shè)置與宿主機(jī)進(jìn)行端口映射
docker pull tomcat
docker run -itd -p8080:8080 --name tom tomcat /bin/bash
訪問 咱的端口 發(fā)現(xiàn)訪問404 這是因?yàn)樵叟渲昧税⒗镌歧R像后 所拉取得鏡像都是最基礎(chǔ)班的 僅僅包含其容器必要數(shù)據(jù) 例如 容器中 vim vi ll 命令都沒有
咱們的webapps 下一個(gè)文件都沒有 蚕冬,訪問肯定404羅
不斷查看 發(fā)現(xiàn)咱 webapps.dist 下是有文件的 我們把它拷貝的webapps 下 然后打包成一個(gè)新的鏡像 后 訪問查看是否進(jìn)入到首頁(yè) 不進(jìn)入404頁(yè)面
exit 退出容器
使用 提交命令 將在運(yùn)行的tomcat 容器 打包為一個(gè)全新的鏡像 名字為tom Tag為1.0
docker commit -a="leilei" -m="第一次打包鏡像免猾,打包后直接訪問還會(huì)404嗎" 231f2eae6896 tom:1.0
為了區(qū)分 咱停止并刪除之前tomcat 的容器
接下來 運(yùn)行咱自己打包的鏡像 tom:1.0
設(shè)置容器名字為lei 映射端口為6500:8080
docker run -d -it -p6500:8080 --name lei tom:1.0 /bin/bash
訪問6500 端口進(jìn)入到了 tomcat 首頁(yè) 說明 咱commit 鏡像成功了
(五)docker 運(yùn)維命令
可能有時(shí)候發(fā)布會(huì)遇到如下錯(cuò)誤:
docker: write /var/lib/docker/tmp/GetImageBlob325372670: no space left on device
這個(gè)錯(cuò)誤是docker在寫入的時(shí)候報(bào)錯(cuò)無(wú)機(jī)器無(wú)空間
查看docker工作目錄
sudo docker info | grep "Docker Root Dir"
查看docker磁盤占用總體情況
du -hs /var/lib/docker/
查看Docker的磁盤使用具體情況
docker system df
刪除 無(wú)用的容器和 鏡像
刪除異常停止的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
# 刪除名稱或標(biāo)簽為none的鏡像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
清除所有無(wú)容器使用的鏡像
注意,此命令只要是鏡像無(wú)容器使用(容器正常運(yùn)行)都會(huì)被刪除囤热,包括容器臨時(shí)停止
docker system prune -a
查找大文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr
查找指定docker使用目錄下大于指定大小文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr |grep '/var/lib/docker/overlay2/*'
ex:我這里是查找 /var/lib/docker/overlay2/* 開頭的且大于100m的文件
如果看到了這里猎提,大兄弟,你的docker便是入門了旁蔼;但前路還長(zhǎng)锨苏,讓我們?cè)倮^續(xù)深入,攀登技術(shù)的高峰吧棺聊,記得點(diǎn)個(gè)關(guān)注喲伞租!