instruction: Create a comprehensive Dockerfile for networking applications with best practices
output: ```dockerfile
  from the
  underlying host.VLAN ID 20In the first network tagged and isolated by the Docker host, eth0.20 is the
  parent interface tagged with VLAN id 20 specified with -o parent=eth0.20.
  Other naming formats can be used, but the links need to be added and deleted
  manually using ip link or Linux configuration files. As long as the -o parent
  exists, anything can be used if it is compliant with Linux netlink.
  
  # now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged
  $ docker network create -d ipvlan \
   --subnet=192.168.20.0/24 \
   --gateway=192.168.20.1 \
   -o parent=eth0.20 ipvlan20
  
  # in two separate terminals, start a Docker container and the containers can now ping one another.
  $ docker run --net=ipvlan20 -it --name ivlan_test1 --rm alpine /bin/sh
  $ docker run --net=ipvlan20 -it --name ivlan_test2 --rm alpine /bin/sh
  VLAN ID 30In the second network, tagged and isolated by the Docker host, eth0.30 is the
  parent interface tagged with VLAN id 30 specified with -o parent=eth0.30. The
  ipvlan_mode= defaults to l2 mode ipvlan_mode=l2. It can also be explicitly
  set with the same result as shown in the next example.
  
  # now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged.
  $ docker network create -d ipvlan \
   --subnet=192.168.30.0/24 \
   --gateway=192.168.30.1 \
   -o parent=eth0.30 \
   -o ipvlan_mode=l2 ipvlan30
  
  # in two separate terminals, start a Docker container and the containers can now ping one another.
  $ docker run --net=ipvlan30 -it --name ivlan_test3 --rm alpine /bin/sh
  $ docker run --net=ipvlan30 -it --name ivlan_test4 --rm alpine /bin/sh
  The gateway is set inside of the container as the default gateway. That gateway
  would typically be an external router on the network.
  
  $$ ip route
   default via 192.168.30.1 dev eth0
   192.168.30.0/24 dev eth0 src 192.168.30.2
  Example: Multi-Subnet IPvlan L2 Mode starting two containers on the same subnet
  and pinging one another. In order for the 192.168.114.0/24 to reach
  192.168.116.0/24 it requires an external router in L2 mode. L3 mode can route
  between subnets that share a common -o parent=.Secondary addresses on network routers are common as an address space becomes
  exhausted to add another secondary to an L3 VLAN interface or commonly referred
  to as a "switched virtual interface" (SVI).
  
  $ docker network create -d ipvlan \
   --subnet=192.168.114.0/24 --subnet=192.168.116.0/24 \
   --gateway=192.168.114.254 --gateway=192.168.116.254 \
   -o parent=eth0.114 \
   -o ipvlan_mode=l2 ipvlan114
  
  $ docker run --net=ipvlan114 --ip=192.168.114.10 -it --rm alpine /bin/sh
  $ docker run --net=ipvlan114 --ip=192.168.114.11 -it --rm alpine /bin/sh
  A key takeaway is, operators have the ability to map their physical network into
  their virtual network for integrating containers into their environment with no
  operational overhauls required. NetOps drops an 802.1Q trunk into the
  Docker host. That virtual link would be the -o parent= passed in the network
  creation. For untagged (non-VLAN) links, it is as simple as -o parent=eth0 or
  for 802.1Q trunks with VLAN IDs each network gets mapped to the corresponding
  VLAN/Subnet
  ```