java.net.UnknownHostException:host.docker.internal:AWS EC2 上的名称或服务未知

时间:2021-01-02 21:36:07

标签: spring-boot docker amazon-ec2 docker-compose

在 AWS EC2 T2.micro 实例上部署 dockerized spring boot 应用程序时,我遇到了这个“java.net.UnknownHostException:host.docker.internal:名称或服务未知”问题。由于此错误,Spring Boot 应用程序无法启动。

但奇怪的是,我没有在应用程序的任何地方使用变量“host.docker.internal”:不在代码中,不在 yaml 文件中,不在 .env 文件中:

$ sudo grep -Rl "host.docker.internal" ~
/home/ec2-user/.bash_history

当我运行以下命令时,它只显示上一个用于搜索它的命令:

<块引用>

$ cat /home/ec2-user/.bash_history | grep "host.docker.internal"

我在本地使用 Windows 10 进行开发,我可以使用 docker-compose 成功调出堆栈。

这是 EC2 实例操作系统版本信息:

$ cat /etc/*release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
Amazon Linux release 2 (Karoo)

这是我在 EC2 实例上使用的 docker-compose 文件:

version: '2'
services:
  backend:
    container_name: backend
    image: 'dockerhubuser/backend:0.0.4'
    ports:
      - '8080:8080'
    volumes:
      - /var/log/backend/logs:/var/log/backend/logs
      - ./backend-ssl:/etc/ssh/backend
    env_file:
      - .env
    depends_on:
      - mysql
      - redis
  redis:
    container_name: redis
    image: 'redis:alpine'
    ports:
      - '6379:6379'
    volumes:
      - $PWD/redis/redis-data:/var/lib/redis
      - $PWD/redis/redis.conf:/usr/local/etc/redis/redis.conf
  mysql:
    container_name: mysql
    image: 'mysql:8.0.21'
    ports:
      - '3306:3306'
    environment:
      MYSQL_DATABASE: dbname
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbpass
      MYSQL_ROOT_PASSWORD: dbrootpass
    volumes:
      - ./my_volume/mysql:/var/lib/mysql
volumes:
  my_volume:

这是我在 EC2 实例上的 .env 文件:

SERVER_PORT=8080
KEY_STORE=/etc/ssh/backend/keystore.p12
KEY_STORE_PASSWORD=keystorepass
REDIS_HOST=redis
REDIS_PORT=6379
DB_HOST=mysql
DB_PORT=3306
DB_USERNAME=dbuser
DB_PASSWORD=dbpass

我很确定在使用“docker-compose up”调出堆栈时正在使用这个 .env 文件,因为我可以看到日志中的 SERVER_PORT 在我更改它时与该文件匹配。

<块引用>

2021-01-02 20:55:44.870 [main] 信息 o.s.b.w.e.tomcat.TomcatWebServer - Tomcat 初始化端口:8080 (https)

但我不断收到错误,抱怨“host.docker.internal”。

以下是我尝试过但不起作用的方法:

  1. 在 application.yml 中的 spring.datasource.url 属性中硬编码数据库主机
  2. 将以下条目添加到 /etc/hosts 文件(请参阅 https://stackoverflow.com/a/48547074/1852496
<块引用>

172.17.0.1 主机.docker.internal

  1. 将以下条目添加到 /etc/hosts 文件,其中“ip-172-31-33-56.us-east-2.compute.internal”是我在运行命令“echo $HOSTNAME”时得到的
<块引用>

ip-172-31-33-56.us-east-2.compute.internal host.docker.internal

  1. 终止实例并创建另一个 T2.micro 实例,但结果相同。
  2. 编辑入站规则以允许来自任何地方的 TCP:3306。

有人可以看看吗?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

在 /etc/hosts 文件中添加“172.17.0.1 host.docker.internal”后,它适用于 Ubuntu 20.04。 确保 docker 引擎版本为 20.10-beta1 或更高版本。