SmartOS et docker

Le support de docker dans SmartOS est normalement disponible dans Triton, c’est à dire l’offre de cloud privé de Joyent qui nécessite au moins trois nœuds. Cela dit, il est quand même possible de lancer des conteneurs docker sur une seule machine smartos.

Pour pouvoir importer des images, il faut dans un premier temps ajouter Docker Hub à la liste des sources de l’outil imgadm à l’aide de la commande suivante :

# imgadm sources --add-docker-hub

Malheureusement, l’outil ne sait pas lister les images disponibles, il faut donc connaître le nom de celle qui nous intéresse. Dans mon cas, je souhaitais tester jellyfin, j’ai donc lancé la commande

# imgadm  import jellyfin/jellyfin

Maintenant que l’image est disponible, avant de pouvoir lancer une zone, nous avons besoin de récupérer quelques informations à son propos. Il faut d’abord récurérer son identifiant avec la commande suivante :

# imgadm list --docker
UUID                                  REPOSITORY         TAG     IMAGE_ID      CREATED
e15d5c7a-b5d2-11b8-abad-4db554148839  jellyfin/jellyfin  latest  sha256:2a027  2019-03-01T05:18:44Z

On récupère les informations qui nous intéresse avec la commande suivante :

# imgadm get e15d5c7a-b5d2-11b8-abad-4db554148839
{
  "manifest": {
    "v": 2,
    "uuid": "e15d5c7a-b5d2-11b8-abad-4db554148839",
    "owner": "00000000-0000-0000-0000-000000000000",
    "name": "docker-layer",
    "version": "2a0277a22206",
    "disabled": false,
    "public": true,
    "published_at": "2019-03-01T05:18:44.505Z",
    "type": "docker",
    "os": "linux",
    "description": "/bin/sh -c #(nop)  ENTRYPOINT [\"/bin/sh\" \"-c\" \"dotnet /jellyfin/jellyfin.dll     --datadir /config     --cachedir /cache     --ffmpeg /usr/local/bin/ffmpeg     --ffprobe /usr/local/bin/ffprobe\"]",
    "tags": {
      "docker:repo": "jellyfin/jellyfin",
      "docker:id": "sha256:2a0277a22206bb4a7efb73220ea26bb950e6b1b89f952bc39bf9a352d69e1106",
      "docker:architecture": "amd64",
      "docker:tag:latest": true,
      "docker:config": {
        "Cmd": null,
        "Entrypoint": [
          "/bin/sh",
          "-c",
          "dotnet /jellyfin/jellyfin.dll     --datadir /config     --cachedir /cache     --ffmpeg /usr/local/bin/ffmpeg     --ffprobe /usr/local/bin/ffprobe"
        ],
        "Env": [
          "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
          "ASPNETCORE_URLS=http://+:80",
          "DOTNET_RUNNING_IN_CONTAINER=true",
          "DOTNET_VERSION=2.2.2"
        ],
        "WorkingDir": ""
      }
    },
    "origin": "79e10f97-d120-eab7-16e1-978feae95f55"
  },
  "zpool": "zones",
  "source": "https://docker.io"
}

Ce qui nous intéresse, ce sont les tags qui vont nous permettre d’exécuter la charge utile de l’image, c’est à dire ici la commande et l’environnement associé soit Entrypoint et Env. A partir de là, on peut créer un fichier manifest pour créer une zone de type lx :

{
  "brand": "lx",
  "max_physical_memory": 512,
  "image_uuid": "e15d5c7a-b5d2-11b8-abad-4db554148839",
  "resolvers": [
    "192.168.111.3"
  ],
  "alias": "docker-jellyfin",
  "docker": true,
  "kernel_version": "3.18.0",
  "internal_metadata": {
    "docker:cmd": "[\"/bin/sh\",\"-c\",\"dotnet /jellyfin/jellyfin.dll     --datadir /config     --cachedir /cache     --ffmpeg /usr/local/bin/ffmpeg     --ffprobe /usr/local/bin/ffprobe\"]",                                                                                                                               
    "docker:env": "[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\", \"ASPNETCORE_URLS=http://+:80\", \"DOTNET_RUNNING_IN_CONTAINER=true\",  \"DOTNET_VERSION=2.2.2\"]",                                                                                                                                
    "docker:workingdir": "",
    "docker:workdir": "",
    "docker:open_stdin": true,
    "docker:tty": "true"
  },
  "filesystems": [
    {
      "type": "lofs",
      "source": "zones/media",
      "target": "/media"
    }
  ],
  "nics": [
    {
      "nic_tag": "admin",
      "ip": "192.168.1.4",
      "netmask": "255.255.255.0",
      "gateway": "192.168.1.1"
    }
  ]
}

On peut alors créer notre zone avec la commande habituelle :

vmadm create -f jellyfin.json

Il faut passer une commande supplémentaire pour la prise en compte des spécifités docker :

vmadm update $UUID docker=true

Il n’y a plus qu’à démarrer notre zone :

vmadm start $UUID