Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用kubernetes中本地环境上的主机名连接到docker容器_Docker_Kubernetes_Docker Compose_Dns - Fatal编程技术网

使用kubernetes中本地环境上的主机名连接到docker容器

使用kubernetes中本地环境上的主机名连接到docker容器,docker,kubernetes,docker-compose,dns,Docker,Kubernetes,Docker Compose,Dns,我有一个kubernete docker的作品 frontend - a web app running on port 80 backend - a node server for API running on port 80 database - mongodb 理想情况下,我希望通过主机名访问前端,例如http://frontend:80,并使浏览器能够通过主机名(如)访问后端http://backend:80,这是客户端web应用程序所必需的 如何在本地主机环境窗口上通过这些主机名访问

我有一个kubernete docker的作品

frontend - a web app running on port 80
backend - a node server for API running on port 80
database - mongodb
理想情况下,我希望通过主机名访问前端,例如http://frontend:80,并使浏览器能够通过主机名(如)访问后端http://backend:80,这是客户端web应用程序所必需的

如何在本地主机环境窗口上通过这些主机名访问容器

docker-compose.yml


我能够找到答案,使用docker compose别名和网络,我能够将每个容器连接到同一个开发网络

有3个主要组成部分:

容器映射节点dns服务器-通过docker ps获取别名,并创建一个dns服务器,将这些请求重定向到127.0.0.1 localhost nginx反向代理容器-通过虚拟网络中的别名将主机映射到容器 项目-每个项目都是docker-compose.yml,在端口80上运行的容器数量不限 clientA的docker-compose.yml

版本:3.8 服务: 前端: 构建:前端 集装箱名称:clienta frontend 网络: 违约: 别名: -clienta.test 后端: 构建:后端 容器名称:clienta后端 网络: 违约: 别名: -api.clienta.test 网络: 违约: 外部:真正连接到外部网络更多信息,请参见下文 名称:外部网络的“开发”名称 nginx代理docker-compose.yml

版本:“3” 服务: 起源: 图片:nginx:alpine 卷数: -./nginx.conf:/etc/nginx/nginx.conf 端口: -80:80将端口80映射到本地主机 网络: -发展 网络: 开发:创建称为开发的网络 名称:‘发展’ 司机:驾驶台 DNS服务器

不要忘记更新计算机网络设置,以使用127.0.0.1作为DNS服务器


Git repository for dns server+nginx proxy,以防您想看到实现:

是Kubernetes还是Docker?浏览器应用程序通常在浏览器中运行,无论哪种情况,浏览器都不在容器环境中,因此它永远不能使用Compose容器/Kubernetes服务名称作为主机名。@DavidMaze它在docker Compose/Kubernetes容器中。我只想通过浏览器中的主机名连接到容器,该主机名位于容器环境之外。您如何公开容器?你有yaml服务吗?@Bimal我添加了docker ComposeLook,就像你的服务是集群IP类型一样。你能分享kubectl get svc的结果吗?
version: "3.8"
services:
    frontend:
        build: frontend
        hostname: framework
        ports:
            - "80:80"
            - "443:443"
            - "33440:33440"
    backend:
        build: backend
        hostname: backend
    database:
        image: 'mongo'
        environment:
            - MONGO_INITDB_DATABASE=framework-database
        volumes:
            - ./mongo/mongo-volume:/data/database
            - ./mongo/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
        ports:
            - '27017-27019:27017-27019'
import dns from 'native-dns'
import { exec } from 'child_process'

const { createServer, Request } = dns
const authority = { address: '8.8.8.8', port: 53, type: 'udp' }
const hosts = {}

let server = createServer()

function command (cmd) {
    return new Promise((resolve, reject) => {
        exec(cmd, (err, stdout, stderr) => stdout ? resolve(stdout) : reject(stderr ?? err))
    })
}
async function getDockerHostnames(){
    let containersText = await command('docker ps --format "{{.ID}}"')
    let containers = containersText.split('\n')
    containers.pop()
    await Promise.all(containers.map(async containerID => {
        let json = JSON.parse(await command(`docker inspect ${containerID}`))?.[0]
        let aliases = json?.NetworkSettings?.Networks?.development?.Aliases || []
        aliases.map(alias => hosts[alias] = {
            domain: `^${alias}*`,
            records: [
                { type: 'A', address: '127.0.0.1', ttl: 100 }
            ]
        })
    }))
}

await getDockerHostnames()
setInterval(getDockerHostnames, 8000)

function proxy(question, response, cb) {
    var request = Request({
        question: question, // forwarding the question
        server: authority,  // this is the DNS server we are asking
        timeout: 1000
    })

    // when we get answers, append them to the response
    request.on('message', (err, msg) => {
        msg.answer.map(a => response.answer.push(a))
    });

    request.on('end', cb)
    request.send()
}

server.on('close', () => console.log('server closed', server.address()))
server.on('error', (err, buff, req, res) => console.error(err.stack))
server.on('socketError', (err, socket) => console.error(err))
server.on('request', async function handleRequest(request, response) {
    await Promise.all(request.question.map(question => {
        console.log(question.name)
        let entry = Object.values(hosts).find(r => new RegExp(r.domain, 'i').test(question.name))
        if (entry) {
            entry.records.map(record => {
                record.name = question.name;
                record.ttl = record.ttl ?? 600;
                return response.answer.push(dns[record.type](record));
            })
        } else {
            return new Promise(resolve => proxy(question, response, resolve))
        }
    }))

    response.send()
});

server.serve(53, '127.0.0.1');