服務部署與持續集成(一)

服務部署與持續集成(一)

Dockerfile

什麼是Dockerfile?

Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。

  1. 對於開發人員:可以爲開發團隊提供一個完全一致的開發環境;
  2. 對於測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件構建一個新
    的鏡像開始工作了;
  3. 對於運維人員:在部署時,可以實現應用的無縫移植。

常用命令列表

命令 作用
FROM image_name:tag 定義了使用哪個基礎鏡像啓動構建流程
MAINTAINER user_name 聲明鏡像的創建者
RUN command 是Dockerfile的核心部分(可以寫多條)
ADD source_dir/file dest_dir/file 將宿主機的文件複製到容器內,如果是一個壓縮文件,將會在複製後自動解壓
COPY source_dir/fi ledest_dir/file 和ADD相似,但是如果有壓縮文件並不能解壓
ENV key value 設置變設置量 (可以設置多條)
WORKDIR path_dir 設置工作目錄
EXPOSE port1 prot2 用來指定端口,使容器內的應用可以通過端口和外界交互
CMD argument 在構建容器時使用,會被docker run 後的argument覆蓋
ENTRYPOINT argument 和CMD相似,但是並不會被docker run指定的參數覆蓋
VOLUME 將本地(宿主機)文件夾或者其他容器的文件掛載到容器中

更詳細的命令可參考:
命令解析
命令詳解

使用腳本製作Java鏡像

創建文件夾usr/local/dockerjava

mkdir –p /usr/local/dockerjdk

將下載好的jdk放在該目錄下

當前使用的是jdk-8u201-linux-x64.tar.gz

在該目錄下創建Dockerfile

vim Dockerfile

注意只能使用Dockerfile命名

#依賴鏡像名稱和ID
FROM centos:7
#指定鏡像創建者信息
MAINTAINER KL
#切換工作目錄
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相對路徑jar,把java添加到容器中
ADD jdk-8u201-linux-x64.tar.gz /usr/local/java/

#配置java環境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_201
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH
$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

執行命令構建鏡像

語法: docker build [OPTIONS] PATH | URL | -

docker build -t='jdk1.8' .

-t: 鏡像的名字及標籤
. 這裏的.代表當前目錄

Docker私有倉庫

私有倉庫搭建與配置

(1)拉取私有倉庫鏡像

docker pull registry

(2)啓動私有倉庫容器

docker run -di --name=registry -p 5000:5000 registry

(3)打開瀏覽器 輸入地址http://47.96.70.206:5000/v2/_catalog

看到 {“repositories”:[]} 表示私有倉庫搭建成功並且內容爲空

(4)修改daemon.json

vi /etc/docker/daemon.json

添加以下內容,保存退出。

{
"insecure‐registries":["47.96.70.206:5000"]
}

此步用於讓 docker信任私有倉庫地址

注意:更換自己的ip,另外如果你的內容格式錯誤,重啓時會報如下異常

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

(5)重啓docker 服務

systemctl restart docker

鏡像上傳至私有倉庫

(1)標記此鏡像爲私有倉庫的鏡像

語法: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

示例

docker tag jdk1.8 47.96.70.206:5000/jdk1.8

jdk1.8是源鏡像名稱
47.96.70.206:5000/jdk1.8是目標鏡像名稱

(2)上傳標記的鏡像

語法: docker push [OPTIONS] NAME[:TAG]

示例

docker push 47.96.70.206:5000/jdk1.8

過程可能有點慢

最後訪問你的鏡像私有庫http://47.96.70.206:5000/v2/_catalog,如果你的repositories中出現了jdk1.8,如下,說明push成功
{"repositories":["jdk1.8"]}

DockerMaven插件

微服務部署有兩種方法:
(1)手動部署:首先基於源碼打包生成jar包(或war包),將jar包(或war包)上傳至虛擬機並拷貝至JDK容器。

(2)通過Maven插件自動部署:對於數量衆多的微服務,手動部署無疑是非常麻煩的做法,並且容易出錯。所以我們這
裏學習如何自動部署,這也是企業實際開發中經常使用的方法。

Maven插件自動部署步驟:

(1)修改宿主機的docker配置,讓其可以遠程訪問

vi /lib/systemd/system/docker.service
其中ExecStart=後添加配置 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
修改後如下:

複製後別忘記,在此行的上一行末尾加上
(2)刷新配置,重啓服務

sudo systemctl daemon-reload
sudo systemctl restart docker

(3)在iot-server工程pom.xml 增加配置

<build>
		<finalName>app</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<!-- docker的maven插件,官網:https://github.com/spotify/docker-maven-plugin -->
			<plugin>
				<groupId>com.spotify</groupId>
				<artifactId>docker-maven-plugin</artifactId>
				<version>0.4.13</version>
				<configuration>
					<imageName>47.96.70.206:5000/${project.artifactId}:${project.version}</imageName>
					<baseImage>java</baseImage>
					<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
					<resources>
						<resource>
							<targetPath>/</targetPath>
							<directory>${project.build.directory}</directory>
							<include>${project.build.finalName}.jar</include>
						</resource>
					</resources>
					<dockerHost>http://47.96.70.206:2375</dockerHost>
				</configuration>
			</plugin>
		</plugins>
	</build>

(4)在iot-server工程的src/main目錄下創建docker目錄,目錄下創建Dockerfile文件,內容如下:

FROM jdk1.8
VOLUME /tmp
ADD app.jar app.jar
ENTRYPOINT ["java","‐jar","/app.jar"]

解釋下這個配置文件:

VOLUME 指定了臨時文件目錄爲 /tmp 。其效果是在主機 /var/lib/docker 目錄下創建了一個臨時文件,並鏈接到容器的 /tmp 。此步驟是可選的,如果涉及到文件系統的應用就很有必要了。 /tmp 目錄用來持久化到 Docker 數據文件夾,因爲 SpringBoot 使用的內嵌 Tomcat 容器默認使用 /tmp 作爲工作目錄項目的 jar 文件作爲 “app.jar” 添加到容器的ENTRYPOINT 執行項目 app.jar。

爲了縮短 Tomcat 啓動時間,添加一個系統屬性指向 “/dev/./urandom” 作爲 Entropy Source,比如ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"],爲何這樣做請猛擊

(5)在windows的命令提示符下,進入iot-server工程所在的目錄,輸入以下命令,進行打包和上傳鏡像

mvn clean package docker:build -DpushImage -DskipTests

執行後,代碼會正在上傳,這個過程可能會比較慢,最終構建並push成功.瀏覽器訪問 http://47.96.70.206:5000/v2/_catalog ,輸出

{"repositories":["dx-iot-server","jdk1.8"]}

代表成功.

(6)進入宿主機 , 查看鏡像

docker images
在這裏插入圖片描述

輸出如上內容,表示iotserver微服務已經做成鏡像
(7) 啓動容器:

docker run ‐di ‐‐name=iotserver -p 8099:8099 47.96.70.106:5000/iotserver:1.0‐SNAPSHOT
啓動時注意按照自己項目端口啓動.

總結

這篇文章重要介紹了Dockerfile和Docker私有倉庫的簡單配置,大家感興趣可以自己玩一下,上邊那個是我的服務器,快到期了,大家可以-DpushImage玩玩.工作之餘,注意享受生活.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章