Docker基本操作

  • 2021 年 7 月 12 日
  • 筆記

Docker容器及鏡像的基本操作,操作命令和Linux極其相似,比較簡單,本文僅演示部分命令。

同時個人學習過程中命令參考來自 菜鳥教程 ,個人認為入門命令或許最輕鬆簡單的就是這裡了,每條命令運行完都有示例結果。

系列文章歡迎訪問:系列文章

一、鏡像操作

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 版本,命令:

获取mysql5.7镜像

刪除鏡像

docker rmi [鏡像名:版本或鏡像ID]

例如刪除 hello-world 鏡像。

删除hellor-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

后台启动tomcat8090

啟動成功之後,訪問看下tomcat服務是否正常,當然前提宿主機的8090埠需要開放,我的地址為://192.168.5.33:8090 。

互動式創建容器並進入容器

創建一個tomcat8.0服務,,以互動式方式運行,映射主機埠8091,容器名稱tomcat8091,命令如下:

docker run -it --name tomcat8091 -p 8091:8080 tomcat:8.0

交互式创建容器并进入容器

可以看到兩者的不同,但是需要注意,互動式啟動容器,一旦執行 exit 命令那麼容器也會 stop,查看結果如下圖,tomcat8091 已經處於停止狀態。

image-20210627203710815

如果需要互動式運行卻不退出容器,可以使用 ctrl + q + p 退出互動式頁面,這樣容器不會退出運行。

掛載宿主機目錄到容器

當我們想掛載宿主機的文件目錄到容器,或者持久化容器某些內容時,例如 MySQL 數據持久化,往 tomcat 容器運行項目,此處就以 tomcat 容器運行項目掛載為例。

此處使用的項目為開源項目: //github.com/jgraph/drawio,這也是我用來畫圖的開源工具,工具支援中文,如果你不想使用付費工具,那麼這個開源工具絕對值得你嘗試,話不多說,命令寫上:

1、首先幹掉所有容器

docker stop $(docker ps -aq)
docker rm $(docker ps -aq)

2、這裡我就使用 //github.com/jgraph/drawio 這個畫圖的開源項目來示例

# 宿主機創建掛載目錄
mkdir -p /itwxe/tomcat/webapps

# wget下載 war 包到創建的目錄,也可以下載 war 後上傳
cd /itwxe/tomcat/webapps
wget //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

啟動成功後訪問 //192.168.5.33:8090/draw 看看效果,效果如下圖:

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 為:

docker容器默认网段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": ["//mirror.ccs.tencentyun.com"]
}

# 更新配置
systemctl daemon-reload
systemctl restart docker

再次查看資訊,可以看到網段已經更改了,通常默認即可

docker更改网段ip

同樣宿主機和docker相互訪問也是通過網卡來訪問的,docker安裝後會新增一個網卡,使用 ip addr 命令查看。

docker网卡

進入容器環境中交互操作

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

可以看到生成鏡像成功,啟動也沒問題,同時 //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、創建倉庫,用於存放需要上傳的鏡像,此處我仍然以 tomcat:tudouge_drawio 為例,公開或私有自己選擇。

创建docker仓库

上傳示例

1、登錄 docker,輸入註冊的用戶名密碼登錄即可,警告可參考提示文檔解決。

docker登录

2、再使用 tag 命令標記一個鏡像,指定自己創建的倉庫。

docker指定自己的仓库

3、使用 push 命令推送此鏡像到 docker 官方倉庫里。

docker推送镜像到官方仓库

4、查詢自己的倉庫,可以看到剛才設置的 v1 版本已經提交了,如果是公共倉庫,那麼別人也可以從你這裡獲取鏡像,命令:docker pull itwxe/tomcat_drawio:v1 。

docker查看提交的镜像

3. Docker私服倉庫

通常情況下在開發部署測試時可能都沒有外網(內網通訊),又或者你不想把你的鏡像放在公網上,那麼就需要私服倉庫了。

搭建私服倉庫

1、下載 registry 鏡像,當前時間最新版本是2.x.x,所以就不指定版本了。

docker pull registry

2、配置允許 http 訪問,默認僅允許 https 訪問。

vim /etc/docker/daemon.json

# 添加 insecure-registries 配置,修改 ip 埠為你自己的
{
  "registry-mirrors": ["//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 //192.168.5.33:5000/v2/_catalog

启动私服仓库容器

可以 curl 查看倉庫的鏡像內容,也可以瀏覽器 //ip:port/v2/_catalog 查看。

提交鏡像到私服倉庫

提交私服倉庫過程和提交官方倉庫步驟一致,以提交 tomcat:tudouge_drawio 到私服倉庫為例。

提交镜像到私服仓库

同樣,拉取鏡像的時候也加上 ip:port 。

docker pull 192.168.5.33:5000/tomcat_drawio:private1

都讀到這裡了,來個 點贊、評論、關注、收藏 吧!

文章作者:IT王小二
首發地址://www.itwxe.com/posts/c078c813/
版權聲明:文章內容遵循 署名-非商業性使用-禁止演繹 4.0 國際 進行許可,除特殊聲明外皆為原創,轉載請在文章頁面明顯位置給出作者與原文鏈接。

Tags: