Docker + SpringBoot2.0快速構建鏡像

博文連接java

Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的鏡像中,而後發佈到任何流行的 Linux或Windows 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。(引用官方概念,本文注重docker+springboot2.0快速構建鏡像,對docker更細節的知識不在作贅述)web

Docker

本文使用的是CentOs7spring

docker 安裝:docker

yum install docker
systemctl start docker 開啓dockershell

docker :修改拉取鏡像地址,docker使用默認的公用倉庫,在國內下載會比較慢json

建議使用ustc拉取
編輯宿主機器文件 : vi /etc/docker/daemon.json
沒有該文件,請先建立一個。
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
最後:重啓dokcer容器 systemctl restart dockervim

docker :經常使用命令windows

docker images 列出鏡像
docker rmi 鏡像 刪除鏡像
docker rm 容器id 移除容器
docker run -d --name 容器名稱 -p 端口 鏡像
docker start/stop 容器id 開啓/中止容器
docker rm 'docker ps -a -q' 刪除全部的容器
docker ps 查看正在運行的容器
docker ps -a 查看歷史運行過的容器
docker ps -l 查看最近運行過的容器centos

安裝私有倉庫

執行如下命令,會啓動一個registry容器,該容器用於提供私有倉庫的服務
沒有掛載目錄請先建立
docker run --name docker-registry -d -p 5000:5000 -v /usr/local/work/registry:/tmp/registry registryapi

**使用curl -X GET http://192.168.15.129:5000/v2/_catalog 查看私有倉庫的鏡像信息**
若是以前沒有建立過,則爲空
{"repositories":[]}

使docker 支持http推送鏡像
在/etc/docker/daemon.json中配置如下屬性,若是多個以逗號分隔。
{"insecure-registries":["192.168.15.129:5000","192.168.15.129"]}
在 /etc/containers/registries.conf中配置
[registries.search] registries = ['docker.io','registry.centos.org','registry.access.redhat.com','192.168.15.129:5000','192.168.15.129']

[registries.insecure] registries =["192.168.15.129:5000","192.168.15.129"]
地址是配置本身搭建的docker倉庫私服地址和域名
從新啓動Docker
systemctl restart docker .
從hub.docker.com中下載一個Tomcat鏡像。
使用docker images 查看鏡像信息,包括 IMAGE ID。

給該鏡像添加一個帶有私有倉庫的ip的tag
docker tag tomcat鏡像id 192.168.15.129:5000/tomcat

查看docker images 鏡像,多出一個打了tag的tomcat鏡像

推送鏡像
docker push 192.168.15.129:5000/tomcat

刪除從hub.docker.com中pull的鏡像

啓動私有倉庫鏡像
docker run --name tomcatpri -d -p 8080:8080 192.168.15.129:5000/tomcat

關閉防火牆,訪問Tomcat,成功!

使用docker部署SpringBoot

搭建一個簡單的SpringBoot 項目與Docker技術進行整合,使用maven來構建docker鏡像並推送至本地docker registry,最後對想不部署時只須要根據對應得鏡像啓動容器便可。

環境搭建

JDK1.8
SpringBoot2.0.6.RELEASE
Maven 3.6.0
Docker

建立一個SpringBoot項目
QQ圖片20191102233115.png

引入依賴配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.6.RELEASE</version>
</parent>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <docker.registry>192.168.15.129:5000</docker.registry>
  </properties>

  <dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
  
  <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- Docker maven plugin -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <!-- docker私服的地址 -->
                    <dockerHost>http://192.168.15.129:2375</dockerHost>
                    <!--鏡像名稱以及版本號-->
                    <imageName>${docker.registry}/${project.artifactId}:${project.version}</imageName>
                    <!--依賴的基礎鏡像-->
                    <baseImage>java</baseImage>
                    <!--Dockerfile的位置 -->
                 <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                    <!-- 這裏是複製 jar 包到 docker 容器指定目錄配置 -->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
            <!-- Docker maven plugin -->
        </plugins>
    </build>

編寫啓動類
QQ圖片20191102233115.png

編寫控制類,用於接收http請求
QQ圖片20191102234012.png

須要在src/main下面新建一個docker目錄,並新建一個Dockerfile文件

FROM java:8
    
    MAINTAINER lvy lvy@163.com
    
    VOLUME /tmp
    
    ADD docker_registry-0.0.1-RELEASE.jar docker_registry.jar
    
    RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' >/etc/timezone
    
    EXPOSE 9000
    
    ENTRYPOINT ["java", "-jar", "docker_registry.jar"]

對Dockerfile裏面的內容作一個簡單的介紹:

1.FROM:指明當前鏡像繼承的基礎鏡像,編譯當前鏡像時候會自動下載基鏡像
2.MAINTAINER:當前鏡像的做者和郵箱,使用空格隔開
3.VOLUME:掛載目錄
4.ADD:從當前工做目錄複製文件到鏡像目錄中並從新命名
5.RUN:在當前鏡像上執行Linux命令,,第二個run指令是爲了解決容器和宿主機時間不一致的問題
6.EXPOSE:監聽的端口號
7.ENTRYPOINT:讓容器像一個可執行程序同樣運行

項目構建

使用docker build對項目打包構建
mvn clean install -DskipTests docker:build

這時會報出一個錯誤
問題1:若是在pom文件裏面添加了<dockerHost>節點,並配置了地址是咱們搭建的私服地址的話,會報出404 NOT PAGE,若是沒有配置該節點會報出連接被拒絕的異常(Connection refused)

解決方案:添加一個``<dockerHost>``節點,值爲docker所在機器ip:2375,至於爲何要配置2375,後面會介紹。

問題2:這時在進行 ``mvn clean install -DskipTests docker:build``命令會報出一樣的錯誤,連接被拒絕。
致使緣由:
在默認狀況下Docker守護進程``Unit socket(/var/run/docker.sock)``來進行本地進程通訊,而不會監放任何端口,所以只能在本地使用docker客戶端或者使用docker api進行操做。若是想在其餘主機上操做docker主機,就須要讓docker守護進程打開一個http socket,這樣才能實現遠程通訊,咱們是在windows上打包構建的,因此須要讓centos7的docker服務開啓遠程訪問。
解決方案:
開啓docker遠程訪問,進入docker私服所在的服務器,編輯配置文件
``vim /usr/lib/systemd/system/docker.service``
在``docker.service``的``[Service]``下增長以下內容
```shell
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
```
注意,該端口不是docker私服所在的服務端口,是新開的遠程訪問端口。進行遠程通訊的。

一樣基於2的基礎上,咱們還要簡歷兩個軟鏈接,否則執行會報出找不到該命令

ln -s /usr/libexec/docker/docker-proxy-current /usr/bin/docker-proxy
 
 cd /usr/libexec/docker/
 ln -s docker-runc-current docker-runc

啓動

從新讀取配置文件並啓動docker

systemctl daemon-reload
systemctl restart docker

再次構建

mvn clean install -DskipTests docker:build
發現竟然成功了。對!就是這麼簡單。
QQ圖片20191102234012.png

查看鏡像,運行

使用docker images查看鏡像,就會發現剛剛的服務已被打包成鏡像了。
使用docker run命令就能夠啓動容器服務啦!
啓動時須要docker名稱+版本號爲鏡像名稱。否則可能找不到(本人機器上如此)
QQ圖片20191102234012.png

訪問服務成功

QQ圖片20191102234012.png

補充一點: maven 內置變量說明

${basedir} 項目根目錄
${project.build.directory} 構建目錄,缺省爲target
${project.build.outputDirectory} 構建過程輸出目錄,缺省爲target/classes ${project.build.finalName} 產出物名稱,缺省爲${project.artifactId}-${project.version} 當前版本 ${project.packaging} 打包類型,缺省爲jar

相關文章
相關標籤/搜索