利用docker搭建痊远、發(fā)布springboot項目(mac環(huán)境)

利用docker搭建、發(fā)布springboot項目(mac環(huán)境)

本文主要講解如何建立一個springboot項目氏捞,并通過docker搭建并發(fā)布的完整流程碧聪。
特別說明:

  • 本文章不會講解基礎,為實戰(zhàn)講解液茎,一些基礎的東西就請各位自行學習了逞姿。
  • 后續(xù)所有貼出來的下載地址,都是官網地址捆等,也可自行百度搜索滞造,不在贅述。

一栋烤、 環(huán)境搭建

  • 準備工作谒养,需要安裝java、maven明郭、idea买窟、docker、mysql薯定、redis

1.1 安裝java

  • 官網下載地址:https://www.oracle.com/java/technologies/javase-jdk16-downloads.html
  • 下載兩個版JDK
    • 一個是Mac版本的:jdk-16.0.1_osx-x64_bin.dmg 用于本機開發(fā)始绍。
    • 一個是Linux版本的,用于后續(xù)docker及服務器上部署:jdk-16.0.1_linux-x64_bin.tar.gz
  • 安裝JDK:雙擊dmg文件话侄,一直下一步即可亏推。
  • 安裝好后苛败,打開終端,輸入java命令和javac命令径簿,看下輸出罢屈。使用 /usr/libexec/java_home -V 命令,查找所安裝的java具體在哪篇亭。
    • image.png

1.2 安裝maven

  • 官網下載地址:https://maven.apache.org/download.cgi
  • 下載 apache-maven-3.8.1-bin.tar.gz
  • 雙擊解壓缠捌,然后移動到 /Library 下面。使用命令行 sudo mv apache-maven-3.8.1 /Library/
  • 配置maven译蒂,vi /Library/apache-maven-3.8.1/conf/settings.xml曼月,主要修改兩個配置:
    • 本地倉庫地址:<localRepository>/Users/sullivan/repo</localRepository> (這里本地倉庫地址,sullivan是我的電腦名柔昼,這里請?zhí)鎿QWie你自己的即可哑芹。)
    • 遠端鏡像倉庫地址:這里我們使用的是阿里云的倉庫地址。
<!-- 本地倉庫地址 -->
<localRepository>/Users/sullivan/repo</localRepository>
<!-- 遠端鏡像倉庫地址 -->
<mirrors>
  <mirror>
    <id>ali maven</id>
    <name>aliyun maven</name>
    <url>https://maven.aliyun.com/repository/public/</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>

1.3 安裝idea

  • 官網下載地址:https://www.jetbrains.com/idea/download/#section=mac
  • 下載Ultimate版本捕透,正常情況是可以試用30天的(請到某寶購買賬號)
  • 直接雙擊安裝聪姿,一直下一步即可
  • 配置idea:jdk和maven環(huán)境
    • jdk配置:File=>Project Structure=>Platform Settings=>SDKs,一般會直接出來乙嘀,沒有的話末购,使用命令行/usr/libexec/java_home -V獲得的JDK地址
    • image.png
    • maven配置:IntelliJ IDEA=>Preferences=>Build,Execution,Deployment=>Build Tools=>Maven
      然后在Maven home path,選擇我們下載的文件的地址虎谢,比如我的是:/Library/apache-maven-3.8.1
    • image.png

1.4 安裝docker

  • 官方下載地址:https://www.docker.com/products/docker-desktop
  • 下載:Mac with intel chip盟榴。
  • 直接雙擊安裝,一直下一步即可婴噩。安裝后擎场,在任務欄會出現一個小鯨魚,就安裝好了几莽。

這里單獨說下迅办,如何切換docker的數據源,用原本docker的源银觅,有可能下載很慢礼饱。我這里使用的是阿里云的源,登錄阿里云后究驴,可以在https://cr.console.aliyun.com/ap-southeast-1/instances/mirrors 找到阿里云的鏡像加速器,每個賬號都有一個自己的匀伏。然后在docker desktop的settings下的Docker Engine里面添加上源地址即可洒忧,然后保存重啟docker即可。

  "registry-mirrors": [
    "https://mayswc8m.mirror.aliyuncs.com"
  ],

1.5 安裝mysql够颠,基于docker安裝

  • 下載mysql的鏡像熙侍,使用命令:docker pull mysql:5.7.31 ,等待下載
  • 查看庫里面的鏡像,使用命令: docker images
    • image.png
  • 啟動容器蛉抓,使用命令: docker run -d --name my1 -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.31
  • -d 是表明后臺運行庆尘,否則退出終端后服務就停了
  • --name 設置docker容器的別名,后續(xù)啟停巷送、刪除等都可以用別名代替驶忌,不用輸入隨機字符串ID。
  • -p 設置端口映射笑跛,比如 -p 13306:3306 將容器內的mysql端口3306與本機的13306端口綁定付魔,就可以使用localhost的13306端口訪問mysql了。
  • -e MYSQL_ROOT_PASSWORD=123456 設置mysql的訪問密碼飞蹂,-e 是設置環(huán)境變量
  • 在最后面加上啟動的鏡像几苍,一定要加上版本號喲,否則會去下載最新的版本陈哑,又要重新下載鏡像了妻坝。
  • 安裝后,我們進行測試惊窖,先通過命令行測試

    • docker ps -a 通過這個命令惠勒,查看是否啟動成功,顯示的my1的STATUS是 Up 多少時間爬坑,就應該啟動成功了纠屋。
    • docker exec -it my1 bash 通過這個命令,我們進入到容器內部盾计,里面其實就是一個簡單的Linux系統(tǒng)
    • mysql -uroot -p123456 通過這個命令售担,我們就應該可以進入到mysql操作界面了。-u后面是數據庫用戶名署辉,-p后面是該用戶名的密碼族铆。你們按我上面說的命令啟動,這個密碼就應該可以進去哭尝。
  • 能夠到這里哥攘,就說明mysql啟動起來了,可以試試 show databases; 可以看看目前的數據庫材鹦。

    • image.png
  • 我們可以下載mysql的桌面客戶端逝淹,我用的是navicat for mysql,新建一個連接桶唐,然后連上去看看栅葡。

1.6 安裝redis,基于docker安裝

  • 下載redis的鏡像尤泽,使用命令:docker pull redis

  • 查看庫里面的鏡像欣簇,使用命令: docker images

    • image.png
  • 啟動容器规脸,命令為: docker run -d --name rd1 -p 16379:6379 redis --requirepass 123456 ,參數說明,請看docker安裝mysql里面的說明熊咽。再強調下莫鸭,這里沒有帶版本號,就是用的最新版本横殴。

  • 單獨說明下被因,最后的參數 --requirepass 是設置Redis密碼的
  • 進行測試,使用命令行進行驗證
    • docker exec -it rd1 redis-cli 這里的rd1是我啟動時設置的別名滥玷,然后就可以看到 127.0.0.1:6379> 就說明進去了氏身,可以直接試一下: set a 123 以及 get a,如果打印出來值惑畴,則說明搞定蛋欣。
    • 但是由于redis有密碼,而我們沒有用密碼登錄如贷,需要會報錯:(error) NOAUTH Authentication required.
    • 使用命令 auth 123456 即可陷虎,現在可以正常使用了。
    • image.png

二杠袱、編寫測試demo

2.1 新建一個項目

  • 新建一個項目尚猿,選擇Spring Initializr,根據下圖填寫內容
    • image.png
  • 選擇項目需要引入的第三方插件楣富,然后點擊完成
    • image.png
  • 編譯項目凿掂,Maven需要download很多包。耐心等待右下角的進度條完全走完
    • image.png
  • 點擊package纹蝴,會發(fā)現報錯庄萎,因為缺少一個插件。
    • image.png
  • 這里需要引入一個插件塘安,請打開pom.xml文件糠涛,在build下添加一個配置
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <skipTests>true</skipTests>
    </configuration>
</plugin>
    • image.png
  • 重新 package 之后,出現 [INFO] BUILD SUCCESS 就證明沒啥問題了兼犯。<br />

    注意:這個過程maven會去下載很多第三方插件忍捡,用于支持springboot、mysql切黔、redis等等砸脊,所以需要內心等等。

2.2 編寫一個接口

  • 新建一個java類绕娘,命名TestController.java

    • image.png
    • image.png
  • 編寫第一個接口

    • image.png
  • 添加配置文件脓规,我們使用的是yml格式,所以重命名一下 application.propertiesapplication.yml

    • image.png
  • 添加以下配置:

server:
  port: 8888 # 服務端口

spring:
  datasource:
    name: test  # 數據庫名
    url: jdbc:mysql://127.0.0.1:13306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false # url
    username: root  # 數據庫用戶名
    password: 123456  # 數據庫密碼
    driver-class-name: com.mysql.cj.jdbc.Driver  # 數據庫鏈接驅動
  redis:
    host: 127.0.0.1 # redis端口
    port: 16379 # redis端口
    password: 123456 # redis密碼
    database: 0
    • image.png
  • 啟動springboot服務

    • image.png
  • 打開瀏覽器訪問:http://127.0.0.1:8888/test/getString

    • image.png
  • 完成第一個接口的開發(fā)险领、啟動侨舆、測試訪問

2.3 編寫數據庫訪問接口

  • 創(chuàng)建數據庫,腳本如下:
CREATE DATABASE `test`;
USE `test`;

CREATE TABLE `user` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL,
  `password` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

insert into user(id, username, password) values(0, '張三', '111111');
insert into user(id, username, password) values(0, '李四', '222222');
select * from user;
    • image.png
  • 修改pom.xml文件绢陌,修改mysql版本號挨下、添加mybatis依賴

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
  • 添加4個包,controller脐湾,service臭笆,mapper,entity

    • image.png
  • 添加實體對象秤掌,entity:User.java

    • image.png
  • 創(chuàng)建mapper接口愁铺,mapper:UserMapper.java

    • image.png
  • 創(chuàng)建service實現,service:UserService.java

    • image.png
  • 創(chuàng)建controller類闻鉴, controller:UserController.java

    • image.png
  • 創(chuàng)建mybatis的sql映射文件茵乱,在resources下創(chuàng)建文件夾(Directory):mapping

    • image.png
  • 創(chuàng)建映射文件,mapping:UserMapping.xml

    • image.png
  • 修改主入口文件孟岛,TestDemoApplication.java

    • image.png
  • 在yml文件中添加mybatis配置

    • image.png
  • 啟動服務瓶竭,先clean,在run

    • image.png
  • 測試訪問渠羞,http://127.0.0.1:8888/user/getUserById?id=1

    • image.png
  • 完成

三斤贰、發(fā)布應用

3.1 本機docker環(huán)境打包運行

  • 下載鏡像:ubuntu:18.04 使用命令:docker pull ubuntu:18.04

    • image.png
  • 配置Dockerfile文件。創(chuàng)建文件夾:DockerImage次询,在里面創(chuàng)建文件:Dockerfile

FROM ubuntu:18.04

WORKDIR /root

ENV LANG=C.UTF-8
ENV JAVA_HOME=/java
ENV PATH=$PATH:$JAVA_HOME/bin

RUN apt update && apt install -y --no-install-recommends fontconfig curl telnet iputils-ping vim \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /var/log/*

VOLUME /java
  • 打包我們自己的鏡像荧恍,使用命令 docker build -t testdi .

    • image.png
  • 獲取mysql和redis的docker容器的ip,使用命令:docker inspect my1 | grep IPAddressdocker inspect rd1 | grep IPAddress 查詢到IP

    • image.png
  • 修改yml配置文件屯吊,修改mysql連接的ip和端口送巡,redis連接的ip和端口

server:
  port: 8888 # 服務端口

spring:
  datasource:
    name: test  # 數據庫名
    url: jdbc:mysql://172.17.0.2:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false # url
    username: root  # 數據庫用戶名
    password: 123456  # 數據庫密碼
    driver-class-name: com.mysql.cj.jdbc.Driver  # 數據庫鏈接驅動
  redis:
    host: 172.17.0.3 # redis端口
    port: 6379 # redis端口
    password: 123456 # redis密碼
    database: 0

mybatis:
  mapper-locations: classpath:mapping/*Mapping.xml  #mapping文件所在位置
  type-aliases-package: com/ske/test/testdemo
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #開啟mybatis日志
  • 修改maven配置文件
<?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.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ske.test</groupId>
    <artifactId>testdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>testdemo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>16</java.version>

        <!--是否跳過spring-boot-maven-plugin, 依賴項目需要設置為true-->
        <skip.boot>false</skip.boot>
        <!--是否跳過打包為docker鏡像, 默認為true, 即不打包為鏡像-->
        <skip.docker>false</skip.docker>
        <!--是否推送鏡像到鏡像倉庫, 默認為false, 即不推送-->
        <image.push>false</image.push>
        <!--基礎鏡像-->
        <image.base>testdi</image.base>
        <!--遠程docker地址-->
        <docker.host/>
        <!--docker認證ca-->
        <docker.ca/>
        <image.name>${project.artifactId}:latest</image.name>

    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <skip>${skip.boot}</skip>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>timestamp-property</goal>
                        </goals>
                        <configuration>
                            <name>build.time</name>
                            <pattern>yyyyMMdd.HHmmss</pattern>
                            <timeZone>GMT+8</timeZone>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <skipDocker>${skip.docker}</skipDocker>
                    <imageName>${image.name}</imageName>
                    <imageTags>
                        <imageTag>latest</imageTag>
                        <imageTag>v${build.time}</imageTag>
                    </imageTags>
                    <pushImage>${image.push}</pushImage>

                    <baseImage>${image.base}</baseImage>
                    <user>root</user>
                    <workdir>/export/servers</workdir>
                    <runs>
                        <run>mkdir -p /export/tmp</run>
                    </runs>
                    <cmd>["sh", "-c", "java -server -Djava.io.tmpdir=/export/tmp $OPTIONS -Djava.security.egd=file:/dev/./urandom -jar ${project.build.finalName}.jar"]</cmd>
                    <dockerHost>${docker.host}</dockerHost>
                    <dockerCertPath>${docker.ca}</dockerCertPath>
                    <resources>
                        <resource>
                            <targetPath>/export/servers</targetPath>
                            <!--jar 包所在的路徑  此處配置的 即對應 target 目錄-->
                            <directory>${project.build.directory}</directory>
                            <!-- 需要包含的 jar包 ,這里對應的是 Dockerfile中添加的文件名 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
  • 主要修改點:

    • 修改了artifactId雌芽,必須改為全小寫授艰,否則打包會報錯
    • 修改了properties,添加一些參數
    • 修改了build世落,修改了打包方式
  • 啟動淮腾,使用命令:docker run -d -v /Users/sullivan/jdk-16.0.1:/java -p8888:8888 --name td --rm testdemo:latest

特別說明,這里需要使用Linux版本的JDK屉佳,之前下載的時候谷朝,已經提示過下載Linux版本的JDK了,解壓后武花,在命令中使用這個版本的JDK路徑

  • 可以通過瀏覽器訪問了圆凰,輸入地址:http://127.0.0.1:8888/user/getUserById?id=1
  • 查看日志,使用命令:docker logs -f td
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末体箕,一起剝皮案震驚了整個濱河市专钉,隨后出現的幾起案子挑童,更是在濱河造成了極大的恐慌,老刑警劉巖跃须,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件站叼,死亡現場離奇詭異,居然都是意外死亡菇民,警方通過查閱死者的電腦和手機尽楔,發(fā)現死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來第练,“玉大人阔馋,你說我怎么就攤上這事〗刻停” “怎么了呕寝?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驹碍。 經常有香客問我壁涎,道長,這世上最難降的妖魔是什么志秃? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任怔球,我火速辦了婚禮,結果婚禮上浮还,老公的妹妹穿的比我還像新娘竟坛。我一直安慰自己,他們只是感情好钧舌,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布担汤。 她就那樣靜靜地躺著,像睡著了一般洼冻。 火紅的嫁衣襯著肌膚如雪崭歧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天撞牢,我揣著相機與錄音率碾,去河邊找鬼。 笑死屋彪,一個胖子當著我的面吹牛所宰,可吹牛的內容都是我干的。 我是一名探鬼主播畜挥,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仔粥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起躯泰,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤谭羔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后斟冕,有當地人在樹林里發(fā)現了一具尸體口糕,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡缅阳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年磕蛇,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片十办。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秀撇,死狀恐怖,靈堂內的尸體忽然破棺而出向族,到底是詐尸還是另有隱情呵燕,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布件相,位于F島的核電站再扭,受9級特大地震影響,放射性物質發(fā)生泄漏夜矗。R本人自食惡果不足惜泛范,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望紊撕。 院中可真熱鬧罢荡,春花似錦、人聲如沸对扶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浪南。三九已至笼才,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間络凿,已是汗流浹背骡送。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喷众,地道東北人各谚。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像到千,于是被迫代替她去往敵國和親昌渤。 傳聞我的和親對象是個殘疾皇子曹锨,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容