本篇內容介紹了“Docker容器的模板怎么創建”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Docker 是一款開源容器引擎,主要解決了跨環境不一致的,多環境下安裝應用所需環境慢等問題。舉幾個個例子實際項目中一般有三種環境開發,測試,正式,會存在這些問題測試環境能正常到了正式環境就有問題,通宵好幾天還不能解決,每次升級上線都難產。還有就是上線后發現單服務抗不住并發,要大量部署相同環境,也需要花費很多時間。Docker的誕生讓徹底把這些問題解決了,讓生產工作更高效。
學習Docker需要了解幾個概念鏡像,容器,倉庫,數據卷,鏡像構建,容器編排集群等等。
docker基本命令
docker version 查看docker版本
docker info 查看docker詳細信息
docker --help 查看docker命令
1 鏡像創建容器的模板,底層使用了聯合文件系統機制,當從倉庫拉取鏡像時Docker引擎檢驗到需要模塊就不會再去下載,并在此基礎上再下載安裝其他層的依賴模塊,這種機制也讓鏡像能快速下載。常用命令拉取,查找,刪除,提交。
1.1 docker images 來列出本地主機上的鏡像
docker images -a列出本地所有的鏡像
docker images -p只顯示鏡像ID
docker images --digests顯示鏡像的摘要信息
docker images --no-trunc顯示完整的鏡像信息
1.2 docker search TERM
docker search tomcat從Docker Hub上查找tomcat鏡像
1.3 docker pull [OPTIONS] NAME[:TAG] 可以從某個人的公共倉庫(包括自己是私人倉庫)拉取,如果沒有網絡,或者從其他私服獲取鏡像。
docker pull tomcat從Docker Hub上下載tomcat鏡像。等價于:docker pull tomcat:latest
1.4 docker commit -m "提交的描述信息" -a "作者" 容器ID 要創建的目標鏡像名稱:[標簽名]提交容器使之成為一個新的鏡像。
如:docker commit -m "新的tomcat" -a "lizq" f9e29e8455a5 mytomcat:1.2
1.5 docker rmi <image_id/image_name ...>
docker rmi hello-world 從Docker中刪除hello-world鏡像
docker rmi -f hello-world 從Docker中強制刪除hello-world鏡像
docker rmi -f hello-world nginx 從Docker中強制刪除hello-world鏡像和nginx鏡像
docker rmi -f $(docker images -aq) 通過docker images -aq查詢到的鏡像ID來刪除所有鏡像
2 容器動態的鏡像,通過鏡像創建的容器,一個鏡像可以生成多個容器。常用命令創建,刪除,查找,停止。
2.1 docker run [OPTIONS] IMAGE根據鏡像新建并啟動容器。IMAGE是鏡像ID或鏡像名稱
OPTIONS說明:
?--name=“容器新名字”:為容器指定一個名稱
?-d:后臺運行容器,并返回容器ID,也即啟動守護式容器
?-i:以交互模式運行容器,通常與-t同時使用
?-t:為容器重新分配一個偽輸入終端,通常與-i同時使用
?-P:隨機端口映射
?-p:指定端口映射,有以下四種格式:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
2.2 docker ps列出當前所有正在運行的容器
docker ps -a列出所有的容器
docker ps -l列出最近創建的容器
docker ps -n 3列出最近創建的3個容器
docker ps -q只顯示容器ID
docker ps --no-trunc顯示當前所有正在運行的容器完整信息
exit退出并停止容器
Ctrl+p+q只退出容器,不停止容器
2.3 docker start 啟動一個已有的容器
2.4 docker restart 容器ID或容器名稱重新啟動容器
2.5 docker stop 優雅停止正在運行的容器 docker stop $(docker ps -aq) 批量停止
2.6 docker kill 立即停止容器中的主要進程
2.7 docker rm <container_id/contaner_name>
docker rm 容器ID或容器名稱刪除容器
docker rm -f 容器ID或容器名稱強制刪除容器
docker rm $(docker ps -a -q) 刪除多個容器
docker logs -f -t --since --tail 容器ID或容器名稱查看容器日志
如:docker logs -f -t --since=”2018-09-10” --tail=10 f9e29e8455a5
?-f : 查看實時日志
?-t : 查看日志產生的日期
?--since : 此參數指定了輸出日志開始日期,即只輸出指定日期之后的日志
?--tail=10 : 查看最后的10條日志
2.8 docker top 容器ID或容器名稱查看容器內運行的進程
2.9 docker inspect 用于查看鏡像和容器的詳細信息,默認會列出全部信息,可以通過--format參數來指定輸出的模板格式,以便輸出特定信息
2.10 docker attach 可以連接到正在運行的容器,觀察容器的運行狀況,或與容器的主進程進行交互
2.11 docker exec 容器ID進到容器內
2.12 docker cp 容器ID:容器內的文件路徑 宿主機路徑從容器內拷貝文件到宿主機.
3 倉庫分為公有倉庫和私有倉庫,倉庫存放鏡像的服務器。
數據卷即宿主機與容器之間存放數據目錄的映射,通過-v 宿主機目錄:虛擬機目錄 。作用是數據持久化,不設置會出現刪除容器,重要數據也跟著刪除。另一個作用是容器間數據同步。
4 鏡像構建通過Docker語法關鍵字創建dockerFile,再通過命令生成鏡像。其實就是通過命令文件生成鏡像。
4.1 創建數據卷
dockerrun 命令的時候,使用-v參數標記可以在容器內創建一個數據卷,多次使用-v標記可 以創建多個數據卷
docker run -dp --name testVolume -v /testVolume ubuntu:14.04
使用-v標記也可以指定掛載一個本地的已有目錄到容器中去作為數據卷
docker run -dp --name testVolume -v /src/webapp:/opt/testVolume ubuntu:1404
docker掛載數據卷的默認權限是讀寫,ro指定只讀:
docker run -dp --name web -v /src/webapp:/opt/webapp:ro ubuntu:14.04
4.2 數據卷容器
需要在容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器,數據卷容器其實是一個普通的容器,專門用來提供數據卷供其它容器掛載
創建一個數據卷容器dbdata,并在其中創建一個數據卷掛載到/dbdata:
docker run -ti -v /dbdata --name dbdata ubuntu:14.04
接著我們可以在其他容器中使用–volumes-form來掛載dbdata容器中的數據卷,例如創建db1和db2兩個容器,并從dbdata容器掛載數據卷:
docker run -ti --volumes-from dbdata --name db1 ubuntu:14.04
docker run -ti --volumes-from dbdata --name db2 ubuntu:14.04
5 dockerFile語法
5.1 Dockerfile 由一行行命令語句組成,并且支持以 # 開頭的注釋行。
一般的,Dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。
5.2 FROM 格式為 FROM <image>或FROM <image>:<tag>。
第一條指令必須為 FROM 指令。并且,如果在同一個Dockerfile中創建多個鏡像時,可以使用多個 FROM 指令(每個鏡像一次)。
5.3 MAINTAINER 格式為MAINTAINER <name> 指定維護者信息。
5.4 RUN 格式為 RUN <command> 或 RUN ["executable", "param1", "param2"]。
前者將在 shell 終端中運行命令,即 /bin/sh -c;后者則使用 exec 執行。指定使用其它終端可以通過第二種方式實現,例如 RUN ["/bin/bash", "-c", "echo hello"]。
每條 RUN 指令將在當前鏡像基礎上執行指定命令,并提交為新的鏡像。當命令較長時可以使用 \ 來換行。
5.5 CMD
支持三種格式
CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最后一條會被執行。
如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。
5.6 EXPOSE 格式為EXPOSE <port> [<port>...]。
告訴 Docker 服務端容器暴露的端口號,供互聯系統使用。在啟動容器時需要通過 -P,Docker 主機會自動分配一個端口轉發到指定的端口。
5.7 ENV 格式為 ENV <key> <value>。 指定一個環境變量,會被后續 RUN 指令使用,并在容器運行時保持。
例如
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
5.8 ADD 格式為 ADD <src> <dest>。
該命令將復制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目錄的一個相對路徑;也可以是一個 URL;還可以是一個 tar 文件(自動解壓為目錄)。
5.9 COPY 格式為 COPY <src> <dest>。
復制本地主機的 <src>(為 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>。
當使用本地目錄為源目錄時,推薦使用 COPY。
5.10 ENTRYPOINT
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啟動后執行的命令,并且不可被 docker run 提供的參數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最后一個起效。
5.11 VOLUME 格式為 VOLUME ["/data"]。
創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。
5.12 USER 格式為 USER daemon。
指定運行容器時的用戶名或 UID,后續的 RUN 也會使用指定用戶。
當服務不需要管理員權限時,可以通過該命令指定運行用戶。并且可以在之前創建所需要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員權限可以使用 gosu,而不推薦 sudo。
5.13 WORKDIR 格式為 WORKDIR /path/to/workdir。
為后續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。
可以使用多個 WORKDIR 指令,后續命令如果參數是相對路徑,則會基于之前命令指定的路徑。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑為 /a/b/c。
5.14 ONBUILD 格式為 ONBUILD [INSTRUCTION]。
配置當所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令。
例如,Dockerfile 使用如下的內容創建了鏡像 image-A。
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基于 image-A 創建新的鏡像時,新的Dockerfile中使用 FROM image-A指定基礎鏡像時,會自動執行ONBUILD 指令內容,等價于在后面添加了兩條指令。
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的鏡像,推薦在標簽中注明,例如 ruby:1.9-onbuild
6 容器編排即有些生產環境有大量容器需要維護,重復操作也很多。通過docker-compose對容器批量操作,高效,安全的維護容器。
“Docker容器的模板怎么創建”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。