Docker常用的操作命令

先說下Docker,Docker是一個開源的容器引擎,它有助於更快地交付應用。Docker可將應用程序和基礎設施層隔離,並且能將基礎設施當作程序一樣進行管理。使用Docker可更快地打包、測試以及部署應用程序,並可以縮短從編寫到部署運行代碼的週期。

Docker包含的組件:

  • Docker daemon:Docker守護進程,是一個運行在宿主機的後臺進程,可通過Docker客戶端與之通信。
  • Client:Docker客戶端時Docker的用戶界面,它可以接受用戶命令和配置標識,並與Docker daemon通信。
  • Images:Docker鏡像時一個只讀模板,它包含創建Docker容器的說明。Docker鏡像可以運行Docker鏡像中的程序。
  • Container:容器時鏡像可運行的實例。可通過Docker API或者CLI命令來啓停止、移動、刪除容器。
  • Registry:Docker Registry是一個集中存儲與分發鏡像的服務。構建完Docker鏡像後,就可再當前宿主機上運行。但如果想要在其他機器上運行這個鏡像,就需要手動複製,Docker Registry可用來避免手動複製。

 

國內訪問Docker Hub的速度很不穩定,有時甚至出現連接不上的情況。可使用阿里雲加速器解決這個問題。網上記錄win10版本及以上推薦安裝Docker For Windows版, 並確保開啓Hyper-V(可在控制面板查看並更改開啓狀態),安裝後,在setting中替換文字即可配置鏡像加速器。

 

Docker鏡像常用命令:

  • 搜索鏡像:docker search(例如:docker search java)。
  • 下載鏡像:docker pull(例如:docker pull java)。
  • 列出鏡像:docker images(直接輸入執行即可查看當前本地鏡像列表)
  • 刪除本地鏡像:docker rmi(例如:docker rmi java),其中,加 -f 表示強制刪除,例如 :docker rmi -f java。
  • 新建並啓動一個容器:docker run 。該命令時最常用的命令。它有很多選項,常用的如下:
    • -d 選項:表示後臺運行;
    • -P 選項:隨機端口映射;
    • -p 選項:指定端口映射,有以下四種格式:
      • ip : hostPort : containerPort
      • ip :: containerPort
      • hostPort : containerPort
      • containerPort
    • --network 選項:指定網絡模式,該選項有以下可選參數:
      • --network=bridge:默認選項,表示連接到默認的網橋
      • --network=host:容器使用宿主機的網絡
      • --network=container:NAME_or_ID:告訴Docker讓新建的容器使用已有容器的網絡配置。
      • --network=none:不配置該容器的網絡,用戶可自定義網絡配置

          示例1:

                 docker run java /bin/echo 'Hello World',終端最終會打印Hello World字樣,這個在本地執行/bin/echo ‘Hello World’一樣。

          示例2:

                  docker run -d -p 91:80 nginx,這樣就能啓動一個Nignx容器,併爲其指定了端口號,在瀏覽器輸入:http://localhost:91/,就會看到nginx的歡迎頁。

          docker run命令創建容器時,會先檢查本地是否存在指定鏡像,如果本地不存在該名稱的鏡像,Docker就會自動下載鏡像並啓動一個Docker容器。

  • 列出容器:docker ps(直接輸入執行即可查看當前運行的容器),加-a 可查看所有容器,例如: docker ps -a。
  • 停止容器:docker stop,可以通過容器ID或容器名稱來停止,例如:docker stop edf4b70fc36e 或 docker stop admiring_lamarr。
  • 強制停止容器:docker kill,發送SIGKILL信號來強制停止容器,例如:docker kill edf4b70fc36e。
  • 啓動已停止容器:docker start,例如: docker start edf4b70fc36e。
  • 重啓容器:docker restart,例如:docker restart edf4b70fc36e。
  • 進入容器:docker attach,例如:docker attach edf4b70fc36e。但在win10上操作後進不去。。嘗試了另一種辦法,使用nsenter,但由於其包含在util-linux 2.23,所以還是未成功,但在此記錄一個nsenter完整的例子:
[root@localhost ~]# docker ps -- 取得容器ID

[root@localhost ~]# docker inspect --format "{{.State.Pid}}" edf4b70fc36e -- 獲取PID,假設獲取的PID爲 3361

[root@localhost ~]# nsenter --target 3361 --mount --uts --ipc --net --pid

          上述的命令也可封裝成一個Shell,從而簡化進入容器的流程。

  • 刪除容器:docker rm,例如:docker rm edf4b70fc36e。這種辦法只能刪除已停止的容器,如果需要刪除正在運行的容器,需要使用-f參數,例如:docker rm -f edf4b70fc36e。

 

使用Dockerfile構建Docker鏡像,Dockerfile是一個文本文件,其中包括了若干條指令,指令描述了構建鏡像的細節。更改nginx首頁的示例如下:

  1. 新建目錄,在目錄下新建二進制文件Dockerfile,相關指令如下:
    1. cd desktop --回到桌面
    2. md testdocker --創建文件夾
    3. cd testdocker --來到剛創建好的文件夾目錄下
    4. type nul>Dockerfile --創建二進制文件並命名
    5. 在文件內寫入下列內容:
    FROM nginx --指定基礎鏡像爲nginx 
    MAINTAINER Dou <[email protected]> --指定鏡像的創建者和聯繫方式 
    RUN echo '<h1>Hello World</h1>' > /usr/share/nginx/html/index.html --容器內部執行的命令
  2. 在Dockerfile所在路徑下執行 " docker build -t nginx:my . " 構建鏡像。命令最後的點要注意,它用於路徑參數傳遞,表示當前路徑。
  3. 執行" docker run -d -p 92:80 nginx:my " 啓動Docker容器。
  4. 訪問本地:http://localhost:92/ ,即可看到修改好的頁面。

 

Dockerfile的命令一般的格式爲:指令名稱 參數。常用的指令命令如下:

  1. ADD複製文件,從src目錄複製到容器的dest。其中src可以是Dockerfile所在目錄的相對路徑,也可以是一個URL,還可以是一個壓縮包,其格式爲:
    1. ADD<src>...</dest>
    2. ADD ["<src>",..."<dest>"]
    3. src必須在構建的上下文內,docker build命令首先會將上下文路徑和其子目錄發送到docker daemon;
    4. 如果src是一個URL,同時dest不以斜槓結尾,dest將會被視爲文件,src對應內容文件將會被下載到dest;
    5. 如果src是一個URL,同時dest以斜槓結尾,dest將被視爲目錄,src對應內容將會被下載到dest目錄;
    6. 如果src是一個目錄,那麼整個目錄下的內容將會被複制,包括文件系統元數據。
    7. 如果文件是可識別的壓縮包格式,則docker會自動解壓。
  2. ARG設置構建參數,ARG設置的是構建時的環境變量,在容器運行時是不會存在這些變量的。
  3. CMD容器啓動命令,每個Dockerfile只有一個CMD命令,如果制定了多個CMD命令,那麼只有最後一條會被執行,如果啓動容器時制定了運行的命令,則會覆蓋掉CMD指定的命令,支持下列三種格式:
    1. CMD ["executable","param1","param2"](推薦使用)
    2. CMD ["param1","param2"](爲ENTRYPOINT指令提供預設參數)
    3. CMD command param1 param2(在shell中執行)
  4. COPY複製文件,複製本地端的src到容器的dest。COPY指令和ADD指令類似,COPY不支持URL和壓縮包,其格式如下:
    1. COPY <src>...<dest>
    2. COPY ["<src>",..."<dest>"]
  5. ENTRYPOINT入口點和CMD指令的目的一樣,都是指定Docker容器啓動時執行的命令,可多次設置,但只有最後一個有效,其格式如下:
    1. ENTRYPOINT ["executable","param1","pparam2"]
    2. ENTRYPOINT command param1 param2
  6. ENV設置環境變量,格式如下:
    1. ENV <key> <value>
    2. ENV <key>=<value> ...
  7. EXPOSE聲明暴漏的端口,用於聲明在運行時容器提供服務的端口,格式爲:EXPOSE <port> [<port>...]。這是一個聲明,運行時不會因爲改聲明就打開相應端口,該指令的作用主要是幫助鏡像使用着理解該鏡像服務的守護端口;其次是當運行時使用隨機映射時,會自動映射EXPOSE的端口,其示例如下:
    # 聲明暴漏一個端口示例 
    EXPOSE port1 
    # 相應的運行容器使用的命令
    docker run -p port1 image 
    # 也可使用-P選項啓動 
    docker run -P image 
    # 聲明暴漏多個端口示例 
    EXPOSE port1 port2 port3 
    # 相應的運行容器使用的命令
     docker run -p port1 -p port2 -p port3 image 
    # 也可指定需要映射到宿主機上的端口號 
    docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image

     

  8. FROM指定基礎鏡像,有些像java中的extends關鍵字,FROM指令必須指定且需要卸載其他指令前。FROM指令後的所有指令都依賴於該指令所指定的鏡像,支持的格式如下:
    1. FROM <image>
    2. FROM <image>:<tag>
    3. FROM <image>@<digest>
  9. LABEL爲鏡像添加元數據,格式爲:LABEL <key>=<value> <key>=<value> <key>=<value>...。可使用“"”和“\”轉換命令行。
  10. MAINTAINER指定維護者的信息,用於爲Dockerfile署名,格式爲:MAINTAINER <name>。
  11. RUN執行命令的兩種格式如下:
    1. RUN <command>
    2. RUN ["executable","param1","param2"]
  12. USER設置用戶,該指令用於設置啓動鏡像時的用戶或者UID,寫在該指令後的RUN、CMD以及ENTRYPOINT指令都將使用該用戶執行命令,示例:USER daemon。
  13. VOLUME指定掛載點,該指令是同其中的一個目錄具有持久化存儲的功能,該目錄可被容器本身使用,也可共享給其他容器,其格式爲:VOLUME ["/data"]。
  14. WORKDIR指定工作目錄,切換目錄命令,類似於cd命令,寫在該指令後的RUN,CMD以及ENTRYPOINT指令都將該目錄作爲當前目錄。並執行相應的命令。
  15. 其他Dockerfile還有一些其他的指令,由於不常用,在此略過。

 

 使用Dockerfile構建鏡像具體步驟如下:

  1. 準保好相應jar包,使用maven打包項目:mvn clean package;
  2. jar包所在目錄,創建名爲Dockerfile的文件;
  3. 編寫Dockerfile文件;
  4. 使用docker build命令構建鏡像;
  5. 啓動鏡像並訪問查看結果。

 

總結:

        手動實踐後發現對於自己來說Windows上操作Docker還是有諸多不變,建議使用Linux版,結合習慣,絲滑順暢。

        本文參考於周立《Spring Cloud與Docker微服務架構實戰》,是讀後的記錄筆記。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章