20191026のdockerに関する記事は11件です。

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です。

Dockerfile
FROM 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は後述する.envdocker-compose.ymlという流れでJenkinsのDockerfileに渡されます。

docker-compose

docker-compose.yml(Jenkins部分抜粋)です。

docker-compose.yml
version: '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を置くことで外部パラメーターとして値を渡すことができます。

.env
DOCKER_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のアクセス権限の問題について

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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.yml
version: '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で叩いてみてください。

スクリーンショット 2019-10-26 20.07.19.png

以上で、HTTPS対応は完了です。

終わりに

letsencryptは大変素晴らしいサービスですが、信頼性がやや劣るため商用利用するサービスでは普通にSSL証明書を購入しましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

FROM scratchで作ったような、ログインコマンドの無いdocker containerにログインする

はじめに

開発向けでなく本番運用のDocker containerの場合、 FROM scratch のようにshやbashコマンドの無いシンプルなcontainerを利用すると思います。
そんなcontainerに対してログインして中を覗きたい!となることが個人的によくあるので、やり方を調べました。

力技: コマンドが無いならコピーすればいい!

対処は単純で、コマンド実行が可能となるコマンドをコピーして利用すればいい! 今回はホスト: Ubuntu Linux環境で試しました。

  1. コピー対象のコマンドを用意する。 今回は busybox を使用しました。 /bin/busybox にあるとします。
  2. docker container ps でログインしたいdocker containerのIDを確認。 ここでは 0123456789ab とします。
  3. docker cp /bin/busybox 0123456789ab:/ でbusyboxをコピー
  4. 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 でファイルをホストからコンテナへコピーする

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Winodows10 homeでDocker環境を構築 - 参考サイトまとめ,使えるコマンド集 -

Windows10 homeにDocker環境を構築する

本記事では、Windows10 homeを利用しているユーザを対象としています。

目標

Windows10 homeにDockerを入れるためのメモです

内容

少し前から流行始めていたDockerがずっと気になっていたので試しに自分のPC (Windows10 home)に入れてみました。

Dockerが何なのかについてはこちらが個人的にはとてもわかりやすいと思ったのでこちらを参考にしてください。

Dockerのインストールはこちらのブログを参考になります。
とても丁寧に記述されており、特に詰まりもせずにインストールすることができました。

Dockerマシンの追加をしたい場合はこちらが参考になります。
マシン追加、削除、動作開始、停止など入門には必要なことが列挙されています。

コンテナの作成

インストールしたらコンテナを作成したい!
ということで、これまでの参考記事でもHello Worldのイメージは入れられるのですが、今回はTensorflowを入れてみます。

Tensorflow
docker run -it --rm --name tensorflow tensorflow/tensorflow

それぞれのコマンドの解説
--it:ターミナルを使うためのオプション
--rm:コンテナから抜けるとコンテナを自動で削除する
--name: コンテナの名前を指定する

また、Jupyter Notebookの場合以下のコードです。

Jupyter_Notebook
docker run -p 8888:8888 -it --rm --name ds jupyter/datascience-notebook

コンテナイメージの保存

作成したコンテナのイメージを保存するためには、以下のコードを入力します。

Jupyter_Notebook
docker commit ds takeshi1222/ds-Juimage

--dsはコンテナの名前 (今回はJupyter Notebookのもの)
--takeshi1222/ds-Juimageはイメージ名 (自由につけていいです)

終わりに

今回は参考になりそうなサイトと基礎的に使えるコマンドを列挙した形にしました。
これからもっと学んでってわかったことをどんどんまとめていこうと思います。

参考文献

JupyterのDockerイメージまとめ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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

↓ブラウザに表示された状態
スクリーンショット 2019-10-25 16.33.22.png

特定のポートを指定することももちろんできて、それには小文字の -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単語。python ubuntu hello-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を指定します。

Dockerfile
FROM python:3-onbuild

FROMBase imageを指定できるんですね。
次は使うポート番号を指定します。今回は5000を使います。

Dockerfile
EXPOSE 5000

次はCMDを書きます。
CMDdocker runする時のコンテナ作成時に実行されるんだとか。

Dockerfile
CMD ["python", "./app.py"]

上記によって$ python app.pyが走ります。

まとめるとDockerfileは以下の内容になります。

Dockerfile
FROM python:3-onbuild
EXPOSE 5000
CMD ["python", "./app.py"]

これでDockerfileは完成です!
あとはビルドすればimageが作れます。
以下のコマンドをflask-app内で実行します。

Dockerfile
docker build -t (自分のdocker hubID)/catnip .

-t タグ名で任意のタグの名前をつけることができます。

これでイメージができました!
あとは以下でimgageを実行します。

docker run -p 8888:5000 (自分のdocker hubID)/catnip

http://localhost:8888/ をみに行くと、ランダムな可愛い猫ちゃんのgifが流れてきます!

終わりに

一通りのコンテナの扱いや、imageの作り方を覚えることができました!
でもまだまだ環境に合わせてカスタマイズする方法などはわからないので、次回もチュートリアルをみつつdockerを学んでいければと思います!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker for Windows】Laradock環境をささっと構築する

LaradockでLaravel開発環境を整える

今回チームのアプリ制作でLaradockを使って開発をすることになったので

その時にハマったことなどを備忘録的にまとめていきたいと思います

前提環境

※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の>上で仮想的なユーザー空間であるコンテナを複数提供できます。

via 注目を浴びる「Dockerコンテナ」、従来の仮想化と何が違うのか?




以下をPoweShellに入力
docker-compose up -d nginx postgres

途中赤字の文字とか出てきますが気にせず完了するまで待ちます
ただ、はじめて構築するときはそこそこ時間がかかるので気長に待ちます


完了した後にLaradockのワークスペースに入り込みます

PowerShellで以下の入力します

docker exec -it APP_NAME_workplace bash
root@------:/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の開発環境を作る

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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はその型

おわりに

  • 自分の理解が進んだら随時追記します
  • 「ここがわからなかった」「ここがまちがってる」「わかりやすかった」などコメントお待ちしてます

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[GKE] Google Kubernetes Engine + docker compose で開発環境を手に入れる

TL;DR

開発する(frontend)

  1. frontend ソース更新
  2. make build
  3. make start
  4. ローカルで動作確認
  5. make deploy でデプロイされる

backend 追加する

  1. backend フォルダに適当になんか用意
  2. backend-{deployment,service}.yaml を用意
  3. 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: dev

docker-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 はいいぞ!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeでBundler::GemNotFoundになる

docker-composeでBundler::GemNotFoundになる

たまに起こって毎回アレッって思うのでメモ

docker-compose upするとGemNotFound

railsプロジェクトで、いつも通りdocker-compose upをすると、たまにBundler::GemNotFoundのエラーとなり起動できないことがある。

bundle installしても解決はしない

docker-compose build しなおす

docker-compose build でビルドしなおし、再度docker-compose upをすると正常に起動する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.yml
version: '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を置いたディレクトリで下記のコマンドを実行

cmd
docker 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

以上です!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 exampleApp

Dockerfileの作成

まず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 Gemfile
Gemfile
source '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-bundle

database.ymlの修正を行う

作成されたconfigファイルの中にあるdatabase.ymlの編集を行う。

vimが使える場合
$cd config
$vi database.yml

vimが使えない場合は直接configファイルに行き編集を行う。
exampleApp/config/database.yml
database.yml
default: &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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む