- 投稿日:2020-09-12T23:51:22+09:00
VirtualBoxのCentOS7にDockerコンテナでJenkinsサーバーを構築し、ローカルPCからJenkinsサーバーにアクセスする方法
本記事を作成することになったきっかけ
下記Udemyの講座では、VirtualBoxとCentOS7とDockerを利用するので、その手順を忘れないようにしたいと思い、作成しました。
【Jenkins, From Zero To Hero: Become a DevOps Jenkins Master】
https://www.udemy.com/course/jenkins-from-zero-to-hero/バージョン
VirtualBox、Dockerのインストール、CentOS7のISOのダウンロードが必要ですが、その手順は新しいものが出るたびに変わって記事にしても数ヶ月後には使えなくなることが多いので割愛し、バージョンだけ載せます。
VirtualBox 6.1.14 platform packages
Docker 19.03.12
Docker Compose 1.26.2
CentOS-7-x86_64-Minimal-1810.iso
※http://repos-tx.psychz.net/centos/7.6.1810/isos/x86_64/
にCentOSのisoあるのでクリックしてダウンロードします。対象の読者
mac利用者
UdemyのJenkins, From Zero To Hero: Become a DevOps Jenkins Masterの講座で何言ってるか分からなかった人VirtualBox上にCentOSの仮想環境を構築する方法
新規をクリックします。
名前をJenkins
マシンフォルダーはデフォルト
タイプはLinux
バージョンはRed Hat(64-bit)
にします。
バージョンをRed Hat(64-bit)にした理由は、CentOSがRedHat系列のLinuxで、CentOS-7-x86_64-Minimal-1810が64bit用だからです。続きをクリックします。
メモリーサイズが表示されます。
2048MBにしてクリックします。仮想ハードディスクを作成するを選択して作成をクリックします。
VDIを選択して続きをクリックします。
可変サイズを選択して続きをクリックします。
上のパスは特に弄りません。
サイズを20GBにします。作成をクリックします。
Jenkinsサーバーを構築するための環境を構築することができました。
アダプター1の割り当てをNATからブリッジアダプターに変更します。
名前は人によって違うかも・・・。
僕の家はWi-Fiでネットワーク接続しているので、Wi-Fiとなっているen0を設定しています。
有線の方は多分Ethernetかな・・・?設定できたらOKをクリックします。
起動をクリックしま・・・と、その前に、VirtualBoxにマウスカーソルの操作権限を取られて全く動かせない人が続出します。解決方法は、左Commandキーを1度押すだけでいいので、その操作だけを必ず覚えて次の手順へ進みましょう。発症するタイミングは人それぞれです。
では気を取り直して、起動をクリックします。人によってはここでセキュリティとプライバシーの設定が必要になるのでVirtualBox.appのキーボードからの入力の監視を許可してあげます。
設定が終わったらVirtualBoxを再起動して、再度Jenkinsの仮想環境を起動します。
人によってはプライバシーのほうも許可しないといけないのでこちらもチェックしてまたVirtualBoxを再起動します。
※それが終わってからJenkinsという仮想環境を起動してもなぜか下記の画面に行かなかったので断念して一度作成した環境を削除してからここまでの手順をもう一度繰り返します。
ここでダウンロードしておいたCentOS7のISO(CentOS-7-x86_64-Minimal-1810.iso)を指定しますが、Empty(空)となっています。指定する必要があるので右のフォルダをクリックします。
Addをクリックし、ISOを保存した先まで移動して選択します。
Chooseをクリックします。Startをクリックします。
上下キーで選択、Returnキーで決定です。
Install CentOS7にカーソルをあわせて、Returnキーを押します。CentOS7のインストールが始まるので少し待ちます。
意外とすぐ終わります。言語設定です。
日本語を選択して続行をクリックします。
※画面の解像度を変更してしまうとかなり操作しづらくなるのでデフォルトのサイズのまま操作します。下のほうにスクロールします。
自動パーティシ・・・択されましたをクリックします。
何も弄らずに完了をクリックします。
すると、△マークが消えました
続いて、ネットワークとホスト名をクリックします。
右上のEthernet(enp0s3)をクリックします。
終わったら完了をクリックします。
インストールの開始をクリックします。
ROOTパスワードを作成するのでROOTパスワードをクリックします。
ここでは分かりやすくパスワードを123456にします。
入力したら完了を2回クリックします。
続いて、ユーザーを作成します。
下の画像のように入力します。
フルネームはjenkinsにします。
ユーザー名はフルネームを入力するたびに自動で入力されます。
このユーザーを管理者にするとこのアカウントを使用する場合にパスワードを必要とするにチェックを忘れずに行います。
パスワードは123456にしておきます。終わったら、左上の完了を2回クリックします。
あとはインストールが完了するまで待ちます。
終わったら、右下の設定完了をクリックします。
終わったら再起動をクリックします。
なんかこんな感じでエラーログが出て再起動できない場合は、設定が原因です。
設定→ディスプレイ→グラフィックスコントローラーをVMSVGAからVBoxVGAに変更します。※これ直すのに丸1日かかりました。無効な設定が見つかりましたと出ますが、問題ありません。OKを押して再度起動します。
起動時にISOの選択画面が出てもキャンセルでOKです。
無事、CentOS7が起動しました。
localhost login:jenkins
password:123456
でログインします。画面クリアのショートカットキーを覚えます
clearとコマンドを打つと文字が全て消えますが、効率が悪いので、ショートカットキーを必ず覚えるようにします。
Command+l(エル)で、clearコマンドと同様の動作が行われます。IPアドレスを調べます
ip aと入力すると、IPアドレスを調べることができます。
enp0s3のinetを見ると192.168.0.6となっています。
これが、この仮想環境のIPアドレスになります。terminalでアクセスするための設定をします
VirtualBoxマネージャーを開いた状態で、ファイル→ホストネットワークマネージャーを選択します。
作成をクリックします。
IPアドレスは192.168.56.101であることを確認します。
vboxnet0が作成されたことを確認し、閉じるをクリックします。
多分みんな同じIPアドレスになると思うのですが、違ったら以降の手順で使うIPアドレスを読み替える必要があります。さっき作ったVMの設定→ネットワーク→アダプター2にホストオンリーアダプターを設定します。
OKをクリックします。
仮想環境を起動し、ログインします。
localhost login:jenkins
password:123456nmtuiコマンドを実行します。
このコマンドは、ネットワークの設定をコマンドではなく視覚的に設定できるようにするためのコマンドです。いわるゆGUIというやつですね。
一応コマンドでもできるっぽいですが、そのやり方は割愛します。色んなファイルを開いてviテキストで編集して、とか面倒ですからね。nmtui画面は上下キーおよびReturnキーで操作します。
上下キーで移動し、Edit a connectionをReturnキーで選択します。enp0s3をReturnキーで選択します。
IPv6をReturnキーでIgnoreに変更します。
Automatically connectは[X]になっていることを確認できればOKです。OKにカーソルを合わせ、選択します。
続いて、* * * *を選択します。
(本当はenp0s8とかになっているはずですが、なんかバグってますね。知り合いも同じ表示になってました。)Profile nameがバグってたらenp0s8にしておきます。
Ipv4 CONFIGURATIONをManualに変更し、Addressesを192.168.56.101/24にします。続いて、Ipv6をIgnoreに変更します。
Automatically connectは[X]になっていることが確認できればOKです。OKを選択し、Back→Quitで終了します。
続いて、下記コマンドを入力します。
service NetworkManager restart service network restart※パスワードを求められたら、123456を入力します。
これで、macからterminalを利用してVirtualBoxのCentOSにアクセスするための準備が整いました。
terminalでアクセスします。
Command+Spaceでspotlight検索を開き、terminal.appと打ってReturnキーを入力し、terminalを起動します。
Windowsと異なるmacの強みですね。Windowsの方はputtyとかteratermを使うといいと思います。
(ここまでの手順で結構Windowsと違うと思うのでWindowsの方は見てないと思いますが・・・)terminalでssh接続をするために、下記コマンドを入力します。
ssh root@192.168.56.101パスワードを求められたら123456を入力します。
そうすると、terminalでVirtualBox上のCentosにアクセスできます。
これで、以降はVirtualBoxで仮想マシンを起動してCentOSを起動し、適当に最小化しておけば、mac側からCentosを操作することが可能になりました。VirtualBoxで表示される画面での操作はやりづらいですからね。yumコマンドが使えるかどうかチェック
ためしにyum listを実行します。
本来はこれでyumのアップデートが始まったあと、yumでインストールしたソフトが一覧表示されるのですが、もし上手く行かなかったときの記事を知り合いが書いています。僕は何もしなくても上手く行きましたが、もし上手く行かないようでしたら参考にしてみてください。
https://qiita.com/yuri2509/items/6715fe853515a8719518Dockerをインストール
一度ネットワークに接続できるかどうかを確認します。
ping google.com繋がってたら画像のようになります。
延々とログが流れ続けるので、Control+cで中断します。googleでdocker for centosと検索し、Install Docker Engine on CentOS | Docker DocumentationのWebページを開きます・
このページを元に、コマンドを上からどんどん入力します。
一応コマンド載せますが、公式ホームページに載ってるコマンドは日々変わるのでコマンド全然違う可能性あります。まずはDockerの古いバージョンのアンインストール(Dockerが入ってなければやる意味なし)
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine引数に一致しませんってログがいっぱい出ます。つまりdockerはインストールされていないということですね。
続いて、yumを便利にするソフトyum-utilsをインストールします。
sudo yum install -y yum-utils続いて、docker用のリポジトリを作成します。
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repoこれで、以下のディレクトリにdocker-ce.repoが作成されました。
/etc/yum.repos.d
┗docker-ce.repoようやく、dockerをインストールするところまで来ました。
以下を実行します。sudo yum install docker-ce docker-ce-cli containerd.io途中で止まってても大丈夫です。それはミラーサイトを検索している最中です。そのため、キー入力は控えましょう。入力してしまうとインストールが途中で中断されたりするので再度コマンドを実行する必要があります。(僕は一度やらかしました)
途中で[y/d/N]とか[y/N]とか出てきたらyを入力して進めます。最後に完了しました!と表示されていたらDockerのインストール完了です。
dockerを起動します。
sudo systemctl start docker何も起こりませんが問題ありません。
公式サイトのコマンド集にはありませんが、起動時に自動でDockerを起動するためのコマンドを実行します。
sudo systemctl enable dockerdockerがインストールされたかどうかを確認するために、下記コマンドでdockerのプロセスを表示してみます。
docker ps
今は管理者で実行しているのでうまく動きますが、CentOSインストール時にjenkinsユーザーを作成したと思います。そちらにsuコマンドを使ってユーザーをjenkinsユーザーに変更し、docker psを実行しても権限がないため失敗します。そのため、下記コマンドを実行して実行できるようにしておきます。
sudo usermod -aG docker jenkinsその設定を反映するには、一度exitでssh接続を解除して再度ssh接続します。
これで、jenkinsユーザーでもdocker psを実行して動作するようになります。docker composeのインストール
googleでdocker compose installationと検索します。
Install Docker Compose | Docker Documentationを開きます。
少し下に行くとmacとかWindowsとかのタブがあるのでLinuxを選択します。
そこに表示されているコマンドを入力していきます。こちらも日々変わるので、公式サイルを参考にしたほうがいいですが、コマンドは一応載せておきます。
docker composeのインストールコマンドです
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composeすぐ終わります。
コマンドの通り、/usr/local/binにdocker-composeがインストールされます。
cdでディレクトリを移動し、pwdコマンドでパスを表示し、llコマンドでパーティション(-rw-r--r--ってなってるやつ)を表示してみました。
実行権限がないので、このままではdocker-composeの実行権限がありません。そのため、実行権限を付与します。
下記コマンドを実行して実行権限を付与することができます。
sudo chmod +x /usr/local/bin/docker-composeパーティションが-rw-r--r--から-rwxr-xr-xに変化しましたね!
これは実行権限が付与されたことを表します。docker-composeがインストールされていたら、バージョンを表示することができるので、その方法で確認します。
docker-compose -vdocker-compose version 1.27.1となっていますね。インストール成功です。
dockerを利用してjenkinsサーバーを構築
docker jenkins imageでgoogle検索します。
jenkins/jenkinsのほうを開きます。こちらはjenkinsのチームがメンテしているDockerイメージです。
jenkinsとなっているほうは公式イメージですが、こちらは間違いなので注意!そうすると、右側にインストールするためのコマンドが載っているのでコピペしてterminalで実行します。※CentOSにssh接続でログインしている状態でやります
docker pull jenkins/jenkinsこれでjenkinsのDockerイメージを取得することができました。
以下のコマンドでjenkinsのDockerイメージがあることを確認します。docker images余談ですが、Dockerのデータはどこにあるのでしょう?
それは、Dockerの情報を表示することで調べることができます。docker infoいっぱい情報が表示されます。
この中にdockerのルートディレクトリが書かれているのですが、探すのが大変です。そのため、以下のコマンドですぐに見つけることができます。
docker info | grep -i rootgrepコマンドは、文字列を検索するのに便利です。
docker infoで表示される文字列から、rootが含まれている行を抽出して表示してくれます。-iをつけることで、大文字小文字の区別なく検索することができます。/var/lib/dockerがDockerのルートディレクトリであることが確認できました。
docker関連のデータはこの中に保存されます。続いて、jenkinsのデータを入れるためのディレクトリを作成します。
/home/jenkins/jenkinsの形で作成します。
まずはhomeディレクトリに移動してjenkinsディレクトリを作成し、更にその中にjenkinsディレクトリを作成します。cd /home mkdir jenkins cd jenkins mkdir jenkins pwdこれでjenkinsディレクトリを作成することができました。
最後にpwdコマンドで現在のディレクトリを表示しています。練習のために、mvコマンドを使ってディレクトリ名を変更してみます。
修正前
/home/jenkins/jenkins修正後
/home/jenkins/jenkins-data以下のコマンドを実行します。
cd /home cd jenkins mv jenkins jenkins-data ll cd jenkins-data pwd無事ディレクトリ名を変更することができました。
続いて、/home/jenkins/jenkinsの中にdocker-compose.ymlを作成します。
下記コマンドを実行して新規ファイルを作成します。
vi docker-compose.yml軽くviの説明をしておくと、デフォルトはコマンドを受け付ける通常モードで、iでインサートモードにして文字を入力でき、escでインサートモード解除して通常モードになり、通常モードで「:wq」を実行すると保存して終了、「:q」で閉じる、「:q!」で保存せず強制終了です。
これだけの知識があればとりあえずなんとかなると思います。多分。viでどんどん書き込んでいきます。
まずはバージョン3を指定します。docker-compose.ymlversion: '3'続いて、jenkinsのコンテナ名を指定します。
docker-compose.ymlversion: '3' services: jenkins: container_name: jenkinsDockerイメージを指定します。
これは、docker imagesを実行したときのRepositoryに記載のあるイメージ名を指定します。必ず確認してから記述する癖をつけるといいと思います。docker-compose.ymlversion: '3' services: jenkins: container_name: jenkins image: jenkins/jenkins続いてポートを指定します。
jenkinsはhttpサーバーなので8080にします。
左側がjenkinsサーバーのポート番号、右側がmacでアクセスする時のポート番号になります。docker-compose.ymlversion: '3' services: jenkins: container_name: jenkins image: jenkins/jenkins ports: - "8080:8080"続いて、ボリュームを作成します。
Dockerにはボリュームという概念があります。Dockerコンテナって作成してから壊すとコンテナ上のすべてのデータが吹き飛ぶんですよね。吹っ飛ばしたくないデータがある場合はどうすればいいのでしょう?答えはボリュームに保存すればいいのです。
今はとりあえずそんくらいの認識があればいいでしょう。
一度escキーでインサートモードから通常モードにして:wqで保存して終了し、ボリューム用の領域を作成します。
以下のディレクトリにいることを確認します。/home/jenkins/jenkins-data
続いて、ボリューム用の領域であるjenkins_homeディレクトリを作成します。
mkdir jenkins_homeこの中に、Dockerコンテナ上のデータを保存できます。
作成し終わったらdocker-compose.ymlの編集に戻ります。vi docker-compose.ymlボリュームを指定します。左がさっき作ったディレクトリ(コピー先)、右がDockerコンテナ上のディレクトリ(コピー元)です。
右側のディレクトリが/var/lib/jenkins_homeではなく、/var/jenkins_homeとなっている情報は古いです。docker-compose.ymlversion: '3' services: jenkins: container_name: jenkins image: jenkins/jenkins ports: - "8080:8080" volumes: - "$PWD/jenkins_home:/var/lib/jenkins_home"続いて、ネットワークに関する情報4行を記述します。
1つはjenkins:の配下に、もう一つはdocker-compose.ymlの配下に記述しています。docker-compose.ymlversion: '3' services: jenkins: container_name: jenkins image: jenkins/jenkins ports: - "8080:8080" volumes: - "$PWD/jenkins_home:/var/lib/jenkins_home" networks: - net networks: net:最終的には以下の形になります。
docker-compose.ymlversion: '3' services: jenkins: container_name: jenkins image: jenkins/jenkins ports: - "8080:8080" volumes: - "$PWD/jenkins_home:/var/lib/jenkins_home" networks: - net networks: net:escキーで通常モードに戻り、:wqで保存します。
終わったら、jenkins_homeディレクトリの権限を変更します。
sudo chown 1000:1000 jenkins_home -Rdocker-compose.ymlのあるディレクトリに移動して、dockerコンテナを起動します。
docker-compose up -d末尾の-dはバックグラウンドで実行という意味です。
下記コマンドを実行します。
docker psこれで、JenkinsサーバーがDockerコンテナ上で動きました。
[もし表示されなかったら] 下記コマンドでjenkinsが表示されていたら Dockerコンテナの起動に失敗しています。 docker ps -a 下記のコマンドでログを表示することができ、 エラー原因を調査できます。 docker-compose logs jenkins Dockerコンテナ側のボリュームが/var/lib/jenkins_home ではなく、/var/jenkins_homeとなっている情報は古いと 先ほど書きましたが、それはこのログを表示することで 解決するに至りました。jenkinsで生成されたパスワードが必要なので、dockerでログを表示する下記コマンドを実行します。
docker logs -f jenkins「1a193f6a36674f58856aed0b3041bc13」という文字が見えますが、これをコピーしてメモします。
ラストスパートです。
VirtualBox上のCentOSのIPアドレスはなんでしたか?
そう、192.168.56.101でしたね。
では、それにhttpサーバーを示すポート番号8080をくっつけて、「192.168.56.101:8080」とwebブラウザのURLに入力します。行けるか・・・?
無事、jenkinsにアクセスすることができました〜!
マンモスうれぴ〜!これでVirtualBoxのCentOS7にDockerコンテナでJenkinsサーバーを構築し、ローカルPCからJenkinsサーバーにアクセスすることができました。
仕上げに、先程メモした1a193f6a36674f58856aed0b3041bc13を貼り付けてアクセスできることを確認します。(この文字列は人によって違うよ!)
大丈夫そうですね。
Jenkinsの使い方については以下で解説しています。良かったら併せてこちらも読んでみてください。【Jenkinsとは?】Jenkinsのインストールから使い方まで世界一分かりやすく解説します
https://qiita.com/JUN_WEB_FREE/items/c7b42528a87911386391dockerを勉強するのにオススメのサイト
今回特にdockerについての解説はしていませんが、以下のサイトが分かりやすいので超オススメです!
- 投稿日:2020-09-12T22:58:16+09:00
DockerのブリッジでIPアドレスが干渉した
はじめに
物理ネットワークで
172.17.xxx.xxx
のアドレス帯を使用したときに起きた話。Ubuntu 18.04.3 LTS
Docker version 19.03.5本題
Dockerが自動生成するブリッジインタフェースが
172.17.0.xxx/16
を使用しており、
物理ネットワークのアドレス帯と干渉した。
/etc/docker/daemon.json
で自動生成される際のIPアドレスを指定できるらしい。/etc/docker/daemon.json{ "bip": "192.168.0.1/24", "default-address-pools":[ { "base":"192.168.0.0/16", "size":24 } ] }ポイントとしては
bip
はdocker0
向けdefault-address-pools
はbr-xxxxxxxxxxxx
向けbip
は無くてもdefault-address-pools
から自動生成されるので省略して構わないでした。
- 投稿日:2020-09-12T17:53:39+09:00
Docker ComposeでNode.jsの環境構築
動機
Create React Appを少し遠回りしてはじめようをローカル環境を汚さずに実践したかっため、タイトルのような環境構築を目指しました。
最終的なディレクトリ構成
最終的なディレクトリ構成node-docker/ |--docker-compose.yml |--node/ |--app/docker-compose.yml
Docker Compose 概要
Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。まずプロジェクトフォルダ
node-docker
を作成し、そこにdockercompose.yml
ファイルを作成します。現在のディレクトリ構成node-docker/ |--docker-compose.ymldocker-compose.ymlversion: '3' services: node: image: node:14.9.0-alpine3.10 container_name: node volumes: - ./node/app:/app tty: true ports: - 3000:3000version
docker-compose.yml
のファイルフォーマットのバージョンservices
各コンテナをサービスとして定義できます。
node
サービス名
image
コンテナを実行時に元となるイメージを指定します。
イメージが存在していなければ、ComposeはDocker Hubからpull(取得)を試みます。
Dockerfile
からイメージを作成する場合は、例えばnode
ディレクトリの下にDockerfile
を作成し、以下のように指定します。
build: ./node
container_name
デフォルトで生成される名前の代わりに、カスタム・コンテナ名を指定します。なお、デフォルトだとnode-docker_node_1という名前になります。
volumes
ローカルのパス(左)とコンテナのパス(右)を共有します。
tty
端末を起動するかどうかを指定しています。(多分)
ports
ポートを公開します。ホストとポートを指定(ホスト:コンテナ)するか、コンテナのポートのみ指定します(ホスト側のポートはランダムに選ばれます)。
expose
はポートを露出し、リンクされたサービス間でのみアクセス可能になります。コンテナの作成と起動
ここまでで必要なファイルが揃ったので、コンテナの作成と起動を行っていきます。
Dockerfile
からイメージを作成する場合は、Docker-compose build
する必要がありますが、今回は既にビルドされたイメージをリモートから取得するので必要ありません。
作業はdocker-compose.yml
が置いてあるディレクトリ上で行います。terminal$ docker-compose up -d
d
オプションにより、バックグラウンドで起動することができます。nodeコンテナに入る
以上でnode環境は整いましたが、node環境はコンテナ上にあるため、作業はその上でする必要があります。
そのために、起動中のコンテナ内で指定したコマンドを実行できるexec
コマンドを利用して、コンテナ上でシェル、端末を起動します。terminal$ docker-compose exec node shコンテナ内のディレクトリ構成は以下のようになっていて、
docker-compose.yml
で指定したためコンテナでのapp
ディレクトリとローカルのnode/app
ディレクトリは対応しています。コンテナ内のディレクトリ構成/ |--app |--bin |--dev |--home |--lib |--media |--mnt |--opt |--proc |--root |--run |--sbin |--srv |--sys |--tmp |--usr |--var作業は、ローカルと共有できているappディレクトリでした方が良いと思います。
参考
Compose file version 3 reference
Compose ファイル・リファレンス
Docker Compose - docker-compose.yml リファレンス
【初心者向け】Dockerで手軽にNode.js開発環境構築 (2)
- 投稿日:2020-09-12T15:24:42+09:00
ubuntu 20.04.1 上でプロキシ環境でdocker を利用する
ubuntu 20.04.1 上でプロキシ環境でdocker を利用する
プロキシを用意する
以下の記事のようにしてプロキシを用意しておく。
https://qiita.com/m-tmatma/items/7b5ce812c85f30546209この記事ではプロキシの IP が
192.168.11.61
で、ポート番号が3128
という前提で記載する。プロキシ経由でしかアクセスできない環境をエミュレートする
プロキシ経由でしかアクセスできない環境をエミュレートする。
これにより、設定が誤っていた場合に検出できる。HTTP, HTTPS を禁止
sudo iptables -A OUTPUT -j REJECT -p tcp --dport 80 sudo iptables -A OUTPUT -j REJECT -p tcp --dport 443Git, SSHを禁止 (これは必須じゃないけど念のため)
sudo iptables -A OUTPUT -j REJECT -p tcp --dport 9418 sudo iptables -A OUTPUT -j REJECT -p tcp --dport 22apt
apt のプロキシ設定をする
sudo nano /etc/apt/apt.conf以下の内容で保存する。
Acquire::http::Proxy "http://192.168.11.61:3128"; Acquire::https::Proxy "http://192.168.11.61:3128";以下のようにプロキシの変数を設定する。
test@test-vmware:~$ cat /etc/apt/apt.conf Acquire::http::Proxy "http://192.168.11.61:3128"; Acquire::https::Proxy "http://192.168.11.61:3128";apt の update をする
sudo apt update -y sudo apt upgrade -ydocker のインストール
インストール
https://qiita.com/m-tmatma/items/06eb40514306e09142c4 を参考に docker をインストールする。
sudo apt install -y docker.io docker-composeカレントユーザーを docker グループに追加 (docker を起動するときに毎回 sudo する場合は省略可)
この手順は docker コマンドを sudo なしで実行したい場合のみ必要です。
docker を sudo なしで実行すると便利なので、カレントユーザーを docker グループに追加する。
反映するために再起動する。sudo usermod -aG docker $USER sudo rebootなお、ここで再起動した場合は、iptables の手順は再度実行すること。
dockerd に環境変数でプロキシを設定する。
プロキシ設定
以下コマンドを実行する。
sudo systemctl edit docker除外 IP を指定しない場合
sudo systemctl edit docker
で起動するエディタで 以下の内容を入力して保存して終了する。[Service] Environment="HTTP_PROXY=http://192.168.11.61:3128" Environment="HTTPS_PROXY=http://192.168.11.61:3128"除外 IP を指定する場合
sudo systemctl edit docker
で起動するエディタでNO_PROXY
も追加で指定する。
以下の内容を入力して保存して終了する。[Service] Environment="HTTP_PROXY=http://192.168.11.61:3128" Environment="HTTPS_PROXY=http://192.168.11.61:3128" Environment="NO_PROXY=localhost,127.0.0.1"設定の確認
/etc/systemd/system/docker.service.d/override.conf
に保存される。
以下は 除外 IP を指定しない場合の例$ cat /etc/systemd/system/docker.service.d/override.conf [Service] Environment="HTTP_PROXY=http://192.168.11.61:3128" "HTTPS_PROXY=http://192.168.11.61:3128"プロキシ設定を反映
設定を反映する。
sudo systemctl daemon-reloadプロキシ設定を確認
設定を確認する。
sudo systemctl show docker --property Environmentdocker を再起動
docker を再起動する。
sudo systemctl restart docker以下を実行して、
HTTP Proxy
とHTTPS Proxy
に反映されているのを確認する。docker info参考
http://docs.docker.jp/engine/articles/systemd.html#http
https://docs.docker.com/config/daemon/systemd/ユーザーごとの docker の設定
設定ファイルを保存するフォルダを作る。
mkdir -p ~/.docker
~/.docker/config.json
を編集する。nano ~/.docker/config.json除外 IP を指定しない場合
~/.docker/config.json
で以下のような内容を入力して保存する。{ "proxies": { "default": { "httpProxy": "http://192.168.11.61:3128", "httpsProxy": "http://192.168.11.61:3128" } } }除外 IP を指定する場合
プロキシに除外条件を指定する場合は
~/.docker/config.json
でnoProxy
で指定する。{ "proxies": { "default": { "httpProxy": "http://192.168.11.61:3128", "httpsProxy": "http://192.168.11.61:3128", "noProxy": "localhost,127.0.0.1" } } }参考
https://docs.docker.com/network/proxy/
https://docs.docker.com/network/proxy/#configure-the-docker-clientdocker pull の確認
以下のように docker pull できる。
$ docker pull alpine Using default tag: latest latest: Pulling from library/alpine df20fa9351a1: Pull complete Digest: sha256:185518070891758909c9f839cf4ca393ee977ac378609f700f60a771a2dfe321 Status: Downloaded newer image for alpine:latest docker.io/library/alpine:latest念のため iptables で確認しても http と https は直アクセスは禁止されている。
$ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy DROP) target prot opt source destination DOCKER-USER all -- anywhere anywhere DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED DOCKER all -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- anywhere anywhere tcp dpt:https reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere tcp dpt:http reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere tcp dpt:git reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable Chain DOCKER (1 references) target prot opt source destination Chain DOCKER-ISOLATION-STAGE-1 (1 references) target prot opt source destination DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere RETURN all -- anywhere anywhere Chain DOCKER-ISOLATION-STAGE-2 (1 references) target prot opt source destination DROP all -- anywhere anywhere RETURN all -- anywhere anywhere Chain DOCKER-USER (1 references) target prot opt source destination RETURN all -- anywhere anywhere
- 投稿日:2020-09-12T14:18:58+09:00
Ansible MoleculeをDocker-outside-of-Docker(DOOD)で動かす
Ansible MoleculeをDocker-outside-of-Docker(DOOD)パターンで動かす方法です。DOODで動かすことによりMoleculeをOSヘインストールする必要がなくなります。
検証環境
- CentOS7 (GCE)
Dockerをインストールする
Docker公式サイトにあるInstall Docker Engine on CentOS | Docker Documentation に従います。
MoleculeをDocker outside of Dockerで起動する
Ansible Moleculeのドキュメントの Common Molecule Use Cases — Molecule documentation に従います。
Ansible Role / Playbookのディレクトリへ移動し docker run コマンドを実行します。
cd path/to/ansible-role docker run --rm -it \ -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \ -v /var/run/docker.sock:/var/run/docker.sock \ -w /tmp/$(basename "${PWD}") \ quay.io/ansible/molecule:3.0.8 \ molecule testその他
docker run コマンドが長いため ~/.bashrc へaliasでショートカットを作成すると良いでしょう。
例えば実行環境がAWS EC2ならログインユーザーの ~/.bashrc へ以下のように記述します。
~/.bashrcalias molecule='sudo docker run --rm -it \ -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \ -v /var/run/docker.sock:/var/run/docker.sock \ -w /tmp/$(basename "${PWD}") \ quay.io/ansible/molecule:3.0.8 \ molecule'これで docker run コマンドから呼び出されるmoleculeコマンドがrootに変更せずに 通常のmolecule コマンドとして実行出来るようになります。
また ansible-playbook や ansible-lint のコマンドにもaliasを採用すると良いかと思います。
最終的な ~/.bashrc はこのようになります。
~/.bashrc# .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # Uncomment the following line if you don't like systemctl's auto-paging feature: # export SYSTEMD_PAGER= # User specific aliases and functions alias molecule='sudo docker run --rm -it \ -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \ -v /var/run/docker.sock:/var/run/docker.sock \ -w /tmp/$(basename "${PWD}") \ quay.io/ansible/molecule:3.0.8 \ molecule' alias ansible='sudo docker run --rm -it \ -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \ -v /var/run/docker.sock:/var/run/docker.sock \ -w /tmp/$(basename "${PWD}") \ quay.io/ansible/molecule:3.0.8 \ ansible' alias ansible-lint='sudo docker run --rm -it \ -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \ -v /var/run/docker.sock:/var/run/docker.sock \ -w /tmp/$(basename "${PWD}") \ quay.io/ansible/molecule:3.0.8 \ ansible-lint' alias ansible-galaxy='sudo docker run --rm -it \ -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \ -v /var/run/docker.sock:/var/run/docker.sock \ -w /tmp/$(basename "${PWD}") \ quay.io/ansible/molecule:3.0.8 \ ansible-galaxy' alias ansible-playbook='sudo docker run --rm -it \ -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \ -v /var/run/docker.sock:/var/run/docker.sock \ -w /tmp/$(basename "${PWD}") \ quay.io/ansible/molecule:3.0.8 \ ansible-playbook'
- 投稿日:2020-09-12T12:25:38+09:00
WSL2とdocker のインストールに挑戦
先日、wsl2のインストールを断念したけど、今(2020年9月12日)はできる様になっていたのでそのメモです
結論
気がつけば、version 1903でも、WSL2がサポートされるようになっていて、'Virtual Machine Platform'を有効にして、WSLのデフォルトのバージョンを2にすれば良かった。
参考
https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-21. Virtual Machine Platform を有効にする(管理者権限で起動)
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart2. WSL2 をデフォルトバージョンにする
wsl --set-default-version 23. バージョン 1903から1909にアップデートする
Win+R → コマンド winver で以下が表示されます
4. Ubuntu ディストリビューションをwsl2に設定する
既に wsl でubuntuとか実行している様であれば、そのバージョンをwsl2にする必要があります
以下をpowershell上で実行しましたwsl --set-version Ubuntu 2コマンド wsl -l -v でバージョンを確認します
4. そして、dockerを入れる
https://docs.docker.jp/docker-for-windows/wsl.html
WSL 2 Linux カーネルの更新
- こちらをダウンロード:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
- インストーラーを実行
- なんかカワイイのがはじまりました!
でも、WSL2の設定はインストール時に決まっていたためか変更出来なかったので、ここはdocker desktopを入れ直すことにしました。。
アンインストールして再インストールしただけだと、hyper-v版が上がってしまったので。。
どうやら、windows 10 version 2004が必要っぽいので、こちらからセットアップ
https://www.microsoft.com/ja-jp/software-download/windows10
version 2004にしたら、wsl2が使えるものがインストールできる様になりました。
アンインストールする必要なかったかも。。
- 投稿日:2020-09-12T09:06:23+09:00
Dockerのimageを全て削除する
下記のコマンドを実行すればできます。
docker rmi -f $(docker images -aq)まず、
image
の削除はdocker rmi <image ID>
でできます。
以下に例を示します。docker rmi e035f93e2af9ですが、これだとたまに消えない
image
があるので、-f
オプションをつけて強制的に削除します。docker rmi -f e035f93e2af9次に、全ての
image
のIDを表示させるコマンドを示します。docker images -aq
-a
オプションで隠れているimage
のIDも表示させることができます。
-q
オプションでimage
のIDのみを表示させることができます。これらを組み合わせて、最初に示した通り、下記のコマンドで全ての
image
を削除することができます。docker rmi -f $(docker images -aq)
- 投稿日:2020-09-12T07:12:37+09:00
docker イメージを使った squid によるプロキシサーバー
squid によるプロキシサーバー
https://hub.docker.com/r/minimum2scp/squid の docker イメージを使った場合
Ubuntu 20.04 上で確認しました。
Ubuntu 側の設定
docker run --rm --name proxy-squid -d -p 3128:3128 minimum2scp/squid sudo apt install -y firewalld sudo firewall-cmd --zone=public --add-port=3128/tcp --permanent sudo firewall-cmd --reloadクライアント
プロキシサーバー上で試す場合
curl --proxy http://localhost:3128 https://www.yahoo.co.jp別のマシンで試す場合
proxy.address
はプロキシのアドレスcurl --proxy http://proxy.address:3128 https://www.yahoo.co.jp
- 投稿日:2020-09-12T03:15:10+09:00
Jupyter NotebookサーバーのTensor Board対応化
Jupyter Notebookサーバーを構築して数ヶ月となりました。この間Jupyter Notebookを活用してTensor Flowの勉強をしたり、Kaggleの画像認識コンペに参加して、Tensor Flowでモデルを構築したりしてきましたが、Tensor Boardが使えない1ことが分かりました。今回は
docker-compose.yml
をカスタマイズしてTensor Boardを使える様にしようと思います。過去の記事
- Intel NUC + SSD 2TB + DRAM 32GBでハイスペックLinuxデスクトップを作ってみた
- eGPUでハイスペックLinuxデスクトップをDeep Learning Workstation化計画(eGPUセットアップ編)
- Deep Learning Workstation構築計画 遂に完結 (Jupyter Notebookサーバー構築編)
Tensor Boardへの対応化
localhostでTensor Boardを実行している場合は、実行時に表示されるURLをWebブラウザで開けばTensor Boardを表示させることが出来ます。しかし、Docker上で実行してるJupyter Notebookサーバー上のNotebookでTensorboardを実行可能にするためにはコンテナ上の60062ポートを公開する必要が有ります。公開したポートに対してポートフォワーディングすることでTensor Boardにアクセス出来る様になります。このサーバーは過去記事の方法で構築している為、Docker Composeベースで設定を行います。
コンテナの停止
リモートサーバーにログインし、
docker-compse.yml
が格納されているディレクトリに移動します。ディレクトリに移動後、コンテナを一旦停止します。docker-compose stop
docker-compose.yml
の改良
docker-compose.yml
を改良して6006ポートを公開する様に設定します。6006ポートの公開設定を追加version: "2.4" services: tensorflow_notebook: build: context: . dockerfile: Dockerfile runtime: nvidia environment: - NVIDIA_VISIBLE_DEVICES=all - NVIDIA_DRIVER_CAPABILITIES=all ports: - 8888:8888 - 6006:6006 volumes: - ../work:/home/jovyan/work restart: alwaysコンテナの再起動
docker-compose.yml
の編集を終えたら、コンテナを再起動します。ここで、デフォルトのパスワードでJupyter Notebookサーバーを使いたくない場合は、過去記事の手順を参考にパスワードを変更する行程を実施して下さい。docker-compose up -d
設定確認
ポートが公開出来ているか確認します。無事
6006
ポートの公開設定が出来ました。$ docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------------------------------------------------------------------- jupyter-notebook-server-container_tensorflow_notebook_1 tini -g -- start-notebook.sh Up 0.0.0.0:6006->6006/tcp, 0.0.0.0:8888->8888/tcp
SSHによるポートフォワーディング2020/9/13訂正: SSHによるポートフォワーディングは今回の構築方法では、不要であることが分かりました。
この行程は不要
サーバー側の設定は終わりましたので、次はクライアント側の設定を行います。サーバーの6006
ポートをクライアントの6006
ポートにバインドします。バインドする方法として以下のコマンドを実行します。sshによるポートフォワーディングssh -fNL 6006:localhost:6006 <USER_NAME>@<SERVER_NAME>
- 補足説明
- -Lオプション: ポートフォワードの実行
- -fオプション: バックグラウンド実行
- -Nオプション: コマンド入力の無効化
~/.ssh/config
に以下の内容3を追記すれば、コマンドの大部分を省略出来ます。~/.ssh/configHost HOST_NAME HostName HOST_NAME User USER_NAME LocalForward 6006 127.0.0.1:6006 IdentityFile IDENTIFY_FILE_PATHポートフォワードは以下のコマンドで実行出来ます。
ssh -fN HOST_NAME
実行結果を
lsof
コマンドで確認します。正しくポートフォワード出来ています。実行結果$ lsof -i:6006 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ssh 6575 USER_NAME 8u IPv6 0x58f4e09519d9696d 0t0 TCP localhost:6006 (LISTEN) ssh 6575 USER_NAME 9u IPv4 0x58f4e0952735ec85 0t0 TCP localhost:6006 (LISTEN)2020/9/13追記 Windowsの場合
Windowsにはlsofコマンドが2020年9月現在有りません。netstatコマンドを上手く使うことで見える様です。
Tensor Boardの動作確認
いよいよTensor Boardの動作確認を行います。公式チュートリアルの内容をそのまま利用します。今回利用するTensor FlowはVer2.3.0です。
JupyterNotebookの内容import tensorflow as tf import datetime, os fashion_mnist = tf.keras.datasets.fashion_mnist (x_train, y_train), (x_test, y_test) = fashion_mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 def create_model(): return tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) def train_model(): model = create_model() model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S")) tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1) model.fit(x=x_train, y=y_train, epochs=5, validation_data=(x_test, y_test), callbacks=[tensorboard_callback])学習の実行train_model()Jupyter Notebook上にTensor Boardを表示させる拡張機能を読み込みます。
%load_ext tensorboardTensorBoardの起動%tensorboard --logdir logs --bind_all以下の様に、Jupyter Notebook上にTensor Boardを表示出来ました。
ブラウザのアドレスバーから
localhost:6006
にアクセスすることで、Webページとして表示させることも出来ます。
- 今回の検証に用いたJupyter Notebookのファイルはこちらのリンクからダウンロード出来ます。
まとめ
Docker上でコンテナとして起動しているJupyter Notebookサーバー上で実行したTensor Boardをクライアントからアクセスして閲覧出来る様に改良しました。Tenor Boardをモデルの学習、評価に活用してきたいと思います。
Reference