- docker常用命令
-
搜索
鏡像:docker search [OPTIONS] [鏡像名]
命令參數(OPTIONS):
-f, --filter filter 根據提供的格式篩選結果,如 -f is-official=true
–format string 利用Go語言的format格式化輸出結果
–limit int 展示最大的結果數,默認25個,優先級高於其他參數
–no-trunc 描述全部顯示 -
查看
鏡像:docker image ls \ docker images
命令參數(OPTIONS):
-a, --all 展示所有鏡像 (默認隱藏底層的鏡像)
–no-trunc 不縮略顯示
-q, --quiet 只顯示鏡像ID
可以使用正則,但是當匹配出兩個一樣NAME的鏡像時會不顯示此時需要加上版本號匹配
如:docker images cent*:latest -
拉取
鏡像:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
命令參數(OPTIONS):
-a, --all-tags 下載所有符合給定tag的鏡像- 沒有指定下載版本時默認下載最新的版本
- 通過Image ID判斷是否下載(如當指定的鏡像Image ID已存在,則不做拉取,如名稱不一樣則只是新增引用)
-
刪除
鏡像:docker rmi / docker image rm [參數] 鏡像名 [鏡像名2…]
命令參數(OPTIONS):
-f, --force 強制刪除,謹慎使用 -
導出
鏡像:docker save [參數] 鏡像名 [鏡像名2…]
命令參數(OPTIONS):
-o, --output string 指定寫入的文件名和路徑
舉慄:docker save hello-world fce2 hello-world:latest -o helloWorld.tar
注意:在導出的時候一定要指定版本號,否則在導入的時候REPOSITORY和TAG會顯示NONE -
備份
導入
:docker load [參數]
命令參數(OPTIONS):
-i, --input string 指定要打入的文件,如沒有指定,默認是STDIN
-q, --quiet 不打印導入過程信息 -
鏡像
重命名
(相當於增加一個引用):docker tag 源鏡像名[:版本號] 新鏡像名[:版本號]
飯粒:docker tag hello-world:latest hello:latest -
鏡像
詳細信息
:docker image inspect [OPTIONS] IMAGE [IMAGE…]
或 docker inspect [OPTIONS] IMAGE [IMAGE…]
命令參數(OPTIONS):
-f, --format string 利用特定Go語言的format格式輸出結果
飯粒:docker inspect hello -f “{{json .ContainerConfig.Env}}” -
鏡像
歷史信息
(可以查看鏡像是由哪個鏡像構建出來的):docker history [OPTIONS] IMAGE
命令參數(OPTIONS):
-H, --human 將創建時間、大小進行優化打印(默認爲true)
-q, --quiet 只顯示鏡像ID
–no-trunc 不縮略顯示
- docker 容器生命週期
-
容器
創建
: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 -
刪除
容器:docker rm [OPTIONS] CONTAINER [CONTAINER…]
命令參數(OPTIONS):
-f, --force 強制刪除,在running、paused狀態下適用 -
容器
啓動
: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 -
容器
創建並啓動
: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 後臺模式 -
停止
容器:docker stop [OPTIONS] CONTAINER [CONTAINER…]
命令參數(OPTIONS):
-t, --time int:停止容器等待時間,單位秒(默認 10s)(儘管在這段時間內執行Ctrl + C 也無法中止stop命令)
stop命令是先發送SIGTERM信號,一段時間後再發送SIGKILL信號 -
容器
終止
:docker kill [OPTIONS] CONTAINER [CONTAINER…]
命令參數(OPTIONS):
-s, --signal string:指定發送給容器的關閉信號 (默認“KILL”信號)
kill命令直接發送SIGKILL信號 -
容器
暫停
:docker pause CONTAINER [CONTAINER…]
-
容器
取消暫停
(恢復運行):docker unpause CONTAINER [CONTAINER…] -
容器
重啓
:docker restart [OPTIONS] CONTAINER [CONTAINER…]
命令參數(OPTIONS):
-t, --time int :重啓前,等待的時間,單位秒(默認 10s) 即關閉前等待的時間 -
容器
詳細信息
:docker container inspect [OPTIONS] CONTAINER [CONTAINER…]
或者 docker inspect [OPTIONS] CONTAINER [CONTAINER…]
命令參數(OPTIONS):
-f, --format string:利用特定Go語言的format格式輸出結果
-s, --size:顯示總大小 -
容器
日誌
信息:docker logs [OPTIONS] CONTAINER
命令參數(OPTIONS):
–details:顯示日誌的額外信息
-f, --follow:動態跟蹤顯示日誌信息
–since string:只顯示某事時間節點之後的
–tail string:顯示倒數的行數(默認全部)
-t, --timestamps:顯示timestamps時間
–until string:只顯示某事時間節點之前的
注意:容器日誌中記錄的是容器主進程的輸出STDOUT\STDERR -
容器
重命名
:docker rename CONTAINER NEW_NAME -
容器
連接
:docker attach [OPTIONS] CONTAINER
將當前終端的STDIN、STDOUT、STDERR綁定到正在運行的容器的主進程
上實現連接(退出以後容器也跟着停止)
命令參數(OPTIONS):
–no-stdin:不綁定STDIN -
容器中
執行新命令
: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 容器與鏡像之間的關係
-
根據容器生成一個新的鏡像
:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
命令參數(OPTIONS):
-a, --author string:作者
-c, --change list:爲創建的鏡像加入Dockerfile命令
-m, --message string:提交信息,類似git commit -m
-p, --pause:提交時暫停容器 (default true) -
容器
導出
:docker export [OPTIONS] CONTAINER
命令參數(OPTIONS):
-o, --output string:指定寫入的文件,默認是STDOUT -
容器包的
導入
:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
命令參數(OPTIONS):
-c, --change list:爲創建的鏡像加入Dockerfile命令
-m, --message string:導入時,添加提交信息 -
commit與import的區別
- commit生成的鏡像通過history可以看到
繼承
關係,而import生成的鏡像是獨立生成一個新的鏡像(沒有繼承關係)
- commit生成的鏡像會保留所有父鏡像的數據,利用import方法會丟失所有父鏡像的元數據(docker inspect查看Config信息)
- commit生成的鏡像通過history可以看到
- Docker鏡像的底層實現(聯合文件系統)
- docker inspect -f “{{json .RootFS.Layers}}” IMAGE查看Layer繼承鏡像信息
- 只讀文件系統,只能看到最後一層。
- Docker 網絡管理
-
查看網絡
:docker network ls [OPTIONS]
命令參數(OPTIONS):
-f, --filter filter 過濾條件(如 'driver=bridge’)
–format string 格式化打印結果
–no-trunc 不縮略顯示
-q, --quiet 只顯示網絡對象的ID
注意:默認情況下,docker安裝完成後,會自動創建bridge、host、none三種網絡驅動 -
創建
網絡: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)
注意:- host和none模式網絡只能存在一個
- docker自帶的overlay 網絡創建依賴於docker swarm(集羣負載均衡)服務
- 192.168.0.0/16 等於 192.168.0.0~192.168.255.255 192.168.8.0/24
- 172.88.0.0/24 等於 172.88.0.0~172.88.0.255
- host和bridge都可以鏈接外網,none無法鏈接外網
-
網絡
刪除
:docker network rm NETWORK [NETWORK…] -
網絡
詳細信息
:docker network inspect [OPTIONS] NETWORK [NETWORK…]
或者 docker inspect [OPTIONS] NETWORK [NETWORK…]
命令參數(OPTIONS):
-f, --format string:根據format輸出結果 -
使用
網絡:docker run/create --network NETWORK
注意:默認情況下,docker創建或啓動容器時,會默認使用名爲bridge的網絡 -
網絡連接與斷開:docker network connect [OPTIONS] NETWORK CONTAINER
docker network disconnect [OPTIONS] NETWORK CONTAINER
命令參數(OPTIONS):
-f, --force 強制斷開連接(用於disconnect)
注意:- host模式不能使用該命令
- 同一容器不能同時存在兩種及以上網絡模式
- 同一容器可以擁有多個bridge網絡
- docker 網絡模式
bridge
模式(基於IP做轉發):- 特點:
- 宿主機上需要單獨的bridge網卡,如默認docker默認創建的docker0。
- 容器之間、容器與主機之間的網絡通信,是藉助爲每一個容器生成的一對veth pair虛擬網絡設備對,進行通信的。一個在容器上,另一個在宿主機上。
- 每創建一個基於bridge網絡的容器,都會自動在宿主機上創建一個veth**虛擬網絡設備。
- 外部無法直接訪問容器。需要建立
端口映射
才能訪問。 - 容器藉由veth虛擬設備通過如docker0這種bridge網絡設備進行通信。
- 每一容器具有單獨的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
模式:網絡性能最佳
特點:
- 容器完全共享宿主機的網絡。網絡沒有隔離。宿主機的網絡就是容器的網絡。
- 容器、主機上的應用所使用的端口不能重複。例如:如果宿主機已經佔用了8090端口,那麼任何一個host模式的容器都不可以使用8090端口了;反之同理。
- 外部可以直接訪問容器,不需要端口映射。
- 容器的IP就是宿主機的IP
-
Container
模式:一個容器共享其他容器的網絡
相當於該容器在網絡層面上,將其他容器作爲“主機”。它們之間的網絡沒有隔離。這些容器之間的特性同host模式。
使用方法:
Docker run/create --network container:CONTAINER …
舉慄:docker run -itd --rm --network container:5e28 mongo
-
none模式:
特點:容器上沒有網絡,也無任何網絡設備。如果需要使用網絡,需要用戶自行安裝與配置。
應用場景:該模式適合需要高度定製(隔離
)網絡的用戶使用。 -
overlay模式:也稱爲覆蓋網絡
- Overlay 網絡的實現方式和方案有多種。Docker自身集成了一種,基於
VXLAN隧道技術
實現。
Overlay 網絡主要用於實現跨主機容器之間的通信。 - 應用場景:需要管理成百上千個跨主機的容器集羣的網絡時。
- TCP/IP協議工作流程:
- IP隧道網絡原理(數據包從c1到c2)
- macvlan 網絡模式:
最主要的特徵就是他們的通信會直接基於mac地址進行轉發
。
- 這時宿主機其實充當一個二層交換機。Docker會維護着一個MAC地址表,當宿主機網絡收到一個數據包後,直接根據mac地址找到對應的容器,再把數據交給對應的容器。
- 容器之間可以直接通過IP互通,通過宿主機上內建的虛擬網絡設備(創建macvlan網絡時自動創建),但與主機無法直接利用IP互通。
- 應用場景:由於每個外來的數據包的目的mac地址就是容器的mac地址,這時每個容器對於外面網絡來說就相當於一個真實的物理網絡設備。因此當需要讓容器來的網絡看起來是一個真實的物理機時,使用macvlan模式
-
docker數據卷
- 容器數據弊端:
- 宿主機無法直接訪問容器中的文件
- 容器中的文件沒有持久化,導致容器刪除後,文件數據也隨之消失
- 容器之間也無法直接訪問互相的文件
- 爲解決以上問題,docker加入了數據卷(volumes)機制,以實現:
- 容器與主機之間、容器與容器之間
共享
文件 - 容器中數據的
持久化
- 將容器中的
數據備份、遷移、恢復
等
- 數據卷的特點
- 數據卷存在於宿主機的文件系統中,
獨立於容器
,和容器的生命週期是分離的。 - 數據卷可以目錄也可以是文件,容器可以利用數據卷與宿主機進行數據共享,實現了容器間的數據共享和交換。
- 容器啓動初始化時,如果容器使用的鏡像包含了數據,這些數據會拷貝到數據卷中。
- 容器對數據卷的修改是實時進行的。
- 數據卷的變化不會影響鏡像的更新。數據卷是獨立於聯合文件系統,鏡像是基於聯合文件系統。鏡像與數據卷之間不會有相互影響。
- Docker掛載容器數據卷的三種方式
- bind mounts:將宿主機上的一個文件或目錄被掛載到容器上。
- volumes:由Docker創建和管理。使用docker volume命令管理
- tmpfs mounts:tmpfs 是一種基於內存的臨時文件系統。tmpfs mounts 數據不會存儲在磁盤上
bind
mounts方式掛載數據卷:掛載數據卷都是利用docker run/create的參數爲容器掛載數據卷
- 方式一: -v, --volume參數
-v 宿主機文件或文件夾路徑:容器中的文件或者文件夾路徑
飯粒:docker run -itd -v /root/volume_dir:/root/v1_dir centos - 方式二:–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
方式掛載數據卷
- 方式一: -v, --volume參數
-v [VOLUME-NAME:]容器中的文件或者文件夾路徑 - 方式二:–mount 參數
–mount type=volume,src=VOLUME-NAME,dst=容器中的文件或者文件夾路徑 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方式來進行使用。使用時需
注意
:
- 如果掛載一個空的數據捲到容器中的一個非空目錄中,那麼這個目錄下的文件會被複制到數據卷中。
- 如果掛載一個非空的數據捲到容器中的一個目錄中,那麼容器中的目錄中會顯示數據卷中的數據。如果原來容器中的目錄中有數據,那麼這些原始數據會被隱藏掉。
- 這兩個規則都非常重要,靈活利用第一個規則可以幫助我們初始化數據卷中的內容。掌握第二個規則可以保證掛載數據卷後的數據總是你期望的結果。
- docker私有倉庫(應用比較小衆,目前都在雲端創建倉庫)
- Docker倉庫就是存放docker鏡像並有docker pull方法下載的雲環境
- Docker倉庫分爲公有倉庫和私有倉庫
- 公有倉庫指Docker Hub(官方)等開放給用戶使用、允許用戶管理鏡像。
- 私有倉庫指由用戶自行搭建的存放鏡像的雲環境。
- 搭建
無認證
私有倉庫
- 第一步:在需要搭建倉庫的服務器上安裝docker。
- 第二步:在服務器上,從docker hub下載registry倉庫
docker pull registry
- 第三步:在服務器上,啓動倉庫
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中查看)目錄下,這樣如果容器被刪除,則存放於容器中的鏡像也會丟失。 - 本地(或瀏覽器)利用curl 服務器IP:8000/v2/_catalog 查看當前倉庫中的存放的鏡像列表。(注意防火牆打開8000端口訪問)
- 上傳私有鏡像到無認證私有倉庫
- 第一步:利用docker tag重命名需要上傳的鏡像
docker tag IMAGE 服務器IP:端口/IMAGE_NAME
飯粒:docker tag centos-net 192.168.33.6:8000/centos-net - 第二步:利用docker push上傳剛剛重命名的鏡像
docker push 服務器IP:端口/centos
飯粒:docker push 192.168.33.6:8000/centos-net - 注意:
必須重命名爲 服務器IP:端口/IMAGE_NAME
如果push出現了類似https的錯誤,那麼需要往配置文件/etc/docker/daemon.json裏添加:“insecure-registries”:[“服務器IP:端口”]
然後重啓docker再上傳鏡像即可。 - 查看鏡像是否上傳成功:curl 服務器IP:端口/v2/_catalog
-
無認證私有倉庫鏡像下載:docker pull 服務器IP:端口/IMAGE_NAME
-
搭建
帶認證
的私有倉庫
- 第一步:刪除先前創建的無認證的倉庫容器(這步可省略)
docker rm -f my-registry - 第二步:創建存放認證用戶名和密碼的文件:
mkdir /auth-registry/auth -p - 第三步:創建密碼驗證文件。注意將USERNAME和PASSWORD替換爲設置的用戶名和密碼
docker run --entrypoint htpasswd registry -Bbn USERNAME PASSWORD > /auth-registry/auth/htpasswd - 第四步:重新啓動倉庫鏡像
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
- 帶認證的私有倉庫上傳、下載鏡像
在認證倉庫機器上:
- 第一步:首先登錄到服務器
docker login -u username -p password 倉庫IP:端口 - 第二步:然後執行pull或者push命令
- 第三步:操作完畢後,可以退出登錄
docker logout 倉庫IP:端口
- 如果想查看倉庫中已有的鏡像,需要進行http驗證纔可以。可以直接藉助瀏覽器訪問 倉庫IP:端口/v2/_catalog