服務部署與持續集成(一)
Dockerfile
什麼是Dockerfile?
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。
- 對於開發人員:可以爲開發團隊提供一個完全一致的開發環境;
- 對於測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件構建一個新
的鏡像開始工作了; - 對於運維人員:在部署時,可以實現應用的無縫移植。
常用命令列表
命令 | 作用 |
---|---|
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玩玩.工作之餘,注意享受生活.