使用域名从主机网络访问Docker

时间:2018-12-11 11:11:33

标签: docker networking server

伙计们,我有一个在其主机B上附加了域名的docker容器A,在主机B上也附加了一个域名.....如何通过A的域名而不是A来访问该容器A B在主机B的本地网络上的计算机C的IP地址或域名。

因此C -> A( via wwww.cname.url)而不是C -> B( www.bname.url:port) -> A

E.G。

以下是带有服务的docker-compose

version: "3.2"
services:
  php:
    links:
      - mysql
    image: arm32v6/php:7.1.24-fpm-alpine3.8-lavalite
    networks:
      - backend
    working_dir: /var/www/html
    volumes:
      - ./website/:/var/www/html/
    privileged: true
  node:
    domainname: docker.local
    hostname: node
    networks:
      frontend:
        aliases:
          - node.docker.local
    links:
      - "apache:dev.docker.local"
    depends_on:
      - apache
    image: arm32v7/node:latest
    entrypoint: yarn
    command: twill-dev
    volumes:
      - ./website:/usr/src/app
    working_dir: /usr/src/app
    ports:
      - "3000:3000"
      - "3001:3001"
  apache:
    domainname: docker.local
    hostname: dev
    image: arm32v7/httpd:2.4
    depends_on:
      - php
      - mysql
    networks:
      frontend:
        aliases:
          - apache
          - dev.docker.local
      backend:
        aliases:
          - apache
    privileged: true
    ports:
      - "8880:80"
    working_dir: /var/www/html
    volumes:
      - ./website/:/var/www/html/
      - ./httpd.conf:/usr/local/apache2/conf/httpd.conf
      - ./fpm.conf:/usr/local/apache2/conf/extra/httpd-vhosts.conf
  mysql:
    image: yobasystems/alpine-mariadb:arm32v7
    volumes:
      - ./datadir:/var/lib/mysql
    networks:
      - backend
    environment:
      - MYSQL_VERSION=5.7
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_USER=test
      - MYSQL_PASSWORD=testpass
      - MYSQL_DATABASE=test_db
networks:
  frontend:
    external:
      name: localnet
  backend:

我希望能够通过其域名设置为 dev.docker.local 的域名访问服务 apache ,该服务器的ip位于网络17.18.0.1/24

主机的IP地址在网络192.168.1.0/24上,域名为dev.server.local

我在192.168.1.0/24网络上有一台开发PC,它可以通过主机IP以及通常用于特定服务的端口访问服务容器。

更新 可以从网络外部通过server.local到达主机 我的网络接口包含以下条目

dns-search server.local
dns-domain server.local

docker容器具有以下内容

主机名nginx 域名server.local

我还需要编辑一个主机文件或resolv.conf文件吗?

似乎主机正在运行avahi服务发现。这会影响什么吗?

我可以

  • 将内部域设置为主机,并在子域上放置docker容器?外部设备将如何通过域访问此地址?
  • 将docker容器连接到主机的网络上,从而在192.168.1.0/24中拥有一个ip,并且也可以被该网络上的设备ping通。域会解决吗?
  • 有没有我可以使用的动态DNS软件,可以将其挂接到我身上,因此它不是手动过程。这样它将检测服务器并通过域名将传入请求路由到该服务器?

1 个答案:

答案 0 :(得分:1)

您可以通过将nginx容器配置为绑定到子域的容器来实现此目的。

例如,主机可以通过域example.com访问,而您想在php.example.com上访问php容器,则可以使用以下设置:

services:
  php:
    image: arm32v6/php:7.1.24-fpm-alpine3.8-lavalite
    environment:
      - VIRTUAL_HOST=php.example.com
  nginx-proxy:
    image: jwilder/nginx-proxy
    depends_on:
      - php
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

对子域的任何请求都将首先发送到主机,这受到nginx的约束,nginx依次注册,因为请求了子域php,它将把用户发送到该容器。

我希望这可以为您提供帮助,如果您有任何疑问,请告诉我