Open2

Dockerの基本

heyhey1028heyhey1028

つーじーさんと話していて
Bulid once, Run anywhere。

参考:https://knowledge.sakura.ad.jp/13265/

  • Vagrantを使ってUbuntuを立ち上げる。
  • Ubuntuのbox ver.14.04 64bit版Trustyをインストール。
  • Docker用のディレクトリでvagrant init。
  • IPアドレスを変える→その後vagrant up
  • vagrant ssh
  • ubuntuのtrustyにdockerをインストール。
  • 実行イメージ。docker indexからdocker pullでインストール
  • docker runで実行するとコンテナが作成される。
  • ここで色々な設定やアプリケーションを作ったら、docker commitでイメージが作成される。
  • それを他のマシンで動かしたい場合、Docker Indexを使うのであればdocker pushで自分の作ったイメージをアップロードする。それを再度docker pullする事で他のマシンでそのイメージをそのまま使うことができる。

オーケストレーションツール:Dockerコンテナが本番環境に浸透していくと複数のコンテナの管理をしていかないといけなくなる。複数のサーバーに同様のコンテナを展開したり、それがちゃんと稼働しているかを監視したり、アプリケーションの負荷が高まったらサーバーを増やしたり、負荷が低くなったらサーバを減らしたり。こうした多数のコンテナに対する運用管理作業をコンテナオーケストレーションと呼ぶ。そのスタンダードツールとしてGoogleによって開発されたKubernetesがある。AWSでもKubernetesのマネージドサービスである「Amazon Elastic Container Service for Kubernetes (Amazon EKS)」を提供している。

コンテナとボリュームの違い:
Data Volumeとはデータを永続化出来る場所の事。

  • dockerは2016年ほどからlinuxのOSをubuntuから軽量なAlpine Linuxをベースにdocker imageを作る方針に切り替えた。単純に軽量だからという事。

Dockerコマンド()

docker pull: docker indexよりイメージをダウンロード
docker search 検索名:docker indexの検索が可能。
docker images: ダウンロードしたイメージの一覧を表示
docker inspect 名前 :タグ/id: イメージの詳細を見る事が出来る。
docker rmi 名前 :タグ/id: イメージを削除

docker run : dockerを走らせる
docker run -d イメージ名 コマンド名:バックグラウンドでdockerを走らせる
docker run -d イメージ名 コマンド名 -s 秒数:バックグラウンドで指定イメージ上で指定コマンドを指定秒数間隔開けて実行する。
ex. Sudo docker run -d centos free -s 3=3秒ごとにメモリの状況を確認するコマンドを実行する
-dockerを走らせるとコンテナのidが返ってくる。コンテナの操作を行う場合、このidでコンテナを指定して操作を行う。
docker ps : 実行中のコンテナ一覧を表示。
docker ps -a:実行終了/停止中のコンテナ一覧を表示
docker rm:コンテナの削除
docker logs コンテナのid:実行中のタスクのログを見る事ができる。
docker attach —sig-proxy=false コンテナid:実行中のタスクをフォアグラウンドに表示する事が可能。ctrl+cでバックグラウンドに戻す為のおまじない- - sig-proxy=falseを書くと便利。
docker stop/kill コンテナid:実行中のタスクをストップする
docker start コンテナid:停止中のタスクを再開させる

docker run -p:コンテナ立ち上げ時にアクセスを許可するポート番号を指定出来る。ローカルでコンテナを立ち上げる場合であれば、ローカルコンピューターのポート番号とコンテナのポート番号を紐付ける。
ex. 8080:80 ローカルコンピューターの8080番ポートとコンテナの80番ポートを紐付けた。

docker run -v:コンテナ内のディレクトリとホストのディレクトリをマウントさせる事ができる。これによりホストのディレクトリにあるファイルをあたかもコンテナ内に保存されているかの様につかう事ができる。これをVolumeと呼ぶ。基本dockerはスクラップ&ビルドを前提としている為、一々コンテナにファイルをアップロードしてWebサーバなどとして使うのは手間がかかるのでVolumeコマンドでマウントさせて使う。1度コンテナとして起動した後で変更は出来ない。この時のVolumeはuid=1000でマウントされる。またファイルのアクセス権限はホスト上の状態を継承する。

Mac上のディレクトリをVolumeでマウントしている場合、コンテナのOSはLinuxなのにMacで動かすのでその分遅くなる。

docker inspect コンテナ名:コンテナの詳細確認が出来る。

コンテナが立ち上がっている状態であればdocker exec -it コンテナid /bin/bashでコンテナ内に入り、bashコマンドが使える。
コンテナから出たい時はexitで出る事が出来る。が、docker run の際のコマンドでコンテナに入った場合、exitを行うとdockerは立ち上がっていない、もしくはコンテナがストップしてしまう。

※イメージとコンテナの関係性を明確にした方が良い。
docker run -i -t イメージ名 /bin/bash:コンテナ内で作業する為、コンテナを-iでインタラクティブモードに変え、-tでコンテナ内でターミナルを立ち上げる。
sudo docker commit コンテナid 新規イメージ名(ユーザー名/ファイル名):変更を加えてコンテナをイメージ化する。慣習として新規イメージ名はユーザ名/分かりやすいファイル名を付ける。

上記のイメージをdocker pull→docker run→コンテナへの変更→docker commitでイメージ化の一連の流れをスクリプトで書いて自動化することができるdocker buildというコマンドで出来る。その為に用いられるスクリプトファイルが「dockerfile」。

Dockerfileによるコンテナ起動

Dokerfile(vimの様に操作する)
vi Dockerfileでdockerfileを立ち上げ、from, maintainer, RUN, CMDなどのいくつかの決まり文句を記載する。
from:何のイメージをもとにするか?
maintainer:誰が書いたか?
RUN 実行コマンド: bulidする時に実行される
CMD [“コマンド”、”表示内容" ]:buildされたイメージを元に再度コンテナを作る時、つまりrunが行われる時に実行するコマンド
ex. CMD [“echo”,”now running…"]
sudo docker build -t [新しいイメージ名] [コンテナを置くディレクトリ]
※どうもdockerfileはディレクトリに一つしか作る事が出来ない。docker buildを走らせるとdockerfileという名前のdockerfileを自動的に走らせる。

Docker HubへのPush

docker login:dockerへログイン
docker push イメージ名: ログイン後、docker indexにイメージをアップロード(push)する。pushされるとdocker indexの自身のリポジトリにpushしたイメージが保存されている。

  • pushする際には自分の作ったイメージに対してdocker tagで自分のdocker hub内のレポジトリと紐づく様に名前をタグ付けする必要がある。ex. sudo docker tag 自分のログイン名/ファイル名。そしてpushする際はこのタグ名でイメージを指定し、docker pushを行う。

Docker Runさせる時のコマンド:

Docker イメージ、コンテナの削除について:
Docker runやcompose upで立ち上げたコンテナはdocker stop後も休止中のコンテナとして残っている。それらはdocker ps -aで表示することが出来、これらを消したい場合はdocker rm [コンテナID]で消す事が出来る。特定のdocker imageを消したい際にそのイメージからビルドされたコンテナが残っているとイメージを消す事が出来なくなる為、先にdocker rm でコンテナを削除する必要がある。
参考:https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae


Dockerコンテナ内のディレクトリ構成

ローカル同様、「/ディレクトリ」が頂点。


Docker compose

コマンド参考;https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa
どうもdocker compose.ymlを毎回設定する際にdockerファイルを作っておいた方が良さそう。

接続中のコンテナから抜け出す:ctl+P→ctl+q
Docker compose.ymlで同時に立ち上げるコンテナを指定してコマンド一発で開発環境を作り出す。
Docker-composeに書く内容はserviceによって変わる。
Webサーバであれば、build, image, environment, ports, linksなど。volumesでデータの


Webサーバーの立ち上げ

Appacheを使っていた時はXamppフォルダにいちいちphpのファイルなどを入れて、立ち上げていたが、dockerも勉強したしもっと簡単に、そして早く立ち上げたい。

そんな時はnginxで仮想webサーバーを立ち上げてlocalでアクセスできるようにしたい。その時はwebサーバーを通してアクセスしたいファイルのディレクトで「docker run -d -p 80:80 -v (pwd):/usr/share/nginx/html/ --name webserver nginx」でコンテナを立ち上げて、指定したポート番号(今回は80番)でアクセスすればサイトに飛べる。(pwd)はどうも現在いるディレクトリを指し、:の後ろに続くのはnginx内でwebサーバーを通して返したいファイルを置くディレクトリの模様。この二つをvolume(-v)でマウントさせる事でアクセスが可能になる。

参考:https://qiita.com/Asuforce/items/3cab073fec0a3030b8a6


Laravel開発環境/PHP開発環境を整える

PHP-FPM (FastCGI Process Manager) :
今まではApacheやXAMPPなどPHPを使えるように既に設定されているライブラリなどを使っていなかったので意識したことはなかったが、Laravel+Vueの環境をDockerで準備しようと思うとnginxとPHP-FPMを立ち上げなければならない。
FPMはFastCGI Process Managerと呼ばれ、CGIはCommon Gateway InterfaceはWebサーバ上でユーザの書いたプログラムを動作させる仕組み。

laradock環境構築 参考:https://liginc.co.jp/364089
Laravel環境の為に、nginx, php, mysqlのコンテナを立てるdocker-compose.yml。
とりあえず現在、Desktop上のtest-projectディレクトリにlaravel環境用のlaradockとlaravelファイルを入れた。後はここにvueをかちこむのだけどそこがちょっとまだやり方がわからない。現状、laradockディレクトリに各種docker images(nginx, mysql, phpfpm, workspace)などが入っており、それらを一発で立ち上げるdocker-composeも入っている為、laradockディレクトリでdocker-compose up をすれば、laravel環境に必要なコンテナが立ち上がる状態になっている。このdocker-compose.ymlはlaradockをgitからpullしたら入っていた。非常に便利。「docker-compose up -d nginx mysql」でlaravel起動に必要なコンテナは立ち上がる。ブラウザにて「localhost」でみるとlaravelの最初のページが見える。そのほか、phpmyadminも入っているので「docker-compose up -d phpmyadmin」でlocalhost;8080でphpmyadminにアクセス出来る。
mysqlへは「docker-compose exec mysql mysql -u root -p」の後、Passwordとして「root」で入る事ができる。これは以前にインストールしたmysqlの設定がこのようになっているからの可能性がある。実際にはlaradock内の.envファイルにDBの項目があり、ここで設定したパスワードなどが設定されるはずだが何故かはまだ解決してない。でもlinuxコマンドでのmysql操作を覚えないと使えない。。。

太一さんのdocker でのlaravel立ち上げ。
base64:YaByWhU4A7D92Vowk5q7SjWxVeIZj8v3llvLtNk1Ayk=
↑.envファイルのAPP_KEYに入っている。暗号鍵


LaradockからLaravel環境を作る手順

  1. 自分のgitレポジトリにsubmoduleとしてLaradockをLaradock公式レポジトリからgit add。
$ git add submodule https://github.com/Laradock/laradock.git
  1. Laradockディレクトリ内で.envファイルを作成
$ cd laradock
/laradock/$ cp env-example .env
  1. コンテナ立ち上げ時に紐付けるディレクトリを.env内で指定
$ vim .env
+ APP_CODE_PATH_HOST=../src
  1. コンテナの立ち上げ
/laradock/$ docker-compose up -d nginx mysql
  1. workspaceコンテナ内でLaravelインストール
$ docker-compose exec workspace bash
var/www# composer create-project --prefer-dist laravel/laravel ./
  1. srcディレクトリ内の.envファイルを書き換え
.env
+ DB_HOST=mysql
+ DB_DATABASE=default
+ DB_USERNAME=default
  1. テーブルをmigrateする
# php artisan migrate:fresh

Laravel+Vue開発環境 with Docker

後はここからvueが使えるようにする事。一応下記のリンク参考でlaravel+vue環境をdockerで用意するのだが、理解がまだ出来ていない。
Laravel+vue.jsをdockerで構築 参考:https://qiita.com/Hormdem/items/68147ca57516fc0395ca

通常であればVue Cliのプロジェクトを「vue create ディレクトリ名」で作ることができる。その後作り出したディレクトリに入って「npm run serve」でwebサーバが立ち上がり、アクセス出来るポートが表示されるのでブラウザからVueCliのメインページにアクセスする事ができる。
Vue Cli3の立ち上げ 参考:https://qiita.com/reflet/items/16f90cbb0db68fd6a498

そのほかにVue Cli3の環境をコンテナに持たせてイメージを作る事を試みてみる。でもなかなかVue Cliが重いのでこんなに幾つもインストールしてて大丈夫かなって感じ。

phpmyadminにはなぜかサーバ名mysql、ユーザー名root、パスワードrootで入れた。


Nuxt.js環境 with Docker

参考:https://qiita.com/satokibi/items/62746a9c6748a948596d
https://tackeyy.com/blog/posts/nuxt-on-docker

dockerコンテナを自分で作り、コンテナ内にfirebase toolsをインストールしてPWAにするやり方
https://www.bravesoft.co.jp/blog/archives/3942

しばらく参考記事01の方法でnuxtのコンテナを作っていたが、call stackがover-flowしてしまい、npm installがコンテナ内で行えないトラブルに巻き込まれた為、他の方法でnuxtコンテナを用意する事にしたのが下記。
https://goodforthree.com/nuxt-docker/
これと最初の記事を参考にnuxtのコンテナを立てる事に成功。


Vue CLI3環境 with Docker
参考:https://qiita.com/satokibi/items/189945f984e5e53117ea


ローカル環境でDockerのWebサーバーを立ち上げる

docker run -d -p 80:80 -v $(pwd):/usr/share/nginx/html/ nginx

以上!!


Dockerfileの作り方

公式ドキュ:http://docs.docker.jp/engine/articles/dockerfile_best-practice.html

主なコマンド:
FROM: どのdockerイメージにするのかを指定
RUN:

RUN apt-get update && apt-get install -y \l -y \

上記はよく使うコマンド。&&続きでinstallする事によりdockerのキャッシュを使わずにクリーンな状態でコンテナを立ち上げてくれる。

CMD:
EXPOSE:コンテナが接続用にリッスンするポートを指定します。80番ポートならば

EXPOSE 80

といった具合。

ENV:コンテナにインストールされているソフトウェアのPATH環境変数をENVを使って更新することができる。例えば、

ENV PATH /usr/local/nginx/bin:$PATH

は、CMD [“nginx”]を動くようにする。

ADDとCOPY:基本的にはCOPYを使うように。COPYはローカルファイルをコンテナの中にコピーする。

COPY {コピーしたいファイル名} {ファイルのディレクトリ}

でコピーするようだ。

ENTRYPOINT
VOLUME
USER
WORKDIR
ONBUILD