返回

GitHub Actions 中运行 Docker LocalStack 无法访问 localhost:4566 怎么办?

Linux

## 自托管 GitHub Actions 中 Docker 运行 LocalStack 无法访问 localhost:4566 的解决方案

### 问题

在自托管 GitHub Actions 中通过 Docker 运行 LocalStack 时,无法访问 localhost:4566

### 原因

Docker 网络桥接模式默认使用独立的网络命名空间,与主机网络隔离开,导致容器无法访问主机的 localhost 地址。

### 解决方法

修改 Docker 网络模式

将 Docker 容器的网络模式从 bridge 改为 host,使容器与主机网络堆栈共享,允许容器访问 localhost 地址。

- name: 运行 LocalStack
  run: |
    docker run -d -i --net host --name LOCALSTACK_DOCKER $REG/localstack:3.1

端口映射

将 Docker 容器的端口映射到主机的特定端口,允许主机进程通过映射端口访问容器中的服务。

- name: 运行 LocalStack
  run: |
    docker run -d -i -p 127.0.0.1:4566:4566 --name LOCALSTACK_DOCKER $REG/localstack:3.1

### 注意

方法 1: 授予容器完全访问主机网络堆栈,存在安全隐患。

方法 2: 只允许主机上的特定进程访问容器中的服务。

### 故障排除

  • 检查 Docker 容器是否运行。
  • 使用 netstat -tuln 检查主机是否监听端口 4566。
  • 尝试在 GitHub Actions 运行器机器的网络中直接运行 shell 脚本,检查是否可以访问 http://localhost:4566

### 其他信息

### 常见问题解答

问:为什么无法通过主机上的应用程序访问容器中的服务?
答:确保已正确配置端口映射,并且主机应用程序已连接到正确的端口。

问:是否可以同时使用 host 网络和端口映射?
答:是的,可以结合使用。host 网络允许容器直接访问主机网络,而端口映射提供了对特定容器端口的精确控制。

问:修改 Docker 网络模式是否会影响容器的安全性?
答:host 网络模式确实会降低容器的安全性,因为它们与主机共享网络堆栈。建议在安全环境中使用此选项。

问:如何在自托管 GitHub Actions 中配置 Docker 网络?
答:在 .github/workflows/*.yml 文件中,使用 dockernetwork 参数指定网络模式或端口映射。

问:如何进一步调试此问题?
答:检查 Docker 容器的日志文件,查看是否存在任何错误或连接问题。此外,尝试使用 Docker exec 命令进入容器并运行诊断命令。