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