Article ID: 125115, created on May 20, 2015, last review on May 20, 2015

  • Applies to:
  • Virtuozzo 6.0
  • Virtuozzo containers for Linux

A partir de la actualización 9 (6.0.9-2806), Virtuozzo soporta la ejecución de Docker en los contenedores.

En este artículo se detalla cómo configurar Docker y se describen las limitaciones conocidas.

Índice de contenidos:

Requisitos previos

Para poder ejecutar Docker en un contenedor es necesario cumplir los siguientes requisitos:

  • El servidor debe ejecutarse en el kernel 2.6.32-042stab105.4 o en una versión posterior

    Si ejecuta el siguiente comando podrá ver el kernel usado:

    [root@pcs ~]# uname -r
    2.6.32-042stab106.4
    
  • En el host se han cargado los módulos veth y bridge del kernel

    A través de la ejecución del siguiente comando podrá comprobar si se han cargados estos módulos, en cuyo caso los módulos serán imprimidos:

    [root@pcs ~]# lsmod | awk '$1=="veth" || $1=="bridge"'
    veth                    4866  0
    bridge                 85143  0
    
  • El contenedor se ejecuta en CentOS 7 o Fedora 21

Le recomendamos instalar Docker mediante la plantilla de aplicación, ya que así la mayoría de los pasos de configuración se efectuarán de forma automática, incluyendo la creación del script modprobe para la carga automática del módulo veth.

Instalación mediante una plantilla

  1. Cree un contenedor CentOS 7 (o Fedora 21):

    [root@pcs ~]# vzctl create <CTID> --ostemplate centos-7-x86_64
    
  2. Configure el modo de red bridged en el contenedor:

    [root@pcs ~]# vzctl set <CTID> --netif_add eth0 --save
    [root@pcs ~]# vzctl set <CTID> --ifname eth0 --ipadd <IP>/<Netmask> --gw <GatewayIP> --save
    
  3. Configure la prestación bridge y permita todos los módulos iptables (full netfilter) en el contenedor:

    [root@pcs ~]# vzctl set <CTID> --features bridge:on --save
    [root@pcs ~]# vzctl set <CTID> --netfilter full --save
    [root@pcs ~]# vzctl set <CTID> --devnodes net/tun:rw --save
    
  4. Instale la plantilla de aplicación correspondiente de Docker en un nodo hardware:

    [root@pcs ~]# yum install docker-centos-7-x86_64-ez
    
  5. Instale la plantilla de aplicación de Docker en el contenedor:

    [root@pcs ~]# vzctl start <CTID>
    [root@pcs ~]# vzpkg install <CTID> docker
    

Instalación manual

  1. Cree un contenedor CentOS 7 (o Fedora 21):

    [root@pcs ~]# vzctl create <CTID> --ostemplate centos-7-x86_64
    
  2. Configure el modo de red bridged en el contenedor:

    [root@pcs ~]# vzctl set <CTID> --netif_add eth0 --save
    [root@pcs ~]# vzctl set <CTID> --ifname eth0 --ipadd <IP>/<Netmask> --gw <GatewayIP> --save
    
  3. Configure la prestación bridge y permita todos los módulos iptables (full netfilter) en el contenedor:

    [root@pcs ~]# vzctl set <CTID> --features bridge:on --save
    [root@pcs ~]# vzctl set <CTID> --netfilter full --save
    [root@pcs ~]# vzctl set <CTID> --devnodes net/tun:rw --save
    
  4. Configure cgroups personalizados en systemd:

    systemd lee /proc/cgroups y monta todos los cgroups allí activados, si bien existe una restricción que hace que en un contenedor solo pueda montarse freezer,devices y cpuacct,cpu,cpuset y no freezer, cpu y otros por separado.

    Ejecute el siguiente comando para así configurar cgroups correctamente:

    [root@pcs ~]# vzctl mount <CTID>
    [root@pcs ~]# echo "JoinControllers=cpu,cpuacct,cpuset freezer,devices" >> /vz/root/<CTID>/etc/systemd/system.conf 
    
  5. En el host, cargue el módulo veth:

    [root@pcs ~]# modprobe veth
    

    Le recomendamos configurar el servidor para que el módulo veth se cargue de forma automática durante el arranque. Si desea más información, consulte la documentación correspondiente.

  6. Inicie el contenedor:

    [root@pcs ~]# vzctl start <CTID>
    
  7. Prepare Docker en el contenedor

    Estos pasos pueden realizarse en el propio contenedor.

    1. Instale Docker:

      [root@docker ~]# yum -y install docker-io
      
    2. Inicie el daemon de Docker

      [root@docker ~]# service docker start
      

Limitaciones

La ejecución de Docker en un contenedor presenta algunas restricciones:

  • Actualmente únicamente se soporta el controlador gráfico vfs de Docker
  • No se soporta la verificación y la migración en tiempo real de un contenedor que contenga contenedores Docker
  • En contenedores Docker que estén ejecutándose en un contenedor Virtuozzo no pueden crearse bridges

Incidencias conocidas

A continuación se detallan las incidencias que pueden experimentarse al configurar Docker:

  1. El servicio docker no puede iniciarse debido al error inappropriate ioctl for device

    [root@docker ~]# service docker start
    Redirecting to /bin/systemctl start  docker.service
    Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.
    [root@docker ~]# systemctl status docker.service
    docker.service - Docker Application Container Engine
       Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
       Active: failed (Result: exit-code) since Fri 2015-04-03 17:24:05 NOVT; 9s ago
         Docs: http://docs.docker.com
      Process: 544 ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
     Main PID: 544 (code=exited, status=1/FAILURE)
    
    Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="+job serveapi(unix:///var/run/docker.sock)"
    Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="+job init_networkdriver()"
    Apr 03 17:24:05 docker.host docker[544]: inappropriate ioctl for device
    Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="-job init_networkdriver() = ERR (1)"
    Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="fatal" msg="inappropriate ioctl for device"
    [root@docker ~]#
    

    Este error denota que la prestación bridge no ha sido activada para el contenedor. Para activarla, ejecute el siguiente comando:

    [root@pcs ~]# vzctl set <CTID> --features "bridge:on" --save
    

    Nota: a continuación debería reiniciar el contenedor.

  2. El servicio docker no puede iniciarse debido al error Unable to enable network bridge NAT:

    [root@docker ~]# systemctl status docker.service
    docker.service - Docker Application Container Engine
       Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
       Active: failed (Result: exit-code) since Fri 2015-04-03 17:27:17 NOVT; 3s ago
         Docs: http://docs.docker.com
      Process: 445 ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
     Main PID: 445 (code=exited, status=1/FAILURE)
    
    Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="+job serveapi(unix:///var/run/docker.sock)"
    Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="+job init_networkdriver()"
    Apr 03 17:24:05 docker.host docker[544]: inappropriate ioctl for device
    Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="info" msg="-job init_networkdriver() = ERR (1)"
    Apr 03 17:24:05 docker.host docker[544]: time="2015-04-03T17:24:05+06:00" level="fatal" msg="inappropriate ioctl for device"
    Apr 03 17:27:17 docker.host docker[445]: time="2015-04-03T17:27:17+06:00" level="info" msg="+job serveapi(unix:///var/run/docker.sock)"
    Apr 03 17:27:17 docker.host docker[445]: time="2015-04-03T17:27:17+06:00" level="info" msg="Listening for HTTP on unix (/var/run/docker.sock)"
    Apr 03 17:27:17 docker.host docker[445]: time="2015-04-03T17:27:17+06:00" level="info" msg="+job init_networkdriver()"
    Apr 03 17:27:17 docker.host docker[445]: Unable to enable network bridge NAT: iptables failed: iptables --wait -I POSTROUTING -t nat -s 172.17.42.1/16 ! -o doc...to insmod?)
    Apr 03 17:27:17 docker.host docker[445]: Perhaps iptables or your kernel needs to be upgraded.
    Apr 03 17:27:17 docker.host docker[445]: (exit status 3)
    Apr 03 17:27:17 docker.host docker[445]: time="2015-04-03T17:27:17+06:00" level="info" msg="-job init_networkdriver() = ERR (1)"
    Apr 03 17:27:17 docker.host docker[445]: time="2015-04-03T17:27:17+06:00" level="fatal" msg=" (exit status 3)"
    Hint: Some lines were ellipsized, use -l to show in full.
    [root@docker ~]#
    

    Este error aparece cuando el contenedor no puede configurar reglas relacionadas con NAT en iptables. Lo más probable es que el parámetro netfilter no se haya definido a full para el contenedor. Para activarlo, ejecute el siguiente comando:

     [root@pcs ~]# vzctl set <CTID> --netfilter full --save
    

    Nota: a continuación debería reiniciar el contenedor.

  3. No es posible ejecutar el contenedor docker debido al error mountpoint for devices not found:

    [root@docker ~]# docker run -i -t docker.io/centos "/bin/bash"
    FATA[0027] Error response from daemon: Cannot start container 384ecb8bd892ff2e0bb45b785ffbbf9243e2d62fa9380dcf1baa9374daf138c2: mountpoint for devices not found
    

    La causa de la aparición de este error es una configuración incorrecta de cgroups. Por ejemplo:

    [root@docker ~]# grep ^JoinControllers /etc/systemd/system.conf
    [root@docker ~]#
    

    Ejemplo de una configuración correcta (la única configuración correcta):

    [root@docker ~]# grep ^JoinControllers /etc/systemd/system.conf
    JoinControllers=cpu,cpuacct,cpuset freezer,devices
    [root@docker ~]#
    

    Para configurar cgroups, ejecute el siguiente comando en el contenedor:

    [root@docker ~]# echo "JoinControllers=cpu,cpuacct,cpuset freezer,devices" >> /etc/systemd/system.conf
    [root@docker ~]# service docker restart
    
  4. No es posible ejecutar el contenedor docker debido al error operation not supported:

    [root@docker ~]# docker run -i -t docker.io/centos "/bin/bash"
    FATA[0022] Error response from daemon: Cannot start container fa074c365b09d47050ff39d2ce9fc4af94b551a5fc33fbc1da6e8cdd52af003a: operation not supported
    [root@docker ~]#
    

    Este error aparece cuando en el host no se ha cargado el módulo veth:

    [root@pcs ~]# lsmod | grep veth
    [root@pcs ~]#
    

    Cargue el módulo para que así el contenedor pueda iniciarse. Tenga en cuenta que el siguiente comando debe ejecutarse a nivel del nodo hardware:

    [root@pcs ~]# modprobe veth
    

    Le recomendamos configurar el servidor para que el módulo veth se cargue de forma automática durante el arranque. Si desea más información, consulte la documentación correspondiente.

  5. No es posible ejecutar el contenedor docker debido al error mountpoint for devices not found

    [root@docker ~]# docker run -i -t docker.io/centos "/bin/bash"
    2015/03/26 19:01:20 Error response from daemon: Cannot start container 970299d4271782d5e1451f1204edd72eda3c506e2f0d02498821c0d9087f8066: mountpoint for devices not found
    

    Este error puede aparecer cuando el nodo hardware no esté ejecutándose en un kernel soportado. La versión del kernel debería ser 2.6.32-042stab105.4 o una versión posterior. Reinicie el host en una de las versiones soportadas del kernel para así resolver la incidencia.

c62e8726973f80975db0531f1ed5c6a2 2897d76d56d2010f4e3a28f864d69223 0dd5b9380c7d4884d77587f3eb0fa8ef e8e50b42231236b82df27684e7ec0beb d02f9caf3e11b191a38179103495106f

Email subscription for changes to this article
Save as PDF