docker中部署專案

panda-star發表於2020-09-24

docker中部署專案

一、簡介

這裡介紹在docker中部署自定義專案。

二、部署流程

在docker中部署自定義專案,流程為建立自定義專案、生成自定義專案映象、docker容器中執行專案映象。

2.1 建立自定義專案

這裡略過,根據需要建立。

2.2 生成目標映象

生成目標映象有兩種方式,一種是根據maven外掛生成,另一種根據定義Dockerfile檔案生成。

2.2.1 根據maven外掛生成映象

在pom.xml的外掛模組,新增類似如下配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <!-- docker 部署外掛 -->
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <!--將外掛繫結在某個phase執行-->
            <executions>
                <execution>
                    <id>build-image</id>
                    <!--繫結在package階段執行外掛,即執行mvn package時,就會自動執行mvn docker:build-->
                    <phase>package</phase>
                    <goals>
                        <goal>build</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!--指定映象名-->
                <imageName>${project.artifactId}</imageName>
                <!--指定標籤,即映象版本-->
                <imageTags>
                    <imageTag>latest</imageTag>
                </imageTags>
                <!--指定基礎映象jdk1.8-->
                <baseImage>java</baseImage>
                <!-- 映象製作人本人資訊  -->
                <maintainer>author_name</maintainer>
                <!--切換到指定目錄下,這裡為/home/app目錄-->
                <workdir>/home/app</workdir>
                <!--${project.build.finalName}.jar是打包後生成的jar包的名字-->
                <!-- jar包部署-->
                <entryPoint>["java", "-jar", "/home/app/${project.build.finalName}.jar"]</entryPoint>
                <!--指定docker服務地址-->
                <!-- <dockerHost>tcp://localhost:2375</dockerHost>-->
                <!-- 複製生成的jar包到docker容器指定目錄-->
                <resources>
                    <resource>
                        <!-- 將生成的jar包複製到容器指定路徑下-->
                        <targetPath>/home/app</targetPath>
                        <!--指定資源目錄,這裡為maven打包後的target目錄-->
                        <directory>${project.build.directory}</directory>
                        <!-- 指定需要複製的檔案,這裡為生成的jar包 -->
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
    </plugins>
</build>

接著執行mavan打包命令即可:

mvn clean package -Dmaven.test.skip=true
2.2.2 定義Dockerfile檔案生成

Dockerfile檔案用於生成映象,檔案內容可引數https://www.runoob.com/docker/docker-dockerfile.html。
常用定義含義如下:

FROM:指定新構建映象的基礎映象,如java專案則依賴於基礎java映象,對應書寫為:FROM java
RUN:在docker run 時執行,用於執行命令,格式為:RUN ["可執行檔案", "引數1", "引數2"],如:RUN ["java", "--version"],在shell下執行命令:java --version
COPY:從上下文目錄中複製檔案到指定目錄,格式為:COPY [--chown=<user>:<group>] <源路徑1>...  <目標路徑>,如:COPY target/hello-0.0.1-SNAPSHOT.jar / ,即將上下文下的target/hello-0.0.1-SNAPSHOT.jar檔案複製到容器的/目錄下
ADD:和COPY類似,推薦使用COPY
CMD:和RUN類似,在 docker build時執行
ENTRYPOINT:和CMD類似
ENV:設定環境變數,格式為:ENV <key> <value> 或 ENV <key1>=<value1> <key2>=<value2>...
ARG:構建引數,和ENV類似,僅在Dockerfile內有效,即僅在docker build過程中有效
VOLUME:定義掛載資料卷,預設會掛到匿名卷下,格式為:VOLUME ["<路徑1>", "<路徑2>"...] 或 VOLUME <路徑>
EXPOSE:宣告埠,方便在使用中對映,在使用中使用docker run -P隨機埠對映時,會隨機對映EXPOSE埠
WORKDIR:指定工作目錄,格式如:WORKDIR <工作目錄路徑>
USER:指定後續命令執行的使用者和使用者組,格式如:USER <使用者名稱>[:<使用者組>]

Dockerfile檔案放於專案根目錄下,接著執行格式如下的命令生成映象:

docker build -t 映象名稱:映象標籤  上下文路徑(需要打包複製到映象的目錄,未指定則預設是存放Dockerfile檔案的所在目錄)

如:

docker build -t spring_boot_docker_image:latest .

2.3 執行目標映象

執行目標映象,可以直接命令執行,也可以通過idea外掛執行。

2.3.1 命令執行

命令執行同其它映象執行一樣,示例如下:

docker run -d -p 20004:8051 --name spring_boot_docker spring_boot_docker_image
2.3.2 通過idea外掛執行

idea中通過外掛整合了docker功能,可以對docker中映象及容器進行管理。在操作前,提前安裝好idea及docker外掛。以專案部署為例,操作包含idea配置和目標專案配置,具體如下:

  1. idea配置

    1、idea控制介面,安裝docker外掛,Preferences | Plugins ->docker;
    2、idea控制介面,新增docker,Preferences | Build, Execution, Deployment | Docker -> 新增docker,並連線成功
    3、回到idea操作介面,選擇底部Services,在底部左則可看到安裝好的Docker,右鍵點選連線。下拉選項可以看到已經安裝的映象和容器
    
  2. 目標專案配置

    1、修改pom.xml,新增docker-maven-plugin外掛
    2、執行maven package,生成專案映象
    3、在idea操作介面services中的docker映象中,找到剛建立的專案映象,右鍵新建容器,在彈框中指定容器名稱、機器埠與容器埠對映關係
    4、執行新建立的容器,採用機器埠即可訪問docker容器中執行的映象
    

三、示例

這裡以部署自定義專案spring_boot_docker到docker為例,直接藉助idea的docker外掛部署。

3.1 建立自定義專案

示例自定義專案為spring_boot_docker,包含檔案如下:

maven配置檔案pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dragon.study</groupId>
    <artifactId>spring_boot_docker</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring_boot_docker</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- docker 部署外掛 -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <!--將外掛繫結在某個phase執行-->
                <executions>
                    <execution>
                        <id>build-image</id>
                        <!--繫結在package階段執行外掛,即執行mvn package時,就會自動執行mvn docker:build-->
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--指定映象名-->
                    <imageName>${project.artifactId}</imageName>
                    <!--指定標籤,即映象版本-->
                    <imageTags>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <!--指定基礎映象jdk1.8-->
                    <baseImage>java</baseImage>
                    <!-- 映象製作人本人資訊  -->
                    <maintainer>author_name</maintainer>
                    <!--切換到指定目錄下,這裡為/home/app目錄-->
                    <workdir>/home/app</workdir>
                    <!--${project.build.finalName}.jar是打包後生成的jar包的名字-->
                    <!-- jar包部署-->
                    <entryPoint>["java", "-jar", "/home/app/${project.build.finalName}.jar"]</entryPoint>
                    <!--指定docker服務地址-->
                    <!-- <dockerHost>tcp://localhost:2375</dockerHost>-->

                    <!-- 複製生成的jar包到docker容器指定目錄-->
                    <resources>
                        <resource>
                            <!-- 將生成的jar包複製到容器指定路徑下-->
                            <targetPath>/home/app</targetPath>
                            <!--指定資源目錄,這裡為maven打包後的target目錄-->
                            <directory>${project.build.directory}</directory>
                            <!-- 指定需要複製的檔案,這裡為生成的jar包 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

application.yaml檔案

spring:
  application:
    name: spring-boot-docker
server:
  port: 8051

HelloController.java類

package com.dragon.study.spring_boot_docker.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping
public class HelloController {
    @RequestMapping("hello")
    public String hello(){
        return "hello, nice to meet you";
    }
}

啟動類SpringBootDockerApplication.java

package com.dragon.study.spring_boot_docker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootDockerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDockerApplication.class, args);
    }
}

3.2 生成目標映象

在idea中選擇maven的package,對自定義專案spring_boot_docker打包,打完包。可以在docker外掛發現已經生成的包。當然也可以通過命令檢視:

docker images

3.3 執行目標映象

在idea的docker外掛中,選擇新生成的映象,並建立容器,指定埠對映(20004:8051)資訊,執行視窗即可,也可通過命令執行行執行,命令如下:

docker run -d -p 20004:8051 --name spring_boot_docker spring_boot_docker

3.4 測試

GET http://localhost:20004/hello
Accept: application/json

響應:

hello, nice to meet you

相關文章