docker部署springboot項目猿妈,并訪問docker中部署的mysql與mongdoDB

解決的問題

  1. docker中的springboot項目訪問docker中的mysql和mongo

  2. MongoDB連接報錯

    org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='admin', source='pet', password=<hidden>, mechanismProperties=<hidden>}; nested exception is com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='admin', source='pet', password=<hidden>, mechanismProperties=<hidden>}
     at com.zxmt.app.AppApplicationTests.contextLoads(AppApplicationTests.java:72)
    Caused by: com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='admin', source='pet', password=<hidden>, mechanismProperties=<hidden>}
     at com.zxmt.app.AppApplicationTests.contextLoads(AppApplicationTests.java:72)
    Caused by: java.lang.IllegalArgumentException: Prohibited character at position 0
     at com.zxmt.app.AppApplicationTests.contextLoads(AppApplicationTests.java:72)
    
  3. 跳過SpringBoot打包測試

先看一下最開始的配置

  • application.yml

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/pet?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: 123456
      data:
        mongodb:
          host: localhost
          port: 27017
          username: admin
          password: 123456
          database: pet
    
  • docker 安裝mysql與mongo

將項目打包成為jar包拿穴,并上傳到服務器

? 打包的時候,項目會進行測試祈争,然后會出現(xiàn)一個問題稼虎。就是mongodb連接報錯,這個問題是由于我們使用分開寫配置文件选调,host,port,database這種造成的夹供,具體原因我也不太清楚灵份,有人說是jdk版本問題仁堪,所以直接換成uri模式

org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='admin', source='pet', password=<hidden>, mechanismProperties=<hidden>}; nested exception is com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='admin', source='pet', password=<hidden>, mechanismProperties=<hidden>}
    at com.zxmt.app.AppApplicationTests.contextLoads(AppApplicationTests.java:72)
Caused by: com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='admin', source='pet', password=<hidden>, mechanismProperties=<hidden>}
    at com.zxmt.app.AppApplicationTests.contextLoads(AppApplicationTests.java:72)
Caused by: java.lang.IllegalArgumentException: Prohibited character at position 0
    at com.zxmt.app.AppApplicationTests.contextLoads(AppApplicationTests.java:72)
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/pet?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
  data:
    mongodb:
    # 重點:mongodb://用戶名:密碼@localhost:27017/數(shù)據(jù)庫名
      uri: mongodb://admin:123456@localhost:27017/pet
image.png

在jar文件同級目錄新建Dockerfile,內(nèi)容如下

FROM java:8-alpine
ADD app-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

然后在當前目錄執(zhí)行(最后有一個點,表示上下文 ):docker build -t pet-app .

因為docker中運行著mysql和mongo填渠,所以我們直接開始運行pet-app這個自己打包的鏡像

dokcer run -d -p 8080:8080 --name pet-app pet-app

-d 表示后臺運行, --name 表示取一個別名 ,最后一個pet-app表示剛才的鏡像名稱

OK問題來了

你以為一切很順利弦聂,但是你訪問接口會發(fā)現(xiàn)錯誤

Error querying database.  Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.\n### The error may exist in com/zxmt/app/mapper/AgreementMapper.java (best guess)\n### The error may involve com.zxmt.app.mapper.AgreementMapper.selectById\n### The error occurred while executing a query\n### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up."

這個問題就是,docker中的springboot沒能通過localhost:3306訪問到數(shù)據(jù)庫氛什,同時mongo也是訪問不到

解決方案1:直接將localhost改為服務器地址就可以了莺葫,相當于docker中的服務通過網(wǎng)絡訪問服務器端口,服務器再訪問docker枪眉。(⊙o⊙)…這個決絕辦法有點low

解決方案2:使用docker中的--link參數(shù)

  1. 先修改配置文件捺檬。將原來的主機地址都取一個別名例如下面的mysql,mongo

    spring:
      datasource:
        url: jdbc:mysql://mysql:3306/pet?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: 123456
      data:
        mongodb:
          uri: mongodb://admin:123456@mongo:27017/pet
    
  2. 因為改了這個配置文件,打包的時候會進行測試贸铜,(你想你都寫成jdbc:mysql://mysql:3306這樣了堡纬,測試能通過嗎)所以現(xiàn)在需要配置跳過測試(在pom的properties中加代碼)

    <properties>
           <skipTests>true</skipTests>
    </properties>
    
  3. 還是Dockerfile打包成鏡像

  4. 最后是通過鏡像啟動容器的代碼!!!!重點

    docker run -p 8080:8080 -d --link=mysql:mysql --link=mongo:mongo  --name pet-app  pet-app
    

    --link:前面的mysql表示啟動的容器的名稱,后面是別名名稱對應上面的配置文件中的mysql

    jdbc:mysql://mysql:3306/pet?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false

    當然mongo也是一樣蒿秦。烤镐。

    再把之前的錯誤啟動方式貼一次對比一下

    # 錯誤的
    dokcer run -d -p 8080:8080 --name pet-app pet-app
    #正確的
    docker run -p 8080:8080 -d --link=mysql:mysql --link=mongo:mongo  --name pet-app  pet-app
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棍鳖,隨后出現(xiàn)的幾起案子炮叶,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镜悉,死亡現(xiàn)場離奇詭異祟辟,居然都是意外死亡,警方通過查閱死者的電腦和手機积瞒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門川尖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茫孔,你說我怎么就攤上這事叮喳。” “怎么了缰贝?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵馍悟,是天一觀的道長。 經(jīng)常有香客問我剩晴,道長锣咒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任赞弥,我火速辦了婚禮毅整,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绽左。我一直安慰自己悼嫉,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布拼窥。 她就那樣靜靜地躺著戏蔑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲁纠。 梳的紋絲不亂的頭發(fā)上总棵,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音改含,去河邊找鬼情龄。 笑死,一個胖子當著我的面吹牛捍壤,可吹牛的內(nèi)容都是我干的骤视。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼白群,長吁一口氣:“原來是場噩夢啊……” “哼尚胞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起帜慢,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤笼裳,失蹤者是張志新(化名)和其女友劉穎唯卖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躬柬,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡拜轨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了允青。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橄碾。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖颠锉,靈堂內(nèi)的尸體忽然破棺而出法牲,到底是詐尸還是另有隱情,我是刑警寧澤琼掠,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布拒垃,位于F島的核電站,受9級特大地震影響瓷蛙,放射性物質(zhì)發(fā)生泄漏悼瓮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一艰猬、第九天 我趴在偏房一處隱蔽的房頂上張望横堡。 院中可真熱鬧,春花似錦冠桃、人聲如沸命贴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽套么。三九已至培己,卻和暖如春碳蛋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背省咨。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工肃弟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人零蓉。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓笤受,卻偏偏與公主長得像,于是被迫代替她去往敵國和親敌蜂。 傳聞我的和親對象是個殘疾皇子箩兽,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容