操作容器的命令 鏡像中的容器啟動之後可以在 docker 中操作和查看容器的信息 l docker ps 查看運行的容器,如果想查看全部加上參數-a 即可 l docker create 完整的鏡像名字# 創建容器但是不啟動它 l docker run 完整的鏡像名字# 創建並啟動容器 l dock ...
操作容器的命令
鏡像中的容器啟動之後可以在 docker 中操作和查看容器的信息
l docker ps 查看運行的容器,如果想查看全部加上參數-a 即可
l docker create 完整的鏡像名字# 創建容器但是不啟動它
l docker run 完整的鏡像名字# 創建並啟動容器
l docker stop CONTAINER ID# 停止容器運行
l docker start CONTAINER ID# 啟動停止狀態的容器
l docker restart CONTAINER ID# 重啟容器
l docker rm CONTAINER ID# 刪除容器
獲取容器相關信息
l docker ps # 顯示狀態為運行(Up)的容器
l docker ps -a # 顯示所有容器,包括運行中(Up)的和退出的(Exited)
l docker inspect # 深入容器內部獲取容器所有信息
l docker logs # 查看容器的日誌(stdout/stderr)
l docker events # 得到 docker 伺服器的實時的事件
l docker port # 顯示容器的埠映射
l docker top # 顯示容器的進程信息
l docker diff # 顯示容器文件系統的前後變化
導出容器
l docker cp # 從容器里向外拷貝文件或目錄
l docker export # 將容器整個文件系統導出為一個 tar 包,不帶 layers、tag 等信息
鏡像操作命令
l docker images # 顯示本地所有的鏡像列表
l docker import # 從一個 tar 包創建一個鏡像,往往和 export 結合使用
l docker build # 使用 Dockerfile 創建鏡像(推薦)
l docker commit # 從容器創建鏡像
l docker rmi # 刪除一個鏡像
l docker load # 從一個 tar 包創建一個鏡像,和 save 配合使用
l docker save # 將一個鏡像保存為一個 tar 包,帶 layers 和 tag 信息
l docker history # 顯示生成一個鏡像的歷史命令
l docker tag # 為鏡像起一個別名
鏡像倉庫命令
l docker login # 登錄到一個 registry
l docker search # 從 registry 倉庫搜索鏡像
l docker pull # 從倉庫下載鏡像到本地
l docker push # 將一個鏡像 push 到 registry 倉庫中
Dockerfile 命令
(1) FROM(指定基礎 image)
構建指令,必須指定且需要在 Dockerfile 其他指令的前面。後續的指令都依賴於該指令指定的 image。FROM 指令指定的基礎 image 可以是官方遠程倉庫中的,也可以位於本地倉庫。
該指令有兩種格式: FROM <image>
指定基礎 image 為該 image 的最後修改的版本。或者: FROM <image>:<tag>
指定基礎 image 為該 image 的一個 tag 版本。
(2) MAINTAINER(用來指定鏡像創建者信息)
構建指令,用於將 image 的製作者相關的信息寫入到 image 中。當我們對該 image 執行docker inspect 命令時,輸出中有相應的欄位記錄該信息。
格式:
MAINTAINER <name>
(3) RUN(安裝軟體用)
構建指令,RUN 可以運行任何被基礎 image 支持的命令。如基礎 image 選擇了 ubuntu, 那麼軟體管理部分只能使用 ubuntu 的命令。
該指令有兩種格式:
RUN <command> (the command is run in a shell - `/bin/sh -c`) RUN ["executable", "param1", "param2" ... ] (exec form)
(4) CMD(設置 container 啟動時執行的操作)
設置指令,用於 container 啟動時指定的操作。該操作可以是執行自定義腳本,也可以是執行系統命令。該指令只能在文件中存在一次,如果有多個,則只執行最後一條。
該指令有三種格式:
CMD ["executable","param1","param2"] (like an exec, this is the preferred form) CMD command param1 param2 (as a shell)
當 Dockerfile 指定了 ENTRYPOINT,那麼使用下麵的格式:
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
ENTRYPOINT 指定的是一個可執行的腳本或者程式的路徑,該指定的腳本或者程式將會以
param1 和 param2 作為參數執行。所以如果 CMD 指令使用上面的形式,那麼 Dockerfile 中必須要有配套的 ENTRYPOINT。
(5) ENTRYPOINT(設置 container 啟動時執行的操作)
設置指令,指定容器啟動時執行的命令,可以多次設置,但是只有最後一個有效。 兩種格式:
l ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred fo
rm)
l ENTRYPOINT command param1 param2 (as a shell)
該指令的使用分為兩種情況,一種是獨自使用,另一種和 CMD 指令配合使用。
當獨自使用時,如果你還使用了 CMD 命令且 CMD 是一個完整的可執行的命令,那麼 CMD 指令和 ENTRYPOINT 會互相覆蓋只有最後一個 CMD 或者 ENTRYPOINT 有效。
# CMD 指令將不會被執行,只有 ENTRYPOINT 指令被執行CMD echo “Hello, World!”
ENTRYPOINT ls -l
另一種用法和 CMD 指令配合使用來指定 ENTRYPOINT 的預設參數,這時 CMD 指令不是一個完整的可執行命令,僅僅是參數部分;ENTRYPOINT 指令只能使用 JSON 方式指定執行命令,而不能指定參數。
FROM ubuntu CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]
(6) USER(設置 container 容器的用戶)
設置指令,設置啟動容器的用戶,預設是 root 用戶。
# 指定 memcached 的運行用戶ENTRYPOINT ["memcached"]
USER daemon 或
ENTRYPOINT ["memcached", "-u", "daemon"]
(7) EXPOSE(指定容器需要映射到宿主機器的埠)
設置指令,該指令會將容器中的埠映射成宿主機器中的某個埠。當你需要訪問容器的時候,可以不是用容器的 IP 地址而是使用宿主機器的 IP 地址和映射後的埠。要完成整個操作需要兩個步驟,首先在 Dockerfile 使用 EXPOSE 設置需要映射的容器埠,然後在運行容器的時候指定-p 選項加上 EXPOSE 設置的埠,這樣 EXPOSE 設置的埠號會被隨機映射成宿主機器中的一個埠號。也可以指定需要映射到宿主機器的那個埠,這時要確保宿主機器上的埠號沒有被使用。EXPOSE 指令可以一次設置多個埠號,相應的運行容器的時候,可以配套的多次使用-p 選項。
格式:
EXPOSE <port> [<port>...]
# 映射一個埠EXPOSE port1
# 相應的運行容器使用的命令docker run -p port1 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
埠映射是 docker 比較重要的一個功能,原因在於我們每次運行容器的時候容器的 IP 地址不能指定而是在橋接網卡的地址範圍內隨機生成的。宿主機器的 IP 地址是固定的,我們可以將容器的埠的映射到宿主機器上的一個埠,免去每次訪問容器中的某個服務時都要查看容器的 IP 的地址。對於一個運行的容器,可以使用 docker port 加上容器中需要映射的埠和容器的 ID 來查看該埠號在宿主機器上的映射埠。
(8) ENV(用於設置環境變數)
構建指令,在 image 中設置一個環境變數。格式:
ENV <key> <value>
設置了後,後續的 RUN 命令都可以使用,container 啟動後,可以通過 docker inspect 查看這個環境變數,也可以通過在 docker run --env key=value 時設置或修改環境變數。假如你安裝了 JAVA 程式,需要設置 JAVA_HOME,那麼可以在 Dockerfile 中這樣寫: ENV JAVA_HOME /path/to/java/dirent
(9) ADD(從 src 複製文件到 container 的 dest 路徑)
構建指令,所有拷貝到 container 中的文件和文件夾許可權為 0755,uid 和 gid 為 0;如果是一個目錄,那麼會將該目錄下的所有文件添加到 container 中,不包括目錄;如果文件是可識別的壓縮格式,則 docker 會幫忙解壓縮(註意壓縮格式);如果<src>是文件且<dest> 中不使用斜杠結束,則會將<dest>視為文件,<src>的內容會寫入<dest>;如果<src>是 文件且<dest>中使用斜杠結束,則會<src>文件拷貝到<dest>目錄下。
ADD <src> <dest>
<src> 是相對被構建的源目錄的相對路徑,可以是文件或目錄的路徑,也可以是一個遠程的文件 url;
<dest> 是 container 中的絕對路徑
(10) VOLUME(指定掛載點))
設置指令,使容器中的一個目錄具有持久化存儲數據的功能,該目錄可以被容器本身使用, 也可以共用給其他容器使用。我們知道容器使用的是 AUFS,這種文件系統不能持久化數據, 當容器關閉後,所有的更改都會丟失。當容器中的應用有持久化數據的需求時可以在
Dockerfile 中使用該指令。格式:
VOLUME ["<mountpoint>"] FROM base
VOLUME ["/tmp/data"]
運行通過該 Dockerfile 生成 image 的容器,/tmp/data 目錄中的數據在容器關閉後,裡面的數據還存在。例如另一個容器也有持久化數據的需求, 且想使用上面容器共用的
/tmp/data 目錄,那麼可以運行下麵的命令啟動一個容器: docker run -t -i -rm -volumes-from container1 image2 bash
container1 為第一個容器的 ID,image2 為第二個容器運行 image 的名字。
(11) WORKDIR(切換目錄)
設置指令,可以多次切換(相當於 cd 命令),對 RUN,CMD,ENTRYPOINT 生效。
WORKDIR /path/to/workdir
# 在 /p1/p2 下執行 vim a.txt
WORKDIR /p1 WORKDIR p2 RUN vim a.txt
(12) ONBUILD(在子鏡像中執行) ONBUILD <Dockerfile 關鍵字>
ONBUILD 指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行。