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