1. 程式人生 > 其它 >docker多個容器對映一個埠_【Docker】命令使用大全

docker多個容器對映一個埠_【Docker】命令使用大全

簡述

容器的出現是為了解決環境配置的問題,虛擬機器是一種解決方案,但是也有一些缺點,再後來出現了 Linux 容器,Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用介面。它是目前最流行的 Linux 容器解決方案。

Docker 的主要用途

  • 提供一次性的環境。比如,本地測試他人的軟體、持續整合的時候提供單元測試和構建的環境。
  • 提供彈性的雲服務。因為 Docker 容器可以隨開隨關,很適合動態擴容和縮容。
  • 組建微服務架構。通過多個容器,一臺機器可以跑多個服務,因此在本機就可以模擬出微服務架構。

基本概念

引用自:https://www.zhihu.com/topic/19950993/top-answers

  • 映象(Image):類似於虛擬機器中的映象,是一個包含有檔案系統的面向 Docker 引擎的只讀模板。任何應用程式執行都需要環境,而映象就是用來提供這種執行環境的。例如一個 Ubuntu 映象就是一個包含 Ubuntu 作業系統環境的模板,同理在該映象上裝上 Apache 軟體,就可以稱為 Apache 映象。
  • 容器(Container):類似於一個輕量級的沙盒,可以將其看作一個極簡的 Linux 系統環境(包括 root 許可權、程序空間、使用者空間和網路空間等),以及執行在其中的應用程式。Docker 引擎利用容器來執行、隔離各個應用。容器是映象建立的應用例項,可以建立、啟動、停止、刪除容器,各個容器之間是是相互隔離的,互不影響。注意:映象本身是隻讀的,容器從映象啟動時,Docker 在映象的上層建立一個可寫層,映象本身不變。
  • 倉庫(Repository):類似於程式碼倉庫,這裡是映象倉庫,是 Docker 用來集中存放映象檔案的地方。注意與註冊伺服器(Registry)的區別:註冊伺服器是存放倉庫的地方,一般會有多個倉庫;而倉庫是存放映象的地方,一般每個倉庫存放一類映象,每個映象利用 tag 進行區分,比如 Ubuntu 倉庫存放有多個版本(12.04、14.04 等)的 Ubuntu 映象。

以下介紹 Docker 基本的命令及其使用

容器週期管理

run

docker run:建立一個新的容器並執行一個命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS 說明:

  • -a stdin:指定標準輸入輸出內容型別,可選 STDIN/STDOUT/STDERR 三項;
  • -d:後臺執行容器,並返回容器 ID;
  • -i:以互動模式執行容器,通常與 -t 同時使用;
  • -P:隨機埠對映,容器內部埠隨機對映到主機的埠
  • -p:指定埠對映,格式為:主機 (宿主) 埠:容器埠
  • -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
  • --name="nginx-lb":為容器指定一個名稱;
  • --dns 8.8.8.8:指定容器使用的 DNS 伺服器,預設和宿主一致;
  • --dns-search example.com:指定容器 DNS 搜尋域名,預設和宿主一致;
  • -h "mars":指定容器的 hostname;
  • -e username="ritchie":設定環境變數;
  • --env-file=[]:從指定檔案讀入環境變數;
  • --cpuset="0-2" or --cpuset="0,1,2":繫結容器到指定 CPU 執行;
  • -m :設定容器使用記憶體最大值;
  • --net="bridge":指定容器的網路連線型別,支援 bridge/host/none/container: 四種類型;
  • --link=[]:新增連結到另一個容器;
  • --expose=[]:開放一個埠或一組埠;
  • --volume , -v繫結一個卷

使用 docker 映象 nginx:latest 以後臺模式啟動一個容器,並將容器命名為 mynginx。

docker run --name mynginx -d nginx:latest

使用映象 nginx:latest 以後臺模式啟動一個容器,並將容器的 80 埠對映到主機隨機埠。

docker run -P -d nginx:latest

使用映象 nginx:latest,以後臺模式啟動一個容器,將容器的 80 埠對映到主機的 80 埠,主機的目錄 /data 對映到容器的 /data。

docker run -p 80:80 -v /data:/data -d nginx:latest

繫結容器的 8080 埠,並將其對映到本地主機 127.0.0.1 的 80 埠上。

docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

使用映象 nginx:latest 以互動模式啟動一個容器,在容器內執行 /bin/bash 命令。

docker run -it nginx:latest /bin/bash

start/stop/restart

  1. docker start [OPTIONS] CONTAINER [CONTAINER...]
  2. docker stop [OPTIONS] CONTAINER [CONTAINER...]
  3. docker restart [OPTIONS] CONTAINER [CONTAINER...]

啟動已被停止的容器 myrunoob

docker start myrunoob

停止執行中的容器 myrunoob

docker stop myrunoob

重啟容器 myrunoob

docker restart myrunoob

kill

docker kill: 殺掉一個執行中的容器。

docker kill [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS 說明:

  • -s :向容器傳送一個訊號

殺掉執行中的容器 mynginx

docker kill -s KILL mynginx

rm

docker rm:刪除一個或多個容器。

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS 說明:

  • -f :通過 SIGKILL 訊號強制刪除一個執行中的容器。
  • -l :移除容器間的網路連線,而非容器本身。
  • -v :刪除與容器關聯的卷。

強制刪除容器 db01、db02:

docker rm -f db01 db02

移除容器 nginx01 對容器 db01 的連線,連線名 db:

docker rm -l db

刪除容器 nginx01, 並刪除容器掛載的資料卷:

docker rm -v nginx01

刪除所有已經停止的容器:

docker rm $(docker ps -a -q)

pause/unpause

docker pause: 暫停容器中所有的程序。docker unpause: 恢復容器中所有的程序。

  1. docker pause [OPTIONS] CONTAINER [CONTAINER...]
  2. docker unpause [OPTIONS] CONTAINER [CONTAINER...]

暫停資料庫容器 db01 提供服務。

docker pause db01

恢復資料庫容器 db01 提供服務。

docker unpause db01

create

docker create:建立一個新的容器但不啟動它
用法同 docker run

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

語法同 docker run

使用 docker 映象 nginx:latest 建立一個容器,並將容器命名為 myrunoob

  1. docker create --name myrunoob nginx:latest
  2. # 輸出
  3. 09b93464c2f75b7b69f83d56a9cfc23ceb50a48a9db7652ee4c27e3e2cb1961f

exec

docker exec:在執行的容器中執行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS 說明:

  • -d :分離模式:在後臺執行
  • -i :即使沒有附加也保持 STDIN 開啟
  • -t :分配一個偽終端

在容器 mynginx 中以互動模式執行容器內 /root/runoob.sh 指令碼:

docker exec -it mynginx /bin/sh /root/runoob.sh

在容器 mynginx 中開啟一個互動模式的終端:

  1. docker exec -i -t mynginx /bin/bash
  2. root@b1a0703e41e7:/#

也可以通過docker ps -a命令檢視已經在執行的容器,然後使用容器 ID 進入容器。
檢視已經在執行的容器 ID:

  1. docker ps -a
  2. # 輸出
  3. ...
  4. 9df70f9a0714 openjdk "/usercode/script.sh…"
  5. ...

第一列的 9df70f9a0714 就是容器 ID。
通過 exec 命令對指定的容器執行 bash:

docker exec -it 9df70f9a0714 /bin/bash

容器操作

ps

docker ps: 列出容器

docker ps [OPTIONS]

OPTIONS 說明:

  • -a :顯示所有的容器,包括未執行的。
  • -f :根據條件過濾顯示的內容。
  • --format :指定返回值的模板檔案。
  • -l :顯示最近建立的容器。
  • -n :列出最近建立的 n 個容器。
  • --no-trunc :不截斷輸出。
  • -q :靜默模式,只顯示容器編號。
  • -s :顯示總的檔案大小。

列出所有在執行的容器資訊。

  1. docker ps
  2. # 輸出
  3. CONTAINER ID IMAGE COMMAND ... PORTS NAMES
  4. 09b93464c2f7 nginx:latest "nginx -g 'daemon off" ... 80/tcp, 443/tcp myrunoob
  5. 96f7f14e99ab mysql:5.6 "docker-entrypoint.sh" ... 0.0.0.0:3306->3306/tcp mymysql

inspect

docker inspect: 獲取容器 / 映象的元資料。

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS 說明:

  • -f: 指定返回值的模板檔案。
  • -s: 顯示總的檔案大小。
  • --type: 為指定型別返回 JSON。

top

docker top: 檢視容器中執行的程序資訊,支援 ps 命令引數。

只有在執行中的容器才能使用這個命令

docker top [OPTIONS] CONTAINER [ps OPTIONS]

容器執行時不一定有 /bin/bash 終端來互動執行 top 命令,而且容器還不一定有 top 命令,可以使用 docker top 來實現檢視 container 中正在執行的程序。

attach

docker attach: 連線到正在執行中的容器。

events

docker events: 從伺服器獲取實時事件

docker events [OPTIONS]

OPTIONS 說明:

  • -f:根據條件過濾事件;
  • --since:從指定的時間戳後顯示所有事件;
  • --until:流水時間顯示到指定的時間為止;

顯示 docker 映象為 python 2016 年 7 月 1 日後的相關事件。

docker events -f "image"="python" --since="1467302400" 

1467302400代表時間戳的意思
線上時間戳轉換工具:https://tool.lu/timestamp/

logs

docker logs: 獲取容器的日誌

docker logs [OPTIONS] CONTAINER

OPTIONS 說明:

  • **-f : ** 跟蹤日誌輸出
  • --since :顯示某個開始時間的所有日誌
  • **-t : ** 顯示時間戳
  • --tail :僅列出最新 N 條容器日誌

wait

docker wait :阻塞執行直到容器停止,然後打印出它的退出程式碼。

docker wait [OPTIONS] CONTAINER [CONTAINER...]

export

docker export: 將檔案系統作為一個 tar 歸檔檔案匯出到 STDOUT。

docker export [OPTIONS] CONTAINER

OPTIONS 說明:

  • -o :將輸入內容寫到檔案。

將 id 為 a404c6c174a2 的容器按日期儲存為 tar 檔案。

docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2

port

docker port: 列出指定的容器的埠對映,或者查詢將 PRIVATE_PORT NAT 到面向公眾的埠。

docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]

容器 rootfs 命令

commit

docker commit: 從容器建立一個新的映象。

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS 說明:

  • -a :提交的映象作者;
  • -c :使用 Dockerfile 指令來建立映象;
  • -m :提交時的說明文字;
  • -p :在 commit 時,將容器暫停。

將容器 d1891e47245f 儲存為新的映象,並新增提交人資訊和說明資訊。

docker commit -a "Leong" -m "python opencv" d1891e47245f  leong/python_opencv:v1 

cp

docker cp :用於容器與主機之間的資料拷貝。

  1. docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
  2. docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

OPTIONS 說明:

  • -L :保持源目標中的連結
  1. docker cp /www/runoob 96f7f14e99ab:/www/ # 將主機 /www/runoob 目錄拷貝到容器 96f7f14e99ab 的 /www 目錄下。
  2. docker cp /www/runoob 96f7f14e99ab:/www # 將主機 /www/runoob 目錄拷貝到容器 96f7f14e99ab 中,目錄重新命名為 www。
  3. docker cp 96f7f14e99ab:/www /tmp/ # 將容器 96f7f14e99ab 的 /www 目錄拷貝到主機的 /tmp 目錄中。

diff

**docker diff : ** 檢查容器裡檔案結構的更改。

docker diff [OPTIONS] CONTAINER

檢視容器 id 字首為 d189 的容器的檔案結構更改。

docker diff d189

最前面的一個字元含義如下:

  1. A- Add
  2. D- Delete
  3. C- Change

映象倉庫

login/logout

docker login :登陸到一個 Docker 映象倉庫,如果未指定映象倉庫地址,預設為官方倉庫 Docker Hubdocker logout :登出一個 Docker 映象倉庫,如果未指定映象倉庫地址,預設為官方倉庫 Docker Hub

  1. docker login [OPTIONS] [SERVER]
  2. docker logout [OPTIONS] [SERVER]

OPTIONS 說明:

  • -u :登陸的使用者名稱
  • -p :登陸的密碼

pull

**docker pull : ** 從映象倉庫中拉取或者更新指定映象

  1. docker pull [OPTIONS] NAME[:TAG|@DIGEST]

OPTIONS 說明:

  • -a :拉取所有 tagged 映象
  • --disable-content-trust :忽略映象的校驗,預設開啟

從 Docker Hub 下載 REPOSITORY 為 java 的所有映象。

  1. docker pull -a java

push

docker push: 將本地的映象上傳到映象倉庫,要先登陸到映象倉庫

  1. docker push [OPTIONS] NAME[:TAG]

OPTIONS 說明:

  • --disable-content-trust: 忽略映象的校驗,預設開啟

上傳本地映象 myapache:v1 到映象倉庫中。

  1. docker push myapache:v1

search

docker search: 從 Docker Hub 查詢映象

  1. docker search [OPTIONS] TERM

OPTIONS 說明:

  • --automated只列出 automated build 型別的映象;
  • --no-trunc顯示完整的映象描述;
  • -s列出收藏數不小於指定值的映象。

從 Docker Hub 查詢所有映象名包含 anaconda,並且收藏數大於 10 的映象

  1. docker search -s 10 anaconda
  • NAME映象倉庫源的名稱
  • DESCRIPTION映象的描述
  • OFFICIAL是否 docker 官方釋出
  • stars類似 Github 裡面的 star,表示點贊、喜歡的意思。
  • AUTOMATED自動構建。

本地映象管理

images

  1. docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS 說明:

  • -a :列出本地所有的映象(含中間映像層,預設情況下,過濾掉中間映像層);
  • --digests :顯示映象的摘要資訊;
  • -f :顯示滿足條件的映象;
  • --format :指定返回值的模板檔案;
  • --no-trunc :顯示完整的映象資訊;
  • -q :只顯示映象 ID。

rmi/prune

docker rmi: 刪除本地一個或多少映象。

  1. docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS 說明:

  • -f :強制刪除;
  • --no-prune :不移除該映象的過程映象,預設移除;

prune 命令用來刪除不再使用的 docker 物件。
刪除所有未被 tag 標記和未被容器使用的映象:

  1. docker image prune
  2. # 輸出
  3. WARNING! This will remove all dangling images.
  4. Are you sure you want to continue? [y/N] y

刪除所有未被容器使用的映象:

  1. docker image prune -a

刪除所有停止執行的容器:

  1. docker container prune

刪除所有未被掛載的卷:

  1. docker volume prune

刪除所有網路:

  1. docker network prune

刪除 docker 所有資源:

  1. docker system prune

tag

**docker tag : ** 標記本地映象,將其歸入某一倉庫。

  1. docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

將映象 ubuntu:15.10 標記為 runoob/ubuntu:v3 映象。

  1. docker tag ubuntu:15.10 runoob/ubuntu:v3
  2. docker images runoob/ubuntu:v3
  3. # 輸出
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. runoob/ubuntu v3 4e3b13c8a266 3 months ago 136.3 MB

build

**docker build ** 命令用於使用 Dockerfile 建立映象。

  1. docker build [OPTIONS] PATH | URL | -

OPTIONS 說明:

  • --build-arg=[] :設定映象建立時的變數;
  • --cpu-shares :設定 cpu 使用權重;
  • --cpu-period :限制 CPU CFS 週期;
  • --cpu-quota :限制 CPU CFS 配額;
  • --cpuset-cpus :指定使用的 CPU id;
  • --cpuset-mems :指定使用的記憶體 id;
  • --disable-content-trust :忽略校驗,預設開啟;
  • -f :指定要使用的 Dockerfile 路徑;
  • --force-rm :設定映象過程中刪除中間容器;
  • --isolation :使用容器隔離技術;
  • --label=[] :設定映象使用的元資料;
  • -m :設定記憶體最大值;
  • --memory-swap :設定 Swap 的最大值為記憶體 + swap,"-1" 表示不限 swap;
  • --no-cache :建立映象的過程不使用快取;
  • --pull :嘗試去更新映象的新版本;
  • --quiet, -q :安靜模式,成功後只輸出鏡像 ID;
  • --rm :設定映象成功後刪除中間容器;
  • --shm-size :設定 /dev/shm 的大小,預設值是 64M;
  • --ulimit:Ulimit 配置。
  • --tag, -t:映象的名字及標籤,通常 name:tag 或者 name 格式;可以在一次構建中為一個映象設定多個標籤。
  • --network:預設 default。在構建期間設定 RUN 指令的網路模式

使用當前目錄的 Dockerfile 建立映象,標籤為 runoob/ubuntu:v1。

docker build -t runoob/ubuntu:v1 .

使用 URL http://github.com/creack/docker-firefox 的 Dockerfile 建立映象。

  1. docker build github.com/creack/docker-firefox

也可以通過 -f Dockerfile 檔案的位置:

  1. docker build -f /path/to/a/Dockerfile .

在 Docker 守護程序執行 Dockerfile 中的指令前,首先會對 Dockerfile 進行語法檢查,有語法錯誤時會返回:

  1. docker build -t test/myapp .
  2. # 輸出
  3. Sending build context to Docker daemon 2.048 kB
  4. Error response from daemon: Unknown instruction: RUNCMD

history

docker history: 檢視指定映象的建立歷史。

  1. docker history [OPTIONS] IMAGE

OPTIONS 說明:

  • -H :以可讀的格式列印映象大小和日期,預設為 true;
  • --no-trunc :顯示完整的提交記錄;
  • -q :僅列出提交記錄 ID。

檢視本地映象 runoob/ubuntu:v3 的建立歷史。

  1. docker history runoob/ubuntu:v3
  2. # 輸出
  3. IMAGE CREATED CREATED BY SIZE COMMENT
  4. 4e3b13c8a266 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
  5. <missing> 3 months ago /bin/sh -c sed -i 's/^#s*(deb.*universe)$/ 1.863 kB
  6. <missing> 3 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 701 B
  7. <missing> 3 months ago /bin/sh -c #(nop) ADD file:43cb048516c6b80f22 136.3 MB

save

docker save: 將指定映象儲存成 tar 歸檔檔案。

  1. docker save [OPTIONS] IMAGE [IMAGE...]

OPTIONS 說明:

  • -o :輸出到的檔案。

將映象 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文件

  1. docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
  2. ll my_ubuntu_v3.tar
  3. # 輸出
  4. -rw------- 1 runoob runoob 142102016 Jul 11 01:37 my_ubuntu_v3.tar

load

docker load: 匯入使用 docker save 命令匯出的映象。

  1. docker load [OPTIONS]

OPTIONS 說明:

  • --input , -i: 指定匯入的檔案,代替 STDIN。
  • --quiet , -q: 精簡輸出資訊。

匯入映象:

  1. docker image ls
  2. # 輸出
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. docker load < busybox.tar.gz
  5. # 輸出
  6. Loaded image: busybox:latest
  7. docker images
  8. # 輸出
  9. REPOSITORY TAG IMAGE ID CREATED SIZE
  10. busybox latest 769b9341d937 7 weeks ago 2.489 MB
  11. docker load --input fedora.tar
  12. # 輸出
  13. Loaded image: fedora:rawhide
  14. Loaded image: fedora:20
  15. docker images
  16. # 輸出
  17. REPOSITORY TAG IMAGE ID CREATED SIZE
  18. busybox latest 769b9341d937 7 weeks ago 2.489 MB
  19. fedora rawhide 0d20aec6529d 7 weeks ago 387 MB
  20. fedora 20 58394af37342 7 weeks ago 385.5 MB
  21. fedora heisenbug 58394af37342 7 weeks ago 385.5 MB
  22. fedora latest 58394af37342 7 weeks ago 385.5 MB

import

docker import :從歸檔檔案中建立映象。

  1. docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

OPTIONS 說明:

  • -c :應用 docker 指令建立映象;
  • -m :提交時的說明文字;

從映象歸檔檔案 my_ubuntu_v3.tar 建立映象,命名為 runoob/ubuntu:v4

  1. docker import my_ubuntu_v3.tar runoob/ubuntu:v4
  2. # 輸出
  3. sha256:63ce4a6d6bc3fabb95dbd6c561404a309b7bdfc4e21c1d59fe9fe4299cbfea39
  4. docker images runoob/ubuntu:v4
  5. # 輸出
  6. REPOSITORY TAG IMAGE ID CREATED SIZE
  7. runoob/ubuntu v4 63ce4a6d6bc3 20 seconds ago 142.1 MB
  8. docker images ls # 列出本地映象
  • 啟動容器,下面兩句的效果是一樣的

-d 後臺執行
-i 互動
-t 終端

  1. docker run -d -i -t ubuntu:18.04 /bin/bash
  2. docker run -dit ubuntu:18.04 /bin/bash
  • 進入後臺容器
  1. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  • 刪除 / 清除容器
  1. docker container rm [OPTIONS] CONTAINER [CONTAINER...] # 刪除容器
  2. docker container prune # 清理掉停止的容器
  3. docker ps -a # 檢視所有的容器
  4. docker ps # 檢視執行著的容器
  5. docker container ls -a # 檢視終止狀態的容器
  6. docker container start <容器 ID>/<NAMES> # 啟動一個容器
  7. docker container stop <容器 ID>/<NAMES> # 停止一個執行著的容器
  8. docker search python # 從 Docker Hub 查詢 python 映象
  9. docker pull python # 從映象倉庫中拉取或者更新指定映象
  10. docker container prune # 清理掉停止的容器
  11. docker rmi <容器 ID> # 刪除本地容器
  12. docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] # 標記本地映象,將其歸入某一倉庫

docker 命令的幾對關係

save 和 export

save 儲存的是映象,export 儲存的是容器

load 和 import

load 載入映象包,import 載入容器包,但兩者都會恢復為映象

load 不能對載入的進行進行命名,import 可以

---------------------------------------------------------------------

原文地址:https://blog.csdn.net/weixin_42498981/article/details/112110445