1、docker簡(jiǎn)介
Docker 是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的鏡像中,然后發(fā)布到任何流行的 Linux或Windows 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口
2、docker優(yōu)點(diǎn)
簡(jiǎn)化配置
虛擬機(jī)的最大好處是能在你的硬件設(shè)施上運(yùn)行各種配置不一樣的平臺(tái)(軟件, 系統(tǒng)), Docker在降低額外開銷的情況下提供了同樣的功能. 它能讓你將運(yùn)行環(huán)境和配置放在代碼匯總?cè)缓蟛渴? 同一個(gè)Docker的配置可以在不同的環(huán)境環(huán)境中使用, 這樣就降低了硬件要求和應(yīng)用環(huán)境之間耦合度.代碼流水線管理
代碼從開發(fā)者的機(jī)器到最終在生產(chǎn)環(huán)境上的部署, 需要經(jīng)過很多的中間環(huán)境. 而每一個(gè)中間環(huán)境都有自己微小的差別, Docker給應(yīng)用提供了一個(gè)從開發(fā)到上線均一致的環(huán)境, 讓代碼的流水線變得簡(jiǎn)單不少.提升開發(fā)效率
不同環(huán)境中, 開發(fā)者的共同目標(biāo):
1)想讓開發(fā)環(huán)境盡量貼近生產(chǎn)環(huán)境.
2)想快速搭建開發(fā)環(huán)境
開發(fā)環(huán)境的機(jī)器通常內(nèi)存比較小, 使用虛擬機(jī), 經(jīng)常需要為開發(fā)環(huán)境的機(jī)器加內(nèi)存, 而現(xiàn)在Docker可以輕易的讓幾十個(gè)服務(wù)在Docker中跑起來.隔離應(yīng)用
開發(fā)時(shí)會(huì)在一個(gè)臺(tái)機(jī)器上運(yùn)行不同的應(yīng)用:
1)為了降低成本, 進(jìn)行服務(wù)器整合
2) 將一個(gè)整體式的應(yīng)用拆分成低耦合的單個(gè)服務(wù)(微服務(wù)架構(gòu))整合服務(wù)器
Docker隔離應(yīng)用的能力使得Docker可以整合多個(gè)服務(wù)器以降低成本. 由于沒有多個(gè)操作系統(tǒng)的內(nèi)存占用, 以及能在多個(gè)實(shí)例之間共享沒有使用的內(nèi)存, Docker可以比虛擬機(jī)提供更好的服務(wù)器整合解決方案.快速部署
Docker為進(jìn)程創(chuàng)建一個(gè)容器, 不需要啟動(dòng)一個(gè)操作系統(tǒng), 時(shí)間縮短為秒級(jí)別.
可以在數(shù)據(jù)中心創(chuàng)建銷毀資源而無須擔(dān)心重新啟動(dòng)帶來的開銷. 通常數(shù)據(jù)中心的資源利用率只有30% , 通過使用Docker并進(jìn)行有效的資源分配可以提高資源的利用率.
3、準(zhǔn)備工作
環(huán)境條件:
- linux系統(tǒng),不建議windows
- docker最新版本
- jdk 1.8
- maven3.0
采用maven的方式去構(gòu)建項(xiàng)目,并采用docker-maven-plugin去構(gòu)建docker鏡像。
4、構(gòu)建eureka服務(wù)鏡像
1)在pom文件加上插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
Spotify 的 docker-maven-plugin 插件是用maven插件方式構(gòu)建docker鏡像的。
- imageName指定了鏡像的名字
- dockerDirectory指定 Dockerfile 的位置
- resources是指那些需要和 Dockerfile 放在一起,在構(gòu)建鏡像時(shí)使用的文件,一般應(yīng)用 jar 包需要納入。
2)修改下配置文件:
server:
port: 8761
eureka:
instance:
prefer-ip-address: true
client:
registerWithEureka: false
fetchRegistry: false
3)編寫dockerfile文件:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD eureka-server-0.0.1-SNAPSHOT.jar app.jar
#RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8761
4)docker file編寫指令:
- FROM
FROM <image>
FROM <image>:<tag>
FROM <image> <digest>
FROM指令必須指定且需要在Dockerfile其他指令的前面,指定的基礎(chǔ)image可以是官方遠(yuǎn)程倉(cāng)庫中的,也可以位于本地倉(cāng)庫。后續(xù)的指令都依賴于該指令指定的image。當(dāng)在同一個(gè)Dockerfile中建立多個(gè)鏡像時(shí),可以使用多個(gè)FROM指令。
- VOLUME
格式為:
VOLUME ["/data"]
使容器中的一個(gè)目錄具有持久化存儲(chǔ)數(shù)據(jù)的功能,該目錄可以被容器本身使用,也可以共享給其他容器。當(dāng)容器中的應(yīng)用有持久化數(shù)據(jù)的需求時(shí)可以在Dockerfile中使用該指令。
ADD
從src目錄復(fù)制文件到容器的dest。其中src可以是Dockerfile所在目錄的相對(duì)路徑,也可以是一個(gè)URL,還可以是一個(gè)壓縮包ENTRYPOINT
指定Docker容器啟動(dòng)時(shí)執(zhí)行的命令,可以多次設(shè)置,但是只有最后一個(gè)有效。EXPOSE
為Docker容器設(shè)置對(duì)外的端口號(hào)。在啟動(dòng)時(shí),可以使用-p選項(xiàng)或者-P選項(xiàng)。
5) 構(gòu)建鏡像
執(zhí)行構(gòu)建docker鏡像maven命令:
mvn clean
mvn package docker:build

構(gòu)建eureka-server鏡像成功。
5、構(gòu)建service-hi鏡像
- pom文件導(dǎo)入同eurek-server
- 修改下配置文件:
eureka:
client:
serviceUrl:
defaultZone: http://eureka-server:8761/eureka/
server:
port: 8763
spring:
application:
name: service-hi
在這里說下:defaultZone發(fā)現(xiàn)服務(wù)的host改為鏡像名。
- dockefile 編寫同eureka-server
- 構(gòu)建鏡像:
mvn clean
mvn package docker:build

這時(shí)我們運(yùn)行docke的eureka-server 和service-hi鏡像:
docker run -p 8761: 8761 -t forezp/eureka-server
docker run -p 8763: 8763 -t forezp/service-hi
訪問localhost:8761

6、采用docker-compose啟動(dòng)鏡像
Compose 是一個(gè)用于定義和運(yùn)行多容器的Docker應(yīng)用的工具。使用Compose,你可以在一個(gè)配置文件(yaml格式)中配置你應(yīng)用的服務(wù),然后使用一個(gè)命令,即可創(chuàng)建并啟動(dòng)配置中引用的所有服務(wù)。下面我們進(jìn)入Compose的實(shí)戰(zhàn)吧。
采用docker-compose的方式編排鏡像,啟動(dòng)鏡像:
version: '3'
services:
eureka-server:
image: forezp/eureka-server
restart: always
ports:
- 8761:8761
service-hi:
image: forezp/service-hi
restart: always
ports:
- 8763:8763
輸入命令: docker-compose up

7、采用docker-compose編排并啟動(dòng)鏡像
docker-compose也可以構(gòu)建鏡像,現(xiàn)在我們采用docker-compose的方式構(gòu)建鏡像。
現(xiàn)在以eureka-server為例: 將Dockerfile移到eureka-server的主目錄,改寫ADD的相對(duì)路徑:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD ./target/eureka-server-0.0.1-SNAPSHOT.jar app.jar
#RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8761
同理修改service-hi目錄;
編寫構(gòu)建鏡像docker-compose-dev文件:
version: '3'
services:
eureka-server:
build: eureka-server
ports:
- 8761:8761
service-hi:
build: service-hi
ports:
- 8763:8763
命令構(gòu)建鏡像并啟動(dòng):
docker-compose -f docker-compose.yml -f docker-compose-dev.yml up
