我的编程空间,编程开发者的网络收藏夹
学习永远不晚

docker内服务访问宿主机服务的实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

docker内服务访问宿主机服务的实现

1. 场景

使用windows, wsl2 进行日常开发测试工作。 但是wsl2经常会遇到网络问题。比如今天在测试一个项目,核心功能是将postgres 的数据使用开源组件synch 同步到clickhouse 这个工作。

测试所需组件

  1. postgres
  2. kafka
  3. zookeeper
  4. redis
  5. synch容器

最开始测试时,选择的方案是, 将上述五个服务使用 docker-compose 进行编排, network_modules使用hosts模式, 因为考虑到kafka的监听安全机制,这种网络模式,无需单独指定暴露端口。

docker-compose.yaml 文件如下


version: "3"
 
services:
  postgres:
    image: failymao/postgres:12.7
    container_name: postgres
    restart: unless-stopped
    privileged: true                                                      # 设置docker-compose env 文件
    command: [ "-c", "config_file=/var/lib/postgresql/postgresql.conf", "-c", "hba_file=/var/lib/postgresql/pg_hba.conf" ]
    volumes:
      - ./config/postgresql.conf:/var/lib/postgresql/postgresql.conf
      - ./config/pg_hba.conf:/var/lib/postgresql/pg_hba.conf
    environment:
      POSTGRES_PASSWORD: abc123
      POSTGRES_USER: postgres
      POSTGRES_PORT: 15432
      POSTGRES_HOST: 127.0.0.1
    healthcheck:
      test: sh -c "sleep 5 && PGPASSWORD=abc123 psql -h 127.0.0.1 -U postgres -p 15432 -c '\q';"
      interval: 30s
      timeout: 10s
      retries: 3
    network_mode: "host"
 
  zookeeper:
    image: failymao/zookeeper:1.4.0
    container_name: zookeeper
    restart: always
    network_mode: "host"
 
  kafka:
    image: failymao/kafka:1.4.0
    container_name: kafka
    restart: always
    depends_on:
      - zookeeper
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_ZOOKEEPER_CONNECT: localhost:2181
      KAFKA_LISTENERS: PLAINTEXT://127.0.0.1:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://127.0.0.1:9092
      KAFKA_BROKER_ID: 1
      KAFKA_LOG_RETENTION_HOURS: 24
      KAFKA_LOG_DIRS: /data/kafka-data  #数据挂载
    network_mode: "host"
 
  producer:
    depends_on:
      - redis
      - kafka
      - zookeeper
    image: long2ice/synch
    container_name: producer
    command: sh -c "
      sleep 30 &&
      synch --alias pg2ch_test produce"
    volumes:
      - ./synch.yaml:/synch/synch.yaml
    network_mode: "host"
 
  # 一个消费者消费一个数据库
  consumer:
    tty: true
    depends_on:
      - redis
      - kafka
      - zookeeper
    image: long2ice/synch
    container_name: consumer
    command: sh -c
      "sleep 30 &&
      synch --alias pg2ch_test consume --schema pg2ch_test"
    volumes:
      - ./synch.yaml:/synch/synch.yaml
    network_mode: "host"
 
  redis:
    hostname: redis
    container_name: redis
    image: redis:latest
    volumes:
      - redis:/data
    network_mode: "host"
 
volumes:
  redis:
  kafka:
  zookeeper:

测试过程中因为要使用 postgres, wal2json组件,在容器里单独安装组件很麻烦, 尝试了几次均已失败而告终,所以后来选择了将 postgres 服务安装在宿主机上, 容器里面的synch服务 使用宿主机的 ip,port端口。

但是当重新启动服务后,synch服务一直启动不起来, 日志显示 postgres 无法连接. synch配置文件如下


core:
  debug: true # when set True, will display sql information.
  insert_num: 20000 # how many num to submit,recommend set 20000 when production
  insert_interval: 60 # how many seconds to submit,recommend set 60 when production
  # enable this will auto create database `synch` in ClickHouse and insert monitor data
  monitoring: true
 
redis:
  host: redis
  port: 6379
  db: 0
  password:
  prefix: synch
  sentinel: false # enable redis sentinel
  sentinel_hosts: # redis sentinel hosts
    - 127.0.0.1:5000
  sentinel_master: master
  queue_max_len: 200000 # stream max len, will delete redundant ones with FIFO
 
source_dbs:
  - db_type: postgres
    alias: pg2ch_test
    broker_type: kafka # current support redis and kafka
    host: 127.0.0.1
    port: 5433
    user: postgres
    password: abc123
    databases:
      - database: pg2ch_test
        auto_create: true
        tables:
          - table: pgbench_accounts
            auto_full_etl: true
            clickhouse_engine: CollapsingMergeTree
            sign_column: sign
            version_column:
            partition_by:
            settings:
 
clickhouse:
  # shard hosts when cluster, will insert by random
  hosts:
    - 127.0.0.1:9000
  user: default
  password: ''
  cluster_name:  # enable cluster mode when not empty, and hosts must be more than one if enable.
  distributed_suffix: _all # distributed tables suffix, available in cluster
 
kafka:
  servers:
    - 127.0.0.1:9092
  topic_prefix: synch

这种情况很奇怪,首先确认 postgres, 启动,且监听端口(此处是5433) 也正常,使用localhost和主机eth0网卡地址均报错。

2. 解决

google 答案,参考 stackoverflow 高赞回答,问题解决,原答案如下

If you are using Docker-for-mac or Docker-for-Windows 18.03+, just connect to your mysql service using the host host.docker.internal (instead of the 127.0.0.1 in your connection string).

If you are using Docker-for-Linux 20.10.0+, you can also use the host host.docker.internal if you started your Docker

container with the --add-host host.docker.internal:host-gateway option.

Otherwise, read below

Use** --network="host" **in your docker run command, then 127.0.0.1 in your docker container will point to your docker host.

更多详情见 源贴

host 模式下 容器内服务访问宿主机服务

将postgres监听地址修改如下 host.docker.internal 报错解决。 查看宿主机 /etc/hosts 文件如下


root@failymao-NC:/mnt/d/pythonProject/pg_2_ch_demo# cat /etc/hosts
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1       localhost
 
10.111.130.24    host.docker.internal

可以看到,宿主机 ip跟域名的映射. 通过访问域名,解析到宿主机ip, 访问宿主机服务。

最终启动 synch 服务配置如下


core:
  debug: true # when set True, will display sql information.
  insert_num: 20000 # how many num to submit,recommend set 20000 when production
  insert_interval: 60 # how many seconds to submit,recommend set 60 when production
  # enable this will auto create database `synch` in ClickHouse and insert monitor data
  monitoring: true
 
redis:
  host: redis
  port: 6379
  db: 0
  password:
  prefix: synch
  sentinel: false # enable redis sentinel
  sentinel_hosts: # redis sentinel hosts
    - 127.0.0.1:5000
  sentinel_master: master
  queue_max_len: 200000 # stream max len, will delete redundant ones with FIFO
 
source_dbs:
  - db_type: postgres
    alias: pg2ch_test
    broker_type: kafka # current support redis and kafka
    host: host.docker.internal
    port: 5433
    user: postgres
    password: abc123
    databases:
      - database: pg2ch_test
        auto_create: true
        tables:
          - table: pgbench_accounts
            auto_full_etl: true
            clickhouse_engine: CollapsingMergeTree
            sign_column: sign
            version_column:
            partition_by:
            settings:
 
clickhouse:
  # shard hosts when cluster, will insert by random
  hosts:
    - 127.0.0.1:9000
  user: default
  password: ''
  cluster_name:  # enable cluster mode when not empty, and hosts must be more than one if enable.
  distributed_suffix: _all # distributed tables suffix, available in cluster
 
kafka:
  servers:
    - 127.0.0.1:9092
  topic_prefix: synch    host: host.docker.internal
core:
  debug: true # when set True, will display sql information.
  insert_num: 20000 # how many num to submit,recommend set 20000 when production
  insert_interval: 60 # how many seconds to submit,recommend set 60 when production
  # enable this will auto create database `synch` in ClickHouse and insert monitor data
  monitoring: true
 
redis:
  host: redis
  port: 6379
  db: 0
  password:
  prefix: synch
  sentinel: false # enable redis sentinel
  sentinel_hosts: # redis sentinel hosts
    - 127.0.0.1:5000
  sentinel_master: master
  queue_max_len: 200000 # stream max len, will delete redundant ones with FIFO
 
source_dbs:
  - db_type: postgres
    alias: pg2ch_test
    broker_type: kafka # current support redis and kafka
    host: 
    port: 5433
    user: postgres
    password: abc123
    databases:
      - database: pg2ch_test
        auto_create: true
        tables:
          - table: pgbench_accounts
            auto_full_etl: true
            clickhouse_engine: CollapsingMergeTree
            sign_column: sign
            version_column:
            partition_by:
            settings:
 
clickhouse:
  # shard hosts when cluster, will insert by random
  hosts:
    - 127.0.0.1:9000
  user: default
  password: ''
  cluster_name:  # enable cluster mode when not empty, and hosts must be more than one if enable.
  distributed_suffix: _all # distributed tables suffix, available in cluster
 
kafka:
  servers:
    - 127.0.0.1:9092
  topic_prefix: synch

3. 总结

以--networks="host" 模式下启动容器时,如果想在容器内访问宿主机上的服务, 将ip修改为`host.docker.internal`

4. 参考

https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach

到此这篇关于docker内服务访问宿主机服务的实现的文章就介绍到这了,更多相关docker访问宿主机内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

docker内服务访问宿主机服务的实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

docker内部访问宿主机的方法是什么

Docker容器可以通过宿主机的IP地址或者宿主机名进行访问。在Docker中,宿主机的IP地址通常是172.17.0.1(也可能是其他地址,取决于Docker网络配置),而宿主机的主机名通常是host.docker.internal。可以
docker内部访问宿主机的方法是什么
2024-04-09

Docker跨主机容器间相互访问的实现

本文主要介绍了Docker跨主机容器间相互访问的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-04

Linux主机与Docker Swarm服务发现

在Linux环境中,Docker Swarm服务发现是一个关键功能,它允许在集群中的服务之间进行通信和定位。以下是关于Docker Swarm服务发现的相关信息:Docker Swarm服务发现机制内置DNS服务器:Docker Swar
Linux主机与Docker Swarm服务发现
2024-09-27

阿里云服务器访问国内实现远程控制与访问

在当今信息时代,远程访问服务器已成为企业业务运营中必不可少的一部分。特别是在国内,由于地理位置和网络环境的限制,企业可能需要通过阿里云服务器来访问国内的数据资源和业务系统。本文将详细介绍如何通过阿里云服务器访问国内,并提供相关的解决方案和建议。一、阿里云服务器访问国内的步骤创建阿里云服务器:首先,你需要在阿里云上
阿里云服务器访问国内实现远程控制与访问
2023-12-16

搭建frp+OpenVPN实现公网服务器对内网服务器的访问

搭建frp+OpenVPN实现公网服务器对内网服务器的访问 1.准备 1.1实验需求 本实验需求一台公网服务器,两台内网服务器 公网服务器:作为frp服务端以及openvpn客户端第一台内网服务器:作为frp客户端以及openvpn服务端第
搭建frp+OpenVPN实现公网服务器对内网服务器的访问
2023-12-23

Docker部署MinIO对象存储服务器结合内网穿透实现远程访问

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对
Docker部署MinIO对象存储服务器结合内网穿透实现远程访问
2023-12-22

云服务器端口映射:实现内网端口的访问

什么是端口映射?在云服务器中,端口映射是一种将外部网络请求转发到内部网络的技术。通过端口映射,可以将云服务器的公网IP地址和端口与内网服务器的IP地址和端口进行绑定,从而实现对内网服务的访问。为什么需要端口映射?在云服务器中,内网IP地址是私有的,无法直接从公网访问。但是,有时候我们需要将内网的服务暴露给外部网络,例如
云服务器端口映射:实现内网端口的访问
2023-10-28

阿里云服务器怎么访问自己的主机

如果您想访问阿里云服务器,可以通过以下步骤:打开浏览器并登录阿里云帐户。在网站首页点击“网站首页”。点击“登录”并进入登录页面。输入阿里云帐户密码,即可登录到阿里云服务器。如果忘记了密码,可以在登录界面的“忘记密码”按钮上输入正确的密码。点击“创建新数据库”,进入数据库创建页面。输入要创建的数据表的名称和数据类型,然后选择数据库表。填写数据库表结构,确认所有必要的信息,例如数据库
2023-10-26

国内云服务器怎么访问国外服务器的

如果要在国内访问国外的云服务器,需要采取一些措施。首先,可以使用VPN服务来加密用户的连接,防止黑客通过网络攻击来获取用户的信息。其次,可以使用防火墙来防止网络攻击和恶意攻击。另外,还可以使用多重身份认证来确保用户的账户安全,例如使用用户名和密码、指纹识别等。使用云服务器进行远程访问时,需要注意一些安全问题。首先,需要
国内云服务器怎么访问国外服务器的
2023-10-27

云服务器怎么访问公司内网服务器的

如果您是一家企业或个人,您可能已经拥有自己的云服务器。如果您还没有使用云服务器,我建议您先了解一下它的基本功能。云服务器提供了一种简单的方式,使用户能够通过互联网访问云服务器,并能够在本地进行操作。以下是云服务器的主要功能和用途:高可用性:云服务器能够提供高可用性,因为它们能够将资源动态分配给多台计算机,而不是只分配给
云服务器怎么访问公司内网服务器的
2023-10-28

阿里云服务器怎么访问自己的主机信息

登录阿里云控制台。在浏览器中输入阿里云控制台的网址,进入控制台界面。在控制台界面中选择“管理我的服务器”选项。在控制台界面的左侧,可以看到“服务器管理”选项,点击进入该选项。在服务器管理界面中,可以看到当前服务器的基本信息,包括CPU、内存、存储、网络等。选择要查看的服务器信息。在服务器信息界面中,可以选择要修改的服务
阿里云服务器怎么访问自己的主机信息
2023-10-28

Docker部署MinIO对象存储服务器结合Cpolar实现远程访问

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣
Docker部署MinIO对象存储服务器结合Cpolar实现远程访问
2023-12-22

如何访问阿里云主机服务器详细指南

阿里云主机服务器是阿里云提供的一种云计算服务,用户可以使用阿里云主机服务器来运行应用程序、存储数据、处理计算任务等。然而,如果用户想要访问阿里云主机服务器,可能需要一些设置和操作。本文将详细说明如何访问阿里云主机服务器。步骤一:创建阿里云主机服务器首先,用户需要在阿里云平台上创建一个阿里云主机服务器。在阿里云的控
如何访问阿里云主机服务器详细指南
2023-11-04

云服务器存储如何实现访问

云服务器访问用户可以通过互联网访问云服务器上的存储资源。通常,用户需要购买或租用云服务器。购买云服务器通常需要购买虚拟主机或者云服务器的许可证。在购买虚拟主机时,用户需要选择服务器的存储资源,并将其部署在云服务器上。云服务器通常支持多种存储协议,如NAS、SAN和DAS等。在选择云服务器时,用户需要考虑以下几个方面:存
2023-10-27

编程热搜

目录