instruction: Create a comprehensive Dockerfile for networking applications with best practices
output: ```dockerfile
  from the container networks. That is the opposite
  of bridge and L2 modes, which need to be on the same subnet (broadcast domain)
  in order to forward broadcast and multicast packets.
  
  # Create an IPv6+IPv4 Dual Stack IPvlan L3 network
  # Gateways for both v4 and v6 are set to a dev e.g. 'default dev eth0'
  $ docker network create -d ipvlan \
   --subnet=192.168.110.0/24 \
   --subnet=192.168.112.0/24 \
   --subnet=2001:db8:abc6::/64 \
   -o parent=eth0 \
   -o ipvlan_mode=l3 ipnet110
  
  # Start a few of containers on the network (ipnet110)
  # in separate terminals and check connectivity
  $ docker run --net=ipnet110 -it --rm alpine /bin/sh
  # Start a second container specifying the v6 address
  $ docker run --net=ipnet110 --ip6=2001:db8:abc6::10 -it --rm alpine /bin/sh
  # Start a third specifying the IPv4 address
  $ docker run --net=ipnet110 --ip=192.168.112.30 -it --rm alpine /bin/sh
  # Start a 4th specifying both the IPv4 and IPv6 addresses
  $ docker run --net=ipnet110 --ip6=2001:db8:abc6::50 --ip=192.168.112.50 -it --rm alpine /bin/sh
  Interface and routing table outputs are as follows:
  
  $$ ip a show eth0
  63: eth0@if59: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
   link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff
   inet 192.168.112.2/24 scope global eth0
   valid_lft forever preferred_lft forever
   inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link
   valid_lft forever preferred_lft forever
   inet6 2001:db8:abc6::10/64 scope link nodad
   valid_lft forever preferred_lft forever
  
  # Note the default route is the eth device because ARPs are filtered.
  $$ ip route
   default dev eth0 scope link
   192.168.112.0/24 dev eth0 proto kernel scope link src 192.168.112.2
  
  $$ ip -6 route
  2001:db8:abc4::/64 dev eth0 proto kernel metric 256
  2001:db8:abc6::/64 dev eth0 proto kernel metric 256
  default dev eth0 metric 1024
  
  NoteThere may be a bug when specifying --ip6= addresses when you delete a
  container with a specified v6 address and then start a new container with the
  same v6 address it throws the following like the address isn't properly being
  released to the v6 pool. It will fail to unmount the container and be left dead.
  
  docker: Error response
  ```