How to get the hostname of the docker host from inside a docker container on that host without env vars

后端 未结 8 1374
时光取名叫无心
时光取名叫无心 2020-12-13 12:13

What are the ways get the docker host\'s hostname from inside a container running on that host besides using environment variables? I know I can pass the hostname as

相关标签:
8条回答
  • 2020-12-13 13:01

    You can pass it as an environment variable like this. Generally Node is the host that it is running in. The hostname is defaulted to the host name of the node when it is created.

    docker service create -e 'FOO={{.Node.Hostname}}' nginx  
    

    Then you can do docker ps to get the process ID and look at the env

    $ docker exec -it c81640b6d1f1 env                                                                                                                                    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=c81640b6d1f1
    TERM=xterm
    FOO=docker-desktop
    NGINX_VERSION=1.17.4
    NJS_VERSION=0.3.5
    PKG_RELEASE=1~buster
    HOME=/root
    

    An example of usage would be with metricbeats so you know which node is having system issues which I put in https://github.com/trajano/elk-swarm:

      metricbeat:
        image: docker.elastic.co/beats/metricbeat:7.4.0
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - /sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro
          - /proc:/hostfs/proc:ro
          - /:/hostfs:ro
        user: root
        hostname: "{{.Node.Hostname}}"
        command:
          - -E
          - |
            metricbeat.modules=[
              {
                module:docker,
                hosts:[unix:///var/run/docker.sock],
                period:10s,
                enabled:true
              }
            ] 
          - -E
          - processors={1:{add_docker_metadata:{host:unix:///var/run/docker.sock}}} 
          - -E
          - output.elasticsearch.enabled=false
          - -E
          - output.logstash.enabled=true
          - -E
          - output.logstash.hosts=["logstash:5044"]
        deploy:
          mode: global
    
    0 讨论(0)
  • 2020-12-13 13:02

    I think the reason that I have the same issue is a bug in the latest Docker for Mac beta, but buried in the comments there I was able to find a solution that worked for me & my team. We're using this for local development, where we need our containerized services to talk to a monolith as we work to replace it. This is probably not a production-viable solution.

    On the host machine, alias a known available IP address to the loopback interface:

    $ sudo ifconfig lo0 alias 10.200.10.1/24
    

    Then add that IP with a hostname to your docker config. In my case, I'm using docker-compose, so I added this to my docker-compose.yml:

    extra_hosts:
    # configure your host to alias 10.200.10.1 to the loopback interface:
    #       sudo ifconfig lo0 alias 10.200.10.1/24
    - "relevant_hostname:10.200.10.1"
    

    I then verified that the desired host service (a web server) was available from inside the container by attaching to a bash session, and using wget to request a page from the host's web server:

    $ docker exec -it container_name /bin/bash
    $ wget relevant_hostname/index.html
    $ cat index.html
    
    0 讨论(0)
提交回复
热议问题