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容器运行的,所以,端口信息也已经有了,直接通过浏览器就可以访问了。

 

posted @ 2020-04-01 15:31  —八戒—  阅读(2873)  评论(0编辑  收藏  举报