Riot Games

Dockerシリーズのこの最初のチュートリアルでは、次のことを学びます:

  • 私たちがRiotで達成しようとしているのは

  • Dockerの基本設定

  • 基本的なDockerプルコマンド

  • Dockerコンテナをデーモンとして実行する方法

  • 基本的なJenkins設定オプション

私が1年前にDockerについて最初に学び始め、その使用を模索していたとき、私は素晴らしいドキュメントと例を見つけるのに苦労しました-今日でも、多くの人が最終的に本番環境では準備ができていない単純なユースケースを説明しています。 Dockerコンテナを使用してアプリケーションを生産するには、一時的な性質と単一プロセスの焦点に調整する必要があります。 これは、データ永続性のニーズやマルチプロセスアーキテクチャを持つアプリケーシ

前回の記事で述べたように、私たちはJenkinsをオープンソースソフトウェアの基礎的な部分として使用し、その上に自動化を構築しています。 Jenkinsはまた、アプリケーションを”ドッキング”することについて考える一つの方法を示すための優れたアプリケー これらのアーキテクチャコンポーネントを念頭に置いてJenkinsを展開します:

  • Jenkinsマスターサーバー(Javaプロセス)

  • Jenkinsマスターデータ(プラグイン、ジョブ定義など)

  • NGINX webプロキシ(SSL証明書などを使用していますが、NGINXはここでは簡単に選択できます)

  • スレーブエージェントを構築する(JENKINS MasterにSSHされているマシン、またはjnlpに接続しているマシン)

これは始めるのに良い場所です。 この一連のブログ記事では、上記のすべてをコンテナとして考える方法をカバーし、Dockerコンテナをビルドスレーブとして使用する方法についての高度な まず、Dockerコンテナ内にJenkinsマスターサーバーを作成します。 次に、データの永続性を処理し、NGINXでwebプロキシを追加することに進みます。

このブログシリーズ全体では、次のDockerの概念をカバーします:

  • 独自のDockerfilesを作成する

  • パブリックイメージへのイメージの依存性の最小化

  • バックアップを含むデータボリュームの作成と使用

  • コンテナを使用したコンテナ化された”ビルド環境”の作成

  • 画像とJenkinsによる「秘密」データの処理

Cloudbees Jenkins Dockerイメージを見ていない場合は、本当に良いのでそこから始めてください。 これは、DockerコンテナでJenkinsを実行することを最初に考えたときの私の基準点であり、多くの人にとってはこれで十分かもしれません。 ここに彼らのドキュメントとGit repo/Dockerfile hereを見つけることができます。

この最初のブログは二つのレッスンプランに分割されています。 それぞれが完了するまでに約30分かかるようにサイズされています。 まず、第1部では、開発環境を準備し、Cloudbeesが提供するデフォルトのJenkins Dockerコンテナを使用する方法を学習します。 第二部では、このイメージを独自のDockerfileにラップするための基礎を築き、イメージをよりエレガントに制御することについて説明します。 特に、Dockerを使ったことがない場合や、Dockerを初めて使用する場合には、Jenkinsを使用する方法を既に知っていて理解していると想定しています。 あなたがDockerを経験しているなら、レッスン1の資料のいくつかは、あなたがおそらくすでに知っていることの少しの再ハッシュになります。

レッスン1:最初の画像を設定して実行する

ロールする準備をしましょう。 ここRiotでは、Windows、Mac OSX、およびLinux上のDocker(およびJenkins)と連携しています。 私はOSX上のDockerで作業することを好みますが、Docker1.6以降のWindowsでは完全に機能します。 これらの日は、両方のオペレーティングシステムのための優れたインストーラがあります。 私はOSXの観点から作業しますが、Windows用にも同じツールが存在します。

事前要件:

1. Windows10ProまたはMac OSX Yosemite10.10.3(またはそれ以降)

2が必要です。 Windowsを使用する場合は、Windows仮想化を有効にしていることを確認する必要があります(Dockerが提供するドキュメントを参照)

Kitematic

に関する簡単なメモDocker1.8とDocker Toolboxのリリースでは、DockerにはDockerイメージとコンテナで何が起こっているのかを管理し視覚化するのに役立つ気の利いたGUIツール”Kitematic”が含まれています。 このチュートリアルのほとんどは、コマンドライン引数の使用とKitematic GUIなしでのDockerの操作に焦点を当てています。 これは、基礎となるメカニズムにあなたをよりよく公開することです。 同様に、後のブログでは、複数のコンテナを一度に起動および停止するためのComposeの使用について説明し始めます。

ステップ1:DOCKER

をインストールする1. https://www.docker.com/docker-macまたはhttps://www.docker.com/docker-windows

2. お使いのオペレーティングシステム用の適切なバージョンのDockerをダウンロードしてインストールします

3. すべての設定手順に従ってください。

4. “Docker Quickstart Terminal”を実行して、お使いのOS用の推奨シェル(OSX用のターミナル、Windows用のPowershell)を開き、インストールが動作していることを確認してください。 Windowsでは、これはデスクトップ上のショートカットになります。 OSXでは、applications/Dockerフォルダにあります。 次のコマンドを確認し、エラーが発生しないことを確認してください

docker ps
docker info

5. 他に何かをする前に、Dockerが使用するデフォルトのメモリとCPU設定を増やす必要があります。 後でJenkinsを調整してより多くのメモリを使用するようにしますが、最初にこれらの設定を調整しないと、Jenkinsがクラッシュする可能性があります。

  • ツールバーのDockerウィジェットに移動し、”環境設定”を選択します”

  • 詳細設定タブに移動します

  • CPU使用率を少なくとも4コアに増加させる

6. 安全のためにメモリ使用量を少なくとも8GB、できれば12GB以上に増やしてください(利用可能な場合)

ステップ2:CLOUDBEES JENKINSコンテナをプルして実行します

1。 Dockerターミナルウィンドウに滞在します。

2. 実行して公開レポからJenkinsをプルします:

docker pull jenkins/jenkins
docker run -p 8080:8080 --name=jenkins-master jenkins/jenkins

3. シェルウィンドウの”Jenkins initial setup”メッセージがパスワードを生成することに注意してください。 後で必要になるようにそれを書き留めてください。 紛失した場合は、コンテナを実行して`docker exec jenkins-master cat/var/jenkins_home/secrets/initialAdminPassword’を実行して取得できます。

4. お気に入りのブラウザを開き、それを指すようにしますhttp://localhost:8080

注意してください、あなたは私がDocker–nameフラグを使用し、コンテナにjenkins-masterという名前を付けることがわかります-これは私がこのブログを通して使 コンテナに名前を付けることは、便利なベストプラクティスであり、3つの利点があります。

1. それは

2と覚えて対話することを容易にします。 Dockerは2つのコンテナに同じ名前を付けることを許可していないため、誤って2つの同一のコンテナ

を開始するような間違いを防ぎます3。 多くの一般的なDockerツール(Docker Composeなど)は特定のコンテナ名を使用するため、コンテナの名前を付けることに慣れておくことが良いベストプラクティスです。

ステップ3:これをもう少し実用的にする

前のステップでは、最も基本的な起動設定でJenkinsを開始します。 Jenkinsには基本的な設定が必要であり、管理者パスワード(起動時に画面に表示されたログから取得できる)を求めていることもわかります。 Riotのような場合は、デフォルト設定でJenkinsを実行することはまずありません。 のは、いくつかの便利なオプションを追加することによって歩いてみましょう。 Jenkinsを起動して実行できることを知るだけで十分です。

ステップ3A:

をデーモン化するほとんどの場合、Jenkinsログが標準出力に吐き出されるのを見たくないでしょう。 そのため、Docker daemonフラグを使用してコンテナを起動します(-d)。

1. コンテナを実行しているターミナルウィンドウでCtrl-cを押して停止します

2. 次のコマンドを実行します

docker rm jenkins-master
docker run -p 8080:8080 --name=jenkins-master -d jenkins/jenkins

これで、ハッシュ文字列が表示され、端末に返されるだけです。 Dockerを初めて使用する場合、そのハッシュ文字列は実際にはコンテナの一意のIDです(これらのコマンドの自動化を開始する場合に便利です)。

ステップ3B:メモリ設定

私たちは、Riotでいくつかの牛肉の設定でJenkinsを実行する傾向があります。 Dockerが以前に使用していたCPU/メモリを増やしたことを覚えていますか? これが主な理由です。 基本的な開始のために、次のコマンドを実行します

docker stop jenkins-master
docker rm jenkins-master
docker run -p 8080:8080 --name=jenkins-master -d --env JAVA_OPTS="-Xmx8192m" jenkins/jenkins

それはJenkinsに素敵な8GBのメモリプールとガベージコレクションを処理するための部屋を与えるはずです。ステップ3C:接続プールの増加

Riotでは、Jenkinsサーバーへのトラフィックが多くなるため、Jenkinsにもう少し息を吹き込む余地を与えることを学びました。 次のコマンドを実行します

docker stop jenkins-master
docker rm jenkins-master

それはJenkinsにハンドラーとキャップの素敵なベースプールを与えるでしょう。 偶然にも、JAVA OPTSとJENKINS OPTSの両方を意味のある方法で環境変数として使用する方法を学びました。 これは、CloudbeesがJenkins Dockerfileをどのように便利に構造化したかのために機能することに注意してください。

ステップ4:すべてをまとめる

ここで学んだすべてを単純なmakefileに配置して、makeコマンドを使用してJenkins dockerコンテナの実行を制御できるようにしました。 あなたはここでそれを見つけることができます:

  • https://github.com/maxfields2000/docker Jenkins_Tutorial/tree/master/tutorial_01

次のコマンドを使用できます:

  • make build-Jenkinsイメージをプルする

  • make run-コンテナを実行します

  • make stop-コンテナを停止します

  • make clean-既存のコンテナを停止して削除します

あなたはmakefileを使う必要はありません、私はrunコマンド全体を入力するよりも簡単だと思います。 あなたは簡単に代わりにあなたの選択のスクリプトにこれらを置くことができます。

うまくいけば、DockerとJenkinsを使って起動して実行するのがいかに簡単かを見てください。 デフォルトのCloudbees Jenkinsコンテナを使用してもう少し使いやすくするための基本的なオプションをいくつか提供しようとしました。 Cloudbeesには、プラグインを事前にインストールしたり、Jenkinsデータを保存したりする方法など、コンテナを実行するための多くの便利なチュート

それは私に主題に関する将来の投稿をもたらします。 このコンテナ/イメージは便利ですが、いくつかの欠点があります:一貫性のあるロギング、永続性、その前にwebサーバープロキシがない、および必要なJenkinsのバージ これは次のような質問を表示します:古いバージョンに固執したい場合はどうすればよいですか? または、利用可能な最新のリリース期間を使用する場合はどうなりますか?

次のレッスンでは、このコンテナをもう少し堅牢にすることについて説明します。 特に:

  • Cloudbeesベースをラップするための独自のDockerfileの作成

  • いくつかの環境変数をこの新しいイメージに移動します

  • ログフォルダの作成、権限やその他の便利なJenkinsディレクトリの設定、実行中のJenkinsログの取得

レッスン2-JENKINSベースイメージラッパー

前のレッスンでは、Dockerを実行するための開発環境の設定について説明し、Cloudbeesが提供するJenkins Dockerイメージを試しました。 私たちは、それが箱から出していくつかの優れた機能で、シンプルで使いやすいことがわかりました。 私たちが特定した改善分野を進歩させるために、このレッスンで説明するDockerの概念は次のとおりです:

  • 独自のDockerfileを作成する

  • Dockerfileでの環境変数の設定

  • dockerfileでのフォルダと権限の作成

  • docker execを使用して実行中のコンテナに対してコマンドを実行する

ベースのDOCKERFILE

を作成するデフォルトでJenkinsを起動する方法をいくつか変更したいと思います。 前回のブログでは、環境変数として引数を渡すmakefileを作成してこれを処理しました。 毎回これを実行したいと考えると、それらを自分のDockerfileに移動することができます。 さらに、Cloudbeesが更新し、アップグレードする準備ができていない場合に備えて、私たち自身のDockerfileを使用しているJenkinsのバージョンをロックできます。

これは、

1の4つのステップで行います。 作業ディレクトリを作成する

2. お気に入りのテキストエディタで、「Dockerfile」という名前の新しいファイルを作成します

3. ファイルに以下を追加して保存します:

FROM jenkins/jenkins:2.112LABEL maintainer=""

4. 次に、コマンドラインで次のように入力します:

docker build -t myjenkins .

ここで行ったことは、公開dockerリポジトリからJenkinsイメージの特定のバージョンを取得することでした。 利用可能なすべてのバージョンはここにあります:

  • FROM句は、使用可能なイメージのバージョンに応じていつでも設定できます。 ただし、バージョンを必要なJenkinsのバージョンに設定することはできません。 これはイメージバージョンの「タグ」または「ラベル」であり、Cloudbeesはイメージ内のJenkinsバージョンと一致させるのに十分です。 Cloudbeesは、最新バージョンを入手するための便利な方法として「jenkins/jenkins」、または最新の「長期サポート」バージョンを入手するための「jenkins/jenkins:lts」を提供しています。 この例では、特定のバージョンを使用します。 リリースの種類にラベルを付けるこれらのタグは素晴らしいですが、それらを使用すると、Jenkinsのバージョンがあなたの下で変更される可能性があり、アップグレードの準備ができていなかった場合に合併症を引き起こす可能性があります。 Dockerやその他の依存関係管理ツールで依存関係を処理するときの一般的なベストプラクティスとして、「バージョンロック」をお勧めします。 あなたは前ではなく、あなたがそれらを意図したときに物事を変更したいです。 だから私はここで特定のバージョンを使用しています。

    新しいDOCKERFILEのテスト

    docker runコマンドを次のように変更することで、イメージに非常に簡単に切り替えることができます:

    docker run -p 8080:8080 --name=jenkins-master -d --env JAVA_OPTS="-Xmx8192m" --env JENKINS_OPTS=" --handlerCountMax=300" myjenkins

    これで、これらの環境変数を独自のDockerfileに配置することで、それらの環境変数をクリーンアップできます。DOCKERFILEに環境変数を追加する

    dockerfileに環境変数などのデフォルト設定を追加するのは簡単です。 これはまた、自己文書化の素晴らしい作品を提供します。 また、Dockerコンテナを実行するときに常にこれらを上書きできるため、実際には欠点はありません。

    1. Dockerfileで、”MAINTAINER”行の後に次の行を追加します:

    ENV JAVA_OPTS="-Xmx8192m"ENV JENKINS_OPTS=" --handlerCountMax=300"

    2. イメージを保存して再構築する:

    • ドッカービルド-t myjenkins.

    docker build -t myjenkins .

    かなり簡単! 次の3つのコマンドを入力することで、まだ動作することをテストできます:

    docker stop jenkins-master
    docker rm jenkins-master
    docker run -p 8080:8080 --name=jenkins-master -d myjenkins

    あなたのイメージは右を開始する必要があります! しかし、どのようにして環境変数が機能したことを知っていますか? シンプル: 通常psを使用してJenkinsアプリを起動した引数を確認するのと同じ方法です。 そして、これはあなたがWindows上で開発している場合でも動作します。コンテナに対して基本的なコマンドを実行する

    JavaとJenkinsのオプションが正しく設定されていることを確認するには、コンテナでpsを実行し、docker exec

    docker exec jenkins-master ps -ef | grep java

    を使用して実行中のJenkins Javaプロセスを確認することができます。

    jenkins 1 0 99 21:28 ? 00:00:35 java -Xmx8192m -jar /usr/share/jenkins/jenkins.war --handlerCountMax=300

    このことから、あなたは簡単に私たちの設定が立ち往生している見ることができます。 docker execは、コンテナ内でシェルコマンドを実行する簡単な方法であり、それらを検査する非常に簡単な方法です。 これは、”exec”の後のコマンドがコンテナ内で実行されているため、コンテナが使用するベースイメージに基づいているため、Windows上でも動作します。

    ログフォルダの設定

    前のブログでは、daemonizeフラグ(-d)を指定してコンテナを実行すると、Jenkinsログの可視性が失われたことに注意しました。 組み込みのJenkins機能を使用してログフォルダを設定したいと考えています。 Dockerfileでこれを行い、ロギングオプションをJenkinsに渡す必要があります。

    もう一度Dockerfileを編集してみましょう。 “MAINTAINER”と最初のENV行の間に次の

    RUN mkdir /var/log/jenkins

    を追加し、ベストプラクティスに従うためにファイル内のこの場所にコマンドを配置します。 これらの設定ディレクトリよりも環境変数を変更する可能性が高く、Dockerfile内の各コマンドラインは本質的に独自のイメージレイヤーになります。 頻繁に変更される項目を下部の近くに配置することで、レイヤーの再使用を最大化します。

    今すぐあなたのイメージを再び構築します:

    docker build -t myjenkins

    次のようなエラーが表示されます

    ---> Running in 0b5ac2bce13bmkdir: cannot create directory '/var/log/jenkins': Permission denied

    心配しないで これは、デフォルトのCloudbeesコンテナが実行中のユーザーを「Jenkins」ユーザーに設定するためです。 それらのDockerfile(ここにあります:https://github.com/Jenkinsci/docker/blob/master/Dockerfile)を見ると、下の近くに

    USER ${user}

    この構文は少し混乱するかもしれません。 Dockerのビルド「引数」を使用して、ユーザーを定義できます。 Dockerファイルをさらに調べると、デフォルト値が表示されます。 Dockerfileの上部を

    ARG user=jenkins

    これにより、「user」引数(ARG)が作成され、Jenkinsユーザーに設定されます。 これにより、docker build–build-arg somevariable=somevalueを呼び出すときにJenkinsが使用するユーザー名を変更できます。 これは、Dockerfileを最初から構築している場合にのみ機能することに注意してください。 これらの値は、docker pullまたはdocker runで変更することはできません。 ビルド引数の詳細については、こちらをご覧ください。 FROM句でビルド済みのバージョンを使用しているため、デフォルトのユーザー「jenkins」になります。通常のLinuxでは、SUDOまたは他の手段を使用してフォルダを作成します(/var/logはrootが所有しています)。 幸いにも私たちのためにDockerは私たちがユーザーを切り替えることができます。

    Dockerfileに以下を追加します。

    1. 実行する前にmkdir行を追加します

    USER root

    2. あなたの実行後mkdir行を追加します

    RUN chown -R jenkins:jenkins /var/log/jenkins

    3. あなたの実行chown行の後に追加します:

    USER jenkins

    Jenkinsユーザーがフォルダに書き込むことができるようにするため、chownコマンドも追加する必要があることに注意してください。 次に、dockerfileの動作が保持されるように、rootを設定してからJenkinsをリセットします。

    今すぐあなたのイメージを再び構築します:

    docker build -t myjenkins .

    と。.. あなたのエラーは消えているはずです。

    ログディレクトリを設定して(注意:このフォルダを好きな場所に置くことができ、一貫性のために/var/logを使用します)、JENKINS_OPTS環境変数を変更することによDockerfileでJENKINS_OPTS行を次のように編集します:

    • ログファイル=/var/log/jenkins/jenkins.ログ”

    ENV JENKINS_OPTS="--handlerCountMax=300 --logfile=/var/log/jenkins/jenkins.log"

    もう一度イメージをビルドしてください

    docker build -t myjenkins .

    新しいイメージをテストして、ログファイルを末尾にできるかどうかを試してみましょう! 次のコマンドを試してください

    docker stop jenkins-master
    docker rm jenkins-master
    docker run -p 8080:8080 --name=jenkins-master -d myjenkins

    コンテナが実行されていると、すべてが機能した場合、ログファイルを末尾にすることができます

    docker exec jenkins-master tail -f /var/log/jenkins/jenkins.log

    JENKINSがクラッシュした場合のログを取得

    ボーナスラウ ログについて議論している限り、Jenkinsがクラッシュした場合、Dockerは興味深い問題を提示します。 コンテナは実行を停止し、docker execは機能しなくなります。 だから何をすべきか?

    ログファイルを永続化するより高度な方法については、後で説明します。 今のところ、コンテナが停止しているので、docker cpコマンドを使用してファイルをコピーできます。 コンテナを停止し、ログを取得してクラッシュをシミュレートしましょう:

    1. ログファイル末尾

    から終了するにはctrl-cを押します2. 次のコマンドを実行します

    docker stop jenkins-master
    docker cp jenkins-master:/var/log/jenkins/jenkins.log jenkins.log
    cat jenkins.log

    結論思考

    あなたは私のチュートリアルGit repo(と更新された便利なmakefile)ですべての作業を見つけることができますここに:

    • https://github.com/maxfields2000/docker Jenkins_Tutorial/tree/master/tutorial_02

    Cloudbeesファイルをラップする独自のDockerfileを作成することで、私たちは自分自身の生活を少し楽にすることができました。 ログを保存するための便利な場所を設定し、docker execコマンドでそれらを見る方法を学びました。 デフォルトの設定をDockerfileに移動し、これを自己文書化の良い部分としてソース管理に保存できるようになりました。

    まだデータ永続化の課題があります。 停止したコンテナからログファイルを引き出す方法を学びました(Jenkinsがクラッシュしたときに便利です)。 しかし、一般的に、コンテナが停止しても、作成したすべてのジョブが失われます。 したがって、永続性がなければ、このJenkinsイメージはローカルの開発とテストにのみ役立ちます。

    次の記事へ Jenkinsの便利なバージョンにロックされた独自のDockerfileラッパーである私たちの基盤が整っていれば、永続性の問題を解決することができます。 次の記事では、これらの概念について説明します:

    • Jenkinsジョブとプラグインのデータの保存

    • ボリュームを使用したDockerデータの永続性

    • データボリュームコンテナの作成

    • ボリューム内のデータを他のコンテナと共有する

    詳細については、このシリーズの残りの部分をチェックしてください。

    パートI:コンテナ内で考える
    パートII:JenkinsをDockerコンテナに入れる(この記事)
    パートIII:Docker&Jenkins:永続するデータ
    パートIV:Jenkins、Docker、プロキシ、およびCompose
    パートV: Dockerイメージの制御
    Part VI:一時的なDockerコンテナ内でJenkinsを使用してビルドする
    Part VII:チュートリアル:一時的なDockerコンテナ内でJenkinsを使用してビルドする
    Part VIII:DockerConの話とこれまでの話

コメントを残す

メールアドレスが公開されることはありません。