Docker容器及鏡像的基本操作,操作命令和Linux極其相似,比較簡單,本文僅演示部分命令。
同時個人學習過程中命令參考來自 菜鳥教程 ,個人認為入門命令或許最輕松簡單的就是這里了,每條命令運行完都有示例結果。
作者:IT王小二
博客:https://itwxe.com
一、鏡像操作
1. 鏡像操作常用命令
# 列出本地鏡像列表
docker images
# 獲取鏡像
docker pull [鏡像名:版本]
# 刪除鏡像
docker rmi [鏡像名:版本或鏡像ID]
# Dockerfile 創建鏡像
docker build -t [鏡像名:版本] [path]
# 查看指定鏡像的創建歷史
docker history [鏡像名:版本]
# 將鏡像保存成 tar 歸檔文件的兩種方式,通常不使用,都是使用鏡像倉庫存儲
docker save -o xxx.tar [鏡像名:版本]
save [鏡像名:版本]>xxx.tar
# 從歸檔文件加載鏡像的兩種方式,通常不使用,都是使用鏡像倉庫獲取
docker load --input xxx.tar / docker load<xxx.tar
列出本地鏡像列表
docker images
- REPOSITORY:鏡像所在倉庫的名稱
- TAG:鏡像標簽(鏡像版本)
- IMAGEID:鏡像ID
- CREATED:鏡像的創建日期(不是獲取該鏡像的日期)
- SIZE:鏡像大小
獲取鏡像
docker pull [鏡像名:版本]
當不加入版本號時默認最后一個版本,即最新的版本。
例如獲取 MySQL5.7 版本,命令:
刪除鏡像
docker rmi [鏡像名:版本或鏡像ID]
例如刪除 hello-world 鏡像。
二、容器操作
1. 容器生命周期管理命令
# 查看容器列表(默認查看正在運行的容器,-a查看所有容器)
docker ps
# 創建一個新的容器並運行一個命令,run為創建並運行,create僅創建不運行
docker run/create [參數] [鏡像名:版本]
# 啟動/停止/重啟一個容器
docker start/stop/restart [容器名或容器ID]
# 直接殺掉容器,不給進程響應時間
docker kill [容器名或容器ID]
# 刪除已經停止的容器
docker rm [容器名或容器ID]
# 暫停/恢復容器中的進程
docker pause/unpause [容器名或容器ID]
這部分命令比較簡單,僅解釋容器列表含義、容器啟動參數詳解。
容器通常情況下都是隨用隨刪,要注意數據掛載保存!
查看容器列表
docker ps
- CONTAINER ID:容器ID,具有唯一性
- IMAGE:容器實例化出來的鏡像名稱和版本號
- COMMAND:啟動容器時運行的命令
- CREATED:容器創建時間
- STATUS:容器狀態,有七種
- created(已創建)
- restarting(重啟中)
- running(運行中)
- removing(遷移中)
- paused(暫停)
- exited(停止)
- dead(死亡)
- PORTS:容器的端口映射信息
- NAMES:容器名稱
創建並運行容器
docker run [參數] [鏡像名:版本]
常用參數:
-d:后台運行容器,並返回容器ID;
-i:以交互模式運行容器,通常與 -t 同時使用
-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用
-p:端口映射,格式為:宿主機端口:容器端口
--restart=always:代表 docker 重啟時,dockerHub 容器也總是隨之啟動
--name 容器名稱:為容器指定一個名稱
-v:掛載宿主機目錄到容器目錄,格式為-v [宿主機目錄]:[容器目錄]
-m:設置容器使用內存最大值
后台啟動容器
創建一個tomcat8.0服務,以后台方式運行,映射主機端口8090,容器名稱tomcat8090,命令如下:
docker run -d --name tomcat8090 -p 8090:8080 tomcat:8.0
啟動成功之后,訪問看下tomcat服務是否正常,當然前提宿主機的8090端口需要開放,我的地址為:http://192.168.5.33:8090
。
交互式創建容器並進入容器
創建一個tomcat8.0服務,,以交互式方式運行,映射主機端口8091,容器名稱tomcat8091,命令如下:
docker run -it --name tomcat8091 -p 8091:8080 tomcat:8.0
可以看到兩者的不同,但是需要注意,交互式啟動容器,一旦執行 exit 命令那么容器也會 stop,查看結果如下圖,tomcat8091 已經處於停止狀態。
如果需要交互式運行卻不退出容器,可以使用 ctrl + q + p
退出交互式頁面,這樣容器不會退出運行。
掛載宿主機目錄到容器
當我們想掛載宿主機的文件目錄到容器,或者持久化容器某些內容時,例如 MySQL 數據持久化,往 tomcat 容器運行項目,此處就以 tomcat 容器運行項目掛載為例。
此處使用的項目為開源項目: https://github.com/jgraph/drawio,這也是我用來畫圖的開源工具,工具支持中文,如果你不想使用付費工具,那么這個開源工具絕對值得你嘗試,話不多說,命令寫上:
1、首先干掉所有容器
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
2、這里我就使用 https://github.com/jgraph/drawio 這個畫圖的開源項目來示例
# 宿主機創建掛載目錄
mkdir -p /itwxe/tomcat/webapps
# wget下載 war 包到創建的目錄,也可以下載 war 后上傳
cd /itwxe/tomcat/webapps
wget https://github.com/jgraph/drawio/releases/download/v14.8.0/draw.war
# 啟動 tomcat 容器,掛載的路徑都必須是絕對路徑
docker run -d --name tomcat_drawio -p 8090:8080 -v /itwxe/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.0
啟動成功后訪問 http://192.168.5.33:8090/draw
看看效果,效果如下圖:
可以看到,war 包正常掛載到了容器,draw項目也部署運行起來了。
2. 容器操作運維
# 查看容器配置元數據
docker inspect [容器名或容器ID]
# 進入容器環境中交互操作
docker exec -it [容器名或容器ID] /bin/bash
# 查看容器日志
docker logs [--since="2019-02-01"] [-f] [--tail=10] [容器名或容器ID]
# 容器文件系統作為一個 tar 歸檔文件
docker export -o test.tar [容器名或容器ID]
docker export [容器名或容器ID]>test.tar
# 導入歸檔文件,成為一個鏡像
docker import test.tar [鏡像名:版本]
查看容器配置元數據
docker inspect [容器名或容器ID]
例如查看啟動的 tomcat_drawio 元數據:docker inspect tomcat_drawio
。
里面可以看到綁定ip,掛載目錄,容器ip 等信息,通常情況下得網段 ip 為:
通常情況無需修改,默認即可,需要修改是可以在 /etc/docker/daemon.json
添加 bip 配置
vim /etc/docker/daemon.json
# 添加bip配置,修改網段為 172.17.5.1,通常默認 172.17.0.1
{
"bip": "172.17.5.1/24",
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
# 更新配置
systemctl daemon-reload
systemctl restart docker
再次查看信息,可以看到網段已經更改了,通常默認即可
同樣宿主機和docker相互訪問也是通過網卡來訪問的,docker安裝后會新增一個網卡,使用 ip addr
命令查看。
進入容器環境中交互操作
docker exec -it [容器名或容器ID] /bin/bash
例如進入已經啟動的容器 tomcat_drawio 中。
docker exec -it tomcat_drawio /bin/bash
可以看到命令執行后就進入了容器中,容器中的命令和Linux的使用基本沒差別,不過僅支持最小化的Linux命令,例如查看文件命令 ll
命令就不支持,僅支持 ls
命令。
查看容器日志
docker logs [--since="2019-02-01"] [-f] [--tail=10] [容器名或容器ID]
查看 docker 容器日志命令和 Linux 系統中 tail
命令類似,例如查看 tomcat_drawio 的運行日志。
docker logs -f tomcat_drawio
3. 容器rootfs命令
# path 容器與主機之間的數據拷貝
docker cp [主機文件路徑] [容器名或容器ID:[容器路徑]]
# 通過容器生成鏡像
docker commit [參數] [容器名稱或容器ID] [鏡像名稱[:版本]]
# 檢查容器里文件結構的更改
docker diff [容器名稱或容器ID]
容器與主機之間的數據拷貝
docker cp [主機文件路徑] [容器名或容器ID]
以復制 draw.war 文件到 tomcat 容器的 /usr/local/tomcat
目錄為例,當然通常 war 包不放在這里。
docker cp /itwxe/tomcat/webapps/draw.war tomcat_drawio:/usr/local/tomcat
可以看到 draw.war 成功拷貝進了容器中。
通過容器生成鏡像
docker commit [參數] [容器名稱或容器ID] [鏡像名稱[:版本]]
參數:
-a:提交的鏡像作者
-c:使用Dockerfile指令來創建鏡像
-m:提交時的說明文字
-p:在commit時,將容器暫停
有時候我們需要將我們改動的容器逆向生成鏡像,這樣通過鏡像創建出來的容器就有了我們所有的更改。
例如需要將部署了 drawio 項目的 tomcat 容器(tomcat_drawio) 逆向生成鏡像。
需要注意的是,通過 -v 掛載的目錄數據不會封裝到鏡像,所以需要把數據拷貝到容器中。
# 干掉其它的示例容器
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
# 啟動一個新的容器
docker run -dit --name tomcat8090 -p 8090:8080 tomcat:8.0
# 往里面拷貝 draw.war 包,war包會自動解壓部署
docker cp /itwxe/tomcat/webapps/draw.war tomcat8090:/usr/local/tomcat/webapps/
# 容器生成鏡像
docker commit -a "itwxe" -m "itwxe create tomcat drawio" tomcat8090 tomcat:itwxe_drawio
# 啟動容器
docker run -dit --name tomcat9000 -p 9000:8080 tomcat:itwxe_drawio
可以看到生成鏡像成功,啟動也沒問題,同時 http://192.168.5.33:8090/draw
當然也可以正常訪問的。
通常情況下生成速度都很快,這是因為容器創建時其實只是在鏡像文件上面多創建了一層可讀寫的文件,而通過容器生成鏡像時只需要把這一層的文件從可讀寫修改成只讀即可,而基礎鏡像層會復用。
三、倉庫操作
1. 倉庫操作常用命令
# 登陸倉庫
docker login
# 標記本地鏡像,將其歸入某一倉庫
docker tag [鏡像名:版本] [倉庫]/[鏡像名:版本]
# 推送鏡像到倉庫 --需要登陸
docker push [倉庫]/[鏡像名:版本]
# 在倉庫中查詢鏡像,無法查詢到 tag 版本
# 其中 OFFICIAL 參數值為 [OK] 的代表官方鏡像,通常使用官方鏡像比較安全
docker search [鏡像名]
# 下載鏡像到本地
docker pull [鏡像名:版本]
# 退出賬號
docker logout
2. Docker官方倉庫
前提
1、首先 DockerHub 注冊賬號,郵件激活,這就不多說了。
2、創建倉庫,用於存放需要上傳的鏡像,此處我仍然以 itwxe/tomcat_drawio
為例,公開或私有自己選擇。
上傳示例
1、登錄 docker,輸入注冊的用戶名密碼登錄即可,警告可參考提示文檔解決。
2、再使用 tag 命令標記一個鏡像,指定自己創建的倉庫。
3、使用 push 命令推送此鏡像到 docker 官方倉庫里。
4、查詢自己的倉庫,可以看到剛才設置的 v1 版本已經提交了,如果是公共倉庫,那么別人也可以從你這里獲取鏡像,命令:docker pull itwxe/tomcat_drawio:v1
。
3. Docker私服倉庫
通常情況下在開發部署測試時可能都沒有外網(內網通信),又或者你不想把你的鏡像放在公網上,那么就需要私服倉庫了。
搭建私服倉庫
1、下載 registry 鏡像,當前時間最新版本是2.x.x,所以就不指定版本了。
docker pull registry
2、配置允許 http 訪問,默認僅允許 https 訪問。
vim /etc/docker/daemon.json
# 添加 insecure-registries 配置,修改 ip 端口為你自己的
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
"insecure-registries": ["192.168.5.33:5000"]
}
# 刷新配置,重啟 docker
systemctl daemon-reload
systemctl restart docker
3、啟動私服倉庫容器。
docker run -d --name dockerHub -p 5000:5000 registry
docker ps -a
curl http://192.168.5.33:5000/v2/_catalog
可以 curl 查看倉庫的鏡像內容,也可以瀏覽器 http://ip:port/v2/_catalog
查看。
提交鏡像到私服倉庫
提交私服倉庫過程和提交官方倉庫步驟一致,以提交 itwxe/tomcat_drawio
到私服倉庫為例。
同樣,拉取鏡像的時候也加上 ip:port
。
docker pull 192.168.5.33:5000/tomcat_drawio:private1
都讀到這里了,來個 點贊、評論、關注、收藏 吧!