I'm now trying to assign a static IP 172.17.0.1 when a Docker container be started up.
I use port 2122 as the ssh port of this container so that I let this container listen port 2122.
sudo docker run -i -t -p 2122:2122 ubuntu
This command will run a Docker container with a random IP like 172.17.0.5, but I need to assign a specific IP to the container.
The following shell script is what I reference Docker documentation in advanced network settings.
pid=$(sudo docker inspect -f '{{.State.Pid}}' <container_name> 2>/dev/null)
sudo rm -rf /var/run/netns/*
sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
sudo ip link add A type veth peer name B
sudo brctl addif docker0 A
sudo ip link set A up
sudo ip link set B netns $pid
sudo ip netns exec $pid ip link set eth0 down
sudo ip netns exec $pid ip link delete eth0
sudo ip netns exec $pid ip link set dev B name eth0
sudo ip netns exec $pid ip link set eth0 address 12:34:56:78:9a:bc
sudo ip netns exec $pid ip link set eth0 down
sudo ip netns exec $pid ip link set eth0 up
sudo ip netns exec $pid ip addr add 172.17.0.1/16 dev eth0
sudo ip netns exec $pid ip route add default via 172.17.42.1
This shell script will assign a static IP 172.17.0.1 and link to the world fine. But whenever I try to ssh to this container from my local, it didn't work. What's the problem possibly I met?
If you want your container to have it's own virtual ethernet socket (with it's own MAC address), iptables, then use the Macvlan driver. This may be necessary to route traffic out to your/ISPs router.
https://docs.docker.com/engine/userguide/networking/get-started-macvlan
Not a direct answer but it could help.
I run most of my dockerized services tied to own static ips using the next approach:
Sample:
For
docker-compose
you can use followingdocker-compose.yml
from host you can test using:
Modern
docker-compose
will automatically create containers with static ip for you.To find static ips of all containers in your
docker-compose
in a single line use:If you want to automate, you can use something like this example gist
You can set the IP while running it.
See my example at https://github.com/RvdGijp/mariadb-10.1-galera
You can access other containers' service by their name(
ping apache
will get the ip orcurl http://apache
would access the http service) And this can be a alternative of a static ip.Easy with Docker version 1.10.1, build 9e83765.
First you need to create you own docker network (mynet123)
than simply run the image (I'll take ubuntu as example)
then in ubuntu shell
Additionally you could use
--hostname
to specify a hostname--add-host
to add more entries to /etc/hostsDocs (and why you need to create a network) at https://docs.docker.com/engine/reference/commandline/network_create/