一文快速入門Docker

Docker提供一種安全套利、可重復的環(huán)境中自動部署軟件的方式兜辞,拉開了基于與計算平臺發(fā)展方式的變革序幕蜻懦。如今Docker在互聯網公司使用已經非常普遍。本文用十分鐘時間纤垂,帶你快速入門Docker矾策。

Docker是什么

Docker是什么劲件?

官網首頁的介紹:

Enterprise Container Platform for High-Velocity Innovation. Securely build, share and run any application, anywhere

百度百科告訴我們:

Docker 是一個開源的應用容器引擎愧旦,讓開發(fā)者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。

《第一本DOCKER書》的簡介:

Docker是一個能夠把開發(fā)的應用程序自動部署到容器的開源引擎析既。由Docker公司(www.docker.com吼鱼,前dotCloud公司蓬豁,PaaS市場中的老牌供應商)的團隊編寫,基于Apache 2.0開源協(xié)議發(fā)行菇肃。

Docker的特別之處:

Docker是輕量級的虛擬化技術地粪,啟動速度快(大多數Docker容器只需不到1s即可完成啟動),單臺硬件上可以同時跑成百上千個容器琐谤,使得快速擴展蟆技,彈性伸縮變得簡單。據說斗忌,在2016年质礼,京東使用15萬Docker集群來保證618高并發(fā)場景下的系統(tǒng)穩(wěn)定。

Docker是跨平臺的织阳,支持Windows几苍、Macos、Linux陈哑,可以做到“構建一次,到處運行”,解決開發(fā)環(huán)境和生產環(huán)境不一致帶來的一系列問題惊窖,讓開發(fā)人員和運維人員可以更加和諧相處刽宪。

Docker是開源的,托管于GitHub界酒。

Docker思想

從docker的logo聯想docker核心思想

image

Docker的logo是一個載著集裝箱的大鯨魚圣拄,這絕對是對Docker最形象的描述和解釋。

對比運輸業(yè)毁欣,在集裝箱出現之前庇谆,貨物無法用統(tǒng)一的標準方式進行搬運,比如有些貨物易碎凭疮,需要輕拿輕放饭耳,有些則不需要。于是鐵路执解、公路寞肖、海洋等各種運輸之間,需要大量的人力作為貨物中轉衰腌,效率極低新蟆,而且成本很高。集裝箱出現之后右蕊,解決了這個難題琼稻,任何貨物貨物都可以放到這個神奇的箱子里,然后在公路饶囚、鐵路帕翻、海洋等所有運輸場景下,這個箱子在運輸過程中都是密封的坯约,而且中間的中轉工作熊咽,都可以通過大型機械搞定,效率大大提升闹丐。

Docker正式借鑒了標準集裝箱的思想横殴,將集裝箱思想運用到了軟件領域。Docker為代碼提供了一個基于容器的標準化運輸系統(tǒng)卿拴,可以將任何應用及其依賴的環(huán)境(如代碼衫仑、配置文件、JDK堕花、Tomcat等)打包成一個容器文狱,這個容器可以在幾乎所有的操作系統(tǒng)運行。

Docker核心概念

鏡像

鏡像是docker的基石缘挽,用戶可以基于鏡像來運行自己的容器瞄崇。

鏡像的基礎是Docker的聯合文件系統(tǒng)呻粹,該文件系統(tǒng)是分層的,每個鏡像是一個層苏研。由于每個層上面還以有其他層等浊,也就是說,鏡像可以在其他鏡像(基礎鏡像)上面進行創(chuàng)建摹蘑。借用一幅圖來幫助理解筹燕。圖片來源于網絡,侵刪衅鹿。


image

倉庫

倉庫是保存用戶鏡像的地方撒踪,docker官方倉庫地址為 https://hub.docker.com。在Docker Hub上面有許多鏡像大渤,包括最簡單的hello-world制妄,MySQL等等。當然我們也可以有自己私有的倉庫兼犯。

容器

容器為應用程序提供了隔離的運行空間忍捡。每個容器內都包含一個獨享的完整的用戶環(huán)境,并且一個容器內的運行環(huán)境變動不會影響其他容器的運行環(huán)境切黔,可以使應用程序在幾乎任何地方以相同的方式運行砸脊。

容器是基于鏡像啟動的,容器中可以運行一個或多個進程纬霞。在創(chuàng)建容器進程時凌埂,指定了這個進程所需要的Namespace參數,使得容器就只能「看」到當前 Namespace 所限定的資源诗芜、文件瞳抓、設備、狀態(tài)伏恐,或者配置孩哑。所以說,容器是一種特殊的進程而已翠桦,容器的本質就是進程横蜒。

Docker安裝

以CentOS 7為例,進行安裝Docker销凑。

檢查系統(tǒng)內核版本

Docker運行在 CentOS 7上丛晌,要求操作系統(tǒng)為 64 位,內核版本為 3.10 及以上斗幼。
確認本機已經安裝了滿足要求的Linux內核澎蛛。使用命令uname -r來檢查內核版本信息。

[root@localhost ~]# uname -r
3.10.0-957.el7.x86_64

在CentOS 7中安裝Docker

使用命令yum install -y docker安裝Docker蜕窿,“-y”表示不詢問谋逻,使用默認配置進行安裝呆馁。

啟動Docker服務,并設置為開機自啟動

使用下列命令:

systemctl start docker.service
systemctl enable docker.service

查看版本信息

輸入docker version毁兆,返回版本信息表明Docker安裝成功智哀。

[root@localhost ~]# docker version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      b2f74b2/1.13.1
 Built:           Wed May  1 14:55:20 2019
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      b2f74b2/1.13.1
 Built:           Wed May  1 14:55:20 2019
 OS/Arch:         linux/amd64
 Experimental:    false

Docker實戰(zhàn)——Hello World

入門實戰(zhàn)怎么能少得了經典的“Hello World”?

拉取鏡像

其實DockerHub上已經有了這個鏡像荧恍,名字叫“hello-world”。直接從DockerHub拉取鏡像屯吊,命令和Git有些相似:docker pull hello-world

[root@localhost docker]# docker pull hello-world
Using default tag: latest
Trying to pull repository docker.io/library/hello-world ... 
latest: Pulling from docker.io/library/hello-world
1b930d010525: Pull complete 
Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8
Status: Downloaded newer image for docker.io/hello-world:latest

查看鏡像

查看拉取到的Docker鏡像:docker images

[root@localhost ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world   latest              fce289e99eb9        5 months ago        1.84 kB

運行鏡像

運行鏡像:docker run hello-world送巡。看到打印出如下的內容盒卸,代表運行成功骗爆。

[root@localhost docker]# docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Docker常用命令

docker images : 列出本地的鏡像

docker pull image_name:拉取鏡像。如果沒有指定具體的鏡像標簽蔽介,會自動拉取latest標簽的鏡像摘投。

docker search image_name:在Docker Hub上查找鏡像

docker start container:啟動和運行容器

docker run [OPTIONS] image_name:基于鏡像創(chuàng)建并啟動一個容器
常用選項:
-d: 后臺運行容器,并返回容器ID虹蓄;
-i: 以交互模式運行容器犀呼,通常與 -t 同時使用;
-t: 為容器重新分配一個偽輸入終端薇组,通常與 -i 同時使用外臂;
-P: 隨機端口映射,容器內部端口隨機映射到主機的高端口
-p: 指定端口映射律胀,格式為:主機(宿主)端口:容器端口

docker logs container:獲取容器的日志信息

docker attach container:進入容器

exit:退出容器

docker exec container command:在運行的容器中執(zhí)行命令

docker stop container:停止容器

docker rm container:刪除容器

docker save -o image_name.tar image_name:導出鏡像

docker ps:查看正在運行的容器

docker ps -a:查看系統(tǒng)中容器列表

docker top container:查看容器內的進程

docker stop daemon_dave:停止守護容器

Docker構建鏡像

如何構建鏡像宋光?

構建一個自己的鏡像需要兩步:

  1. 編寫Dockerfile。Dockerfile 告訴Docker如何制作鏡像以及每一步是怎樣的炭菌。
    Docker執(zhí)行Dockerfile中的指令的流程是這樣的:

    • Docker從基礎鏡像運行一個容器
    • 執(zhí)行一條指令罪佳,對容器進行修改
    • 提交到一個新的鏡像層
    • Docker再基于剛才提交的鏡像運行一個新容器
    • 執(zhí)行Dockerfile中的下一條指令,知道所有指令執(zhí)行完畢黑低。
  2. 使用docker build命令構建赘艳。

編寫Dockerfile

每個Dockerfile的第一條命令必須是FROM。FROM指令指定一個已經存在的鏡像投储,告訴Docker后續(xù)的指令都是在這個基礎上進行的第练。例如:FROM java:8

MAINTAINER 指令用來標志該鏡像所有者和聯系方式。例如:MAINTAINER James "×××@example.com"

VOLUME 指令用來向基于鏡像創(chuàng)建的容器添加卷玛荞。一個卷可以是存在一個或者多個容器內的特定的目錄娇掏,這個目錄可以繞過聯合文件系統(tǒng),并提供共享數據和數據持久化的功能勋眯。

CMD 指令用來指定一個容器啟動時要運行的命令婴梧。

ENTRYPOINT指令與CMD指令很相似下梢。

WORKDIR 指令用來從鏡像創(chuàng)建一個新容器的時候,在容器內部設置一個工作命令塞蹭,ENTRYPOINT或CMD指令指定的程序會在這個目錄下執(zhí)行孽江。

ENV 指令用來在在鏡像構建過程中設置環(huán)境變量。例如:ENV TEST_PATH /home/test

RUN 指令用來在當前鏡像中運行指定的命令番电。例如:RUN apt-get install -y nginx

EXPOSE 指令用來告訴Docker該容器內的應用程序將使用容器的指定端口岗屏。例如:EXPOSE 80

ADD 指令用來將構建環(huán)境下的文件和目錄復制到鏡像中。 例如:ADD docker-0.0.1-SNAPSHOT.jar app.jar

COPY 指令與ADD 類似漱办,不同點在與COPY只關心在構建上下文中復制本地文件这刷,而不會提取和解壓。

LABEL 指令用于為Docker鏡像添加元數據娩井。例如:LABEL name=test description="a container is used to test"

Dockerfile實例:

FROM java:8
MAINTAINER James "×××@example.com"
VOLUME /tmp
ADD docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

執(zhí)行docker build

執(zhí)行docker build命令后看到“BUILD SUCCESS”表明構建成功暇屋,可以使用docker run命令來運行了。

總結

本文介紹了Docker是什么洞辣、Docker思想咐刨、Docker核心概念、Docker安裝等內容扬霜,看完本文定鸟,Docker算是入門了,但是萬里長征只走完了第一步畜挥,學無止境仔粥,共勉。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末蟹但,一起剝皮案震驚了整個濱河市躯泰,隨后出現的幾起案子,更是在濱河造成了極大的恐慌华糖,老刑警劉巖麦向,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異客叉,居然都是意外死亡诵竭,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門兼搏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卵慰,“玉大人,你說我怎么就攤上這事佛呻∩雅螅” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵吓著,是天一觀的道長鲤嫡。 經常有香客問我送挑,道長,這世上最難降的妖魔是什么暖眼? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任惕耕,我火速辦了婚禮,結果婚禮上诫肠,老公的妹妹穿的比我還像新娘司澎。我一直安慰自己,他們只是感情好栋豫,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布惭缰。 她就那樣靜靜地躺著,像睡著了一般笼才。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上络凿,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天骡送,我揣著相機與錄音,去河邊找鬼絮记。 笑死摔踱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的怨愤。 我是一名探鬼主播派敷,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撰洗!你這毒婦竟也來了篮愉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤差导,失蹤者是張志新(化名)和其女友劉穎试躏,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體设褐,經...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡颠蕴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了助析。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犀被。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖外冀,靈堂內的尸體忽然破棺而出寡键,到底是詐尸還是另有隱情,我是刑警寧澤锥惋,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布昌腰,位于F島的核電站开伏,受9級特大地震影響,放射性物質發(fā)生泄漏遭商。R本人自食惡果不足惜固灵,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劫流。 院中可真熱鬧巫玻,春花似錦、人聲如沸祠汇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽可很。三九已至诗力,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間我抠,已是汗流浹背苇本。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留菜拓,地道東北人瓣窄。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像纳鼎,于是被迫代替她去往敵國和親俺夕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內容

  • 《Docker從入門到實踐》閱讀筆記 原書地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo閱讀 11,375評論 1 39
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,746評論 1 21
  • Docker簡介Docker是一個由GO語言寫的程序運行的“容器”贱鄙; 目前云服務的基石是操作系統(tǒng)級別的隔離劝贸,在同一...
    gakiww閱讀 543評論 0 0
  • 一、概述 Docker is the world’s leading software container pla...
    凜_冬_將_至閱讀 294評論 0 0
  • 光有熱情 沒有毅力 不行 光有專注 不講效率 不行 光有心態(tài) 缺少實力 不行 不要假設如果不是當初 現在又該如何 ...
    豫視西影閱讀 279評論 1 8