- 投稿日:2019-10-26T22:37:59+09:00
Dockerで動くJenkinsから他のコンテナを操作する(Docker outside of Docker)
Dockerコンテナ内で動くJenkinsから、ホスト側のDockerを使って他のDockerコンテナを動かす、いわゆるDocker outside of Docker(DooD)に必要な設定のメモです。
前提
- JenkinsもDockerコンテナで動く
- Jenkinsコンテナのユーザーはjenkins(root以外)とする
- 各Dockerコンテナは同一ホスト内で動く
- 複数のDockerコンテナが動くためdocker-composeを利用する
環境
- ホストOS:Oracle Linux 7.7(Red Hat 7.7)
- docker 18.09.1
- docker-compose 1.24.1
- Jenkins(Dockerイメージ)2.60.3
ホスト側のSELinuxはオフにしています。
ファイル構成
docker-composeを使うのでこのような構成になります。
docker ├─ .env ├─ docker-compose.yml ├─ jenkins | ├─ Dockerfile ……ファイル定義
JenkinsのDockerfile
JenkinsのDockerfileです。
DockerfileFROM jenkins/jenkins:lts USER root # add jenkins user RUN mkdir /home/jenkins && chown jenkins:jenkins /home/jenkins && usermod -d /home/jenkins jenkins # add docker group ARG DOCKER_GROUP_ID RUN groupadd -g ${DOCKER_GROUP_ID} docker && usermod -aG ${DOCKER_GROUP_ID} jenkins # install docker, docker-compose ENV DOCKER_VERSION 18.09.1 RUN curl -fL -o docker.tgz "https://download.docker.com/linux/static/test/x86_64/docker-$DOCKER_VERSION.tgz" && \ tar --strip-component=1 -xvaf docker.tgz -C /usr/bin RUN curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose USER jenkinsポイントとしてはコンテナユーザーをjenkinsとしており、コンテナ内でsudoせずに済むようにホスト側のdockerグループID(
DOCKER_GROUP_ID)を追加しています。DOCKER_GROUP_IDは後述する.env→docker-compose.ymlという流れでJenkinsのDockerfileに渡されます。docker-compose
docker-compose.yml(Jenkins部分抜粋)です。docker-compose.ymlversion: '2' services: jenkins: build: context: ./jenkins args: - DOCKER_GROUP_ID=${DOCKER_GROUP_ID} ports: - 8080:8080 volumes: - /var/jenkins:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock
buildの引数としてDOCKER_GROUP_IDを渡します。これはホスト側のdockerグループIDで、後述の.envファイル内に定義します。
volumesで/var/run/docker.socket:/var/run/docker.sockを指定することにより、ホスト側のdockerソケットをJenkinsコンテナ内にマウントします。これでJenkinsコンテナ内のdockerコマンドで同じホストで動く他のコンテナを操作できます。.env
docker-compose.ymlと同じ階層に.envを置くことで外部パラメーターとして値を渡すことができます。.envDOCKER_GROUP_ID=992
DOCKER_GROUP_IDにホスト側のdockerグループIDを指定します。確認
JenkinsのDockerコンテナに入って
dockerコマンドが実行できれば完了です。[docker@host]$ sudo docker exec -it docker_jenkins_1 /bin/bash jenkins@6a642404e172:/$ docker version Client: Docker Engine - Community Version: 18.09.1 API version: 1.39 Go version: go1.10.6 Git commit: 4c52b90 Built: Wed Jan 9 19:33:22 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.1-ol API version: 1.39 (minimum version 1.12) Go version: go1.10.8 Git commit: e32a1bd Built: Thu Jun 6 14:47:41 2019 OS/Arch: linux/amd64 Experimental: false今回はdocker-compose.ymlで構成しましたが単独コンテナで動かす場合でも、構成は大きく変わらないはずです。
参考
docker上のjenkinsでdockerを実行
dockerでvolumeをマウントしたときのファイルのowner問題
Dockerfile ARG入門
jenkinsのdockerイメージからホストのdockerが使えるようにするDockerfile(docker in docker)
DockerのVolumeのアクセス権限の問題について
- 投稿日:2019-10-26T20:19:34+09:00
[Redmine] DockerでHTTPS対応
以下記事の続きです。
AWS環境にRedmineを構築し、ドメイン取得・DNS設定までを行なっています。[AWS]ほぼ全自動Redmine構築
[AWS]Route53 ドメイン取得本記事では、HTTP通信からHTTPS通信に切り替える方法を紹介します。
なお、本記事で使用するドメインは例としてwww.example.comとさせて頂きます。対応方法
今回は
letsencryptを使用します。
letsencryptは無料でSSL証明書を発行することができ、誰でもSSL/TLS通信を実現することができるサービスとなっています。
SSL証明書は申請や作成・設定に時間を要しますが、以下リポジトリはDockerコンテナ一つ立てることで証明書の取得・設定を全て自動で行なってくれます。https://github.com/SteveLTN/https-portal
こんな便利なものを無料で展開してくれるなんて、とてもありがたいことです。。
READMEに書いてある通り、docker-compose.ymlを編集します。
docker-compose.ymlversion: '3' services: redmine: image: redmine:4.0.5 restart: always container_name: redmine_container environment: - REDMINE_DB_POSTGRES=db - REDMINE_DB_USERNAME=postgres - REDMINE_DB_PASSWORD=postgres - VIRTUAL_HOST=www.example.com <- ご自身のドメイン expose: - 3000 volumes: - ./redmine/files:/usr/src/redmine/files links: - db db: image: postgres:10.3 restart: always environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres volumes: - ./postgres/data:/var/lib/postgresql/data https-portal: image: steveltn/https-portal:latest ports: - '80:80' - '443:443' links: - redmine restart: always environment: DOMAINS: 'www.example.com -> http://redmine_container:3000' <-ご自身のドメイン #STAGE: 'production' #FORCE_RENEW: 'true'たったこれだけでSSL通信を実現することができます。
letsencryptは申請に制限があるため、最初は以下をコメントアウトしコンテナを立ち上げてください。
コメントアウトすることで、SSL証明書の代わりに自己証明でテストを行い証明書作成に問題がないか判定してくれます。#STAGE: 'production' #FORCE_RENEW: 'true'コンテナを立ち上げましょう。
$ docker-compose up -dログの確認方法は以下の通りです。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a328ea2b95a3 steveltn/https-portal:latest "/init" 4 hours ago Up 4 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp redminedocker_https-portal_1 f24edf5e687f redmine:4.0.5 "/docker-entrypoint.…" 4 hours ago Up 4 hours 3000/tcp redmine_container 8f51137977c3 postgres:10.3 4 hours ago Up 4 hours 5432/tcp redminedocker_db_1 $ docker logs a328ea2b95a3ログを確認し無事成功していると、以下のような出力となるはずです。
Found domains: www.example.com Getting directory... Directory found! Registering account... Registered! Creating new order... Order created! Verifying www.example.com... www.example.com verified! Signing certificate...成功していたら、コメントアウトを戻しコンテナを再度立ち上げましょう。
また、以前作成したAWSでのセキュリティグループがHTTPSを許可していないと思います。
コンソールからインバウンドでHTTPSを通すよう設定してください。ブラウザからご自身のドメインを
httpsで叩いてみてください。以上で、HTTPS対応は完了です。
終わりに
letsencryptは大変素晴らしいサービスですが、信頼性がやや劣るため商用利用するサービスでは普通にSSL証明書を購入しましょう。
- 投稿日:2019-10-26T18:30:25+09:00
FROM scratchで作ったような、ログインコマンドの無いdocker containerにログインする
はじめに
開発向けでなく本番運用のDocker containerの場合、
FROM scratchのようにshやbashコマンドの無いシンプルなcontainerを利用すると思います。
そんなcontainerに対してログインして中を覗きたい!となることが個人的によくあるので、やり方を調べました。力技: コマンドが無いならコピーすればいい!
対処は単純で、コマンド実行が可能となるコマンドをコピーして利用すればいい! 今回はホスト: Ubuntu Linux環境で試しました。
- コピー対象のコマンドを用意する。 今回は
busyboxを使用しました。/bin/busyboxにあるとします。docker container psでログインしたいdocker containerのIDを確認。 ここでは0123456789abとします。docker cp /bin/busybox 0123456789ab:/でbusyboxをコピーdocker exec -it 0123456789ab /busybox shでコピーしたbusyboxを使ってでログイン$ which busybox /bin/busybox $ docker container ps | grep some_keyword 0123456789ab xxxxxxxxxx "run command" 2 days ago Up 2 days $ docker cp /bin/busybox 0123456789ab:/ $ docker exec -it 0123456789ab /busybox sh BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1.4) built-in shell (ash) Enter 'help' for a list of built-in commands. / #これでログインできたので、あとは好きにデバッグしましょう。
終わったら
rmで消しましょうdocker exec -it 0123456789ab /busybox rm /busybox参考
busyboxのコピーを参考にしました: Debugging “FROM scratch” on Kubernetes
docker cp でファイルをホストからコンテナへコピーする
- 投稿日:2019-10-26T17:42:04+09:00
Winodows10 homeでDocker環境を構築 - 参考サイトまとめ,使えるコマンド集 -
Windows10 homeにDocker環境を構築する
本記事では、Windows10 homeを利用しているユーザを対象としています。
目標
Windows10 homeにDockerを入れるためのメモです
内容
少し前から流行始めていたDockerがずっと気になっていたので試しに自分のPC (Windows10 home)に入れてみました。
Dockerが何なのかについてはこちらが個人的にはとてもわかりやすいと思ったのでこちらを参考にしてください。
Dockerのインストールはこちらのブログを参考になります。
とても丁寧に記述されており、特に詰まりもせずにインストールすることができました。Dockerマシンの追加をしたい場合はこちらが参考になります。
マシン追加、削除、動作開始、停止など入門には必要なことが列挙されています。コンテナの作成
インストールしたらコンテナを作成したい!
ということで、これまでの参考記事でもHello Worldのイメージは入れられるのですが、今回はTensorflowを入れてみます。Tensorflowdocker run -it --rm --name tensorflow tensorflow/tensorflowそれぞれのコマンドの解説
--it:ターミナルを使うためのオプション
--rm:コンテナから抜けるとコンテナを自動で削除する
--name: コンテナの名前を指定するまた、Jupyter Notebookの場合以下のコードです。
Jupyter_Notebookdocker run -p 8888:8888 -it --rm --name ds jupyter/datascience-notebookコンテナイメージの保存
作成したコンテナのイメージを保存するためには、以下のコードを入力します。
Jupyter_Notebookdocker commit ds takeshi1222/ds-Juimage--dsはコンテナの名前 (今回はJupyter Notebookのもの)
--takeshi1222/ds-Juimageはイメージ名 (自由につけていいです)終わりに
今回は参考になりそうなサイトと基礎的に使えるコマンドを列挙した形にしました。
これからもっと学んでってわかったことをどんどんまとめていこうと思います。参考文献
- 投稿日:2019-10-26T16:42:22+09:00
【Docker】初めてのdockerでimageまで作成
https://docker-curriculum.com/
ここを読んで覚えていったことを書いていってます!他参考サイト
http://docs.docker.jp/engine/userguide/dockerizing.htmlバックエンド寄りなことも知っとかないとな〜と日々思うので、
まずはdockerについて学習してみます。dockerのすごいところ!
Virtual Boxなんかより軽い。
そもそもの構成が違うみたい。ここでは深くは触れない。
https://qiita.com/supaiku2452/items/8b06b774c0e2fce7df92
この辺が参考になりました。Hello world!(ダウンロード〜動作確認)
まずはdockerをダウンロード
Mac https://docs.docker.com/docker-for-mac/install/
Windows https://docs.docker.com/docker-for-windows/install/
Linux https://docs.docker.com/install/linux/docker-ce/ubuntu/ダウンロードが終わったらMacだとターミナルを開いて
docker run hello-worldを入力すると、
Hello from Docker. This message shows that your installation appears to be working correctly. ...と表示されたらうまくいってます。
dockerの用語と簡単な仕組み
ざっくりと。
container ・・・dockerがアプリケーション起動を動かしてくれる仮想環境の一つの枠組み
image ・・・そのコンテナを起動する際に使う、コンテナの設計が書かれている
docker daemon ・・・containerを管理・制御してる
docker client ・・・そのdocker daemonとのやりとりを可能にしてくれるコマンドラインツール
docker hub ・・・imageが登録されている、imageのディレクトリのようなもの流れとしては、docker hubからimageをpullする(持ってくる)
そのimageをもとにcontainerを作る
という感じ。早速コンテナを扱ってみる
まず、コンテナの元となるimageをdocker hubからpullします。
今回はbusyboxを引っ張ってみます。docker pull busyboxコンテナを生成して起動する
docker run busybox一見何も動いてないようですが、コマンド等を渡してないから起動しただけで何も実行されなかったということみたいです。
docker run busybox echo "hello from busybox"これを入力するときちんと
echoが実行されているのがわかります。
docker psコマンドで現在起動されているコンテナ一覧が表示されています。
今動いていないコンテナも表示する場合は-aオプションをつけます。docker ps -aコンテナの中に入って色々実行したい場合は
docker run -it busybox shです。
-iと-tオプションをつけることで、コンテナ内部のコマンドラインを操作できるようになります。
オプションやらコマンドやらで困ったら--helpを使います。docker run -- help // 以下オプション等の説明がずらっと出力されるコンテナを削除する
このまま
runでコンテナを生成しまくっていたらメモリに限界がきます。
docker ps -aで削除したいコンテナIDを確認して、以下のコマンドでコンテナを削除します。docker rm 305297d7a235(削除したいコンテナのdocker id)複数削除もできますが、毎度docker idをコピーしてくるのも面倒です。そんな時は以下のコマンド
docker rm $(docker ps -a -q -f status=exited)
-qでidの数字だけを表示、-fで特定のステータスだけのコンテナをフィルターできます。
この場合はステータスがexitedのコンテナIDを全て表示し、一括削除しています。
新しいバージョンのdockerだったら、以下のコマンドで同じ挙動になります。楽チン!docker container pruneちなみに、いちいち削除するのが面倒な場合は、実行後自動でコンテナを削除してくれる便利な
--rmというオプションもあります。docker run --rm (任意のimage)imageの一覧確認と削除
一覧表示
docker image必要なくなったimageを削除したい場合は
docker rmi 305297d7a235(削除したいimageのimage id)静的サイトを実行する
Let's begin. The image that we are going to use is a single-page website that I've already created for the purpose of this demo and hosted on the registry - prakhar1989/static-site.
https://docker-curriculum.com/
の方で元となるimageを準備してくれてます。こちらのコマンドで起動しましょう。
docker run --rm prakhar1989/static-siteちなみに今回のように、ローカルにimageがない状態でrunすると、自動でimageを引っ張ってくれるみたいです。
Nginx is running...が表示されたら成功です。
....それで、どうやってサイトをみるんでしょうか。
これでは実はポートが発行されていません。Ctrl + cで一旦コンテナを停止させます。まず、サイトを起動するにあたって便利なデタッチモードというものがあります。これはコンテナに入らずバックグラウンドでコンテナを起動させることができるモードです。何が嬉しいかというと、ターミナルを閉じててもコンテナを起動し続けることができる点です。オプション
-dでデタッチモードになります。そして
-Pオプションでランダムなポートに公開します。
仕上げに--name 名前オプションでコンテナに名前をつけます。docker run -d -P --name static-site prakhar1989/static-siteこれでポートを見に行けるようになってるはずです。
docker port static-siteそうすると以下のレスポンスが返ってくるので、ブラウザで見にいって表示できたら成功です。
この場合は, http://localhost:32769/ になります。80/tcp -> 0.0.0.0:32769 443/tcp -> 0.0.0.0:32768特定のポートを指定することももちろんできて、それには小文字の
-p 指定するポート
でいけます。docker run -p 8888:80 prakhar1989/static-siteデタッチモードで開いたコンテナを停止させる場合は
docker stopで停止させます。docker stop static-siteここまでで人通り用意されたimageからの操作はバッチリです!
次は自分でimageを作れるようになってみたいですね。Docker images
dockerのイメージには二種類ある。
Base image ・・・・ コンテナのベースになる。大体 ubuntuやbusyboxなどのようにOSっぽいもの
Child image ・・・・ base image上でbuildされて、色々機能を追加してくれるものあとは以下の分類法もある。
official image ・・・・dockerが提供してるっぽい。基本的に1単語。pythonubuntuhello-worldなど
user image ・・・・一般の人が作ったもの。 基本的にuser/image-nameという感じの名前とimageの種類を作ったところで、自分のimage作りにチャレンジしてみます。
簡単なFlaskのアプリケーションを作ります。猫がランダムに表示されるアプリらしいです?
(Pythonのフレームワークです。私はPythonをやったことないけどこのドキュメントにしたがってみます)以下のコマンドを打ち込みます。(注意:コンテナの中で実行じゃないよ)
git clone https://github.com/prakhar1989/docker-curriculum.git cd docker-curriculum/flask-appこれは言語がpythonなので、base imageは
python:3-onbuildを使用します。
onbuild について何ですが、dockerfileを使うことで色々便利になるバージョン指定、ということが書かれています。onbuild version of the image includes helpers that automate the boring parts of getting an app running. Rather than doing these tasks manually (or scripting these tasks), these images do that work for you. We now have all the ingredients to create our own image - a functioning web app and a base image. How are we going to do that? The answer is - using a Dockerfile.
Dockerfileって何よ
イメージを作るときに使う命令なんかをやってくれる便利テキスト。
Linux commandと書き方がほぼ同じらしい。
先ほどクローンしてきたflask-appディレクトリの中に、Dockerfileという名前でファイルを作ります。
(このディレクトリではすでにDockerfileの記述がしてありますが、一から作る練習もかねて削除します。)
ファイル作成(flask-app内で)touch DockerfileそれではDockerfileの中をいじっていきます。
エディター等で開いて、次の一行を追加してBase imageを指定します。DockerfileFROM python:3-onbuild
FROMでBase imageを指定できるんですね。
次は使うポート番号を指定します。今回は5000を使います。DockerfileEXPOSE 5000次は
CMDを書きます。
CMDはdocker runする時のコンテナ作成時に実行されるんだとか。DockerfileCMD ["python", "./app.py"]上記によって
$ python app.pyが走ります。まとめるとDockerfileは以下の内容になります。
DockerfileFROM python:3-onbuild EXPOSE 5000 CMD ["python", "./app.py"]これでDockerfileは完成です!
あとはビルドすればimageが作れます。
以下のコマンドをflask-app内で実行します。Dockerfiledocker build -t (自分のdocker hubID)/catnip .
-t タグ名で任意のタグの名前をつけることができます。これでイメージができました!
あとは以下でimgageを実行します。docker run -p 8888:5000 (自分のdocker hubID)/catniphttp://localhost:8888/ をみに行くと、ランダムな可愛い猫ちゃんのgifが流れてきます!
終わりに
一通りのコンテナの扱いや、imageの作り方を覚えることができました!
でもまだまだ環境に合わせてカスタマイズする方法などはわからないので、次回もチュートリアルをみつつdockerを学んでいければと思います!
- 投稿日:2019-10-26T13:13:33+09:00
【Docker for Windows】Laradock環境をささっと構築する
LaradockでLaravel開発環境を整える
今回チームのアプリ制作でLaradockを使って開発をすることになったので
その時にハマったことなどを備忘録的にまとめていきたいと思います
前提環境
- Windows 10 Pro(Hyper-V)
- Docker for Windows
- Postgres(DB)
- Nginx(Web Server)
- Git
※Docker for windowsはWindows 10 Proじゃないと使えないので注意が必要です
Laradockをgit clone
好きなディレクトリへ移動してLaradockをgit cloneします
cd yourProject //移動したらgit cloneをする git clone https://github.com/laradock/laradock.git
現段階でのディレクトリ構造は以下の通りです
yourProject ┗━ Laradockできていることが確認出来たら.envファイルを作成します
作成というよりファイル名を変えてコピーするだけなのでコマンドを入力するだけです
cp env-example .envコマンドを入力したら.envファイルが作成されます
確認したい場合はエクスプローラーから開いて確認することができますLaradock .envの設定
変更するコード
APP_CODE_PATH_HOST=../APP_NAME/ //8行目あたり COMPOSE_PROJECT_NAME=APP_NAME //36行目あたり ※APP_NAMEはおのおの名前を付けてください特に二行目のcompose_project_nemeを変更は忘れないようにしましょう
ここを設定しておくとコンテナ被りを避けることができます
あと290行目付近にPostgresの設定が書かれているところがあるのでDB名とユーザー名、パスワードをメモか何かしておきましょう
あとでLaravel側の.envの書き換えで使います
Dockerの環境構築
まずDockerアプリを起動します
起動するまでしばし待ちましょう
cd laradock
起動が完了したらLaradockフォルダに移動してdockerのコンテナを立ち上げます
コンテナとは?
コンテナ型仮想化はOSの上に“コンテナ”と呼ばれる仮想的なユーザー空間を提供します。ユーザー空間とは、ユーザーがアプリケーションを実行するための、
ひと揃いのリソースが提供される空間です。通常は1つのOSの上に1つのユーザー空間があるのですが、コンテナ型仮想化では1つのOSの>上で仮想的なユーザー空間であるコンテナを複数提供できます。
以下をPoweShellに入力
docker-compose up -d nginx postgres
途中赤字の文字とか出てきますが気にせず完了するまで待ちます
ただ、はじめて構築するときはそこそこ時間がかかるので気長に待ちます
完了した後にLaradockのワークスペースに入り込みます
PowerShellで以下の入力します
docker exec -it APP_NAME_workplace bashroot@------:/var/wwwと出たらワークスペースに入ることができています
エラーが出た場合に確認すること
- Dockerが起動しているか
- カレントディレクトリ(今いるディレクトリ)がLaradockかどうか
ワークスペースに入り込んだらlaradockにあるパッケージを最新のバージョンに更新していきます
これもコマンドを入力するだけOKです
apt-get update入力したら完了までしばらく待ちます
完了したらLaravelをインストールしていきます
新規プロジェクトを作成する方法
ワークスペースに入っている状態で
composer create-project laravel/laravel APP_NAMEそして、次にDockerの時と同じように.envファイルをコピーして作成していきます
cp .env.example .env.envファイルは環境を設定するためのファイルなのでないとエラーが出てしまいます
なのでDockerの時もそうですが忘れずに作成するようにしましょう
作成し終わったら、次はcomposerをアップデートします
今の状態だとvenderファイルが存在しません
venderファイルというのはcomposerの依存設定を置くところと認識したらOKだと思いますcomposer update //ワークスペース内でちなみに現在のディレクトリはこんな感じです
yourProject ┗━ APP_NAME ┗━ Laradock読むといいかも:Laravelのディレクトリ構造について学ぶ
Laravel .envの設定
今回はPostgresを使うのでその箇所だけを書き換えます
たとえばこんな感じ
DB_CONNECTION=pgsql DB_HOST=postgres DB_PORT=5432 //ここから↓はLaradockの.envにかかれてた内容を書く DB_DATABASE=DB_NAME DB_USERNAME=USER_NAME DB_PASSWORD=PASSWORD上から3行はコピペしちゃっても大丈夫かと思います
下から3行はLaradockに書いてあったとおりに書いていきましょう
最後にdocker-composeでコンテナをリビルドします
docker-compose up -d --build nginx postgresリビルドが完了したら
http://localhost
でLaravelのウェルカムページが表示されるはずここで表示されないエラーが出る場合はlaradockの側の.envファイルでミスがあります。
詳しくは後日別記事で書きますのでお待ちください。以上がDocker for windowsを使ったLaradock環境構築でした、ありがとうございました。
僕がおせわになった記事たち
LaradockでLaravel環境構築【手順書】
Windows10でLaradockを使ってLaravel 5.5環境を作る
docker for windowsを使ってlaravelの開発環境を作る
- 投稿日:2019-10-26T13:03:26+09:00
Docker初心者未満向け
はじめに
- 自己紹介:UbuntuでPythonを書いてデータ分析とか異常検知してます
- CUDAのバージョン管理のためにDockerをやろうと思った
- 専門用語が多すぎて脳が混乱したので用語集を作った
- これからDockerを始めたいけどガチで何もわからないという人向けにまとめた
- PCで見てほしい(スマホQiita勢、いるのか…?)
Dockerことはじめ
- いろんな仮想環境構築が簡単にできて嬉しいシステム
- 仮想環境とは:好きなOS+好きなソフトと思っとけばOK
- 今までの仮想化(ホストOS型仮想化)の悪いところ
- 仮想環境がホストOSや仮想化ソフトウェアのバージョンに依存してしまう
- DockerはホストPCの中に全く別のPCを用意する様なものなのでホストの環境に依存しない
- つまり、いつ誰が使っても同じ結果になる=これを「冪等性」という
- 冪等性がなくてつらいことになる例
- web系の人:開発環境と本番環境が違って動かない
- 機械学習の人:CUDAとかミドルウェアのバージョン管理が死ぬほどめんどくさい
- 動作がもっさり、ファイル容量が大きいので共有が大変
- Dockerは仮想環境(Container)の型(Image)を保存・配布する方式なので、管理や共有が楽
Docker運用の流れ
- ホストPCにDockerをインストール
- Dockerfileを書く
- Dockerfileを元に、Docker Imageを作る(build)
- Docker Imageを元に、Docker Containerを作り、仮想環境を有効にする(run)
- 仮想環境内でなんやかんや好きなことをする
- 終わったらContainerを停止させ(stop)、削除する(rm)
- 「この前と同じ仮想環境作りたいな〜」と思ったら、同じImageを元にContainerを作る(run)
- Tips
- Imageは基本的に削除しないけど、もう使わないものがあまりに増え過ぎたら消してOK
- Docker HubというGithub的なリポジトリから既存のImageをダウンロードできる(pull)
用語集(超基礎)
- Dockerfile
- 拡張子のないテキストファイル。DSLというDocker用言語を使って「どんな仮想環境を作りたいか」を書くもの
- DSL言語の例
- FROM:どのOSやミドルウェアの環境を作るか
- RUN:Imageを作る時に、どういうコマンドを実行するか
- COPY:どのファイルをホストPCからコンテナに移動させるか
- Docker Image
- Dockerfileを基に作られるもの。後述のContainerの型のようなもの
- Imageを作ることをbuildと言う
- オブジェクト指向的に言えばクラス
- Docker Hubで公開されてるImageをDLしてきてもOK。これをpullという
- Docker Container
- Docker Imageを基に作られる仮想環境そのもの
- オブジェクト指向的に言えばインスタンス
- Containerを作り実行することをrunという
- Imageの形で保存・配布して、仮想環境を作りたくなったらContainerにしてね〜という感じ
- やりたい事が終わったら消す。Imageは残しておき、同じ環境が作りたくなったらまたrunさせる
用語集(ちょっとむずかしい)
- Docker Engine
- 常駐アプリ。Dockerシステムの親玉
- Docker Compose
- yml形式のテキストファイル
- 1個のホストPC上で複数個のコンテナを動かす時、その方法を指示する
- 複数個のコンテナをいっぺんに起動とかもできて便利
- Docker Machine
- 「Dockerを持つホストPC」の中に「Dockerを持つPC」環境を作れる
- クラウド上にDocker環境作る時に便利
- Docker Swarm
- 複数台のホストPCがある時、それらをまとめて制御できる
- 例えば、ホストをまたいだコンテナ間の通信をどう制御するかなど
- これを「オーケストレーションシステム」という
- Service
- ホストPCが1台&コンテナが1個 → container runコマンドでコンテナを起動
- ホストPCが1台&コンテナが1個 → Composeを使ってまとめてコンテナを起動
- ではホストPCが複数台のときは? → Serviceというコンテナのまとまりを作って起動
- 1つのアプリしか扱えない
- Stack
- Serviceのまとまり
- 複数のServiceを扱うことで、複数のアプリを扱うことができるようになる
- Kubernetes
- Swarmと同じく、オーケストレーションシステムの1つ
- Compose, Swarm, Stackを合わせたような便利なやつ
Dockerにおけるデータ管理
- データ管理関連
- 仮想環境作ってからいちいちデータをダウンロードしてたらめんどくさい
- ホストPC上にデータを管理して、それをコンテナにマウントする手法が取られる
- データ通信関連
- コンテナ間で通信できるし、ホストをまたいで通信する事もできる
Dockerを勉強しててひっかかったところ
- 「Dockerfile」という名前の情報のなさ
- Dockerfileという固有名詞があると最初わからなかった
- Docker関係のファイル全般のことだと思ってた
- Docker Imageもコンテナっぽいこと
- Imageに「OS+ミドルウェア+アプリ」を放り込むんだからコンテナ感あるよね
- あくまでContainerは仮想環境の実体、Imageはその型
おわりに
- 自分の理解が進んだら随時追記します
- 「ここがわからなかった」「ここがまちがってる」「わかりやすかった」などコメントお待ちしてます
参考
- 投稿日:2019-10-26T12:57:01+09:00
[GKE] Google Kubernetes Engine + docker compose で開発環境を手に入れる
TL;DR
開発する(frontend)
- frontend ソース更新
- make build
- make start
- ローカルで動作確認
- make deploy でデプロイされる
backend 追加する
- backend フォルダに適当になんか用意
- backend-{deployment,service}.yaml を用意
- Makefile への追記
詳細
公式の guestbook を元に go + redis な開発ができるようにする
https://github.com/kubernetes/examples/tree/master/guestbook-goファイル構成はこんな感じ
frontend/* に対象のサンプルファイルおいた. ├── Makefile ├── README.md ├── data │ └── reis ├── docker-compose.yml ├── frontend │ ├── Dockerfile │ ├── main.go │ └── public │ ├── index.html │ ├── script.js │ └── style.css ├── frontend-deployment.yaml ├── frontend-service.yaml ├── redis-master-deployment.yaml ├── redis-master-service.yaml ├── redis-slave-deployment.yaml └── redis-slave-service.yaml
- 後々 backend/* なり api/* なり ci/* なり拡張しやすい気がする
- pod 定義は公式に習って deployment + service
- go は json で書かれてたけど yaml の方が好きなので yaml で
Makefile から各種更新やらローカル環境ホスティングできるように
update: kubectl apply -f ${FILE} .PHONY: update build: docker build -t gcr.io/${PROJECT_ID}/${FRONTEND} ./frontend # docker build -t gcr.io/${PROJECT_ID}/${BACKEND} ./backend .PHONY: build deploy: gcloud docker -- push gcr.io/${PROJECT_ID}/${FRONTEND} # gcloud docker -- push gcr.io/${PROJECT_ID}/${BACKEND} .PHONY: deploy dev: docker-compose up -d .PHONY: devdocker-compose.yml では redis を master / slave で構成
web は image を立ててポートを調整version: '3' services: web: image: gcr.io/siiid-prd/siiid-frontend:latest ports: - "3341:3000" redis-master: image: redis ports: - "6380:6379" volumes: - "./data/reis:/data" redis-slave: image: redis command: redis-server --slaveof redis-master 6379 ports: - "6381:6379" volumes: - "./data/reis:/data"gke はいいぞ!
- 投稿日:2019-10-26T11:48:24+09:00
docker-composeでBundler::GemNotFoundになる
- 投稿日:2019-10-26T11:31:31+09:00
docker-composeでWordpressの構築 (Windows)
概要
- 手元のPCでWordpressを軽く触りたい
- 手元のPCにPHPやDBをインストールしていない(環境設定とか面倒)
- MAMPのような導入に便利なパッケージあるけど、やっぱり手元のPC環境はきれいなままにしたい
- そもそも、Wordpressで本格的に何かを開発するのではなくて勉強程度に触れるだけ
...ってな時にはDockerで試してみるのもありですね!
環境
- Windows 10 pro
- Docker version 19.03.2
- docker-compose version 1.24.1
準備
- 下記ファイルを用意
docker-compose.ymlversion: '3.4' networks: { intr: { external: true } } volumes: wp_db_data: { driver: "local" } services: wp: image: wordpress networks: [ "intr" ] volumes: - ./www:/var/www/html environment: WORDPRESS_DB_HOST: wp_db:3306 WORDPRESS_DB_PASSWORD: pass ports: [ 8001:80 ] wp_db: image: mysql:5.7 networks: [ "intr" ] volumes: - wp_db_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: pass MYSQL_DATABASE: wordpress MYSQL_USER: user MYSQL_PASSWORD: pass構築
docker-compose.ymlを置いたディレクトリで下記のコマンドを実行cmddocker network create intr docker-compose up -d動作確認
[フロント画面]:http://localhost:8001
[管理画面]:http://localhost:8001/wp-admin補足
docker-compose.ymlに定義した内容の補足
- networks
- 将来的に別の
docker-compsoe.ymlで定義したコンテナからのアクセスを考慮し、共通リンク用のネットワークを作成してからコンテナを立ち上げるようにしています。(不要の場合は削除してよいです。)- そのため、
docker-compose up -dの前に、docker network create intrを実行して事前にネットワークを作っています。docker network lsで既存のnetworkの一覧を確認できます。- volumes
- データを永続化させるためにトップレベルに
data volumesを指定しています。- そのため、コンテナを再構築することになっても
data volumesさえ消さなければデータは無事です。- 今回、Docekr for Windowsを標準のまま利用しているので、Mysqlに登録されたデータは
Hyper-Vで作成した仮想マシンMobyLinuxVMにマウントされています。docker-compose down -vを実行するとdata volumesも消えるのでデータは消失します。docker volumes lsで 既存のvolumes一覧を確認できます。- services
- Wordpress(wp)とMysql(wp_db)のコンテナを立ち上げています。
- wpではホスト側のエディタ等を使用してWordpressのカスタマイズが出来るようにコンテナ内の
/var/www/htmlをマウントしてます。- wpではホスト側の
8001番ポートとコンテナ側の80番ポートをマッピングしているので、localhost:8001でブラウザからアクセスして動作を確認することができます。- wp_dbのコンテナの中には以下のコマンドで入ることができます。
docker-compose exec wp_db sh- コンテナの中に入ったら、下記のようなMysqlのコマンドでDBの参照等を行うことができます。
mysql -uuser -ppass wordpress以上です!
- 投稿日:2019-10-26T01:48:16+09:00
Railsでポートフォリオを作ってみよう! vol.1 後編 (docker-compose導入〜rails構築編)
前回、Docker導入を行ったが、今回はdocker-composeの導入を行う。
(前回のDocker導入編をまだご覧になっていない人は→こちら)docker-composeとは
Docker-composeとは、複数のコンテナをまとめて管理してくれるツールの名称。コンテナで作成した複数のサービスを構築・実行する手順を自動化し、管理を容易にしてくれる優れもの。
一つの専用ファイル(docker-compose.yml)を書いて、コマンドを叩くだけで使えるのも非常に便利。
Rails開発では複数のコンテナを使用する事が多々ある為Dockerを使うとなったら必須となってくる。
日本語訳版公式文章つまりは覚えて損はない。
環境
今回の環境は以下の通り
・ruby 2.5.1
・rails 5.2.1
・MySQL 5.7必要ファイルの確認
今回作成していくファイルは以下の4つ
・Dockerfile
・docker-compose.yml
・Gemfile
・Gemfile.lock構築
下記から構築を行っていくが、作業の区切り区切りは中タグで区切っている為、途中から作業を再開したい場合などは右の一覧から探すのがオススメ。
作業ディレクトリの作成
作業ディレクトリの作成を行う。mkdirでファイルを作成しその中に入っていく。
今回「exampleApp」で作成を行っていく。$ mkdir exampleApp $ cd exampleAppDockerfileの作成
まずDockerfileをexampleApp直下に置く
vimが使える場合 $ vi Dockerfile vimが使えない場合 $ touch Dockerfile を行いDockerfileを作成し、Atomなどで開いて編集しても良いそしてDockerfileを編集する
exampleApp/Dockerfile#rubyの指定、今回は環境欄で言った通り2.5.1を指定している。 FROM ruby:2.5.1 #shellの実行を行い、パッケージのインストールを行う。 RUN apt-get update -qq && \ apt-get install -y build-essential \ libpq-dev \ nodejs #RUN mkdirでファイルを作成し、ENVで環境変数の設定を行っている。 #WORDIDは起点ディレクトリの設定を行っている。 #ちなみに下記に書いてある[/app_name]の名前は変更しなくても良い RUN mkdir /app_name ENV APP_ROOT /app_name WORKDIR $APP_ROOT #Gemfileの作成 ADD ./Gemfile $APP_ROOT/Gemfile ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock #Gemfileのbundle installを走らせる RUN bundle install ADD . $APP_ROOT編集を行ったら保存してDockerfileは終了。
docker-compose.ymlの作成
Dockerfileと同じようにこちらもexampleApp直下に置く。
vimが使える場合 $ vi docker-compose.yml vimが使えない場合 $ touch docker-compose.yml を行いdocker-composeを作成し、Atomなどで開いて編集しても良いこちらも開いて編集を行う。
examleApp/docker-compose.yml#dbにある[MYSQL_ROOT_PASSWORD]のパスワードは後ほど使用する為覚えておく事 #インデントに注意する(インデントがずれている場合、エラーになる事が極めて高い) #インデント表示無しVer #versionは最新の3を使用 version: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: root ports: - "3306:3306" web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/app_name ports: - "3000:3000" links: - db #インデント表示有りVer(こちらはインデント確認用として使用) version: '3' services: ..db: ....image: mysql:5.7 ....environment: ......MYSQL_ROOT_PASSWORD: password ......MYSQL_DATABASE: root ....ports: ......- "3306:3306" ..web: ....build: . ....command: bundle exec rails s -p 3000 -b '0.0.0.0' ....volumes: ......- .:/app_name ....ports: ......- "3000:3000" ....links: ......- db編集を行ったら保存してdocker-compose終了。
Gemfileの作成
今回railsは5.2.1を利用
vimが使える場合 $ vi Gemfile vimが使えない場合 $ touch GemfileGemfilesource 'https://rubygems.org' gem 'rails', '5.2.1'編集して保存。
現状はrailsだけ入っていれば大丈夫。Gemfile.lockの作成
Gemfile.lockはただ単に作成だけ行う。
中の編集などは行わないので、$ touch Gemfile.fileで完了。
これで必要なファイルの作成は終了。rails newを行う
docker-composeコマンドを使用し、rails newを実行する。
$ docker-compose run web rails new . --force --database=mysql --skip-bundledatabase.ymlの修正を行う
作成されたconfigファイルの中にあるdatabase.ymlの編集を行う。
vimが使える場合 $cd config $vi database.yml vimが使えない場合は直接configファイルに行き編集を行う。 exampleApp/config/database.ymldatabase.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password # MYSQL_ROOT_PASSWORDを記入 host: db # docker-compose.ymlのservice名を記入保存する。
docker-composeを起動する
ターミナルを確認。もしこの時点で
$ PC名: config $になっていたら [cd] を使用しexampleAppまで戻っておく
$ PC名: config $ cd .. $ PC名: exampleApp $コンテナを建てる
# コンテナをビルド $ docker-compose build # コンテナの作成&起動(別ターミナルが必要になる) $ docker-compose up # コンテナの作成&起動(バックグラウンド) $ docker-compose up -d起動しおわったら localhost:3000に飛びいつものページ(Yay! You're on Rails!)が出ていることを確認して完了。
その他
サーバーの終了方法
いつものctrl + cだけでは、railsサーバーは閉じたけどdb(mysql)サーバーは閉じていないなどの不具合が発生する事があるため、以下のいずれかの方法で終了させる。
コンテナを停止だけさせたい場合 $ docker-compose stop コンテナを停止させる + 削除する $ docker-compose downもしミスってctrl + cを行ってしまった場合はtmp/pids/server.pidファイルを削除し再度起動を行う。
そんなファイルないやんって時は、一度docker-composeを起動し、その状態で再度ファイルを探して削除を行い再起動すると治る場合がある。なぜ2つの停止方法があるのか
他の理由もあるとは思うが、コンテナがある状態で新しくgemをインストールすると、サーバーの再起動を行っても反映されない事象がある。
原因としては簡単でDockerfileを見ればわかるようにRUN bundle installを行っている。
docker-composeをstopさせただけでは以前のコンテナが残りっぱなしの為、docker-compose upを行ってもgemが対応しない。
なので、一回一回コンテナを削除して読み込ませないといけない。そのため
gemは入れないけどとりあえず停止だけさせたい → $ docker-compose stop gem新しく入れます、再度コンテナを作り直す理由が他にもあります → $ docker-compose downと分けて使用する。
DBでもエラーが出た場合
docker-compose down を行い build したのはいいけど、dbが無いよなどのエラーが発生する場合がある。
その時は、docker-compose run web rails db:createを行う。
ちなみに
先ほど実行したdocker-compose run、
docker-composeではよく使うので覚えた方が吉。docker-compose run [docker-compose.ymlで設定したサービス名] (使用したいコマンド) → docker-compose run web rails db:create ローカルでbundle installしたい docker-compose run web bundle install gitコマンド使いたい docker-compose run web git add . RSpec使いたい docker-compose run web bin/rspec

