Docker部署啟動錯誤,需要手動進入Docker的容器里,啟動程序,排查錯誤


 

#docker-compose build --no-cache //重新創建容器,不管有沒有
#docker-compose up
#docker-compose up -d  //后台啟動並運行容器,如果沒有會先執行build,如果有只啟動
#docker-compose build --no-cache && docker-compose up -d

 asp.net core 

#docker run -it --rm --entrypoint /bin/bash tlz.netcore.ssodemo:1.0

進入docker容器里面,啟動運行asp.net core的程序

#dotnet TLZ.COM.NetCore.View.SSODemo.dll   手動在容器里運行程序,觀察運行時的錯誤

 redis.Docker.json ,redis容器名稱通過docker ps 查看 name字段得到,文章下面有

{
  "Redis": {
    "AutoStart": true,
    "DbIndex": 1,
    "Password": "315360007",
    "AllowAdmin": true,
    "AbortConnect": false,
    "ReadWriteHost": [ "trusting_euclid:6379" ],
    "ReadOnlyHost": [],
    "MaxWritePoolSize": 65000,
    "MaxReadPoolSize": 65000,
    "ConnectTimeout": 1000,
    "DistributedCacheEnabled": true,
    "ApplicationDiscriminator": "6A9C3ED7EAC624E4FF988388627D723CB53C9542863F0B286A6482709BA7E141",
    "DataProtectionKey": "AspNetCore-DataProtection-Redis-Keys"
  }
}

再次進入Docker容器里面,查看hosts文件,和命令行方式運行dotnet程序並且指定運行時的環境變量

#docker run -it  --rm --entrypoint /bin/bash --link trusting_euclid  tlz.netcore.ssodemo:1.0  ( trusting_euclid  是 redis容器的NAMES)
#cat /etc/hosts
#dotnet TLZ.COM.NetCore.View.SSODemo.dll --environment=Docker

#docker run -it --rm -p 27777:7777 --link trusting_euclid --network bridge dotnetcore/easyui /bin/bash
#dotnet TLZ.COM.NetCore.View.EasyUIDemo.dll --environment=Docker

ASP.NET Core 發布之后通過命令控制監聽地址和環境變量

java & springboot 

#docker run -it --rm --entrypoint /bin/bash  tb.com.sbmsm.demo:1.0

#java -jar tb.easyuidemo.jar --spring.profiles.active=docker  手動在容器里運行程序,觀察運行時的錯誤

 找不到設置的數據庫連接地址。之前是192.168.0.82,現在改成heuristic_stallman,因為同一個宿主機,不同的docker容器之間沒法互相通信。

 查看hosts文件,發現沒有heuristic_stallman

cat /etc/hosts

 換一種方式運行,增加heuristic_stallman,同時設置訪問端口

docker run -it  --rm --entrypoint /bin/bash -p 18090:8090 --link heuristic_stallman tb.com.sbmsm.demo:1.0

查看hosts文件,發現有了heuristic_stallman

cat /etc/hosts

 這時候在運行java的程序就可以了,同時由於運行容器的時候指定了訪問端口,通過瀏覽器也可以訪問到了。

#java -jar tb.easyuidemo.jar --spring.profiles.active=docker  手動在容器里運行程序,觀察運行時的錯誤

#同一台宿主機里面的多個docker容器,運行一個docker容器的java程序,連另一個運行docker容器里面的mysql,默認是連接不通的。

#原因為本機內部的多個docker容器在運行互相連接時,沒有通過本機的防火牆,默認是無法互聯的。

 修改程序數據庫連接字符串,寫上mysql的docker運行時的名字

 直接通過命令的方式運行進入docker指定的鏡像容器里面,查看容器里hosts的信息,注意:現在用的是openjdk8的鏡像啟動的,並且指定link和workdir

#docker run --rm --workdir /app --link heuristic_stallman -it openjdk:8 /bin/bash
#cat /etc/hosts    手動在容器里運行程序,查看容器里面hosts的信息

 用下面的方式,運行之后程序就可以通了,但是docker里面並沒有將這個java程序打包進去。繼續往下

查看linxu里面需要運行的java程序位置。

#ll /data/web/springboot/deploy

直接通過命令的方式運行進入docker指定的鏡像容器里面

注意:現在用的是openjdk的鏡像啟動的,並且使用數據卷的方式,將外部java程序的目錄進行映射到容器里,運行java的jar程序是在linux系統里面,並不是在docker容器里面的jar程序,繼續指定link,同時指定端口后,運行之后可以通過瀏覽器訪問了。

#docker run --rm -v /data/web/springboot/deploy:/app --workdir /app --link heuristic_stallman -p 18090:8090 openjdk:8 java -jar tb.easyuidemo.jar --spring.profiles.active=docker

 如何實現打包的方式,讓docker里面的java程序能夠訪問另外一個docker里面mysql的數據庫呢?

首先需要了解當前宿主機里面docker的網絡使用情況,發現每一個netcore和java的程序,被docker之后都會創建一個獨立名稱的network。

#docker network ls  查看docker的全部網絡(了解docker當前的網絡情況)

 查看所有docker鏡像,包括未運行的鏡像

docker ps -a  (查看所有docker鏡像,包括未運行的)

查看一個net core的docker容器的network名稱是什么,通過容器ID的方式查看

docker inspect 5d727bb33b58  (netcore的容器ID)

查找mysql運行時用到的network名稱,首選需要找到mysql的docker容器使用的IDNAMES

#docker ps 查找mysql運行時docker容器的ID和NAMES

 查看mysql運行時docker容器用到的network名稱是bridge

#docker inspect df687bae1933 (mysql的容器ID)查看mysql運行時docker容器用到的網絡名稱是bridge

這時候就知道為什么之前的docker程序鏡像,不管是net還是java都無法訪問當前宿主機的mysql的docker容器了,是因為他們的network名稱不同導致的。 

docker-compose.xml   修改配置文件,增加external_links(設置NAMES的值)和指定network_mode(設置Networks的值)

version: '3.4'
services:
  tb.com.sbmsm.demo:
    image: tb.com.sbmsm.demo:1.0
    build:
      context: ./tb.com.sbmsm.demo
      dockerfile: ./tb.view.sbmsm.easyuidemo/Dockerfile
    ports:
      - 18090:8090 external_links: - heuristic_stallman:heuristic_stallman
    network_mode: bridge

Dockerfile(原來的,不需要修改)

FROM openjdk:8 AS base
WORKDIR /app
EXPOSE 8090

FROM maven:3-jdk-8 AS build
WORKDIR /app
COPY . .
RUN mvn clean install -Dmaven.test.skip=true -f tb.common/pom.xml -s settings.xml; \
 mvn clean install -Dmaven.test.skip=true -f tb.db/pom.xml -s settings.xml; \
 mvn clean package -Dmaven.test.skip=true -f tb.view.sbmsm.easyuidemo/pom.xml -s settings.xml

FROM base AS final
WORKDIR /app
COPY --from=build /app/tb.view.sbmsm.easyuidemo/target/tb.easyuidemo.jar .
ENTRYPOINT ["java", "-jar", "tb.easyuidemo.jar", "--spring.profiles.active=docker"]

使用docker-compose命令重新打包

#docker-compose build (重新創建docker鏡像)
#docker-compose up (前台方式重新運行,查看是否還有錯誤信息)

 查看docker容器(包含沒有啟動的java容器)

#docker ps -a  查看容器(包含沒有啟動的java容器)

 查看docker容器為java的信息,看到link和networks都已經設置到docker容器里面了。

#docker inspect 95967302d33d(java的容器ID)查看docker容器里的信息

 

 重新運行docker容器,這時java的docker容器網絡就通了,進去看一下/etc/hosts文件里面的內容

#docker start 95967302d33d (運行已經創建好的docker容器)
#docker exec -it 95967302d33d /bin/bash(進入運行的docker容器)查看hosts文件
#cat /etc/hosts

 這時容器里面就已經設置好了hosts文件和網絡信息。由於這次是通過已經打包好java程序的docker容器運行的,所以,端口信息也已經有了,直接通過瀏覽器就可以訪問了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM