1. 程式人生 > >Docker部署微服務詳解

Docker部署微服務詳解

2013年釋出至今,Docker一直廣受矚目,被認為可能會改變軟體行業。

但是,許多人並不清楚Docker 到底是什麼,要解決什麼問題,好處又在哪裡?今天就來詳細解釋,幫助大家理解它,還帶有簡單易懂的例項,教你如何將它用於日常開發。

 01 Docker簡介

Docker是一個開源的容器引擎,它有助於更快地交付應用。Docker可將應用程式和基礎設施層隔離,並且能將基礎設施當作程式一樣進行管理。

使用Docker可更快地打包、測試以及部署應用程式,並可以縮短從編寫到部署執行程式碼的週期。

Docker的優點如下:

1、簡化程式

Docker讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,便可以實現虛擬化。Docker改變了虛擬化的方式,使開發者可以直接將自己的成果放入Docker中進行管理。方便快捷已經是Docker的最大優勢,過去需要用數天乃至數週的任務,在Docker容器的處理下,只需要數秒就能完成

2、避免選擇恐懼症

如果你有選擇恐懼症,還是資深患者。Docker幫你打包你的糾結!比如Docker映象;Docker映象中包含了執行環境和配置,所以Docker可以簡化部署多種應用例項工作。比如Web應用、後臺應用、資料庫應用、大資料應用比如Hadoop叢集、訊息佇列等等都可以打包成一個映象部署。

3、節省開支

一方面,雲端計算時代到來,使開發者不必為了追求效果而配置高額的硬體,Docker改變了高效能必然高價格的思維定勢。Docker與雲的結合,讓雲空間得到更充分的利用。不僅解決了硬體管理的問題,也改變了虛擬化的方式。

02 Docker的架構

Docker daemon(Docker守護程序)

Docker daemon是一個執行在宿主機(DOCKER-HOST)的後臺程序。可通過 Docker客戶端與之通訊。

Client( Docker客戶端)

Docker客戶端是Docker的使用者介面,它可以接受使用者命令和配置標識,並與Docker daemon通訊。圖中,docker build等都是Docker的相關命令。

Images(Docker映象)

Docker映象是一個只讀模板,它包含建立 Docker容器的說明。它和系統安裝光碟有點像,使用系統安裝光碟可以安裝系統,同理,使用Docker映象可以執行Docker映象中的程式。

Container(容器)

容器是映象的可執行例項。映象和容器的關係有點類似於面向物件中,類和物件的關係。可通過Docker API或者CLI命令來啟停、移動、刪除容器。

Registry

Docker Registry是一個集中儲存與分發映象的服務。構建完 Docker映象後,就可在當前宿主機上執行。但如果想要在其他機器上執行這個映象,就需要手動複製。此時可藉助Docker Registry來避免映象的手動複製。

一個Docker Registry可包含多個Docker倉庫,每個倉庫可包含多個映象標籤,每個標籤對應一個Docker映象。這跟Maven的倉庫有點類似,如果把Docker Registry比作Maven倉庫的話,那麼Docker倉庫就可理解為某jar包的路徑,而映象標籤則可理解為jar包的版本號。

Docker Registry可分為公有Docker Registry和私有Docker Registry。最常用的Docker Registry莫過於官方的Docker Hub,這也是預設的Docker Registry。Docker Hub上存放著大量優秀的映象,我們可使用Docker命令下載並使用。

 03 Docker 的安裝

Docker是一個開源的商業產品,有兩個版本:社群版(Community Edition,縮寫為 CE)和企業版(Enterprise Edition,縮寫為 EE)。企業版包含了一些收費服務,個人開發者一般用不到。下面的介紹都針對社群版。

Docker CE的安裝請參考官方文件,我們這裡以CentOS為例:

1、Docker要求 CentOS 系統的核心版本高於3.10

通過uname -r 命令檢視你當前的核心版本

 #uname -r

2、使用 root 許可權登入 Centos。確保 yum 包更新到最新。

 #yum -y update

3、解除安裝舊版本(如果安裝過舊版本的話)

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

4、安裝需要的軟體包,yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的

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

5、設定yum源,並更新 yum 的包索引

` # yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo       # yum makecache fast`

6、可以檢視所有倉庫中所有docker版本,並選擇特定版本安裝

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

7、安裝docker

```

# yum install docker-ce  #由於repo中預設只開啟stable倉庫,故這裡安裝的是最新穩定版18.03.1

# yum install<FQPN>  # 例如:yum -y install docker-ce-18.03.1.ce

```

8、啟動並加入開機啟動

```

# systemctl start docker 

# systemctl enable docker

```

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

`# docker version`

10、解除安裝docker

`# yum -y remove docker-engine`

 04 Docker常用命令

映象相關命令

1、搜尋映象

可使用docker search命令搜尋存放在Docker Hub中的映象。執行該命令後,Docker就會在Docker Hub中搜索含有 java這個關鍵詞的映象倉庫。

`# docker search java`

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

- NAME:映象倉庫名稱。

- DESCRIPTION:映象倉庫描述。

- STARS:映象倉庫收藏數,表示該映象倉庫的受歡迎程度,類似於 GitHub的 stars0

- OFFICAL:表示是否為官方倉庫,該列標記為[0K]的映象均由各軟體的官方專案組建立和維護。

- AUTOMATED:表示是否是自動構建的映象倉庫。

注意:需要配置映象加速器

`# docker search java`

Error response from daemon: Get https://index.docker.io/v1/search?q=java: read tcp 52.200.132.201:443: i/o timeout

我們可以藉助阿里雲的映象加速器,登入阿里雲(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上下載映象,執行該命令後,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:映象建立時間。

- SIZE: 映象大小。

4、刪除本地映象

使用docker rmi命令即可刪除指定映象

`# docker rmi java`

## 05、容器相關命令

1、新建並啟動容器

使用以下docker run命令即可新建並啟動一個容器,該命令是最常用的命令,它有很多選項,下面將列舉一些常用的選項。

-d選項:表示後臺執行

-P選項:隨機埠對映

-p選項:指定埠對映,有以下四種格式。

-- ip:hostPort:containerPort

-- ip::containerPort

-- hostPort:containerPort

-- containerPort

--net選項:指定網路模式,該選項有以下可選引數:

--net=bridge:預設選項,表示連線到預設的網橋。

--net=host:容器使用宿主機的網路。

--net=container:NAME-or-ID:告訴 Docker讓新建的容器使用已有容器的網路配置。

--net=none:不配置該容器的網路,使用者可自定義網路配置。

`# docker run -d -p 91:80 nginx`

這樣就能啟動一個Nginx容器。在本例中,為docker run添加了兩個引數,含義如下:

-d 後臺執行

-p 宿主機埠:容器埠 #開放容器埠到宿主機埠

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

需要注意的是,使用docker run命令建立容器時,會先檢查本地是否存在指定映象。如果本地不存在該名稱的映象, Docker就會自動從Docker Hub下載映象並啟動一個 Docker容器。

2、列出容器

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

`# docker ps`

如需列出所有容器(包括已停止的容器),可使用-a引數。該列表包含了7列,含義如下

- CONTAINER_ID:表示容器 ID。

- IMAGE:表示映象名稱。

- COMMAND:表示啟動容器時執行的命令。

- CREATED:表示容器的建立時間。

- STATUS:表示容器執行的狀態。UP表示執行中, Exited表示已停止。

- PORTS:表示容器對外的埠號。

- NAMES:表示容器名稱。該名稱預設由 Docker自動生成,也可使用 docker run命令的--name選項自行指定。

3、停止容器

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

`# docker stop f0b1c8ab3633`

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

4、強制停止容器

可使用 docker kill命令傳送 SIGKILL訊號來強制停止容器

`# docker kill f0b1c8ab3633`

5、啟動已停止的容器

使用docker run命令,即可新建並啟動一個容器。對於已停止的容器,可使用 docker start命令來啟動

`# docker start f0b1c8ab3633`

6、檢視容器所有資訊

`# docker inspect f0b1c8ab3633`

7、檢視容器日誌

`# docker container logs f0b1c8ab3633`

8、檢視容器裡的程序

`# docker top f0b1c8ab3633`

9、進入容器

使用docker exec命令用於進入一個正在執行的docker容器。如果docker run命令執行容器的時候,沒有使用-it引數,就要用這個命令進入容器。一旦進入了容器,就可以在容器的 Shell 執行命令了

`# docker exec -it f0b1c8ab3633 /bin/bash`

10、刪除容器

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

`# docker rm f0b1c8ab3633`

該命令只能刪除已停止的容器,如需刪除正在執行的容器,可使用-f引數

06、將微服務執行在docker上

Dockerfile是一個文字檔案,其中包含了若干條指令,指令描述了構建映象的細節

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

1、新建資料夾/app,在app目錄下新建一個名為Dockerfile的檔案,在裡面增加如下內容:

FROM nginx

RUN echo '<h1>This is Tuling Nginx!!!</h1>' > /usr/share/nginx/html/index.html

該Dockerfile非常簡單,其中的 FORM、RUN都是 Dockerfile的指令。FROM指令用於指定基礎映象, RUN指令用於執行命令。

2、在Dockerfile所在路徑執行以下命令構建映象:

`# docker build -t nginx:tuling .`

其中,-t指定映象名字,命令最後的點(.)表示Dockerfile檔案所在路徑

3、執行以下命令,即可使用該映象啟動一個Docker容器

`# docker run -d -p 92:80 nginx:tuling`

4、訪問http://Docker宿主機IP:92/,可看到下圖所示介面

注意:RUN命令在image檔案的構建階段執行,執行結果都會打包進入image 檔案;CMD命令則是在容器啟動後執行。另外,一個Dockerfile 可以包含多個RUN命令,但是隻能有一個CMD命令。

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

 07、使用Dockerfile構建微服務映象

以專案05-ms-eureka-server為例,將該微服務的可執行jar包構建成docker映象

1、將jar包上傳linux伺服器/app/eureka目錄,在jar包所在目錄建立名為Dockerfile的檔案

2、在Dockerfile中新增以下內容

`# 基於哪個映象`

From java:8

`# 複製檔案到容器`

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

`# 宣告需要暴露的埠`

EXPOSE 8761

`# 配置容器啟動後執行的命令`

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

3、使用docker build命令構建映象

```

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

# 格式:docker build -t 映象名稱:標籤 Dockerfile的相對位置

```

在這裡,使用-t選項指定了映象的標籤。執行該命令後,終端將會輸出如下的內容

4、啟動映象,加-d可在後臺啟動

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

使用-v 可以掛載一個主機上的目錄到容器的目錄

`# docker run -p 8761:8761 -v /tmp:/tmp microservice-eureka-server:0.0.1`

5、訪問http://Docker宿主機IP:8761/,可正常顯示Eureka Server首頁

## 08、Docker虛擬化原理

傳統虛擬化和容器技術結構比較:傳統虛擬化技術是在硬體層面實現虛擬化,增加了系統呼叫鏈路的環節,有效能損耗;容器虛擬化技術以共享Kernel的方式實現,幾乎沒有效能損耗。

相關推薦

Docker部署服務

2013年釋出至今,Docker一直廣受矚目,被認為可能會改變軟體行業。 但是,許多人並不清楚Docker 到底是什麼,要解決什

服務(六):部署與測試

獨立部署和使用諸如Docker的容器來部署微服務,使用Docker將專案部署到AWS上。 可以利用Docker或者任何其他容器,可以簡化部署; 1.使用Netflix OSS的微服務架構概述 Netflix是微服務架構中的先鋒,通過他

零基礎用Docker部署服務

1. docker架構   這裡的Client和DOCKER_HOST(docker server)都是在本地的,docker倉庫Registry是在遠端的; Client的docker命令通過Docker daemon與docker server映象互動;

Docker $ 專案部署Docker 部署服務 + Mysql

一.準備工作 這裡以兩個專案為例: micro-servive-client micro-servive-server   這裡配置方面需要注意,服務提供者的host名稱為server的映象名,否則服務無法向註冊中心註冊。 eureka: client:

Docker部署服務(Cloud-Admin)

文章目錄 Docker的安裝 解除安裝舊版本 使用yum安裝 設定開機自啟和自動服務 建立docker使用者組

服務(五):實現服務

利用Spring Boot來實現領域驅動設計概念並將它們從核心Java轉換為預計Spring框架的模型; 利用Spring Clouded,它提供了一個雲就緒的解決方案。Spring Cloud也是用Spring Boot,它允許你使用嵌

web緩存服務器varnish-4.1.6的部署及配置

是否 次數 tool 至少 hits 檢查 rep nat list web緩存服務器varnish-4.1.6的部署及配置詳解 1.安裝varnish4.1.6安裝依賴 yum install -y autoconf automake jemalloc-devel li

Docker入門實戰(四)——基於jenkins部署服務

一、部署前端Vue專案 第一步、編寫構建指令碼xxx-build.sh port=xxx #根據埠號查詢對應的pid pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }'); #殺掉對應

docker服務部署之:六、Rancher管理部署服務

關系 本地倉庫 tab 滾動 hce 同學 官網 blog 學習 docker微服務部署之:五、利用DockerMaven插件自動構建鏡像 一、 什麽是Rancher Rancher是一個開源的企業級容器管理平臺。通過Rancher,企業再也不必自己使用一系列的開源軟件

Rsync 服務部署與引數

  Rsync 簡介 rsync 是一款開源的、快速的、多功能的、可實現全量及增量的本地或遠端資料同步備份的優秀工具。Rsync軟體適用於unix/linux/windows等多種作業系統平臺。 傳統的 scp 和 cp 工具拷貝每次均為完整拷貝,而rsync除了可以完整拷貝外,還具備增量拷貝功能。

Docker實戰 | 第二篇:IDEA整合Docker外掛實現一鍵自動打包部署服務專案,一勞永逸的技術手段值得一試

## 一. 前言 大家在自己玩微服務專案的時候,動輒十幾個服務,每次修改逐一部署繁瑣不說也會浪費越來越多時間,所以本篇整理通過一次性配置實現一鍵部署微服務,實現真正所謂的一勞永逸。 ## 二. 配置伺服器 ### 1. Docker安裝 伺服器需要安裝Docker,如未安裝參考這篇文章安裝即可 [

docker學習(3)--Dockfile

基於 環境 設置 多個 詳解 連接 當前 true truct   轉載請註明出處:http://www.cnblogs.com/lighten/p/6900556.html 1.基本說明   Dockfile是一個用於編寫docker鏡像生成過程的文件,其有特定的語法。在

深究AngularJS——自定義服務(factory、service、provider)

string targe 返回 config 屬性 doctype 三種方式 啟用 print 前言 3種創建自定義服務的方式。 Factory Service Provider 大家應該知道,AngularJS是後臺人員在工作之余發明的,他主要應用了後臺早就存

ftp文件共享服務

地址 關閉 ble conn 允許 window 自身 創建 跨平臺 ftp 文件共享服務,文件的上傳下載 跨平臺,tcp協議 21號(命令端口) 20號(數據端口,主動模式) 默認情況 ftp服務運行被動模式vsftpd:軟件 非常安全的rpm -qi vsftpdvs

ssh服務

linux什麽是opensshopenssl是使用ssh協議遠程登錄系統的連接工具。它能加密流量、防竊聽和其他攻擊。此外還能夠提供隧道功能、多種認證方法和復雜的配置選項;openssh是一組工具的集合,其套件包括三部分:遠程操作類 ssh、scp、sftp密鑰管理類 ssh-add、ssh-key

服務網址

architect redis命令參考 刪除 全文搜索 只需要 github 語言 open lib mongodb 配置文件: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

CentOS DNS服務與基於bind的智能DNS

cfa oba 主從 err 正向解析 程序 管理員 hint 查詢方式 Linux中通常使用bind來實現DNS服務器的架設 安裝bind 安裝DNS服務軟件Bind和相應工具包 #yum install bind bind-utils -y #service named

當我們需要部署服務的時候,哪個更好?

hit 額外 應用生命周期 更多 .html 服務架構 功能 ros 缺點 當我們需要部署微服務的時候,哪個更好?Spring Cloud還是Kubernetes?答案是都可以,只是各自有其優勢。 Spring Cloud 和 Kubernetes 都宣稱自己是開發和運行微

從 0 開始的服務架構:(五)代碼給你,看如何用Docker支撐服務

這一 復用 微軟 .com 擴展 版本發布 生產 通信 ibm 很好的一篇文章,全面、系統。 雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麽上來就

AngularJS 中的Promise --- $q服務

eject 標準 resolv ise comment 失敗 實例 方法 狀態 什麽是Promise Javascript中異步的實現方式有很多,延時函數、回調函數、以及es6新增的生成器函數,其中Promise也是實現異步的方式之一。 關於javascript中的異步