容器からの展開


開発用容器を使用することは広範囲にわたる実践になった.開発の一般的なケースは、アプリケーションが必要とするサービスを実行するためです.Redis、MongoDB、あるいは弾性検索をインストールするなど.ほとんどの場合、開発者はアプリケーションに必要なサービス全体を定義するためにdocker-composeに依存します.
私はさらに与えられた言語で開発するために必要なすべてのコンテナイメージを作成することによって物事を撮影した.これには(
  • コードエディタ
  • デバッガ
  • プロファイラー
  • を追跡するツール
  • パッケージマネージャー
  • ビルドツール

  • 動機

    OS非依存
    あなたがMac用のDockerを使用している場合でも、まだ開発にLinuxベースの環境があります.それは本当にLinuxに慣れるために良いです.そして、それは本当の生産容器イメージ(他の多くのものの中で)をつくることに適用されることができます.

    インストール速度
    インストーラのスクリプトを使用すると比較して、コンテナイメージ(特にDocker画像)は、新しいマシンに行くために本当に速いです.これは、コンパイル済みのバイナリでイメージをダウンロードする必要があるためです.たとえば、私は私のイメージの1つのためのソースからcqueryサーバをコンパイルしなければならなかった.インストーラスクリプトを使っているなら、コンパイルされたバイナリを自分でホストしたり、マシンにコンパイルしたりする必要があります.

    移植性
    インストーラースクリプトを使用する場合、あるパッケージが異なる方法でインストールされているため、異なるマシンで動作することはありません.たとえば、誰かがPPAを使用して1台のマシンをインストールしているかもしれませんが、別のマシンでは.debアーカイブとしてインストールされたり、標準のソフトウェアソースを使用しています.対照的に、一度コンテナイメージが構築されると、それは実際には任意のマシン上で動作します.

    再現性
    画像が構築されると、それはどこからも壊れない.インストーラスクリプトとは異なります.私は、インストーラが実行されるときにそれが壊れている構成とスクリプトを保存するためにちょうどGitリポジトリを使用していたとき、私は多くの発生を返しました.

    警告

    Dockerの一般的なユースケースではない
    ワークフローのこの種のDockerからのサポートは恒星ではありませんでした.Dockerによるいくつかの問題は、tofix年をとった.

    まだ接着剤コードが必要
    ホストからコンテナにマップするいくつかのものがあります.私はこれを容易にslipwayと呼ばれるツールを書いた.このツールを書く前に、シェルスクリプトを使ってコンテナを初期化します.
    LinuxオペレーティングシステムとしてLinuxを使用していない場合、物事はさらに複雑になることができます.

    コンテナ化開発環境の解剖

    0 .ベースイメージを選択する
    未起動のために、Dockerイメージを構築するために、コンテナで実行されるステップを定義する構成ファイル(Dockerfile)が必要である.これらのステップの全てが実行されたあと、コンテナは新しいイメージとして「コミットされます」.
    ほとんどの画像は別の画像に基づいています.私は、それが非常に人気があるので、Ubuntuベースから始めることを勧めます.
    空のディレクトリにDockerfileというファイルを追加します.
    FROM ubuntu:bionic
    

    1 .ユーザの設定
    イメージはrootユーザだけである.コンテナーの内部で実行する適切なパーミッションを持つユーザーを作成する必要があります.
    # Feel free to change this to whatever your want
    ENV DOCKER_USER developer
    
    # Create user with passwordless sudo. This is only acceptable as it is a
    # private development environment not exposed to the outside world. Do 
    # NOT do this on your host machine or otherwise.
    RUN apt-get update && \
        apt-get install -y sudo && \
        adduser --disabled-password --gecos '' "$DOCKER_USER" && \
        adduser "$DOCKER_USER" sudo && \
        echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \
        touch /home/$DOCKER_USER/.sudo_as_admin_successful && \
        rm -rf /var/lib/apt/lists/*
    
    USER "$DOCKER_USER"
    
    WORKDIR "/home/$DOCKER_USER"
    

    2 .基本ツール
    Ubuntuコア(それは我々のイメージがベースになっている)は“準備ができて出荷する”アプリケーションのために構築されて以来、多く含まれていません.開発用の基本パッケージを追加します
    RUN yes | sudo unminimize && \
        sudo apt-get install -y man-db bash-completion build-essential curl openssh-client && \
        sudo rm -rf /var/lib/apt/lists/*
    

    多重化(任意)
    VSCodeやWebStormのようなGUIエディタを使用していない場合は、おそらく単一のシェルセッションを取ることができますし、複数のものに分割プログラムをするでしょう.これをterminal multiplexerと呼ぶ.私はtmuxを好みます.
    RUN sudo apt-get update && \
        sudo apt-get install -y tmux && \
        sudo rm -rf /var/lib/apt/lists/*
    
    私がここで議論することができた多くのカスタマイズオプションがあります、しかし、チュートリアルを短くするために、私はこのステップを飛ばしています.開発された開発環境アイデアのためのFeel free to check out my project.

    選択したエディタをインストールする
    ソースコードを編集する必要があります.私はneovimを推薦することができます、しかし、どんなエディタもします.
    RUN sudo apt-get update && \
        sudo apt-get install -y neovim && \
        sudo rm -rf var/lib/apt/lists/*
    
    上記のように、私はカスタマイズオプションをスキップしています.

    ランタイムのインストール
    この例では、サイト上のほとんどの開発者が使用しているので、nodejsをインストールします.Pythonや他の言語を使っているなら、代わりにインストールすることができます.
    RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
    ENV NVM_DIR /home/$DOCKER_USER/.nvm
    
    RUN . "$NVM_DIR/nvm.sh" && \
        nvm install --lts && \
        nvm alias default stable
    
    このステップで選択した言語の追加ツールをインストールします.

    ビル、その後
    必要なのは、実行する前にイメージをビルドすることです.
    端末で次のコマンドを実行します.
    docker build -t development-environment .
    
    あなたの環境を実行する最終的なコマンドは、あなたが何を乗り換えたいかに基づいて変わることができます.以下に例を示します.
    docker run --rm -ti \
        -v $HOME/workspace:/home/developer/workspace \
        development-environment bash
    
    このチュートリアルのより詳細なバージョンは、リポジトリのtutorial節を参照してください.