Según la configuración predeterminada, el firewall del host de Container-Optimized OS permite solo las conexiones salientes, y acepta las conexiones entrantes únicamente a través del servicio SSH. Puedes ver la configuración exacta de firewall del host si ejecutas sudo iptables -L
en una instancia de VM que ejecuta Container-Optimized OS.
Ten en cuenta que el firewall del host es diferente de las reglas de firewall de la nube privada virtual, que también deben configurarse para que tus aplicaciones funcionen correctamente. Consulta la Descripción general de las reglas de firewall para obtener más información sobre las reglas de firewall de la nube privada virtual.
Ejecuta contenedores en el espacio de nombres de red predeterminado de Docker
Si implementas un contenedor en Container-Optimized OS, debe ser accesible a través de la red, y no debes usar la opción --net=host
de Docker, ejecuta tu contenedor con la opción -p
de Docker. Con esta opción, Docker configurará automáticamente el firewall del host para exponer tu aplicación en la red. Consulta la referencia de ejecución de Docker para obtener más información sobre las opciones de ejecución de Docker.
En el siguiente ejemplo, se podrá acceder al contenedor nginx
en la red en el puerto 80:
docker run --rm -d -p 80:80 --name=nginx nginx
Ejecuta contenedores en el espacio de nombres de red del host
Si implementas un contenedor en Container-Optimized OS al que se debe acceder mediante la red y usas la opción --net=host
de Docker, debes configurar el firewall del host de forma explícita.
Puedes configurar el firewall del host con los comandos iptables
estándar. Al igual que con la mayoría de las distribuciones de GNU/Linux, las reglas de firewall configuradas con comandos de iptables
no persistirán en los reinicios. Para asegurarte de que el firewall del host esté configurado de forma correcta en cada inicio, configura el firewall del host en tu configuración cloud-init
. Considera el siguiente ejemplo de cloud-init
:
#cloud-config
write_files:
- path: /etc/systemd/system/config-firewall.service
permissions: 0644
owner: root
content: |
[Unit]
Description=Configures the host firewall
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- path: /etc/systemd/system/myhttp.service
permissions: 0644
owner: root
content: |
[Unit]
Description=My HTTP service
After=docker.service config-firewall.service
Wants=docker.service config-firewall.service
[Service]
Restart=always
ExecStart=/usr/bin/docker run --rm --name=%n --net=host nginx
ExecStop=-/usr/bin/docker exec %n -s quit
runcmd:
- systemctl daemon-reload
- systemctl start myhttp.service
El uso de esta configuración de cloud-init
con una VM que ejecuta Container-Optimized OS dará como resultado los siguientes comportamientos en cada inicio:
- El firewall del host se configurará para permitir conexiones TCP entrantes en el puerto 80.
- Un contenedor
nginx
escuchará en el puerto 80 y responderá a las solicitudes HTTP entrantes.
Consulta Crea y configura instancias para obtener más información sobre el uso de cloud-init
en Container-Optimized OS.