アップルシリコンについてのDockerの使用


この記事はzsiegel.com
最近、私は新しいM 1のMacBook Airを私の第一開発機械として使っています.これは私のプライマリインテルベースのデスクトップマシンに加えているので、私は私の標準的な開発ツールをインストールする儀式を開始すると、私は少しの罠を打った.
他の多くのように私は私のdotfiles in githubのすべてを格納します.これは、私が起きるのを助けて、速くサーバーまたは新しいコンピュータで走っています.私は、スクリプトを通して私のツールをインストールするために単純なスクリプトを実行することができます.そして、私が必要とするツールの多くは、どちらも準備ができていません.
私は、サム・ソファーを通してHomebrew on Apple Siliconと題された優秀なポストを読み、別々のロゼッタターミナルでbrewをインストールしました、しかし、私は、このセットアップが本当にこの点で私のニーズに合っているかどうかについて考えるために、一歩後退しました.私は小さなハードドライブでラップトップにいました、そして、私は正直に私のプロジェクトをサポートするために異なる開発ツールと彼らの異なるバージョンのトンをインストールしなければなりませんでした.
私は停止し、自分自身に尋ねた-私はどのように私は最初の場所ですべてのこれらのツールをインストールする必要がないように私のシステムを設定できますか?
私はDockerが包装のための現在の標準であったことを知っていました、そして、ツールを配布して、私はコードを展開するために毎日それを使用しました、しかし、私はそれを活用することができましたか?私のローカルマシンで編集して、実行して、デバッグして、容器でテストさせるシステムを開発することができましたか?

エキスパートドッカーフー
過去に、私は、彼女がGuisでDockerでクロム、SpotifyとSkypeを走らせるJessie Frazelleの好意から狂ったDocker Fuについて読みました-しかし、私が彼らを読むとき、それらを上へ回転させる命令は少しの間私に手を伸ばしました.
私は、これが本当にものについて行くために理想的な方法であるかもしれないと感じました、そして、私の冬の休みの上で、私はRun More Stuff in Docker .
Jonathansポストを読んで、Dockerドキュメンテーションでもう少し時間を過ごした後に、私は私が欲しかったものを成し遂げることができることでより自信があると感じました.
ここでは、私の開発プロジェクトのすべてをセットアップしようとしたので、私は道に沿って学んだことです.Homebrewを介して任意のソフトウェアをインストールするから私を解放し、私の選択の私のネイティブアプリで編集できるように、私も簡単に私が利用可能なARM 64互換ツールを使用して選ぶことができます.

コンテナにカレントディレクトリをマウントする
Jonathansのブログ投稿の中で最も興味深いビットの一つは、コンテナの中に既存のディレクトリをマウントし、その作業ディレクトリをコンテナ内の非常に同じディレクトリに設定する方法です.以下の例は、カレントディレクトリを受け取り、選択したコンテナの中にマウントします.これは魔法のように感じます.それはあなたの既存のディレクトリを取って、変更なしでコンテナに正しくそれを落とすようです.
docker run -it -v "$(pwd)":"$(pwd)" -w "$(pwd)" alpine:latest
サイドノート:M 1では、これは本当に即座に驚くほど起動します.

分離ツールと資格情報
私は常にAWS、GCPとCLIクライアントを持っている他のクラウドツールの間で永続的な構成と資格情報を私のマシンで交換しています.私は、間違った環境に対してコマンドを実行することについて常に偏執しています、そして、ツール自身によって管理されるいくつかのランダムディレクトリにあるすべての私の資格情報の考えを憎みます.
このため、環境ごとにシェルエイリアスを作成することにしました.それぞれの設定ディレクトリに資格情報を指定します.これは、各コンテナには、ツールとそれが必要とする特定の資格情報を持っていることを意味します.
この例は、地形とGoogle Cloud CLIツールの両方をインストールした簡単なアルパインコンテナを利用します.
#!/usr/bin/env dockerfile-shebang
FROM alpine:3.8
ARG CLOUD_SDK_VERSION=321.0.0
ENV CLOUD_SDK_VERSION=$CLOUD_SDK_VERSION
ENV PATH /google-cloud-sdk/bin:$PATH

RUN apk add terraform=0.14.3-r0 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community

RUN apk --no-cache add \
        wget \
        python \
    && wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \
    tar xzf google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \
    rm google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \
    ln -s /lib /lib64 && \
    gcloud config set core/disable_usage_reporting true && \
    gcloud --version
私は、このコンテナを資格証明書を隔離するためにユニークなローカルの設定ディレクトリで起動することができて、CLIツールによって使用のためにそれらをマウントすることができます.この場合、ローカルディレクトリからcredentailsを取っているimは/opcloud/local/gcloud/{ ProjectCore - id }/{環境}で、それらをroot/でマウントします.GCloud CLIツールが設定を期待するところです.
私が最初にこのコンテナを始めるとき、それが空であるかもしれないことに注意してください!この場合、私がローカルのマシンにマップされたボリュームがgcloud auth loginを実行するとすぐに、それらの資格情報はコンテナの右から私のローカルディレクトリに保存されます.
docker run -it -v "/opt/local/gcloud/{PROJECT_ID}/{ENVIRONMENT}":"root/.config" \
               -v "$(pwd)":"$(pwd)" \
               -w "$(pwd)" \
               zsiegel/devops:latest

Dockerfile Shebangの使用
上で注意深く上記のDockerfileを読むならば、Dockerfileの最上位にshebangに気づくでしょう.これは最初は少し奇妙ですが、あなたのDockerFilesの実行可能にすることができますので、上の例のようにカスタムイメージを必要とする場合に必要なビルドステップをスキップできます.
また、これは非常に簡単にセットアップを各プロジェクトのDockerFileを簡単に実行して完全に孤立している.プロジェクトを引き下げたり、依存関係をローカルマシンにインストールしたりしません.それはすべての容器に絶縁することができます!
あなたのものthatsまたはちょうどあなたの経路にちょうどそれを落とすことができるならば、これを支持するためにscript in homebrewを作成しました.
DockerFile Shebangがインストールされているので、このプロジェクトの目的で構築されたDockerFileの中で必要なツールをすべて分離することができます.
たとえば、静的なウェブサイトのためのノードプロジェクトの数があります.私のプロジェクトのそれぞれで、私はProjectClarNameと呼ばれるファイルを持っています.ルートのdockerfile.Dockerfileの内容は以下のようになります.
#!/usr/bin/env dockerfile-shebang
FROM amd64/node:lts-slim
私のプロジェクトのルートでこのファイルを使用すると、次のように実行できます.

# Make the dockerfile executable first - do this only once
chmod +x zsiegel.com.dockerfile

# Run the environment
./zsiegel.com.dockerfile -it -p 8000:8000 -v "$(pwd)":"$(pwd)" -w "$(pwd)" -- /bin/sh

# In the container
yarn install
yarn dev
上記のコマンドは直進し、以前のセクションで学んだことに基づいています.私はDockRootをShebangパッケージの実行可能なおかげで実行します(必要に応じてDockerFileが自動的に構築されることに注意してください)、いくつかのポートを公開し、ローカルにアクセスし、現在のディレクトリをマウントし、私のワークディレクトリを設定し、シェルプロンプトを要求します.

AMD 64とARM 64の使用
私はいくつかのツールは、アップルのシリコン上で実行していると述べた前に、他のされていません.私が見つけたもう一つの利点は、利用可能なARM 64コンパイルされたツールを選ぶ能力です.下を見ると、異なるアーキテクチャを指定する3つのdockerfileの例が表示されます.

デフォルトのアーキテクチャ
#!/usr/bin/env dockerfile-shebang
FROM alpine:latest
 uname -sm
 Linux aarch64
アーキテクチャ指定のないこのDockerfileは、現在のマシンアーキテクチャを検出し、適切なコンテナーを使用しようとします.アップルシリコンの場合はarm64アーキテクチャになります.

X 64アーキテクチャ
#!/usr/bin/env dockerfile-shebang
FROM amd64/node:lts-slim
uname -sm
Linux x86_64
このDockerFileはアーキテクチャ指定を行い、X 64アーキテクチャを指定してエミュレーションを実行します.

ツールバーリング
あなたが開発者であるならば、あなたはJava、ノード、Python、Rubyと他のツールの複数の異なるバージョンをジャグリングすることの痛みを知っていると確信します.手で上記のトリックを使用すると、適切に私のプロジェクトのすべてを確保することができますが必要なソフトウェアのバージョンに対して分離されます.
プロジェクトがXの古いバージョンを必要とするならば、
  • ?右のバージョンでDockerFileを設定します.
  • 私の新しいプロジェクトYは、Javaの最新バージョンに対してコンパイルできますか?完全にそのもう一つのDockerfile離れて.
  • 私はその新しいライブラリを試してみたいが、いくつかの奇妙な古いバージョンが必要ですか?いいえ問題は、ちょうどコンテナでそれを実行する!

  • 2021のDockerと私
    上記の新たな知識は、私が本当に私のワークフローを合理化して、私がこの新しいM 1 MacBook Airでインストールして、管理しなければならないツールを最小にするのを許しました.私は私のローカルマシン上の開発ツールを実行するためのDockerとレバレッジについての詳細を学び続けることを願っています.