DNS与本地网络托管的docker容器

时间:2018-04-07 10:22:32

标签: docker nginx networking dns gitlab

我很难设置我的本地网络并需要一些帮助。如果有人更习惯使用DNS和docker,这可能不是一个难题,因为它对我来说。

当前状态

我有一个在192.168.1.212上运行Ubuntu的本地服务器。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.4 LTS
Release:        16.04
Codename:       xenial

服务器使用软件运行多个docker容器,供我开发。

$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                          PORTS                                                                 NAMES
f6b079af1c2d        sameersbn/gitlab:latest       "/sbin/entrypoint.sh…"   16 hours ago        Up 16 hours                     0.0.0.0:10022->22/tcp, 0.0.0.0:1080->80/tcp, 0.0.0.0:10443->443/tcp   gitlab_gitlab_1
49eec1e36038        sameersbn/redis:latest        "/sbin/entrypoint.sh…"   9 days ago          Up 16 hours                     6379/tcp                                                              gitlab_redis_1
1d6acbb1d475        sameersbn/postgresql:9.6-2    "/sbin/entrypoint.sh"    10 months ago       Up 16 hours                     5432/tcp                                                              gitlab_postgresql_1

目前我正在使用https://192.168.1.212:10443访问我的gitlab服务器。我的本地计算机有ip 192.168.1.156

问题

我希望能够在我的ubuntu服务器上运行DNS,解决需求,特定域,停靠者容器,如https://gitlab.internal

考虑

目前我需要将码头工人的每个端口转发到我的主机。这解决了非方便的地址,如ssh://git@192.168.1.212:10022/my_group/my_project.git来解决我的git项目。首先,与我的合作伙伴安排主机的端口范围有点混乱,如果端口发生变化,它可能会破坏现有网址。

此外,我想设置一个必须链接到gitlab的docker注册表。因此,必须使用此注册表配置gitlab和url以及一些访问令牌。因此,docker容器本身也必须能够解析我的自定义URL,例如regisrty配置中的realm: https://gitlab.itnern/jwt/auth和gitlab配置中的registry_external_url 'https://registry.docker.internal'

另一个棘手的部分可能是我的跑步者设置。这些机器连接到gitlab并为我的ci / d管道供电。但是,如果我的本地计算机可以转发到docker容器,这对于跑步者来说应该不是什么大问题。至少我猜是这样。

是否有人遇到类似的问题或者设置反向代理或DNS服务的经验?任何帮助都会受到欢迎。

提前致谢 迈克尔

1 个答案:

答案 0 :(得分:0)

设置DNS以访问本地容器有两种方法。

您的泊坞窗文件端口不会更改,因为它与特定于应用程序的主机地图相关,可以更改。

所以这里是避免端口冲突和直接使用容器IP访问容器的解决方案。

此脚本将获取容器的IP,并将在/ etc / hosts中设置DNS。因此,您无需使用HOST端口映射端口即可直接访问。

要运行容器,请创建 myscript.sh

sudo ./myscript.sh container_name host_for_container docker_image

例如

sudo ./mysript.sh gitlab gitlab.itnern.com gitlabsameersbn/gitlab:latest

因此,这将运行您的容器并在主机中设置DNS,无需端口假设www.gitlab.intern.com即可访问。需要以sudo身份运行

#!/bin/bash

docker_container_name=$1
docker_host=$2
docker_image=$3
function process_request(){
docker run --name $docker_container_name -dit $docker_image

declare -a container_list=('platform')

# check if successfully run
 if [ "$(docker inspect -f {{.State.Running}} $docker_container_name)" ]; then

   # getting container ip by container name
   container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $docker_container_name)
    #delete if already exist value in host etc conf
   sed -i "/$container_ip  $docker_host/d" /etc/hosts
    #inset ip with domain    
   sed -i "1s/^/$container_ip  $docker_host\n/" /etc/hosts
fi

if [ $# -eq 3 ]; then
process_request "$@"
else
echo "Insufficient number of arguments, at least 3 arguments required to run container and set up DNS at host config"
fi

第二添加主机以便在容器--add-host=IP之外访问,以便您的容器可以使用ip调用其他服务。

  

--add-host="" : Add a line to /etc/hosts (host:IP)

     

因此 - 在主机网络模式下允许使用主机名,并且仅允许使用主机名   更改容器内的主机名。与--hostname类似,   --add-host, - DNS, - DNS-search和--dns-option选项可用于主机网络模式。这些选项更新/ etc / hosts或   容器内的/etc/resolv.conf。没有变化   主机上的/ etc / hosts和/etc/resolv.conf

     

管理/ etc / hosts您的容器将在/ etc / hosts中包含哪些行   定义容器本身的主机名以及localhost和a   其他一些常见的东西。 --add-host标志可用于添加   / etc / hosts的其他行。

docker run -it --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts

https://docs.docker.com/engine/reference/run/#network-settings