十分鐘學會用docker部署微服務

2013年發(fā)布至今诉瓦, Docker 一直廣受矚目川队,被認為可能會改變軟件行業(yè)。

但是睬澡,許多人并不清楚 Docker 到底是什么固额,要解決什么問題,好處又在哪里煞聪?今天就來詳細解釋斗躏,幫助大家理解它,還帶有簡單易懂的實例昔脯,教你如何將它用于日常開發(fā)并用其部署微服務啄糙。

一. Docker簡介

Docker是一個開源的容器引擎,它有助于更快地交付應用云稚。 Docker可將應用程序和基礎設施層隔離隧饼,并且能將基礎設施當作程序一樣進行管理。使用 Docker可更快地打包静陈、測試以及部署應用程序燕雁,并可以縮短從編寫到部署運行代碼的周期。

Docker的優(yōu)點如下

1. 簡化程序

Docker 讓開發(fā)者可以打包他們的應用以及依賴包到一個可移植的容器中鲸拥,然后發(fā)布到任何流行的 Linux 機器上拐格,便可以實現(xiàn)虛擬化。Docker改變了虛擬化的方式崩泡,使開發(fā)者可以直接將自己的成果放入Docker中進行管理禁荒。方便快捷已經(jīng)是 Docker的最大優(yōu)勢猬膨,過去需要用數(shù)天乃至數(shù)周的 任務角撞,在Docker容器的處理下,只需要數(shù)秒就能完成勃痴。

2. 避免選擇恐懼癥

如果你有選擇恐懼癥谒所,還是資深患者。Docker 幫你 打包你的糾結(jié)沛申!比如 Docker 鏡像劣领;Docker 鏡像中包含了運行環(huán)境和配置,所以 Docker 可以簡化部署多種應用實例工作铁材。比如 Web 應用尖淘、后臺應用奕锌、數(shù)據(jù)庫應用、大數(shù)據(jù)應用比如 Hadoop 集群村生、消息隊列等等都可以打包成一個鏡像部署惊暴。

3. 節(jié)省開支

一方面,云計算時代到來趁桃,使開發(fā)者不必為了追求效果而配置高額的硬件辽话,Docker 改變了高性能必然高價格的思維定勢。Docker 與云的結(jié)合卫病,讓云空間得到更充分的利用油啤。不僅解決了硬件管理的問題,也改變了虛擬化的方式蟀苛。

二. Docker架構(gòu)

Docker daemon( Docker守護進程)

Docker daemon是一個運行在宿主機( DOCKER-HOST)的后臺進程益咬。可通過 Docker客戶端與之通信帜平。

Client( Docker客戶端)

Docker客戶端是 Docker的用戶界面础废,它可以接受用戶命令和配置標識,并與 Docker daemon通信罕模。圖中评腺, docker build等都是 Docker的相關(guān)命令。

Images( Docker鏡像)

Docker鏡像是一個只讀模板淑掌,它包含創(chuàng)建 Docker容器的說明蒿讥。它和系統(tǒng)安裝光盤有點像,使用系統(tǒng)安裝光盤可以安裝系統(tǒng)抛腕,同理芋绸,使用Docker鏡像可以運行 Docker鏡像中的程序。

Container(容器)

容器是鏡像的可運行實例担敌。鏡像和容器的關(guān)系有點類似于面向?qū)ο笾兴ち玻惡蛯ο蟮年P(guān)系∪猓可通過 Docker API或者 CLI命令來啟停马昙、移動、刪除容器刹悴。

Registry

Docker Registry是一個集中存儲與分發(fā)鏡像的服務行楞。構(gòu)建完 Docker鏡像后,就可在當前宿主機上運行土匀。但如果想要在其他機器上運行這個鏡像子房,就需要手動復制。此時可借助 Docker Registry來避免鏡像的手動復制。

一個 Docker Registry可包含多個 Docker倉庫证杭,每個倉庫可包含多個鏡像標簽田度,每個標簽對應一個 Docker鏡像。這跟 Maven的倉庫有點類似解愤,如果把 Docker Registry比作 Maven倉庫的話每币,那么 Docker倉庫就可理解為某jar包的路徑,而鏡像標簽則可理解為jar包的版本號琢歇。

三. Docker安裝

Docker 是一個開源的商業(yè)產(chǎn)品兰怠,有兩個版本:社區(qū)版(Community Edition,縮寫為 CE)和企業(yè)版(Enterprise Edition李茫,縮寫為 EE)揭保。企業(yè)版包含了一些收費服務,個人開發(fā)者一般用不到魄宏。下面的介紹都針對社區(qū)版秸侣。

Docker CE 的安裝請參考官方文檔。以下列出不同操作系統(tǒng)的安裝方法

  • Mac
  • indows
  • Ubuntu
  • Debian
  • CentOS
  • Fedora
  • 其他 Linux 發(fā)行版

我們這里以CentOS為例

1宠互、Docker 要求 CentOS 系統(tǒng)的內(nèi)核版本高于 3.10 味榛,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。

通過 uname -r 命令查看你當前的內(nèi)核版本

# uname -r

2予跌、使用 root 權(quán)限登錄 Centos搏色。確保 yum 包更新到最新。

# yum -y update

3券册、卸載舊版本(如果安裝過舊版本的話)

# yum remove docker docker-common docker-selinux docker-engine

4频轿、安裝需要的軟件包, yum-util 提供yum-config-manager功能烁焙,另外兩個是devicemapper驅(qū)動依賴的

# yum install -y yum-utils device-mapper-persistent-data lvm2

5航邢、設置yum源

# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

6、可以查看所有倉庫中所有docker版本骄蝇,并選擇特定版本安裝

# yum list docker-ce --showduplicates | sort -r 

7膳殷、安裝docker

# sudo yum install -y docker-ce #由于repo中默認只開啟stable倉庫,故這里安裝的是最新穩(wěn)定版18.03.1

8九火、啟動并加入開機啟動

# systemctl start docker

# systemctl enable docker

9赚窃、驗證安裝是否成功(有client和service兩部分表示docker安裝啟動都成功了)

# docker version

10、卸載docker

# yum -y remove docker-engine

四. Docker常用命令

(一) .鏡像相關(guān)命令

1吃既、搜索鏡像

可使用 docker search命令搜索存放在 Docker Hub(這是docker官方提供的存放所有docker鏡像軟件的地方考榨,類似maven的中央倉庫)中的鏡像。執(zhí)行該命令后鹦倚, Docker就會在Docker Hub中搜索含有 java這個關(guān)鍵詞的鏡像倉庫。

# docker search java

以上列表包含五列冀惭,含義如下:

  • NAME:鏡像倉庫名稱震叙。
  • DESCRIPTION:鏡像倉庫描述掀鹅。
  • STARS:鏡像倉庫收藏數(shù),表示該鏡像倉庫的受歡迎程度媒楼,類似于 GitHub的 stars0
  • OFFICAL:表示是否為官方倉庫乐尊,該列標記為[0K]的鏡像均由各軟件的官方項目組創(chuàng)建和維護。
  • AUTOMATED:表示是否是自動構(gòu)建的鏡像倉庫划址。

注意:使用docker查找或下載鏡像可能會超時扔嵌,所以我們需要為docker配置國內(nèi)的鏡像加速器

我們可以借助阿里云的鏡像加速器,登錄阿里云(https://cr.console.aliyun.com/#/accelerator)

可以看到鏡像加速地址如下圖:

# cd /etc/docker

查看有沒有 daemon.json夺颤。這是docker默認的配置文件痢缎。

如果沒有新建,如果有世澜,則修改独旷。

# vim daemon.json 
{
    "registry-mirrors": ["https://m9r2r2uj.mirror.aliyuncs.com"]
}

保存退出并重啟docker服務

# service docker restart

2、下載鏡像

使用命令docker pull命令即可從 Docker Registry上下載鏡像寥裂,執(zhí)行該命令后嵌洼,Docker會從 Docker Hub中的 java倉庫下載最新版本的 Java鏡像。如果要下載指定版本則在java后面加冒號指定版本封恰,例如:docker pull java:8

# docker pull java:8

3麻养、列出鏡像

使用 docker images命令即可列出已下載的鏡像

# docker images

以上列表含義如下

  • REPOSITORY:鏡像所屬倉庫名稱。
  • TAG:鏡像標簽诺舔。默認是 latest,表示最新回溺。
  • IMAGE ID:鏡像 ID,表示鏡像唯一標識混萝。
  • CREATED:鏡像創(chuàng)建時間遗遵。
  • SIZE: 鏡像大小。

4逸嘀、刪除本地鏡像

使用 docker rmi命令即可刪除指定鏡像

# docker rmi java

(二) .容器相關(guān)命令

1车要、新建并啟動容器

使用以下docker run <鏡像名>命令即可新建并啟動一個容器,該命令是最常用的命令崭倘,它有很多選項翼岁,下面將列舉一些常用的選項。

# docker run -d -p 91:80 nginx

這樣就能啟動一個 Nginx容器司光。在本例中琅坡,為 docker run添加了兩個參數(shù),含義如下:

  • -d 后臺運行
  • -p 宿主機端口:容器端口 #開放容器端口到宿主機端口

訪問 http://Docker宿主機 IP:91/残家,將會看到nginx的主界面如下:

需要注意的是榆俺,使用 docker run命令創(chuàng)建容器時,會先檢查本地是否存在指定鏡像。如果本地不存在該名稱的鏡像茴晋, Docker就會自動從 Docker Hub下載鏡像并啟動一個 Docker容器陪捷。

該命令還有一個網(wǎng)絡配置參數(shù),如下所示

  • --net選項:指定網(wǎng)絡模式诺擅,該選項有以下可選參數(shù):
  • --net=bridge:默認選項市袖,表示連接到默認的網(wǎng)橋。
  • --net=host:容器使用宿主機的網(wǎng)絡烁涌。
  • --net=container:NAME-or-ID:告訴 Docker讓新建的容器使用已有容器的網(wǎng)絡配置苍碟。
  • --net=none:不配置該容器的網(wǎng)絡,用戶可自定義網(wǎng)絡配置撮执。

2微峰、列出容器

用 docker ps命令即可列出運行中的容器

# docker ps

如需列出所有容器(包括已停止的容器),可使用-a參數(shù)二打。該列表包含了7列县忌,含義如下

  • CONTAINER_ID:表示容器 ID。
  • IMAGE:表示鏡像名稱继效。
  • COMMAND:表示啟動容器時運行的命令症杏。
  • CREATED:表示容器的創(chuàng)建時間。
  • STATUS:表示容器運行的狀態(tài)瑞信。UP表示運行中厉颤, Exited表示已停止。
  • PORTS:表示容器對外的端口號凡简。
  • NAMES:表示容器名稱逼友。該名稱默認由 Docker自動生成,也可使用 docker run命令的--name選項自行指定秤涩。

3帜乞、停止容器

使用 docker stop <容器id>命令,即可停止容器

# docker stop f0b1c8ab3633

其中f0b1c8ab3633是容器 ID,當然也可使用 docker stop容器名稱來停止指定容器

4筐眷、強制停止容器

可使用 docker kill <容器id>命令發(fā)送 SIGKILL信號來強制停止容器

# docker kill f0b1c8ab3633

5黎烈、啟動已停止的容器

使用docker run命令,即可新建并啟動一個容器匀谣。對于已停止的容器照棋,可使用 docker start <容器id>命令來啟動

# docker start f0b1c8ab3633

6、查看容器所有信息

使用命令docker inspect <容器id>

# docker inspect f0b1c8ab3633

7武翎、查看容器日志

使用命令docker container logs <容器id>

# docker container logs f0b1c8ab3633

8烈炭、查看容器里的進程

使用命令docker top <容器id>

# docker top f0b1c8ab3633

9、進入容器

使用docker container exec -it <容器id> /bin/bash命令用于進入一個正在運行的docker容器宝恶。如果docker run命令運行容器的時候符隙,沒有使用-it參數(shù)趴捅,就要用這個命令進入容器。一旦進入了容器膏执,就可以在容器的 Shell 執(zhí)行命令了

# docker container exec -it f0b1c8ab3633 /bin/bash

10驻售、刪除容器

使用 docker rm命令即可刪除指定容器

# docker rm f0b1c8ab3633

該命令只能刪除已停止的容器露久,如需刪除正在運行的容器更米,可使用-f參數(shù)

(三) .構(gòu)建自己的docker鏡像

使用Dockerfile構(gòu)建自己的Docker鏡像

Dockerfile是一個文本文件胀屿,其中包含了若干條指令蛾魄,指令描述了構(gòu)建鏡像的細節(jié)

先來編寫一個最簡單的Dockerfile,以前文下載的Nginx鏡像為例呆贿,來編寫一個Dockerfile修改該Nginx鏡像的首頁

1消请、新建文件夾/app栏笆,在app目錄下新建一個名為Dockerfile的文件,在里面增加如下內(nèi)容:

FROM nginx #從本地的鏡像倉庫里拉取ngxin的docker鏡像 
RUN echo 'This is QingFeng Nginx!!!' > /usr/share/nginx/html/index.html #修改ngxin的docker鏡像的首頁內(nèi)容

該Dockerfile非常簡單臊泰,其中的 FORM蛉加、 RUN都是 Dockerfile的指令。 FROM指令用于指定基礎鏡像缸逃, RUN指令用于執(zhí)行命令针饥。

2、在Dockerfile所在路徑執(zhí)行以下命令構(gòu)建我們自己的ngxin鏡像需频,構(gòu)建完可用docker images命令查看是否已生成鏡像ngxin:tuling:

# docker build -t nginx:qingfeng .

其中丁眼,-t指定鏡像名字,命令最后的點(.)表示Dockerfile文件所在路徑

3昭殉、執(zhí)行以下命令苞七,即可使用該鏡像啟動一個 Docker容器

# docker run -d -p 92:80 nginx:qingfeng

4、訪問 http://Docker宿主機IP:92/挪丢,可看到下圖所示界面蹂风,

Dockerfile的文件編寫還有如下常用指令

注意:RUN命令在 image 文件的構(gòu)建階段執(zhí)行,執(zhí)行結(jié)果都會打包進入 image 文件乾蓬;CMD命令則是在容器啟動后執(zhí)行惠啄。另外,一個 Dockerfile 可以包含多個RUN命令巢块,但是只能有一個CMD命令礁阁。

注意:指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash)族奢,否則它會覆蓋CMD命令姥闭。

(四) .使用Dockerfile構(gòu)建微服務鏡像

以spring boot項目ms-eureka-server(源碼在最后)為例,該項目就是一個spring cloud eureka的微服務項目越走,該項目可通過spring boot的maven插件打包成可執(zhí)行的jar包運行棚品,如下圖所示

將該項目的可執(zhí)行jar包構(gòu)建成docker鏡像:

1靠欢、將jar包上傳linux服務器/app/eureka目錄,在jar包所在目錄創(chuàng)建名為Dockerfile的文件

2铜跑、在Dockerfile中添加以下內(nèi)容

# 基于哪個鏡像

From java:8

# 復制文件到容器

ADD microservice-eureka-server-0.0.1-SNAPSHOT.jar /app.jar

# 聲明需要暴露的端口

EXPOSE 8761 # 微服務項目的啟動端口

# 配置容器啟動后執(zhí)行的命令

ENTRYPOINT ["java","-jar","/app.jar"]

3门怪、使用docker build命令構(gòu)建鏡像

# docker build -t microservice-eureka-server:0.0.1 .

# 格式: docker build -t 鏡像名稱:標簽 Dockerfile的相對位置

在這里,使用-t選項指定了鏡像的標簽锅纺。執(zhí)行該命令后掷空,終端將會輸出如下的內(nèi)容

4、啟動鏡像囤锉,加-d可在后臺啟動

# docker run -p 8761:8761 microservice-eureka-server:0.0.1

5坦弟、訪問http://Docker宿主機IP:8761/,可正常顯示微服務Eureka Server的首頁

Java_蘇先生:專注于Java開發(fā)技術(shù)的研究與知識分享官地!
————END————

  • 點贊(感謝)
  • ...
  • 轉(zhuǎn)發(fā)(感謝)
  • ...
  • 關(guān)注(感謝)
  • ...

【推薦閱讀】

Java程序員備戰(zhàn)“金九銀十”必備的面試技巧(附攜程Java崗面試題)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酿傍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子驱入,更是在濱河造成了極大的恐慌赤炒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亏较,死亡現(xiàn)場離奇詭異莺褒,居然都是意外死亡,警方通過查閱死者的電腦和手機宴杀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門癣朗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旺罢,你說我怎么就攤上這事旷余。” “怎么了扁达?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵正卧,是天一觀的道長。 經(jīng)常有香客問我跪解,道長炉旷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任叉讥,我火速辦了婚禮窘行,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘图仓。我一直安慰自己罐盔,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布救崔。 她就那樣靜靜地躺著惶看,像睡著了一般捏顺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纬黎,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天幅骄,我揣著相機與錄音,去河邊找鬼本今。 笑死拆座,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的诈泼。 我是一名探鬼主播懂拾,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼煤禽,長吁一口氣:“原來是場噩夢啊……” “哼铐达!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起檬果,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤瓮孙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后选脊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杭抠,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年恳啥,在試婚紗的時候發(fā)現(xiàn)自己被綠了偏灿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡钝的,死狀恐怖翁垂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硝桩,我是刑警寧澤沿猜,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站碗脊,受9級特大地震影響啼肩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衙伶,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一祈坠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矢劲,春花似錦赦拘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儒陨。三九已至,卻和暖如春笋籽,著一層夾襖步出監(jiān)牢的瞬間蹦漠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工车海, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笛园,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓侍芝,卻偏偏與公主長得像研铆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子州叠,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容