摘要:本文最早發表于本人博客快速入門指引是什么是公司開源的一個基于技術之上構建的容器引擎,基于語言并遵從協議開源。指令用于設置用戶或來運行生成的鏡像和執行指令。中定義的指令不會繼承到當前引用的鏡像中,也就是當引用的鏡像創建完成后將會清除所
本文最早發表于本人博客: Docker 快速入門指引
Docker是什么?Docker是 Docker.Inc 公司開源的一個基于 LXC技術之上構建的Container容器引擎,基于Go語言并遵從Apache2.0協議開源。
開發者可以搭建他們的應用僅僅一次,就能保證讓這個應用保持一致的跑在任何地方。運營人員可以將他們的服務器配置一遍,就能跑任何應用。
What is Docker’s architecture?Docker uses a client-server architecture. The Docker?client?talks to the Dockerdaemon, which does the heavy lifting of building, running, and distributing your Docker containers. Both the Docker client and the daemon?can?run on the same system, or you can connect a Docker client to a remote Docker daemon. The Docker client and daemon communicate via sockets or through a RESTful API.和傳統虛擬主機的區別
傳統虛擬機通過硬件虛擬化來創造一整個虛擬系統。每一個虛擬機內的應用不僅僅包含這個應用的一些類庫代碼,而且還包含一整個操作系統。
Docker所有的容器分享一個操作系統,他們顯然會比虛擬機更小一些,使得他們可以存在100多個虛擬的系統在一個主機上(而不像一個嚴格限制數量的虛擬機)。
優點和特點標準化應用發布,docker容器包含了運行環境和可執行程序,可以跨平臺和主機使用
快速部署和啟動,VM啟動一般是分鐘級,docker容器啟動是秒級,即啟即用
方便構建基于SOA架構或微服務架構的系統,通過服務編排,更好的松耦合
輕量低成本,占有更少的磁盤空間,一臺主機可以啟動上千個容器
方便持續集成,通過與代碼進行關聯使持續集成非常方便
安全隔離的執行環境,每個運行的容器互不影響
文件系統分離,每一個進程容器跑在完全分離的root權限的文件系統下
資源分離,系統資源(像CPU、內存)能被指定的分配給每一個進程容器,使用cgroups
網絡分離,使用一個虛擬的接口和IP地址,每一個進程容器跑在它自己的網絡命名空間
豐富的鏡像資源,用戶可以方便的在此基礎上構建自己的容器運行
......
一些概念和名稱Docker Client?是用戶界面,它支持用戶與Docker Daemon之間通信
Docker Daemon Docker最核心的后臺進程,運行于主機上,處理服務請求
Docker Index是中央registry,支持擁有公有與私有訪問權限的Docker容器鏡像的備份
Docker Containers負責應用程序的運行,包括操作系統、用戶添加的文件以及元數據
Docker Images是一個只讀模板,用來運行Docker容器
DockerFile是文件指令集,用來說明如何自動創建Docker鏡像
安裝現在已經支持Windows,Mac OS X,以及大多數Linux版本 -> Install Docker Engine
DaoCloud的安裝腳本
#Ubuntu curl -sSL https://get.daocloud.io/docker | sh #CentOS curl -sSL https://get.daocloud.io/docker | sh sudo chkconfig docker on sudo systemctl start docker倉庫
倉庫(Repository)是集中存放鏡像文件的場所,倉庫注冊服務器(Registry)上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag),和倉庫(Repository)嚴格來講不是同一個概念。
倉庫分為公開倉庫(Public)和私有倉庫(Private),官方的?Docker Hub提供大量鏡像提供下載,但是訪問非常的慢,可以使用國內的公開倉庫?時速云?、網易云 、阿里云?、DaoCloud加速器等
用戶也可以在本地網絡內創建一個私有倉庫,創建了自己的鏡像之后就可以使用?push?命令將它上傳到公有或者私有倉庫,其他機器上使用只需要從倉庫上?pull?下來就可以了。
鏡像就是一堆文件的集合,并不是像VM那樣的是一個操作系統。鏡像可以簡單到只有一個程序文件。如果你寫一個helloworld 靜態編譯后放到一個空的Image中,那么整個image的大小,就是你編譯后的二進制文件的大小。一個ubuntu:14.04的鏡像,提供了一個基本的ubuntu:14.04的發行版,鏡像是不包含操作系統Linux內核。
如果在Debian鏡像中安裝MySQL 5.6,就成了mysql:5.6鏡像。底層一個Debian操作系統鏡像,上面疊加一個 MySQL層,就完成了一個MySQL鏡像的構建。
Dockerfile構建出Docker鏡像,通過Docker鏡像運行Docker容器。Docker鏡像是Docker容器運行的基礎,沒有Docker鏡像,就不可能有Docker容器,這也是Docker的設計原則之一。
docker images 顯示本地已有鏡像
docker info 顯示docker系統信息
docker commit -m -a 提交更新后的鏡像
docker build 通過Dockerfile來構建鏡像
docker import 本地導入鏡像
docker search 查找倉庫中鏡像
docker push 將鏡像推送到倉庫
docker pull 將倉庫中鏡像下載到本地
docker save -o mysql_5.6.tar mysql:5.6 導出鏡像到本地
docker load < mysql_5.6.tar 載入鏡像
docker rmi 移除鏡像
docker attach 運行中容器的stdin,進行命令執行的動作
docker history 顯示鏡像的歷史
DockerfileDockerfile是Docker用來構建鏡像的文本文件,包含自定義的指令和格式, 可以通過docker build命令從Dockerfile中構建鏡像。
FROM
FROM[: ] 設置要制作的鏡像基于哪個鏡像,FROM指令必須是整個Dockerfile的第一個指令,如果指定的鏡像不存在默認會自動從Docker Hub上下載。
MAINTAINER
MAINTAINERMAINTAINER指令允許你給將要制作的鏡像設置作者信息
RUN
RUN#將會調用/bin/sh -c RUN ["executable", "param1", "param2"] #將會調用exec執行,以避免有些時候shell方式執行時的傳遞參數問題,而且有些基礎鏡像可能不包含/bin/sh RUN指令會在一個新的容器中執行任何命令,然后把執行后的改變提交到當前鏡像,提交后的鏡像會被用于Dockerfile中定義的下一步操作,RUN中定義的命令會按順序執行并提交,這正是Docker廉價的提交和可以基于鏡像的任何一個歷史點創建容器的好處,就像版本控制工具一樣。
CMD
CMD ["executable", "param1", "param2"] #將會調用exec執行,首選方式 CMD ["param1", "param2"] #當使用ENTRYPOINT指令時,為該指令傳遞默認參數 CMD[ | ] #將會調用/bin/sh -c執行 CMD指令中指定的命令會在鏡像運行時執行,在Dockerfile中只能存在一個,如果使用了多個CMD指令,則只有最后一個CMD指令有效。 當出現ENTRYPOINT指令時,CMD中定義的內容會作為ENTRYPOINT指令的默認參數,也就是說可以使用CMD指令給ENTRYPOINT傳遞參數。 RUN和CMD都是執行命令,他們的差異在于RUN中定義的命令會在執行docker build命令創建鏡像時執行,而CMD中定義的命令會在執行docker run命令運行鏡像時執行,另外使用第一種語法也就是調用exec執行時,命令必須為絕對路徑。
EXPOSE
EXPOSE[ ...] EXPOSE指令用來告訴Docker這個容器在運行時會監聽哪些端口,Docker在連接不同的容器(使用–link參數)時使用這些信息。
ENV
ENVENV指令用于設置環境變量,在Dockerfile中這些設置的環境變量也會影響到RUN指令,當運行生成的鏡像時這些環境變量依然有效,如果需要在運行時更改這些環境變量可以在運行docker run時添加–env = 參數來修改。 最好不要定義那些可能和系統預定義的環境變量沖突的名字,否則可能會產生意想不到的結果。
ADD
ADDADD指令用于從指定路徑拷貝一個文件或目錄到容器的指定路徑中, 是一個文件或目錄的路徑,也可以是一個url,路徑是相對于該Dockerfile文件所在位置的相對路徑, 是目標容器的一個絕對路徑 例如/home/yooke/Docker/Dockerfile這個文件中定義的,那么ADD /data.txt /db/指令將會嘗試拷貝文件從/home/yooke/Docker/data.txt到將要生成的容器的/db/data.txt,且文件或目錄的屬組和屬主分別為uid和gid為0的用戶和組,如果是通過url方式獲取的文件,則權限是600。 注意: ①如果執行docker build – < somefile即通過標準輸入來創建時,ADD指令只支持url方式,另外如果url需要認證,則可以通過RUN wget …或RUN curl …來完成,ADD指令不支持認證。 ② 路徑必須與Dockerfile在同級目錄或子目錄中,例如不能使用ADD ../somepath,因為在執行docker build時首先做的就是把Dockerfile所在目錄包含子目錄發送給docker的守護進程。 ③如果 是一個url且 不是以”/“結尾,則會下載文件并重命名為 。 ④如果 是一個url且 以“/”結尾,則會下載文件到 / ,url必須是一個正常的路徑形式,“http://example.com”像這樣的url是不能正常工作的。 ⑤如果 是一個本地的壓縮包且 是以“/”結尾的目錄,則會調用“tar -x”命令解壓縮,如果 有同名文件則覆蓋,但 是一個url時不會執行解壓縮。
COPY
COPY用法與ADD相同, 不支持使用url
ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"] #將會調用exec執行,首選方式 ENTRYPOINT command param1 param2 #將會調用/bin/sh -c執行 ENTRYPOINT指令中指定的命令會在鏡像運行時執行,在Dockerfile中只能存在一個,如果使用了多個則只有最后一個指令有效。 ENTRYPOINT指令中指定的命令(exec執行的方式)可以通過docker run來傳遞參數,例如docker run-l啟動的容器將會把-l參數傳遞給ENTRYPOINT指令定義的命令并會覆蓋CMD指令中定義的默認參數(如果有的話),但不會覆蓋該指令定義的參數,例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],當通過docker run 啟動容器時該容器會運行ls -a /etc命令,當使用docker run -l啟動時該容器會運行ls -a -l命令,-l參數會覆蓋CMD指令中定義的/etc參數。 當使用ENTRYPOINT指令時生成的鏡像運行時只會執行該指令指定的命令。 當出現ENTRYPOINT指令時CMD指令只可能(當ENTRYPOINT指令使用exec方式執行時)被當做ENTRYPOINT指令的參數使用,其他情況則會被忽略。
VOLUME
VOLUME ["samepath"] VOLUME指令用來設置一個掛載點,可以用來讓其他容器掛載以實現數據共享或對容器數據的備份、恢復或遷移。
USER
USER [username|uid] USER指令用于設置用戶或uid來運行生成的鏡像和執行RUN指令。
WORKDIR
WORKDIR /path/to/workdir WORKDIR指令用于設置Dockerfile中的RUN、CMD和ENTRYPOINT指令執行命令的工作目錄(默認為/目錄),該指令在Dockerfile文件中可以出現多次,如果使用相對路徑則為相對于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最終輸出的當前目錄是/data/logs。
ONBUILD
ONBUILD [INSTRUCTION] ONBUILD指令用來設置一些觸發的指令,用于在當該鏡像被作為基礎鏡像來創建其他鏡像時(也就是Dockerfile中的FROM為當前鏡像時)執行一些操作,ONBUILD中定義的指令會在用于生成其他鏡像的Dockerfile文件的FROM指令之后被執行,上述介紹的任何一個指令都可以用于ONBUILD指令,可以用來執行一些因為環境而變化的操作,使鏡像更加通用。 注意: ①ONBUILD中定義的指令在當前鏡像的build中不會被執行。 ②可以通過查看docker inspeat容器命令執行結果的OnBuild鍵來查看某個鏡像ONBUILD指令定義的內容。 ③ONBUILD中定義的指令會當做引用該鏡像的Dockerfile文件的FROM指令的一部分來執行,執行順序會按ONBUILD定義的先后順序執行,如果ONBUILD中定義的任何一個指令運行失敗,則會使FROM指令中斷并導致整個build失敗,當所有的ONBUILD中定義的指令成功完成后,會按正常順序繼續執行build。 ④ONBUILD中定義的指令不會繼承到當前引用的鏡像中,也就是當引用ONBUILD的鏡像創建完成后將會清除所有引用的ONBUILD指令。 ⑤ONBUILD指令不允許嵌套,例如ONBUILD ONBUILD ADD . /data是不允許的。 ⑥ONBUILD指令不會執行其定義的FROM或MAINTAINER指令。
容器 = 鏡像 + 可讀層
Docker容器就像是一個文件夾,它包含了一個應用程序運行所需要的所有內容。每個容器都是基于Docker鏡像構建。我們可以運行、開始、停止、遷移或者是刪除Docker容器。每個容器均是一個隔離的、安全的應用平臺。Docker容器是Docker的運行組件。
docker run 新建并啟動容器
-d 容器運行在后臺,此時不能使用--rm選項
-i -t 和容器進行交互式操作
--name 命名容器,沒有該參數Docker deamon會生產UUID來標識
--cidfile 將容器ID輸入到指定文件中
--add-host 添加一行到/etc/hosts
--mac-address 設置MAC地址
--dns 覆蓋容器DNS設置
--rm 退出容器時自動清除數據
-m 調整容器的內存使用
-c 調整容器的CPU優先級
-e 設定環境變量
--expose 運行時暴露端口,不創建和宿主機的映射
-p 創建映射規則,將一個或者一組端口從容器里綁定到宿主機上,可多次使用
ip:hostPort:containerPort
?ip::containerPort??
?hostPort:containerPort??
?containerPort
-P 將Dockfile中暴露的端口映射動態映射到宿主機
--link 容器互聯 --link name:alias
-v 創建數據卷掛載到容器,一次run中可多次使用
可覆蓋Dockfile參數
CMD
ENTRYPOINT
EXPOSE
ENV
VOLUME
USER
WORKDIR
docker stop 停止運行中容器
docker stop $(docker ps -qa) 停止所有運行中的容器
docker restart 重啟容器
docker ps -a 查看所有容器
docker rm 移除處于終止狀態的容器
docker rm $(docker ps -qa) 移除處于終止狀態的容器
docker logs 從容器中去日志
docker diff 列出容器中被改變的文件或者目錄
docker top 顯示運行容器的進程信息
docker cp 從容器中拷貝文件或者目錄到本地
docker inspect 查看容器詳細信息
Volume和Volume Containers數據卷類似于 Linux 下對目錄或文件進行 mount,本質是容器中一個特殊的文件或目錄(掛載點)。在容器的創建過程中,這個掛載點會被掛載一個宿主機上的指定的目錄 (一個以volumeID為名稱的目錄 或者指定的宿主機目錄)。它的設計用來持久化數據的,生命周期獨立于容器。
docker run -i -t -v /data debian:jessie /bin/sh
將宿主的/var/lib/docker/volumes/volume_id/_data 綁定掛載到 /data
docker run -i -t -v /var/www/:/data debian:jessie /bin/sh
?將宿主機的/var/www/ 綁定掛載到 /data
docker run -i -t -v /var/www/:/data:ro debian:jessie /bin/sh
?掛載為只讀
數據卷容器,用來提供數據卷供其它容器掛載的正常容器。
創建一個數據卷容器dbdata
docker run -d -v /var/www/:/dbdata --name dbdata debian:jessie
其他容器掛載 dbdata容器中的數據卷
docker run -d --volumes-from dbdata --name db1 debian:jessie
也可以從其他已經掛載了數據卷的容器來級聯掛載數據卷
docker run -d --name db2 --volumes-from db1 debian:jessie
如果刪除了掛載的容器,數據卷并不會被自動刪除。如果要刪除一個數據卷,必須在刪除最后一個還掛載著它的容器時使用?docker rm -v?命令來指定同時刪除關聯的容器。
備份數據卷,使用了?tar?命令來將 dbdata 卷備份為容器中 /backup/backup.tar 文件,也就是主機當前目錄下的名為?backup.tar?的文件。
docker run --volumes-from dbdata -v $(pwd):/backup debian:jessie tar cvf /backup/backup.tar /dbdata
恢復數據卷
# 創建一個帶有空數據卷的容器 docker run -v /dbdata --name dbdata2 debian:jessie /bin/bash # 創建另一個容器,掛載 dbdata2 容器卷中的數據卷,并解壓備份文件到掛載的容器卷中。 docker run --volumes-from dbdata2 -v $(pwd):/backup debian:jessie tar xvf /backup/backup.tar # 再啟動一個容器掛載同樣的容器卷來查看恢復的數據 docker run --volumes-from dbdata2 debian:jessie /bin/ls /dbdata參考
Docker Docs
Docker入門與實戰
如果覺得本篇文章對您十分有益,何不 打賞一下
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26608.html
摘要:例如改成例如改成以上兩種開發方式都可以結合原生平臺打包成獨立應用。 繼上一篇一張腦圖看懂BUI Webapp移動快速開發框架【上】--框架與工具、資源 大綱 在線查看大綱 思路更佳清晰 1. 框架設計 框架介紹 簡介 BUI 是用來快速構建界面交互的UI交互框架, 專注webapp開發, 開發者只需關注業務的開發, 界面的布局及交互交給BUI, 開發出來的應用, 可以嵌入平臺 ( Li...
摘要:監控項目進一步完善集群和服務監控和報警必然是運維同仁們的重點關注功能。系統服務注冊功能改進,基于健康檢查實現注冊的自動上線和下線,解決錯誤的添加管理節點導致鏡像倉庫等服務負載均衡錯誤問題。修復了鏡像錯誤導致檢測失敗后未提供后續操作的問題。 Rainbond 5.1.3發布,快速部署和運維spring cloud集群 今天為大家帶來Rainbond 5.1系列第三個更新版本,本次版本更新...
摘要:入門指引啟動,停止和重載配置配置文件的結構服務靜態內容建立簡單的代理服務器建立代理這個指引對做了一些簡單的介紹并且描述了一些它可以完成的簡單任務。如果一個塊級指令中包含了其它指令,那么它被稱為一個上下文。為了使配置生效,要發送信號。 興趣使然的翻譯,業余水平,nginx官方英文介紹文檔很不錯,可惜中文網上好像沒有相應的翻譯。 入門指引 啟動,停止和重載配置配置文件的結構服務靜態內容...
閱讀 2576·2021-11-22 13:53
閱讀 4084·2021-09-28 09:47
閱讀 869·2021-09-22 15:33
閱讀 819·2020-12-03 17:17
閱讀 3320·2019-08-30 13:13
閱讀 2125·2019-08-29 16:09
閱讀 1182·2019-08-29 12:24
閱讀 2455·2019-08-28 18:14