top of page
Writer's pictureinojmikelcamalelo

Docker Docker.for.mac.localhost



The host has a changing IP address (or none if you have no network access). We recommend that you connect to the special DNS namehost.docker.internal which resolves to the internal IP address used by thehost. This is for development purpose and does not work in a production environment outside of Docker Desktop.


DNS name docker.for.mac.host.internal should be used instead of docker.for.mac.localhost (still valid) for host resolution from containers, since since there is an RFC banning the use of subdomains of localhost. See -west-let-localhost-be-localhost-06.




Docker Docker.for.mac.localhost



DNS name host.docker.internal should be used for host resolution from containers. Older aliases (still valid) are deprecated in favor of this one. (See -west-let-localhost-be-localhost-06).


In this example, I will use a CentOS 7 installation to demonstrate how to connect docker to localhost. You should start by removing any older version of docker that may be installed so that you can use the latest for the following example. Enter the following to remove old docker installations.


You will probably advice me to put the service I want to access in another docker container too but for fastest tests on CI I want to access docker host machine by ip from container, that's why I need it.


I would like to write a universal shell script which will first try to resolve docker.for.mac.localhost and add the resolved address to /etc/hosts. If not (which means docker host is either windows or linux, not Mac), use the ip r grep ^default cut -d" " -f3 approach and add to /etc/hosts too.


The question is: How can I try to resolve docker.for.mac.localhost in ANY container? (some distros do not have nslookup for example). Or maybe I should not try to resolve and I can just try to read docker.for.mac.localhost value from somewhere?


My current thoughts are to try to use getent ahosts docker.for.mac.localhost, then in case command does not exist I will try to use nslookup (i.e. Busybox image does not have getent command). Probably I am wrong trying to resolve docker.for.mac.localhost and it can be retrieved in easier way. Please share your thoughts.


Your idea of resolving docker.for.mac.localhost is pretty well right-on-target, you just need to find something capable of resolving it in pretty much any container. This should do it (and has, according to my tests):


All we're doing is getting Linux to resolve the name. Ping is just the easiest choice, though nc and traceroute exist pretty much everywhere. If all else fails, you can actually do this with a modern (but non-BusyBox) bash or syslog. By default, Docker sets up a small DNS server that responds to the names of any other containers on the same network (or, in older versions, linked containers). And then docker.for.mac.localhost is added into that.


Docker for Mac offers a Mac native application that installs in /Applications. It creates symlinks (symbolic links) in /usr/local/bin for docker and docker-compose to the Mac versions of the commands in the application bundle.


Docker for Mac replaces docker and docker-compose with its own versions; if you already have Docker Toolbox on your Mac, Docker for Mac still replaces the binaries. You want the Docker client and Engine to match versions; mismatches can cause problems where the client and host cannot communicate. If you already have Docker Toolbox, and then you install Docker for Mac, you may get a newer version of the Docker client. Running docker version in a command shell displays the version of the client and server you have on your system.


Depending on your use case, a network of type host may not work (and requires some setup). Docker provides a way to add hosts into your container's /etc/hosts file. I'll show it here in two ways, one via CLI and one via docker-compose as a bonus.


Get the host machine's address for the docker0 interface and put it in shell var (note that docker0 doesn't exist on macOS, scroll to the next part if you're on a Mac). Of course, this part is optional if you just want to paste the IP in.


Docker for Mac does not have the docker0 interface1 that's used in the above example. Instead, you can actually simply go into the container and use a special macOS-only DNS name (docker.for.mac.localhost) that comes out of the box (version 17.06+):


Update April 2019: The DNS name is now called host.docker.internal in the docs, though docker.for.mac.localhost works just as well for now in Docker 18.09.3. Additionally, you can also now also use gateway.docker.internal to access the host's gateway.


The host has a changing IP address (or none if you have no network access). From 18.03 onwards our recommendation is to connect to the special DNS name host.docker.internal, which resolves to the internal IP address used by the host. This is for development purpose and will not work in a production environment outside of Docker Desktop for Mac.


The -d flag runs it in the background, and we can go into the container and check out our /etc/hosts file in almost the same way as we did earlier. Since we didn't name the container, we grab the container ID using docker ps first, which is 0dde138913ee:


Update December 2019: I understand there's a desire for the convenience hostname host.docker.internal to be made available on all platforms, and not just macOS or Windows. I don't have an opinion on that, but if you do you can follow the lengthy discussion here: -linux/issues/264


Alternatively, you can also run a specific version of Superset by first checking outthe branch/tag, and then starting docker-compose with the TAG variable.For example, to run the 1.4.0 version, run the following commands:


Note: This will bring up superset in a non-dev mode, changes to the codebase will not be reflected.If you would like to run superset in dev mode to test local changes, simply replace the previous command with: docker-compose up,and wait for the superset_node container to finish building the assets.


You can configure the Docker Compose environment varirables for dev and non-dev mode with docker/.env and docker/.env-non-dev respectively. These environment files set the environment for most containers in the Docker Compose setup, and some variables affect multiple containers and others only single ones.


Note: Users often want to connect to other databases from Superset. Currently, the easiest way to do this is to modify the docker-compose-non-dev.yml file and add your database as a service that the other services depend on (via x-superset-depends-on). Others have attempted to set network_mode: host on the Superset services, but these generally break the installation, because the configuration requires use of the Docker Compose DNS resolver for the service names. If you have a good solution for this, let us know!


When running Superset using docker or docker-compose it runs in its own docker container, as if the Superset was running in a separate machine entirely. Therefore attempts to connect to your local database with hostname localhost won't work as localhost refers to the docker container Superset is running in, and not your actual host machine. Fortunately, docker provides an easy way to access network resources in the host machine from inside a container, and we will leverage this capability to connect to our local database instance.


Here the instructions are for connecting to postgresql (which is running on your host machine) from Superset (which is running in its docker container). Other databases may have slightly different configurations but gist would be same and boils down to 2 steps -


Before proceeding, docker and docker-compose must be installed on the localhost. Docker Engine and Compose are included in Docker Desktop for Windows and macOS. For Linux you will need to get Docker Engine and docker-compose. Make sure you get docker-compose with the context support feature. This is available starting with release 1.26.0-rc2 of docker-compose.


The sample application can be deployed on a remote host in several ways. Assume we have SSH access to a remote docker host with a key-based authentication to avoid a password prompt when deploying the application.


The Docker Contexts support in docker-compose offers an easy and elegant approach to target different remote hosts. Switching between different environments is now easy to manage and deployment risks across them are reduced. We have shown an example of how to access remote docker hosts via SSH and tcp protocols hoping these cover a large number of use-cases.


The docker stack deploy manages to deploy to K8s. It convert docker-compose files to k8s manifests (something like kompose) before deployment. Let me showcase an example which shows how one can use the same YAML file to build Swarm Mode as well as K8s cluster.


If we run docker run with -p 5000:5000, it will forward from all interfaces where the Docker daemon is running (for our purposes, the main network namespace) to the external IP address of the containter.


The .env file sets environment variables that are used when you run thedocker-compose.yml configuration file. Ensure that you specify a strongpassword for the elastic and kibana_system users with theELASTIC_PASSWORD and KIBANA_PASSWORD variables. These variable arereferenced by the docker-compose.yml file.


If you opt for the bootstrap.memory_lock: true approach,you also need to define the memlock: true ulimit in theDocker Daemon,or explicitly set for the container as shown in the sample compose file.When using docker run, you can specify:


For testing, you can also manually set the heap size using the ES_JAVA_OPTSenvironment variable. For example, to use 16GB, specify -eES_JAVA_OPTS="-Xms16g -Xmx16g" with docker run. The ES_JAVA_OPTS variableoverrides all other JVM options. We do not recommend using ES_JAVA_OPTS inproduction. The docker-compose.yml file above sets the heap size to 512MB. 2ff7e9595c


0 views0 comments

Recent Posts

See All

Comments


bottom of page