Docker for Arm on Linux の使用を開始する

ティッカー


このブログ投稿は、ArmとDockerのコラボレーションの成果です。 オリジナルのコンテンツの多くを作成してくれたJason Andrews @ Armに感謝します。

ArmとDockerは今年初めに戦略的パートナーシップ を発表し、IoTエンドポイントからネットワークのエッジ、データセンターの中心まで、さまざまなデバイスセットにわたってソフトウェア開発と展開を統合しました。 Dockerは、エンタープライズソフトウェアの開発とデプロイを簡素化し、Armベースのクラウドインスタンスでの真のマルチプラットフォームの移植性とコスト削減を実現します。 さらにエキサイティングなのは、Dockerが組み込みソフトウェアの開発と展開の方法をどのように変えているかです。

従来の組み込みLinuxソフトウェアアプリケーションは、ファイルをクロスコンパイルして組み込みターゲットボードにコピーすることによって作成されていました。 このプロセスを自動化する方法はさまざまですが、Linuxを実行するx86以外の組み込み所有者が登場した1990年代から一般的に変わっていません。 Dockerは、組み込みLinuxアプリケーション開発者のワークフローに最初の重要な変更を加える立場にあります。

この記事は、「Docker Desktop を使用した Arm および x86 用のマルチアーキテクチャ イメージの構築」に続き、Linux での同じ機能を示します。 WindowsとMacのサポートは素晴らしいですが、組み込みLinuxシステムをターゲットとするソフトウェア開発者の大多数は、Linuxでも開発作業を行っています。 Dockerのマルチアーキテクチャサポートにより、組み込みLinuxアプリケーションの開発とデプロイも大幅に簡素化されます。

x86 Linux マシンでソフトウェア開発を行っていて、Arm サーバーまたは Arm 組み込みおよび IoT デバイスで実行される Docker イメージを作成する場合、この記事はプロセスとそのさまざまな方法を理解するのに役立ちます。

Linux の新しい buildx 機能を使用して Arm ソフトウェア開発に Docker を使用し、マルチアーキテクチャのコンテナー イメージを作成して実行する方法を見てみましょう。 私はUbuntu 18.04を使用していますが、同じ情報がほとんどのLinuxディストリビューションに適用されます。

ドッカーをインストールする

LinuxにDockerをインストールするには、いくつかのコマンドが必要です。 インストールの詳細については、Docker のドキュメントを参照してください。

古いバージョンの Docker が既にある場合は、必ず最初に アンインストール してください。 buildxを使用するにはDocker 19.03が必要であり、現在、これを取得する最良の方法は、安定バージョンの代わりにテストを使用することです。

$ sudo apt-get update
$ sudo apt-get upgrade
$ curl -fsSL test.docker.com -o get-docker.sh && sh get-docker.sh

現在のユーザーを docker グループに追加して、docker コマンドを実行するために sudo が不要になるようにします。

$ sudo usermod -aG docker $USER 

必ずログアウトしてから再度ログインしてください。 次に、迅速なhello-world実行でインストールをテストします。

$ docker run hello-world 

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

docker version コマンドを使用して、実行中のバージョンを確認します。

$ docker version
Client:
 Version:           19.03.0-beta4
 API version:       1.40
 Go version:        go1.11.5
 Git commit:        d9934ea
 Built:             Tue May 14 06:46:47 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          19.03.0-beta4
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.11.5
  Git commit:       d9934ea
  Built:            Tue May 14 06:44:59 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.5
  GitCommit:        bb71b10fd8f58240ca47fbb579b9d1028eea7c84
 runc:
  Version:          1.0.0-rc6+dev
  GitCommit:        2b18fe1d885ee5083ef9f0838fee39b62d653e30
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

マルチアーキテクチャ イメージ ビルド用の buildx のインストール

Linux で buildx を入手するには、次の 3 つのオプションがあります。

  • Docker のテスト チャネル バージョンから直接 buildx を使用する
  • buildx のバイナリ リリースをダウンロードし、$HOME/.docker にコピーします。 ディレクトリ
  • github.com からbuildxをダウンロード、ビルド、およびインストールする
ドッカーテストチャネルからビルドxを使用する

Docker のテスト バージョンには既に buildx が含まれています。 必要なのは、実験的なコマンドライン機能を有効にするように環境変数を設定することだけです。

$ export DOCKER_CLI_EXPERIMENTAL=enabled
バイナリリリースをダウンロードする

buildxを入手する別の方法は、githubからバイナリリリースをダウンロードし、.docker / cliプラグインを配置することです ディレクトリ。

たとえば、ブラウザーを使用して Linux amd64 用の buildx を次の場所からダウンロードします。 https://github.com/docker/buildx/releases/tag/v0.2.0

次に、それをcli-plugins/ディレクトリにコピーします(必要に応じて最初に作成します)。

$ cp buildx-v0.2.0.linux-amd64 ~/.docker/cli-plugins/docker-buildx
buildx のダウンロード、ビルド、インストール

buildxは新しいコマンドであり、ドキュメントはまだ追いついているため、 ギットハブ buildx のしくみに関する詳細情報を読むのに適した場所です。

githubからbuildxを取得するには、次のコマンドを使用します。

$ export DOCKER_BUILDKIT=1
$ docker build --platform=local -o . git://github.com/docker/buildx
$ mkdir -p ~/.docker/cli-plugins
$ mv buildx ~/.docker/cli-plugins/docker-buildx

buildx がインストールされていることを確認するには、ヘルプとバージョン コマンドを実行します。

$ docker buildx --help 
 
Usage:  docker buildx COMMAND
Build with BuildKit

Management Commands:
  imagetools  Commands to work on images in registry

Commands:
  bake        Build from a file
  build       Start a build
  create      Create a new builder instance
  inspect     Inspect current builder instance
  ls          List builder instances
  rm          Remove a builder instance
  stop        Stop builder instance
  use         Set the current builder instance
  version     Show buildx version information 

Run 'docker buildx COMMAND --help' for more information on a command.

$ docker buildx version
github.com/docker/buildx v0.2.0-36-g4e61674 4e61674ac805117794cc55475a62efdef0be9818

x64 マシンで実行する Arm 実行可能ファイルを登録する

qemu命令エミュレーションをインストールして、x86マシンで実行するArm実行可能ファイルを登録します。 最良の結果を得るには、 最新の qemu イメージ を使用する必要があります。 古い qemu を使用すると、一部のアプリケーションが x86 ハードウェアで正しく動作しない可能性があります。

$ docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3 

qemuハンドラーが正しく登録されていることを確認するには、次のコマンドを実行し、出力の最初の行が「有効」であることを確認します。 ハンドラーの登録は再起動後も存続しませんが、システムの起動スクリプトに追加できることに注意してください。

$ cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled
interpreter /usr/bin/qemu-aarch64
flags: OCF
offset 0
magic 7f454c460201010000000000000000000200b7

マルチアーキテクチャのビルドインスタンスを作成する

新しいビルダーインスタンスをセットアップして、マルチアーキテクチャイメージを作成します。

$ docker buildx create --name mybuilder
$ docker buildx use mybuilder
$ docker buildx inspect --bootstrap
Name: mybuilder
Driver: docker-container

Nodes:
Name: mybuilder0
Endpoint: unix:///var/run/docker.sock
Status: running
Platforms: linux/amd64, linux/arm64, linux/arm/v7, linux/arm/v6

ビルドxを試す

buildxの例は複数ありますが、ここではCプログラマ向けの簡単な例を紹介します。 hello.c という名前のファイルを作成します このコードで:

/*
 * hello.c
 */
#include <stdio.h>
#include <stdlib.h>
 
#ifndef ARCH
#define ARCH "Undefined"
#endif  

int main() {
  printf("Hello, my architecture is %s\n", ARCH);
  exit(0);
}

ビルドして実行するためのDockerファイルを次に示します。 組み込みアプリケーションのデプロイで一般的になるため、マルチステージDockerファイルの使用に慣れましょう。 次のように Dockerfile を作成します。

#
# Dockerfile
#
FROM alpine AS builder 
RUN apk add build-base 
WORKDIR /home
COPY hello.c .
RUN gcc "-DARCH=\"`uname -a`\"" hello.c -o hello
 
FROM alpine 
WORKDIR /home
COPY --from=builder /home/hello .
ENTRYPOINT ["./hello"] 

次に、buildx を使用して複数のアーキテクチャ用にビルドし、Docker ハブにプッシュします。

必要に応じて最初に docker ログインを使用し、 独自の ハブ アカウントを置き換えます。

$ docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t timtsai2018/hello . --push 
$ docker buildx imagetools inspect timtsai2018/hello
Name: docker.io/timtsai2018/hello:latest
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest: sha256:6f2ad12a9400330107ca8ad1675ab2924ae18c61bc1d3c600fdf9e2212e3bb7a

Manifests: 
Name: docker.io/timtsai2018/hello:latest@sha256:adcdcf8f511cb35f7cf124df3d339bf677a733ab40260e85945e0037cf02c598
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/arm/v7

Name: docker.io/timtsai2018/hello:latest@sha256:3dc400e687a365aa5140718fde6cbbe37e050606f00274956e17fa9510df9573
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/arm64

Name: docker.io/timtsai2018/hello:latest@sha256:9446cf48281105b4f41f1c697c1258e6d2f9b9389d1c0aa34e2209477ed720cb
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/amd64

マニフェストの sha を使用して実行し、uname からの出力を armv7l、aarch64、および x86_64 として確認します。

$ docker run docker.io/timtsai2018/hello:latest@sha256:adcdcf8f511cb35f7cf124df3d339bf677a733ab40260e85945e0037cf02c598 
Hello, my architecture is Linux buildkitsandbox 4.15.0-50-generic #54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 armv7l Linux

$ docker run docker.io/timtsai2018/hello:latest@sha256:3dc400e687a365aa5140718fde6cbbe37e050606f00274956e17fa9510df9573 
Hello, my architecture is Linux buildkitsandbox 4.15.0-50-generic #54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 aarch64 Linux

$ docker run docker.io/timtsai2018/hello:latest@sha256:9446cf48281105b4f41f1c697c1258e6d2f9b9389d1c0aa34e2209477ed720cb
Hello, my architecture is Linux buildkitsandbox 4.15.0-50-generic #54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 x86_64 Linux

次のステップ

これまで見てきたように、マルチアーキテクチャコンテナの構築は、MacおよびWindows用のDockerデスクトップと同じ方法でbuildxを使用して作成できます。 自分で試してみて、今すぐマルチアーキテクチャのDockerイメージへの移行を始めましょう。

参考文献