[LINUX] Moteur Docker - Construction source CE

introduction

Construisez Docker Engine - Community Edition à partir du code source. Les dernières versions des sources changent de plusieurs manières. Les informations de construction source sont disponibles ailleurs, mais je n'ai vu aucune information japonaise montrant les dernières instructions de construction. Si les informations sont un peu anciennes, la procédure de construction sera différente [^ 1]. Par conséquent, le texte montre la dernière version de la source Docker-ce-19.03.11 en juin 2020.

[^ 1]: En premier lieu, la structure du projet de Docker a changé, et le Docker Engine est désormais sous la responsabilité de Moby Project. Par conséquent, les informations obtenues à partir de [https://github.com/docker/docker] pour la source git sont obsolètes. De plus, étant donné que les versions du démon Docker et du client Docker ont été séparées à un moment donné, la procédure dans le texte principal est nécessaire pour construire le démon et le client en même temps.

Soyez prudent si vous suivez la procédure décrite dans le texte. Dans la distribution Linux que beaucoup de gens utilisent, il y a un gestionnaire de paquets, et je pense que le module Docker est installé en tant que paquet. Le travail dans le texte tente de désactiver le Docker emballé et de le remplacer par un Docker auto-construit. De plus, comme j'utilise Linux From Scratch, je ne considère pas le gestionnaire de paquets, et je n'hésite pas à l'installer en tant que / usr / bin. Assurez-vous de bien comprendre les conditions gérées par le gestionnaire de paquets et les risques d'endommagement de l'environnement avant de passer au texte. Par exemple, prenez des mesures telles que la définition de la destination d'installation sur / usr / local / bin.

supposition

L'auteur est [Linux From Scratch](http: //) comme indiqué dans cet article de Qiita "Présentation du moteur Docker à Linux From Scratch". Nous utilisons un système d'exploitation Linux construit sur la base de www.linuxfromscratch.org), et nous allons construire le source sur cet OS. Cependant, je pense que cette méthode de construction source fonctionne pour Linux OS en général. En effet, lors de la construction à partir de la source Docker, un conteneur Docker est créé à l'aide de Docker (pour être exact, le démon Docker) déjà installé sur le système (= système hôte) où la génération source est effectuée, et la source est créée dans ce conteneur. Parce qu'il construit. Parlant comme Docker, dans un environnement encapsulé dans un conteneur, les outils de construction nécessaires sont installés dynamiquement, c'est-à-dire installés à ce stade et construits, de sorte que n'importe quel système hôte Linux peut être utilisé et les outils de construction sont installés dans le système hôte. Vous pouvez le construire même s'il n'est pas en ordre.

En général, les hypothèses suivantes sont formulées.

procédure

Dans ce qui suit, cette procédure est effectuée par l'utilisateur root. S'il vous plaît soyez prudente.

1. Télécharger la source

Il existe deux façons d'obtenir la source. La première consiste à utiliser le code source résumé dans l'archive tar. Et l'autre est d'obtenir la dernière source du dépôt git, comme cela est souvent expliqué partout. Je pense que vous devriez décider lequel choisir en fonction de votre objectif et de vos préférences, mais je recommande la méthode tarball.

1.1. Obtenir l'archive tar

La source tarball est fournie par la page officielle de publication du site Docker Github (https://github.com/docker/docker-ce/releases). Il y a un lien de téléchargement de l'archive tar au milieu de la description longue et longue de la version, ce qui est difficile à comprendre, mais si vous regardez de plus près, [Code source] (tar.gz)](https://github.com/docker/docker-ce/archive/v19.03.11.tar.gz). Dans le texte, la dernière v19.03.11.tar.gz au moment de la rédaction est utilisée.

Utilisez donc wget pour télécharger. Pour le répertoire de téléchargement, utilisez / mnt / lfs / sources comme exemple de répertoire pour la construction source.

C'est un goût personnel ici, mais comme le nom de l'archive tar est v19.03.11.tar.gz, vous ne pouvez pas dire quelle est l'archive tar source simplement en la regardant. Étant donné que nous le gérerons plus tard, nous renommerons le fichier et le téléchargerons en utilisant l'option wget`` --output-document comme indiqué ci-dessous.

# cd /mnt/lfs/sources
# wget -N https://github.com/docker/docker-ce/archive/v19.03.11.tar.gz \
    --output-document docker-ce-19.03.11.tar.gz

Si vous vérifiez le contenu de l'archive tar au cas où, vous pouvez voir que divers codes sources sont rassemblés sous le répertoire docker-ce-19.03.11.

# tar tf docker-ce-19.03.11.tar.gz | less
docker-ce-19.03.11/
docker-ce-19.03.11/.github/
docker-ce-19.03.11/.github/PULL_REQUEST_TEMPLATE
docker-ce-19.03.11/.gitignore
docker-ce-19.03.11/CHANGELOG.md
docker-ce-19.03.11/CONTRIBUTING.md
docker-ce-19.03.11/Makefile
docker-ce-19.03.11/README.md
docker-ce-19.03.11/VERSION
docker-ce-19.03.11/components.conf
docker-ce-19.03.11/components/
docker-ce-19.03.11/components/cli/
docker-ce-19.03.11/components/cli/.dockerignore
(Ce qui suit est omis)

Décompressez (décompressez) l'archive tar et déplacez-la vers le répertoire source supérieur docker-ce-19.03.11.

# tar xf docker-ce-19.03.11.tar.gz
# cd docker-ce-19.03.11

Si vous choisissez d'obtenir cette archive tar, ignorez la description de git ci-dessous et passez à la section 2. Construction source.

1.2. Obtention du source par git

Clonez le référentiel officiel Docker git pour obtenir le dernier code source. Un nouveau répertoire docker-ce sera créé, alors allez-y.

# cd /mnt/lfs/sources
# git clone https://github.com/docker/docker-ce.git
# cd docker-ce

2. Construction de la source

2.1. Décision de politique de création de source

Avant de procéder à la génération source, définissez d'abord la stratégie de génération.

2.1.1. Déterminer la cible de construction

Si vous entrez dans le répertoire source et tapez make, cela seul ne démarrera pas le processus de construction et affichera une liste de cibles de construction make. make est conçu pour s'exécuter avec une cible de construction donnée comme argument. En d'autres termes, vous devez décider quelle cible de construction make choisir. Il existe plusieurs cibles, mais il existe trois façons de créer un nouveau module d'exécution Docker.

Sauf si vous avez un objectif de construction clair, l'essentiel est que vous devriez choisir statique. Je vais choisir cela dans le texte.

Comme son nom l'indique, deb et rpm sont censés construire respectivement les packages deb et rpm. Je ne l'ai pas vraiment essayé, donc je ne l'expliquerai pas dans cet article.

2.1.2. Mesures de construction minimale

Le choix de la make build target static a l'inconvénient de construire trop de modules exécutables. Plus précisément, il compile tous les modules d'exécution pour les architectures compatibles telles que Linux, Windows, Mac et ARM. À moins que vous n'essayiez de créer tout cela, vous n'avez pas besoin de tout. Même si la génération des sources Docker prend beaucoup de temps à construire, la construction de tout nécessite une grande préparation.

Ma conscience est de reconfigurer le démon Docker et les modules clients fonctionnant sur le système d'exploitation Linux avec une version source, sans avoir besoin d'un module d'exécution Windows ou Mac. Par conséquent, ne construisez que le module d'exécution Linux.

2.2. Vérifier avant la construction

Le démon Docker doit être en cours d'exécution pour pouvoir créer une source Docker. S'il n'est pas démarré, démarrez-le comme suit.

# systemctl start docker
2.3. Exécutez la compilation

Le répertoire docker-ce-19.03.11 créé par décompression (décompression) de l'archive tar est le répertoire principal source. (Ou docker-ce est le répertoire principal source si vous l'avez obtenu à partir du référentiel git.)

Commencez par passer au répertoire supérieur source.

# cd /mnt/lfs/sources/docker-ce-19.03.11

Ensuite, lancez make static. Cependant, si vous l'exécutez tel quel, il créera tous les modules d'exécution pour l'architecture correspondante comme mentionné ci-dessus. Pour créer uniquement le module exécutable pour Linux, tapez:

# make static DOCKER_BUILD_PKGS=static-linux

Je vais expliquer brièvement la signification de la commande ci-dessus.

.PHONY: static
static: DOCKER_BUILD_PKGS:=static-linux cross-mac cross-win cross-arm
2.4. Vérification du temps de traitement de la construction

Au fait, j'ai utilisé la commande time pour mesurer le temps de construction de toutes les versions de module en exécutant uniquement make static et les versions de module Linux avec DOCKER_BUILD_PKGS = static-linux. L'environnement de construction est le même environnement avec une image virtuelle sur VMware, Linux From Scratch, mémoire 2 Go, swap 1 Go. Voyez la différence écrasante.

Méthode de traitement Commande de traitement temps de traitement
Construction de tous les modules make static 4 heures 06 minutes 49 secondes
Construire le module Linux uniquement make static DOCKER_BUILD_PKGS=static-linux 59 minutes 04 secondes

Dans toutes les versions de modules, nous construisons 4 types de modules pour l'architecture, static-linux, cross-mac, cross-win et cross-arm, et il faut environ 1 heure pour construire une architecture. Le résultat est que c'est nécessaire.

3. Installation (sauvegarde du module d'exécution)

3.1. Module de confirmation d'exécution

Les modules d'exécution construits par make static sont stockés dans <répertoire principal source> / components / packaging / static / build / linux. L'un est une archive tar qui rassemble les modules d'exécution, et l'autre est un module d'exécution individuel dans le sous-répertoire docker (et docker-rootless-extras). Je vais. La situation est la suivante. Vous pouvez voir deux archives tar et les sous-répertoires docker et docker-rootless-extras.

# cd /mnt/lfs/sources/docker-ce-19.03.11
# cd components/packaging/static/build/linux
# ls
docker               docker-rootless-extras
docker-19.03.11.tgz  docker-rootless-extras-19.03.11.tgz

Si vous continuez à regarder les sous-répertoires docker et docker-rootless-extras ci-dessus, le module exécutable est toujours là.

# ls docker
containerd       ctr     docker-init   dockerd
containerd-shim  docker  docker-proxy  runc

# ls docker-rootless-extras
dockerd-rootless.sh  rootlesskit  rootlesskit-docker-proxy  vpnkit

La méthode d'installation suivante consiste à copier et à enregistrer l'archive tar quelque part, et dans certains cas à la copier sur une autre machine et à l'installer. Vous pouvez simplement copier le module exécutable dans le sous-répertoire docker (et docker-rootless-extras) directement sur le système hôte. Choisissez la méthode appropriée en fonction de vos besoins. Dans le texte, nous allons procéder avec cette dernière méthode.

3.2. Arrêt du service Docker

Le service Docker sera réinstallé, alors arrêtez d'abord le service Docker.

# systemctl stop docker

Si vous ne le faites pas, même si vous essayez de copier et d'installer le module d'exécution du démon Docker dockerd, systemd récupérera l'ancien dockerd, donc vous obtiendrez un nouveau module d'exécution. La copie par écrasement n'est pas possible.

3.3. Sauvegarde (ou suppression) du module d'exécution jusqu'à ce point

Si nécessaire, effectuez une sauvegarde du module Docker que vous utilisiez. Déplacez-le dans un répertoire et enregistrez-le, ou enregistrez-le avec un suffixe tel que .orig. La procédure de sauvegarde n'apparaît pas dans le texte. Veuillez utiliser la méthode de votre choix.

Alternativement, si vous êtes bien conscient de la situation et que c'est possible, vous pouvez supprimer tous les modules d'exécution Docker précédents. Si vous avez installé des packages liés à Docker à l'aide du gestionnaire de packages fourni par votre distribution Linux, vous souhaiterez peut-être les supprimer. Cependant, je l'écrirai plusieurs fois, mais seulement si je comprends parfaitement la situation.

3.4. Installation du module d'exécution

Comme indiqué ci-dessus, le module d'exécution nouvellement construit est placé sous le répertoire source, c'est donc une méthode pour le copier directement dans / usr / bin. Copiez simplement depuis le répertoire source vers / usr / bin.

J'ai expliqué que le module d'exécution unique est situé dans <répertoire supérieur de la source> / components / packaging / static / build / linux / docker. Donc, comme précédemment, en supposant que le répertoire principal source est / mnt / lfs / sources / docker-ce-19.03.11, procédez comme suit:

# cd /mnt/lfs/sources/docker-ce-19.03.11
# cd components/packaging/static/build/linux/docker
# cp * /usr/bin

Si vous souhaitez également installer l'exécutable sans racine, faites de même pour le répertoire docker-rootless-extras.

# cd /mnt/lfs/sources/docker-ce-19.03.11
# cd components/packaging/static/build/linux/docker-rootless-extras
# cp * /usr/bin

Essayez d'exécuter docker, dockerd et d'autres modules exécutables installés dans / usr / bin avec l'option --version. Assurez-vous que la nouvelle version est installée.

# which -a docker
/usr/bin/docker

# docker --version
Docker version 19.03.11, build
# which -a dockerd
/usr/bin/dockerd

# dockerd --version
Docker version 19.03.11, build unsupported
3.5. Redémarrez le service Docker

Démarrez le service Docker qui a été arrêté.

Si docker.service et docker.socket sont correctement préparés, un nouveau module d'exécution du démon Docker dockerd démarrera à partir d'ici. Je vais vraiment le déplacer.

# systemctl start docker.service
3.6. Contrôle de fonctionnement

Après cela, essayez docker run hello-world et la documentation officielle de Docker Tutorial pour faire fonctionner le démon Docker et le client Docker. Assure-toi.

C'est tout pour le texte.

Recommended Posts

Moteur Docker - Construction source CE
Construire PostgreSQL à partir des sources
La version source de SciPy 1.4 nécessite pybind11
docker build --aider la traduction en japonais
docker build python basé sur alpin
Créer un environnement go à l'aide de Docker
Créer un fichier deb avec Docker
Construire un environnement Mysql + Python avec docker
Développement Google AppEngine avec Docker