Docker命令合集


  • docker常用命令
  1. 搜索鏡像:docker search [OPTIONS] [鏡像名]
    命令參數(OPTIONS):
    -f, --filter filter 根據提供的格式篩選結果,如 -f is-official=true
    –format string 利用Go語言的format格式化輸出結果
    –limit int 展示最大的結果數,默認25個,優先級高於其他參數
    –no-trunc 描述全部顯示

  2. 查看鏡像:docker image ls \ docker images
    命令參數(OPTIONS):
    -a, --all 展示所有鏡像 (默認隱藏底層的鏡像)
    –no-trunc 不縮略顯示
    -q, --quiet 只顯示鏡像ID
    可以使用正則,但是當匹配出兩個一樣NAME的鏡像時會不顯示此時需要加上版本號匹配
    如:docker images cent*:latest

  3. 拉取鏡像:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    命令參數(OPTIONS):
    -a, --all-tags 下載所有符合給定tag的鏡像

    1. 沒有指定下載版本時默認下載最新的版本
    2. 通過Image ID判斷是否下載(如當指定的鏡像Image ID已存在,則不做拉取,如名稱不一樣則只是新增引用)
  4. 刪除鏡像:docker rmi / docker image rm [參數] 鏡像名 [鏡像名2…]
    命令參數(OPTIONS):
    -f, --force 強制刪除,謹慎使用

  5. 導出鏡像:docker save [參數] 鏡像名 [鏡像名2…]
    命令參數(OPTIONS):
    -o, --output string 指定寫入的文件名和路徑
    舉慄:docker save hello-world fce2 hello-world:latest -o helloWorld.tar
    注意:在導出的時候一定要指定版本號,否則在導入的時候REPOSITORY和TAG會顯示NONE

  6. 備份導入:docker load [參數]
    命令參數(OPTIONS):
    -i, --input string 指定要打入的文件,如沒有指定,默認是STDIN
    -q, --quiet 不打印導入過程信息

  7. 鏡像重命名(相當於增加一個引用):docker tag 源鏡像名[:版本號] 新鏡像名[:版本號]
    飯粒:docker tag hello-world:latest hello:latest

  8. 鏡像詳細信息:docker image inspect [OPTIONS] IMAGE [IMAGE…]
    或 docker inspect [OPTIONS] IMAGE [IMAGE…]
    命令參數(OPTIONS):
    -f, --format string 利用特定Go語言的format格式輸出結果
    飯粒:docker inspect hello -f “{{json .ContainerConfig.Env}}”

  9. 鏡像歷史信息(可以查看鏡像是由哪個鏡像構建出來的):docker history [OPTIONS] IMAGE
    命令參數(OPTIONS):
    -H, --human 將創建時間、大小進行優化打印(默認爲true)
    -q, --quiet 只顯示鏡像ID
    –no-trunc 不縮略顯示
    鏡像總結


  • docker 容器生命週期
    docker 容器生命週期
  1. 容器創建:docker create [OPTIONS] IMAGE [COMMAND] [ARG…]
    命令參數(OPTIONS):
    -t, --tty 分配一個僞TTY,也就是分配虛擬終端
    -i, --interactive 即使沒有連接,也要保持STDIN打開
    –name 爲容器起名,如果沒有指定將會隨機產生一個名稱
    待執行命令 / 參數(COMMAND\ARG):
    COMMAND 表示容器啓動後,需要在容器中執行的命令,如ps、ls 等命令
    ARG 表示執行 COMMAND 時需要提供的一些參數,如ps 命令的 aux、ls命令的-a等等
    飯粒:docker create --name centos-test centos ls -a

  2. 刪除容器:docker rm [OPTIONS] CONTAINER [CONTAINER…]
    命令參數(OPTIONS):
    -f, --force 強制刪除,在running、paused狀態下適用

  3. 容器啓動:docker start [OPTIONS] CONTAINER [CONTAINER…]
    命令參數(OPTIONS):
    -a, --attach 將當前shell的 STDOUT/STDERR 連接到容器上
    -i, --interactive 將當前shell的 STDIN連接到容器上
    注意:當運行的容器有長連接等待輸入的時候(如執行python)需要在容器創建的時候就加上-ti參數,啓動的時候加上-ai參數
    飯粒:docker create --name python2 -ti centos python
    docker start -ai python2

  4. 容器創建並啓動:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
    命令參數(OPTIONS):
    -t, --tty:分配一個僞TTY,也就是分配虛擬終端
    -i, --interactive:即使沒有連接,也要保持STDIN打開
    –name:爲容器起名,如果沒有指定將會隨機產生一個名稱
    -d, --detach:在後臺運行容器並打印出容器ID
    –rm:當容器退出運行後,自動刪除容器
    待執行命令/參數(COMMAND\ARG):
    COMMAND:表示容器啓動後,需要在容器中執行的命令,如ps、ls 等命令
    ARG:表示執行 COMMAND 時需要提供的一些參數,如ps 命令的 aux、ls命令的-a等等
    docker run 相當於 docker create + docker start –a 前臺模式
    docker run -d 相當於 docker create + docker start 後臺模式

  5. 停止容器:docker stop [OPTIONS] CONTAINER [CONTAINER…]
    命令參數(OPTIONS):
    -t, --time int:停止容器等待時間,單位秒(默認 10s)(儘管在這段時間內執行Ctrl + C 也無法中止stop命令)
    stop命令是先發送SIGTERM信號,一段時間後再發送SIGKILL信號

  6. 容器終止 :docker kill [OPTIONS] CONTAINER [CONTAINER…]
    命令參數(OPTIONS):
    -s, --signal string:指定發送給容器的關閉信號 (默認“KILL”信號)
    kill命令直接發送SIGKILL信號

  7. 容器暫停:docker pause CONTAINER [CONTAINER…]
    在這裏插入圖片描述

  8. 容器取消暫停(恢復運行):docker unpause CONTAINER [CONTAINER…]

  9. 容器重啓:docker restart [OPTIONS] CONTAINER [CONTAINER…]
    命令參數(OPTIONS):
    -t, --time int :重啓前,等待的時間,單位秒(默認 10s) 即關閉前等待的時間

  10. 容器詳細信息:docker container inspect [OPTIONS] CONTAINER [CONTAINER…]
    或者 docker inspect [OPTIONS] CONTAINER [CONTAINER…]
    命令參數(OPTIONS):
    -f, --format string:利用特定Go語言的format格式輸出結果
    -s, --size:顯示總大小

  11. 容器日誌信息:docker logs [OPTIONS] CONTAINER
    命令參數(OPTIONS):
    –details:顯示日誌的額外信息
    -f, --follow:動態跟蹤顯示日誌信息
    –since string:只顯示某事時間節點之後的
    –tail string:顯示倒數的行數(默認全部)
    -t, --timestamps:顯示timestamps時間
    –until string:只顯示某事時間節點之前的
    注意:容器日誌中記錄的是容器主進程的輸出STDOUT\STDERR

  12. 容器重命名:docker rename CONTAINER NEW_NAME

  13. 容器連接:docker attach [OPTIONS] CONTAINER
    將當前終端的STDIN、STDOUT、STDERR綁定到正在運行的容器的主進程上實現連接(退出以後容器也跟着停止)
    命令參數(OPTIONS):
    –no-stdin:不綁定STDIN

  14. 容器中執行新命令:docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
    命令參數(OPTIONS):
    -d, --detach:後臺運行命令
    -i, --interactive:即使沒連接容器,也將當前的STDIN綁定上
    -t, --tty:分配一個虛擬終端
    -w, --workdir string:指定在容器中的工作目錄
    -e, --env list:設置容器中運行時的環境變量
    執行的命令(子進程)不影響主進程運行,其中的標準輸出不會記錄到logs中(即docker logs無法查看exec的輸出)


  • Docker 容器與鏡像之間的關係
    在這裏插入圖片描述
  1. 根據容器生成一個新的鏡像:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    命令參數(OPTIONS):
    -a, --author string:作者
    -c, --change list:爲創建的鏡像加入Dockerfile命令
    -m, --message string:提交信息,類似git commit -m
    -p, --pause:提交時暫停容器 (default true)

  2. 容器導出:docker export [OPTIONS] CONTAINER
    命令參數(OPTIONS):
    -o, --output string:指定寫入的文件,默認是STDOUT

  3. 容器包的導入:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
    命令參數(OPTIONS):
    -c, --change list:爲創建的鏡像加入Dockerfile命令
    -m, --message string:導入時,添加提交信息

  4. commit與import的區別

    1. commit生成的鏡像通過history可以看到繼承關係,而import生成的鏡像是獨立生成一個新的鏡像(沒有繼承關係)
      在這裏插入圖片描述
    2. commit生成的鏡像會保留所有父鏡像的數據,利用import方法會丟失所有父鏡像的元數據(docker inspect查看Config信息)

  • Docker鏡像的底層實現(聯合文件系統)
    在這裏插入圖片描述
    • docker inspect -f “{{json .RootFS.Layers}}” IMAGE查看Layer繼承鏡像信息
    • 只讀文件系統,只能看到最後一層。
      在這裏插入圖片描述
      在這裏插入圖片描述
      在這裏插入圖片描述
      在這裏插入圖片描述

  • Docker 網絡管理
  1. 查看網絡:docker network ls [OPTIONS]
    命令參數(OPTIONS):
    -f, --filter filter 過濾條件(如 'driver=bridge’)
    –format string 格式化打印結果
    –no-trunc 不縮略顯示
    -q, --quiet 只顯示網絡對象的ID
    注意:默認情況下,docker安裝完成後,會自動創建bridge、host、none三種網絡驅動

  2. 創建網絡:docker network create [OPTIONS] NETWORK
    命令參數(OPTIONS):
    -d, --driver string:指定網絡的驅動(默認 “bridge”)
    –subnet strings:指定子網網段(如192.168.0.0/16、172.88.0.0/24)
    –ip-range strings:執行容器的IP範圍,格式同subnet參數
    –gateway strings:子網的IPv4 or IPv6網關,如(192.168.0.1)
    注意:

    1. host和none模式網絡只能存在一個
    2. docker自帶的overlay 網絡創建依賴於docker swarm(集羣負載均衡)服務
    3. 192.168.0.0/16 等於 192.168.0.0~192.168.255.255 192.168.8.0/24
    4. 172.88.0.0/24 等於 172.88.0.0~172.88.0.255
    5. host和bridge都可以鏈接外網,none無法鏈接外網
  3. 網絡刪除:docker network rm NETWORK [NETWORK…]

  4. 網絡詳細信息:docker network inspect [OPTIONS] NETWORK [NETWORK…]
    或者 docker inspect [OPTIONS] NETWORK [NETWORK…]
    命令參數(OPTIONS):
    -f, --format string:根據format輸出結果

  5. 使用網絡:docker run/create --network NETWORK
    注意:默認情況下,docker創建或啓動容器時,會默認使用名爲bridge的網絡

  6. 網絡連接與斷開:docker network connect [OPTIONS] NETWORK CONTAINER
    docker network disconnect [OPTIONS] NETWORK CONTAINER
    命令參數(OPTIONS):
    -f, --force 強制斷開連接(用於disconnect)
    注意:

    1. host模式不能使用該命令
    2. 同一容器不能同時存在兩種及以上網絡模式
    3. 同一容器可以擁有多個bridge網絡

  • docker 網絡模式
    • bridge 模式(基於IP做轉發):
      • 特點:
    1. 宿主機上需要單獨的bridge網卡,如默認docker默認創建的docker0。
    2. 容器之間、容器與主機之間的網絡通信,是藉助爲每一個容器生成的一對veth pair虛擬網絡設備對,進行通信的。一個在容器上,另一個在宿主機上。
    3. 每創建一個基於bridge網絡的容器,都會自動在宿主機上創建一個veth**虛擬網絡設備。
    4. 外部無法直接訪問容器。需要建立端口映射才能訪問。
    5. 容器藉由veth虛擬設備通過如docker0這種bridge網絡設備進行通信。
    6. 每一容器具有單獨的IP
      在這裏插入圖片描述
    • 端口映射:在容器創建或啓動時指定端口映射
      docker run/create -P …或者 docker run/create –p …
      命令參數(OPTIONS):
      -P, --publish-all:將容器內部所有暴露端口進行隨機映射
      -p, --publish list:手動指定端口映射
      飯粒:-p [HOST_IP]:[HOST_PORT]:CONTAINER_PORT
      如:-p ::80 將容器的80端口隨機(端口)映射到宿主機任意IP
      -p :8000:6379 將容器的6379端口映射到宿主機任意IP的8000端口
      -p 192.168.5.1::3306 將容器的3306端口隨機(端口)映射到宿主機的192.168.5.1 IP上
      在這裏插入圖片描述
    • host模式:網絡性能最佳
      特點:
    1. 容器完全共享宿主機的網絡。網絡沒有隔離。宿主機的網絡就是容器的網絡。
    2. 容器、主機上的應用所使用的端口不能重複。例如:如果宿主機已經佔用了8090端口,那麼任何一個host模式的容器都不可以使用8090端口了;反之同理。
    3. 外部可以直接訪問容器,不需要端口映射。
    4. 容器的IP就是宿主機的IP
      在這裏插入圖片描述
    • Container模式:一個容器共享其他容器的網絡
      相當於該容器在網絡層面上,將其他容器作爲“主機”。它們之間的網絡沒有隔離。這些容器之間的特性同host模式。
      使用方法:
      Docker run/create --network container:CONTAINER …
      舉慄:docker run -itd --rm --network container:5e28 mongo
      在這裏插入圖片描述

    • none模式:
      特點:容器上沒有網絡,也無任何網絡設備。如果需要使用網絡,需要用戶自行安裝與配置。
      應用場景:該模式適合需要高度定製(隔離)網絡的用戶使用。

    • overlay模式:也稱爲覆蓋網絡

    1. Overlay 網絡的實現方式和方案有多種。Docker自身集成了一種,基於VXLAN隧道技術實現。
      Overlay 網絡主要用於實現跨主機容器之間的通信。
    2. 應用場景:需要管理成百上千個跨主機的容器集羣的網絡時。
    3. TCP/IP協議工作流程:
      TCP/IP協議工作流程
    4. IP隧道網絡原理(數據包從c1到c2)
      IP隧道網絡原理
    • macvlan 網絡模式:
      最主要的特徵就是他們的通信會直接基於mac地址進行轉發
    1. 這時宿主機其實充當一個二層交換機。Docker會維護着一個MAC地址表,當宿主機網絡收到一個數據包後,直接根據mac地址找到對應的容器,再把數據交給對應的容器。
    2. 容器之間可以直接通過IP互通,通過宿主機上內建的虛擬網絡設備(創建macvlan網絡時自動創建),但與主機無法直接利用IP互通。
    3. 應用場景:由於每個外來的數據包的目的mac地址就是容器的mac地址,這時每個容器對於外面網絡來說就相當於一個真實的物理網絡設備。因此當需要讓容器來的網絡看起來是一個真實的物理機時,使用macvlan模式
      在這裏插入圖片描述

  • docker數據卷

    • 容器數據弊端:
    1. 宿主機無法直接訪問容器中的文件
    2. 容器中的文件沒有持久化,導致容器刪除後,文件數據也隨之消失
    3. 容器之間也無法直接訪問互相的文件
    • 爲解決以上問題,docker加入了數據卷(volumes)機制,以實現:
    1. 容器與主機之間、容器與容器之間共享文件
    2. 容器中數據的持久化
    3. 將容器中的數據備份、遷移、恢復
    • 數據卷的特點
    1. 數據卷存在於宿主機的文件系統中,獨立於容器,和容器的生命週期是分離的。
    2. 數據卷可以目錄也可以是文件,容器可以利用數據卷與宿主機進行數據共享,實現了容器間的數據共享和交換。
    3. 容器啓動初始化時,如果容器使用的鏡像包含了數據,這些數據會拷貝到數據卷中。
    4. 容器對數據卷的修改是實時進行的。
    5. 數據卷的變化不會影響鏡像的更新。數據卷是獨立於聯合文件系統,鏡像是基於聯合文件系統。鏡像與數據卷之間不會有相互影響。
    • Docker掛載容器數據卷的三種方式
    1. bind mounts:將宿主機上的一個文件或目錄被掛載到容器上。
    2. volumes:由Docker創建和管理。使用docker volume命令管理
    3. tmpfs mounts:tmpfs 是一種基於內存的臨時文件系統。tmpfs mounts 數據不會存儲在磁盤上
      在這裏插入圖片描述
    • bind mounts方式掛載數據卷:掛載數據卷都是利用docker run/create的參數爲容器掛載數據卷
    1. 方式一: -v, --volume參數
      -v 宿主機文件或文件夾路徑:容器中的文件或者文件夾路徑
      飯粒:docker run -itd -v /root/volume_dir:/root/v1_dir centos
    2. 方式二:–mount參數
      –mount type=bind,src=宿主機文件或文件夾路徑,dst=容器中的文件或者文件夾路徑
      注意:src指定的文件和路徑必須提前創建或存在;type/src/dst之間不能存在空格
      飯粒:docker run -itd --mount type=bind,src=/root/mount_dir,dst=/root/v2_dir centos
    • volumes方式掛載數據卷
    1. 方式一: -v, --volume參數
      -v [VOLUME-NAME:]容器中的文件或者文件夾路徑
    2. 方式二:–mount 參數
      –mount type=volume,src=VOLUME-NAME,dst=容器中的文件或者文件夾路徑
    3. volume對象管理
      docker volume:命令管理volume數據卷對象
      docker volume create:創建數據卷對象
      docker volume inspect:查看數據卷詳細信息
      docker volume ls:查看已創建的數據卷對象
      docker volume prune:刪除未被使用的數據卷對象
      docker volume rm:刪除一個或多個數據卷對象
    • tmpfs mount方式掛載數據卷:掛載/存到內存
      用法:
      –mount type=tmpfs, dst=PATH
      飯粒:docker run -itd --mount type=tmpfs,dst=/root/mount_dir centos

    • 共享其他容器的數據卷
      用法:docker run/create --volumes-from CONTAINER
      飯粒:docker run -itd --volumes-from ce3a centos

    • Docker的數據卷更多會是使用volumes方式來進行使用。使用時需注意

    1. 如果掛載一個空的數據捲到容器中的一個非空目錄中,那麼這個目錄下的文件會被複制到數據卷中。
    2. 如果掛載一個非空的數據捲到容器中的一個目錄中,那麼容器中的目錄中會顯示數據卷中的數據。如果原來容器中的目錄中有數據,那麼這些原始數據會被隱藏掉。
    3. 這兩個規則都非常重要,靈活利用第一個規則可以幫助我們初始化數據卷中的內容。掌握第二個規則可以保證掛載數據卷後的數據總是你期望的結果。

  • docker私有倉庫(應用比較小衆,目前都在雲端創建倉庫)
    • Docker倉庫就是存放docker鏡像並有docker pull方法下載的雲環境
    • Docker倉庫分爲公有倉庫和私有倉庫
      • 公有倉庫指Docker Hub(官方)等開放給用戶使用、允許用戶管理鏡像。
      • 私有倉庫指由用戶自行搭建的存放鏡像的雲環境。
    • 搭建無認證私有倉庫
    1. 第一步:在需要搭建倉庫的服務器上安裝docker。
    2. 第二步:在服務器上,從docker hub下載registry倉庫
      docker pull registry
    3. 第三步:在服務器上,啓動倉庫
      docker run -d -ti --restart always --name my-registry -p 8000:5000 -v /my-registry/registry:/var/lib/registry registry
      注意:registry內部對外開放端口是5000。默認情況下,鏡像會存放於容器內的/var/lib/registry(官網Dockerfile中查看)目錄下,這樣如果容器被刪除,則存放於容器中的鏡像也會丟失。
    4. 本地(或瀏覽器)利用curl 服務器IP:8000/v2/_catalog 查看當前倉庫中的存放的鏡像列表。(注意防火牆打開8000端口訪問)
      在這裏插入圖片描述
    • 上傳私有鏡像到無認證私有倉庫
    1. 第一步:利用docker tag重命名需要上傳的鏡像
      docker tag IMAGE 服務器IP:端口/IMAGE_NAME
      飯粒:docker tag centos-net 192.168.33.6:8000/centos-net
    2. 第二步:利用docker push上傳剛剛重命名的鏡像
      docker push 服務器IP:端口/centos
      飯粒:docker push 192.168.33.6:8000/centos-net
    3. 注意:
      必須重命名爲 服務器IP:端口/IMAGE_NAME
      如果push出現了類似https的錯誤,那麼需要往配置文件/etc/docker/daemon.json裏添加:“insecure-registries”:[“服務器IP:端口”]
      然後重啓docker再上傳鏡像即可。
    4. 查看鏡像是否上傳成功:curl 服務器IP:端口/v2/_catalog
      在這裏插入圖片描述
    • 無認證私有倉庫鏡像下載:docker pull 服務器IP:端口/IMAGE_NAME

    • 搭建帶認證的私有倉庫

    1. 第一步:刪除先前創建的無認證的倉庫容器(這步可省略)
      docker rm -f my-registry
    2. 第二步:創建存放認證用戶名和密碼的文件:
      mkdir /auth-registry/auth -p
    3. 第三步:創建密碼驗證文件。注意將USERNAME和PASSWORD替換爲設置的用戶名和密碼
      docker run --entrypoint htpasswd registry -Bbn USERNAME PASSWORD > /auth-registry/auth/htpasswd
    4. 第四步:重新啓動倉庫鏡像
      docker run -d -p 8000:5000 --restart=always --name docker-registry
      -v /auth-registry/registry:/var/lib/registry
      -v /auth-registry/auth:/auth
      -e “REGISTRY_AUTH=htpasswd”
      -e “REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm”
      -e “REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd”
      registry
    • 帶認證的私有倉庫上傳、下載鏡像
      在認證倉庫機器上:
    1. 第一步:首先登錄到服務器
      docker login -u username -p password 倉庫IP:端口
    2. 第二步:然後執行pull或者push命令
    3. 第三步:操作完畢後,可以退出登錄
      docker logout 倉庫IP:端口
      在這裏插入圖片描述
    • 如果想查看倉庫中已有的鏡像,需要進行http驗證纔可以。可以直接藉助瀏覽器訪問 倉庫IP:端口/v2/_catalog
      在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章