- 投稿日:2019-09-29T23:58:56+09:00
ROCm-Pytorch-Dockerの環境構築がいつの間にか楽になってた
今でROCm-Pytorch-Dockerの環境構築は毎回Buildしてあげないと駄目だったのがBuild無用になっていた
今までAMDなGPUでPytorchを動かそうとするとそれなりに手間がかかっていたので嬉しい.https://qiita.com/T_keigo_wwk/items/1a525768ad7585bda34f
Pytorch-ROCm DockerでPytorch-ROCmをビルドしてみる(ROCm2.4編)この時点ではbuildを毎回しないと構築不能だったようだが現在はpip3にプレインストールされるようになったみたいなのでROCm-Dockerを動かせる環境さえ立ち上げてしまえば即運用可能になると思われる.
動作検証そのものは特にまだしていないのでこれからコミュニティによる動作検証やRTGチームでの最適化が必要だと思われる.
今回確認したのはこのDocker image
sudo docker pull rocm/pytorch:rocm2.7_ubuntu16.04_py3.6_pytorchsudo docker run --name pytroch_rocm -it --privileged --rm --device=/dev/kfd --device=/dev/dri --group-add video rocm/pytorch:rocm2.7_ubuntu16.04_py3.6_pytorchpip3 listでインストールされているか確認する.
# pip3 list Package Version ------------------ ---------------------- absl-py 0.7.1 atomicwrites 1.3.0 attrs 19.1.0 audioread 2.1.8 backcall 0.1.0 bleach 3.1.0 cffi 1.12.3 Click 7.0 cycler 0.10.0 decorator 4.4.0 defusedxml 0.6.0 entrypoints 0.3 future 0.17.1 grpcio 1.22.0 hypothesis 4.32.3 imageio 2.5.0 importlib-metadata 0.19 ipykernel 5.1.2 ipython 7.7.0 ipython-genutils 0.2.0 ipywidgets 7.5.1 jedi 0.15.1 Jinja2 2.10.1 joblib 0.13.2 jsonschema 3.0.2 jupyter 1.0.0 jupyter-client 5.3.1 jupyter-console 6.0.0 jupyter-core 4.5.0 kiwisolver 1.1.0 librosa 0.7.0 llvmlite 0.29.0 Markdown 3.1.1 MarkupSafe 1.1.1 matplotlib 3.1.1 mistune 0.8.4 mock 3.0.5 more-itertools 7.2.0 mypy 0.720 mypy-extensions 0.4.1 nbconvert 5.6.0 nbformat 4.4.0 networkx 2.0 ninja 1.9.0.post1 notebook 6.0.0 numba 0.45.1 numpy 1.17.0 packaging 19.1 pandocfilters 1.4.2 parso 0.5.1 pexpect 4.7.0 pickleshare 0.7.5 Pillow 6.1.0 pip 19.2.2 pluggy 0.12.0 prometheus-client 0.7.1 prompt-toolkit 2.0.9 protobuf 3.9.1 psutil 5.6.3 ptyprocess 0.6.0 py 1.8.0 pycparser 2.19 pycurl 7.43.0 Pygments 2.4.2 pygobject 3.20.0 pyparsing 2.4.2 pyrsistent 0.15.4 pytest 5.0.1 python-apt 1.1.0b1+ubuntu0.16.4.5 python-dateutil 2.8.0 PyWavelets 1.0.3 PyYAML 5.1.2 pyzmq 18.1.0 qtconsole 4.5.2 resampy 0.2.1 scikit-image 0.15.0 scikit-learn 0.21.3 scipy 0.19.1 Send2Trash 1.5.0 setuptools 41.1.0 six 1.12.0 SoundFile 0.10.2 tabulate 0.8.3 tb-nightly 1.15.0a20190814 terminado 0.8.2 testpath 0.4.2 torch 1.2.0a0+eddebaf torchvision 0.3.0a0+2b73a48 tornado 6.0.3 traitlets 4.3.2 typed-ast 1.4.0 typing 3.7.4 typing-extensions 3.7.4 virtualenv 16.7.2 wcwidth 0.1.7 webencodings 0.5.1 Werkzeug 0.15.5 wheel 0.33.4 widgetsnbextension 3.5.1 zipp 0.5.2torch 1.2.0a0+eddebaf
ちゃんと追加されている
ここでは環境構築の手順だけ残しておくのですが今後動作検証とかするつもりです.
- 投稿日:2019-09-29T23:57:51+09:00
Rails 5.2 + Docker, RAILS_MASTER_KEYをイメージ作成時に動的に入れる方法
ブログから移動したものです。
下記のような形でDockerfileを作成する。
FROM ruby:2.6.0-alpine3.8 ENV RAILS_ENV=production ENV APP_ROOT /usr/src/app ARG RAILS_MASTER_KEY ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY} WORKDIR $APP_ROOT RUN apk add --no-cache alpine-sdk \ nodejs-current \ nodejs-npm \ yarn \ mysql-client \ mysql-dev \ python2 \ tzdata COPY Gemfile $APP_ROOT COPY Gemfile.lock $APP_ROOT RUN bundle install --jobs=4 COPY . $APP_ROOT RUN bin/yarn install RUN bin/rails webpacker:compile VOLUME $APP_ROOT/public VOLUME $APP_ROOT/tmp下記の部分がポイントとなっている。
ARG RAILS_MASTER_KEY ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}下記のような形でCI上で環境変数をARGとして渡してやれば(CI側の環境変数にRAILS_MASTER_KEYが設定されている前提)、上記のARGにRAILS_MASTER_KEYが設定され、ENVのRAILS_MASTER_KEYにARGのRAILS_MASTER_KEYを設定することができる。これにより、イメージ作成時にRAILS_MASTER_KEYを設定した状態でビルドすることができる。
docker build --build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY} -t app . -f Dockerfile.production参考:
* https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39
* https://qiita.com/nacika_ins/items/cf8ceb20711bd077f770
- 投稿日:2019-09-29T22:53:12+09:00
ラズパイ Zero W(ARM v6l)Buster Lite に Docker をインストールする手順【2019/09 版】
RaspberryPi Zero W に arm32v6 用 Docker CE をインストールする手順です。
- RaspberryPi: Zero W(
ARMv6l
/BCM2835
/Rev.9000c1
)- Raspbian: v10 Buster(2019-07-10-raspbian-buster-lite.zip)
- Stretch に Docker と docker-compose をインストールする手順はこちら。
TL;DR(ワンライナー)
cd /tmp && wget https://packagecloud.io/Hypriot/rpi/packages/raspbian/buster/containerd.io_1.2.6-1_armhf.deb/download.deb && sudo dpkg -i download.deb && sudo curl -sL get.docker.com | bash && sudo rm download.debTS;DR
RaspberryPi Zero W に Buster Lite をインストール、ロケールの設定などを行う。
armhf 版
containerd.io
の v1.2.6 をあらかじめインストールする。$ cd /tmp $ wget https://packagecloud.io/Hypriot/rpi/packages/raspbian/buster/containerd.io_1.2.6-1_armhf.deb/download.deb ... $ sudo dpkg -i download.deb ... $ sudo rm download.deb公式の Docker インストールスクリプトを実行する。
$ sudo curl -sL get.docker.com | bash ...Docker が動くか確認する
$ sudo docker version Client: Docker Engine - Community Version: 19.03.2 API version: 1.40 Go version: go1.12.8 Git commit: 6a30dfc Built: Thu Aug 29 06:18:36 2019 OS/Arch: linux/arm Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.2 API version: 1.40 (minimum version 1.12) Go version: go1.12.8 Git commit: 6a30dfc Built: Thu Aug 29 06:12:41 2019 OS/Arch: linux/arm Experimental: false containerd: Version: 1.2.6 GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc: Version: 1.0.0-rc7+dev GitCommit: 029124da7af7360afa781a0234d1b083550f797c docker-init: Version: 0.18.0 GitCommit: fec3683参考文献
- Docker-CE need updating for raspbian buster | Issue #709 | Docker @ GitHub
- How to install docker on a Raspberry Pi Zero W running Raspbian Buster @ markmcgookin
- 投稿日:2019-09-29T22:53:12+09:00
ラズパイ Zero W(ARM v6l)Buster Lite に Docker と docker-compose をインストールする手順【2019/09 版】
Docker on Buster for RPi Zero W
RaspberryPi Zero W に arm32v6 用 Docker CE と docker-compose をインストールする手順です。
- 確認日:2019/09/29
- RaspberryPi: Zero W(
ARMv6l
/BCM2835
/Rev.9000c1
)- Raspbian: v10 Buster(2019-07-10-raspbian-buster-lite.zip)
- v9 Stretch に Docker と docker-compose をインストールしたい場合は以下。
「 ラズパイ Zero W(ARM v6l)Stretch Lite に Docker と docker-compose をインストールする手順【2019/09 版】」@ QiitaTL;DR(ワンライナー)
Dockerのインストールcd /tmp && wget https://packagecloud.io/Hypriot/rpi/packages/raspbian/buster/containerd.io_1.2.6-1_armhf.deb/download.deb && sudo dpkg -i download.deb && sudo curl -sL get.docker.com | bash && sudo rm download.debdocker-composeのインストールsudo curl -L --fail https://keinos.github.io/Dockerfile_of_Docker-Compose_for_ARMv6l/run.sh -o /usr/local/bin/docker-compose && sudo chmod +x /usr/local/bin/docker-compose
- 注意:ラズパイ3 や Intel/ARM マシンに比べて、コンテナの作成や docker コマンドのレスポンスはモッタリです。コンテナが一旦起動すれば「まぁ普通。でも速くはない」って感じです。
TS;DR
Docker のインストール手順
RaspberryPi Zero W に Buster Lite をインストール、ロケールの設定などを行う。
armhf 版
containerd.io
の v1.2.6 をあらかじめインストールする。$ cd /tmp $ wget https://packagecloud.io/Hypriot/rpi/packages/raspbian/buster/containerd.io_1.2.6-1_armhf.deb/download.deb ... $ sudo dpkg -i download.deb ... $ sudo rm download.deb公式の Docker インストールスクリプトを実行する。
$ sudo curl -sL get.docker.com | bash ...Docker が動くか確認する
$ sudo docker version Client: Docker Engine - Community Version: 19.03.2 API version: 1.40 Go version: go1.12.8 Git commit: 6a30dfc Built: Thu Aug 29 06:18:36 2019 OS/Arch: linux/arm Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.2 API version: 1.40 (minimum version 1.12) Go version: go1.12.8 Git commit: 6a30dfc Built: Thu Aug 29 06:12:41 2019 OS/Arch: linux/arm Experimental: false containerd: Version: 1.2.6 GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc: Version: 1.0.0-rc7+dev GitCommit: 029124da7af7360afa781a0234d1b083550f797c docker-init: Version: 0.18.0 GitCommit: fec3683必要(毎回
sudo
をつけるのが面倒)なら現在のユーザーをdocker
グループに追加するsudo gpasswd -a $USER docker sudo reboot nowdocker-compose のインストール手順
Stretch と同じ手順なので、そちらをご覧ください。
参考文献
- Docker-CE need updating for raspbian buster | Issue #709 | Docker @ GitHub
- How to install docker on a Raspberry Pi Zero W running Raspbian Buster @ markmcgookin
- 投稿日:2019-09-29T22:32:42+09:00
docker-composeユーザのためのVimプラグイン
ども、ゴリラです。
docker-composeユーザのためのVimプラグインを作ったのでそのプラグインの紹介です。
このプラグインを使えば、vimを終了することなくdocker-composeを使用することができます。とても便利。ぜひ入れて試してみて下さい。
はじめに
以前、docker.vimというVimプラグインを作って、Docker Meetup Tokyoやゴリラ.vimで発表してきました。
その中でdocker-compose版もほしいという声を頂いたので、
2日くらいでパーッと作ってみました。どんな感じ?
できること
docker-composeをラップしたコマンド
DockerCompose {args}
を用意したので、基本docker-composeでできることはすべてできます。
Twitter上で業務でdocker-composeを使用している方たちからヒアリングしたよく使う機能は実装しました。それが次になります。
引数は対応していないのですが、サクッと使うときは便利です。
vim command docker-compose command :DockerCompose {args} docker-compose {args} :DockerComposeList {file} docker-compose -f {file} ps :DockerComposeLogs {file} docker-compose -f {file} logs :DockerComposeUp {file} docker-compose -f {file} up :DockerComposeDown {file} docker-compose -f {file} down :DockerComposeDownAll {file} docker-compose -f {file} down --rmi all -v :DockerComposeStart {file} docker-compose -f {file} start :DockerComposeStop {file} docker-compose -f {file} stop :DockerComposeRestart {file} docker-compose -f {file} restart :DockerComposeBuild {file} docker-compose -f {file} build :DockerComposePull {file} docker-compose -f {file} pull :DockerComposeConfig {file} docker-compose -f {file} config 一点注意ですが、
DockerComposeDownAll
はコンテナ、イメージ、ネットワークに加え、ボリュームも削除します。
完全にリソースが不要になったときに使用すると便利です。ちなみに
DockerComposeList
は専用のインターフェイスを用意していて、実行すると次にようになります。このウィンドウでの操作は次にようになります。
key operation u start contaienr d stop contaienr j next contaienr k previous contaienr q close window コンテナを個別で起動したいときに
u
、停止したいときにd
を使用します。docker.vimとの差別化
docker.vim
は単体のコンテナ、イメージの管理に特化したプラグインになります。
機能はとても豊富で、次のことができます。images
- image list(udpate every 5 second)
- delete image
- pull image
- search image
- open DockerHub in browser
- push an image
- tag an image
- build an image
- save an image to tarball
containers
- container list(udpate every 5 second)
- start/stop/restart/kill container
- delete container
- attach container
- run container(like docker run {container})
- monitoring container logs and CPU/MEM
- copy file/folders between containers and local filesystem
docker-compose
はコンテナへのアタッチできるサブコマンドexec
がありますが、こちらはdocker-compose.vim
には実装していません。
なぜならdocker.vim
にはその機能があり、そちらを使用すれば解決するからです。
docker-compose.vim
は複数のコンテナを管理するためのプラグインという位置づけで、
個別のコンテナの管理や操作はdocker.vim
のが優れているので、そちらを使用したほうが良いでしょう。
docker-compose.vim
の今後とりあえずがーっと作ったので、もう少しよくあるユースケースの情報を収集して、便利そうなら機能を追加する予定です。
この記事を読んで、これができたら便利そう、などの意見があればぜひコメント頂ければと思います。最後に
docker.vim
とdocker-compose.vim
を使えば、
Vimでコンテナを使った開発がさらに楽になるので、ぜひとも両方を入れてみて下さい。そして良いなと思ったらGitHubのスターを押して頂けると励みます。
お礼にバナナあげるかもしれません。
- 投稿日:2019-09-29T21:10:13+09:00
最近よく使っているDocker構成の備忘録 (NodeJS+Redis+MySQL)
はじめに
この記事は最近Dockerをよく使うようになってきて、
開発環境を作っては捨て作っては捨てを繰り返しつつ、いろいろ試しているうちに
個人的によく使いそうな構成が見えてきたので、それをメモとして残しておく目的で記載しています。アーキテクチャ
NodeJS + Redis + MySQLによる構成で作っていきます。
主な内訳は以下の通りです。
利用目的 NodeJS webアプリケーション MySQL ユーザー等の主なデータ Redis セッション,キャッシュ 今回セッションとキャッシュをどちらもRedisで管理してしまっていますが、
分けるソリューションもあると思います。
一例としては、キャッシュとかはDynamoDBでセッション管理はRedisに保存みたいな感じですかね。
自分が作る程度の環境だとそこまで分ける必要性を感じなかったので、すべてRedisで管理してました。ディレクトリ構成
このあとdocker-compose.ymlを記載しますが、
今回は以下のディレクトリ構成を前提で進めています。├── data │ ├── mysql │ └── redis ├── docker-compose.yml ├── mysql │ └── Dockerfile ├── app │ ├── Dockerfile │ ├── app.js │ ├── bin │ │ └── www │ ├── node_modules │ ├── package-lock.json │ ├── package.json │ ├── public │ │ ├── images │ │ ├── javascripts │ │ └── stylesheets │ │ └── style.css │ ├── routes │ │ ├── index.js │ │ └── users.js │ └── views │ ├── error.jade │ ├── index.jade │ └── layout.jade └── redis └── Dockerfile
docker-compose.yml
今回は、Docker-Composeを使ってNodeJS、MySQL、Redisのそれぞれでコンテナ立ち上げていく形にしていきます。
docker-composeの内容は以下の通りです。docker-compose.ymlversion: '3' services: app: build: context: . dockerfile: ./app/Dockerfile depends_on: - mysql - redis ports: - '3000:3000' tty: true container_name: node_app mysql: build: context: . dockerfile: ./mysql/Dockerfile restart: always environment: MYSQL_ROOT_PASSWORD: password MYSQL_USER: user MYSQL_PASSWORD: hogehoge MYSQL_DATABASE: testdb volumes: - ./data/mysql:/var/lib/mysql container_name: mysql redis: build: context: . dockerfile: ./redis/Dockerfile restart: always volumes: - ./data/redis:/data container_name: redisservicesに対してwebアプリケーションや他のミドルウェアのDockerイメージに関する設定内容を記載しています。
appのところにはdepends_onがありますが、これは記載されている他のイメージとの依存関係を示すものになっています。依存関係のあるものが解決してからappの内容が動作します。
それぞれbuildのところで、どのDockerfileを使用してDockerイメージをbuildするかを設定しているのがわかると思うので、Dockerfileも記載しましょう。./app/Dockerfile
./app/DockerfileFROM node:latest WORKDIR /home/app COPY ./app/package*.json ./ RUN npm install COPY ./app ./ EXPOSE 3000./mysql/Dockerfile
./mysql/DockerfileFROM mysql:5.7 # ADD ./mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf EXPOSE 3306./redis/Dockerfile
./redis/DockerfileFROM redis # COPY redis.conf /usr/local/etc/redis/redis.conf EXPOSE 6379実行
docker-compose.ymlのあるディレクトリで実行します。
build
$ docker-compose build起動
$ docker-compose up -dexec
# nodeのコンテナ $ docker-compose exec app bash # redisのコンテナ $ docker-compose exec redis bash # mysqlのコンテナ $ docker-compose exec mysql bashここに記載していないコマンドはこちらの方の記事が参考になります。
docker-compose コマンドまとめおわりに
個人的に利用することの多そうな環境をメモがてら書いていきましたが、
間違いやよりよい方法があればぜひ教えてください?♀️
- 投稿日:2019-09-29T20:52:07+09:00
dockerで開発環境構築時にvendor,node_modulesなどのフォルダをどうやっていくか
dockerおよびcomposeで開発環境を構築するときに、皆さんは依存物のフォルダをどう扱っていますか?
依存物のフォルダとは、いわゆる
- rubyやphpのvendor
- Node.jsのnode_modules
等のことです。
dockerで開発環境を構築する上でこのフォルダを扱うのが面倒なことがあり、私が調べた範囲で2つの解決策がありますので紹介します。
ちなみに、このような依存内容を格納するフォルダの一般名称はどなたか知りませんか?
この記事では以下では依存物フォルダと書きます。何が面倒なのか → 普通にマウントすると消える
このようなdocker-compose.ymlとします。説明のために省略していますが、本来は他のservicesもあるでしょう。
docker-compose.ymlservices: web: build: context: ./laravel volumes: - ./laravel:/var/www
- 普通に
composer install
等のコマンドを書いたDockerfileを用意- frontendやbackendなどのソースコードをマウントする(上のvolumesのところです)
というような感じで普通に
docker-compose up
すると、依存物フォルダの中身は空になってしまいます。実はこれは当然の挙動で、ホスト側に
node_modules
が存在しないので、docker image内に作られた依存物フォルダが、マウント時に上書きされて隠されるからです。ググってもすぐに同様の問題を抱えている人を見つけられます。
- https://stackoverflow.com/questions/30043872/docker-compose-node-modules-not-present-in-a-volume-after-npm-install-succeeds
- https://www.reddit.com/r/docker/comments/6yrgr1/i_am_going_crazy_trying_to_run_php_with_composer/
どうするか
私が調べた範囲だと、解決策は2つあります。
- volume trickを使う
- 依存物フォルダも素直にホストからマウントした上で、コンテナからインストールする
ただし、各々に利点と欠点があります。
解決策1: volume trickを使う
ホストからコンテナにマウントする際に消されたくないフォルダを、docker volumeとしてマウントすることで、消えることを防ぐことができます。
参考: https://jdlm.info/articles/2019/09/06/lessons-building-node-app-docker.htmldocker-compose.ymlservices: web: build: context: ./laravel volumes: - ./laravel:/var/www - node_modules:/var/www/node_modules # <- ここ volumes: node_modules: # ここでvolumeを定義 driver: local以上は名前付きボリュームを作成してマウントする例です。無名ボリュームで紹介している記事も見かけましたが、せっかくdocker-composeを使っているのだから名前付きを使ったほうが良いように思います。
簡単ですし、多くの記事がこの方法を紹介しています。
実用上問題が無ければこれでよいかと思いますが、一点問題があります。ホスト側から依存物フォルダ内を見ることができません。
ホスト側からは、依存物フォルダは空になります。これはエディタやデバッガが依存物フォルダの中を参照する場合に不便です。
解決策2: 素直にマウントしてコンテナからインストールする
素直に、ソースコードのフォルダも依存物フォルダもマウントした上で、コンテナ起動した後にコンテナ内からインストールをすれば、依存物フォルダはホスト側に共有されます。
この方法は、Dockerfileにインストールコマンドを書いていたとしても、コンテナ起動後に再度インストールを実行しないといけないです。
「ビルド前にホスト側のフォルダをマウント」というようなことはできません。
see https://docs.docker.com/engine/reference/builder/#volumeここに関してはマルチステージビルドを使って、開発環境のステージではDockerfile側でinstallコマンドを書かずに、productionのときのみinstallコマンドを実行するように工夫すると良いかもしれません。
あるいは、installコマンドも含めたdockerfileから作成されたdocker imageから、vendorの中身を引っ張ってくるというのも考えられますね。(これはこれでスマートな方法が無いです。)Docker for Macの場合、書き込みが遅い
この解決策での一番の問題はこれかもしれません。
laravelの初期状態でのcomposer install
,npm install
で数分かかりました。重くなるようでしたら、jsだけはホスト側でビルドしても良いかもしれません。
追記: docker-syncがいいかも。後で調べます。
参考
- https://forums.docker.com/t/file-access-in-mounted-volumes-extremely-slow-cpu-bound/8076/287
- https://mizchi.hatenablog.com/entry/2019/04/07/074634
その他:依存物フォルダにはdelegated オプションを使う
マウント時のオプションで少し状況は改善します。上に挙げたどちらの手段でも使っておくと良いと思います。ただし、劇的な改善とまではいきませんでした。
docker-compose.ymlservices: web: build: context: ./laravel volumes: - ./laravel:/var/www - ./laravel/node_modules:/var/www/node_modules:delegated # <-cachedとdelegatedは、ホスト側かコンテナ側からか、どちらからの書き込みが多いかで選びましょう
まとめ
dockerで依存物フォルダを扱う方法は、2つある。
- volomes trickを使うか
- 諦めて素直にまるごとマウントした上で、ビルド後にインストールをするか
ホスト側から依存物フォルダの中身が見える代わりに、書き込み速度が遅くなるか、というトレードオフになっています。
上記以外の選択肢や、改善のためのtipsをご存知の方がいらっしゃいましたら、ぜひコメントを頂ければ幸いです。
- 投稿日:2019-09-29T20:34:48+09:00
Docker Composeのvolumes使用時に出会うpermission deniedに対応する一つの方法
この記事は
Linux上でDocker Composeを使ったvolumesの権限設定を紹介したいと思います
書く理由は
Linux上でDocker Composeを使ったvolumesの設定で権限で怒られたから
権限で怒らないためには
host(Docker Composeを動かす方)のLinux user id、group idとコンテナの中のvolumesのuser idとgroup idが異なるからです。
これらを同じくすれば治りました対応内容
- .envにhostのLinux user id、group id、user nameを書いておく
- docker-compose.ymlのargsを使って、.envで書いたuser id、group id、user nameをDockerFileに渡す
- DockerFileはdocker-compose.ymlから渡されたuser id、group id、user nameを使ってユーザーを作る
- Docker コンテナを作った後にvolumesの権限を直してくれるshell scriptを書く
環境
Linux
- NAME : Kali GNU/Linux
- VERSION : 2019.1
Docker Compose
- VERSION : 1.23.1
Docker
- VERSION : 18.09.4
構成図
.env
# hostのLinux user id. $(id -u $USER)で確認可能 UID=1000 # hostのLinux group id. $(id -g $USER)で確認可能 GID=1000 # hostのLinux user name. $(echo "$USER")で確認可能 UNAME=vagrantdocker-compose.yml
version: '3' services: dot_env_docker_volumn: build: context: . args: UID: $UID GID: $GID UNAME: $UNAME container_name: 'dot_env_docker_volumn' tty: true working_dir: '/home/$UNAME' volumes: - ./workspace/:/home/$UNAMEDockerfile
FROM amazonlinux:2 RUN \ yum -y update \ && yum -y install systemd procps openssh-server passwd sudo vim git wget unzip \ && yum clean all \ && cp -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime ENV LANG ja_JP.UTF-8 ENV LC_ALL C ARG UID ARG GID ARG UNAME ENV UID ${UID} ENV GID ${GID} ENV UNAME ${UNAME} RUN groupadd -g ${GID} ${UNAME} RUN useradd -u ${UID} -g ${UNAME} -m ${UNAME}setDockerVolumePermission.sh
#!/bin/sh UNAME=$(echo "$USER") CONTAINER_NAME="dot_env_docker_volumn" CONTAINER_VOLUME_PATH="/home/${UNAME}" docker exec ${CONTAINER_NAME} chown -R ${UNAME}:${UNAME} ${CONTAINER_VOLUME_PATH}コメント
.envにLinux user id、group id、user nameを動的に書き込むshell scriptを書くと、もっと便利かもしれません。
以上
- 投稿日:2019-09-29T19:39:16+09:00
VirtualBox上のCentOS7にdockerでpostgresql+PHP+Apache環境を構築
はじめに
かなり期間が空いてしましましたが、
ローカル環境にVirtualBoxを使用して開発環境を構築する作業の3回目です。
前々回はDBサーバ、
前回はWEBサーバを構築しました。
今回は、DBサーバ+WEBサーバ+PHPアプリの環境を構築します。
イメージとしては、DBの値を取得して、WEBサーバ上にPHPで表示します。作業環境
- MacOS X Yosemite 10.10.5
1.Docker Compose
今回は「Docker Compose」を使用して、複数のサーバを一度に操作する手順でまとめます。
インストール手順は、公式サイトの手順を参考に実施してください。2.ディレクトリ構成
今回は以下の構成で各ファイルを用意しました。
docker-php-postgres ┣ docker-compose.yml // Docker Composeの設定ファイル(3.参照) ┣ docker-file ┃ ┣ db ┃ ┃ ┣ Dockerfile // DBサーバ用のDockerfile(4.参照) ┃ ┃ ┣ docker-entrypoint-initdb.d ┃ ┃ ┣ 01_createdb.sql // DB作成用SQL ┃ ┣ web ┃ ┣ Dockerfile // WEBサーバ用のDockerfile(6.参照) ┃ ┣ php.ini // PHP設定ファイル(7.参照) ┣ volumes ┣ web ┣ html ┣ index.php // PHPファイル(8.参照)3. docker-compose.yml
version: '3' services: web: build: ./docker-file/web/ ports: - 8080:80 volumes: - ./volumes/web/html/:/var/www/html:z // :zを忘れないように。 depends_on: - db db: build: ./docker-file/db/ ports: - 5432:5432 environment: - POSTGRES_USER=testuser - POSTGRES_PASSWORD=password4. DBサーバ用Dockerfile
FROM postgres:9.3 RUN apt-get update RUN apt-get install -y vim less COPY ./docker-entrypoint-initdb.d/01_createdb.sql /docker-entrypoint-initdb.d/ EXPOSE 54325. DB作成用SQL
DB作成用SQLとテーブル作成SQLファイルをdocker-entrypoint-initdb.d配下に作成します。
今回は「01_createdb.sql」という名称で
testdbというDB、test_tableというテーブルを作成します。
test_tableテーブルには、idカラムとkeywordカラムを用意して、
適当な値を設定しておきます。6. WEBサーバ用Dockerfile
# Apache モジュールが同梱された PHP コンテナイメージ FROM php:apache RUN apt-get update RUN apt-get install -y vim less # Postgres関連のPHPエクステンションをインストール RUN set -ex apk --no-cache add postgresql-dev libpq-dev RUN apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql pgsql mbstring # PHPの設定ファイルをコピー COPY ./php.ini /usr/local/etc/php/7. PHP設定ファイル
[Core] display_errors = On error_reporting = E_ALL error_log = /var/log/apache2/error.log log_errors = On [Date] date.timezone = 'Asia/Tokyo' [mbstring] mbstring.language = Japanese mbstring.internal_encoding = auto mbstring.http_input = auto mbstring.http_output = auto mbsting.encoding_translation = Off mbstring.detect_order = auto8. PHPファイル
DBのテーブル内容を取得して、出力する単純なPHPファイルです。
$conn = "host=docker-php-postgres_db_1 port=5432 dbname=testdb user=testuser password=password"; $link = pg_connect($conn); if (!$link) { exit('接続失敗です。'.pg_last_error()); } pg_set_client_encoding("sjis"); $result = pg_query('SELECT id, keyword FROM test_table'); if (!$result) { exit('クエリーが失敗しました。'.pg_last_error()); } for ($i = 0 ; $i < pg_num_rows($result) ; $i++){ $rows = pg_fetch_array($result, NULL, PGSQL_ASSOC); print('id='.$rows['id']); print(',keyword='.$rows['keyword'].'<br>'); } $close_flag = pg_close($link); if (!$close_flag){ print('切断に失敗しました。<br>'); } ?> </body> </html>9. コンテナ起動
3.〜8. のファイルが準備でき次第、以下のコマンドを実行します。
このコマンドはビルドまで行ってくれます。$ docker-compose up -dビルドのみ行いたい場合は、以下のコマンドを実行します。
$ docker-compose buildコマンドを実行した後、コンテナが起動したかどうかを以下のコマンドで確認します。
$ docker-compose ps root@localhost docker-php-postgres]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f078f9167ad6 docker-php-postgres_web "docker-php-entryp..." 41 seconds ago Up 36 seconds 0.0.0.0:8080->80/tcp docker-php-postgres_web_1 c51a280c6d44 docker-php-postgres_db "docker-entrypoint..." 45 seconds ago Up 41 seconds 0.0.0.0:5432->5432/tcp docker-php-postgres_db_1起動ができたら、ブラウザから起動したWEBサーバのindex.phpにアクセスしてみます。
アクセスして、テーブルの内容が表示されていたら、完了です。http://【VirtualBox IPアドレス】:8080/index.php
10. コンテナの停止
コンテナの停止は以下のコマンドを実行します。
$ docker-compose stop
これでDBサーバ+WEBサーバ+PHPアプリの環境を構築できました。
今回の学習したものをベースに、
dockerを使用した様々な環境構築を実施していきたいと思っています。参考URL
https://www.key-p.com/blog/staff/archives/106755
https://docs.docker.com/compose/install/
https://qiita.com/uhooi/items/fb14d99d3323bd2eee9d
https://mizominton.hatenablog.jp/entry/docker-cakephp1.3
https://qiita.com/nagi244/items/e5de6fc062fdcc5004e9
- 投稿日:2019-09-29T19:01:50+09:00
[初心者]Docker+Rails+MySQLでの環境構築の記録
はじめに
cloud9やvagrant以外にも
Dockerを使って環境構築してみたいと思い、勉強をしてみました!
Docker環境構築をする上で行った事を振り返ってまとめています。Dockerについて
- ホストOSのカーネルを使用している為、軽量で起動が高速
- 複数人で開発する時に開発環境を統一しやすい
- そのまま本番サーバーにデプロイする事ができる
などのメリットがあると知り、
様々の方のqiita記事など参考に環境構築に取り組んでみました。環境
- Mac OS
- Ruby 2.6.3
- Rails 5.2.3
- MySQL 8.0
【1】作業ディレクトリの作成、移動
$ mkdir sample $ cd sample【2】Dockerfileの作成
$ vi DockerfileDockerfileFROM ruby:2.6.3 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /sample WORKDIR /sample ADD Gemfile /sample/Gemfile ADD Gemfile.lock /sample/Gemfile.lock RUN bundle install ADD . /sample【3】Gemfile、空のGemfile.lockを作成
$ vi GemfileGemfilesource 'https://rubygems.org' gem 'rails', '5.2.3'$ touch Gemfile.lock【4】docker-compose.ymlの作成
$ vi docker-compose.ymldocker-compose.ymlversion: '3' services: db: image: mysql command: mysqld --default-authentication-plugin=mysql_native_password environment: MYSQL_USER: root MYSQL_ROOT_PASSWORD: password ports: - '3316:3306' volumes: - ./db/mysql/volumes:/var/lib/mysql web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/sample ports: - "3000:3000" depends_on: - db【5】Rails newを実行する
$ docker-compose run web rails new . --force --database=mysql【6】イメージを再ビルドする
$ docker-compose build【7】config/database.ymlの設定
config/database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: host: localhostdatabase.ymlが上記のようになっているので
下記のように書き換える。config/database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password host: db【8】サービスを起動する
$ docker-compose up -d【9】DBを作成する
$ docker-compose run web rails db:create【10】アクセスしてサーバーの起動を確認する
http://localhost:3000
にアクセスしてRailsのトップページが表示されたら完成です。その後、サーバーを止める時は
docker-compose stop
とします。感じたこと
まだまだDockerに関する知識は浅いですがとにかく環境を構築する事ができました!
環境構築中MySQLの認証プラグインのエラーが発生してかなり苦戦したのですが、
どうやらMySQL8.0は
【4】docker-compose.ymlの作成のところで
command: mysqld --default-authentication-plugin=mysql_native_password
を書かないとエラーが出てしまうようです。
このエラーを解決する為に様々な方法を試していくうちに
MySQLの権限エラーが新たに出るなどして泥沼にハマっていき
10時間ぐらいかかって解決して何とか環境構築できました(汗)環境構築はとりあえずできましたが
何がどうなっているのかなどまだまだDockerを理解できていない部分が多いので
今後更に深く学習してみようと感じました。参考
[Rails] DockerでRails + MySQLの開発環境をつくる手順
丁寧すぎるDocker-composeによるrails + MySQL on Dockerの環境構築(Docker for Mac)
Docker Composeのインストール方法(CentOS7.3)
- 投稿日:2019-09-29T19:01:50+09:00
【初心者】Docker+Rails+MySQLでの環境構築の記録
はじめに
cloud9やvagrant以外にも
Dockerを使って環境構築してみたいと思い、勉強をしてみました!
Docker環境構築をする上で行った事を振り返ってまとめています。Dockerについて
- ホストOSのカーネルを使用している為、軽量で起動が高速
- 複数人で開発する時に開発環境を統一しやすい
- そのまま本番サーバーにデプロイする事ができる
などのメリットがあると知り、
様々の方のqiita記事など参考に環境構築に取り組んでみました。環境
- Mac OS
- Ruby 2.6.3
- Rails 5.2.3
- MySQL 8.0
【1】作業ディレクトリの作成、移動
$ mkdir sample $ cd sample【2】Dockerfileの作成
$ vi DockerfileDockerfileFROM ruby:2.6.3 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /sample WORKDIR /sample ADD Gemfile /sample/Gemfile ADD Gemfile.lock /sample/Gemfile.lock RUN bundle install ADD . /sample【3】Gemfile、空のGemfile.lockを作成
$ vi GemfileGemfilesource 'https://rubygems.org' gem 'rails', '5.2.3'$ touch Gemfile.lock【4】docker-compose.ymlの作成
$ vi docker-compose.ymldocker-compose.ymlversion: '3' services: db: image: mysql command: mysqld --default-authentication-plugin=mysql_native_password environment: MYSQL_USER: root MYSQL_ROOT_PASSWORD: password ports: - '3316:3306' volumes: - ./db/mysql/volumes:/var/lib/mysql web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/sample ports: - "3000:3000" depends_on: - db【5】Rails newを実行する
$ docker-compose run web rails new . --force --database=mysql【6】イメージを再ビルドする
$ docker-compose build【7】config/database.ymlの設定
config/database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: host: localhostdatabase.ymlが上記のようになっているので
下記のように書き換える。config/database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password host: db【8】サービスを起動する
$ docker-compose up -d【9】DBを作成する
$ docker-compose run web rails db:create【10】アクセスしてサーバーの起動を確認する
http://localhost:3000
にアクセスしてRailsのトップページが表示されたら完成です。その後、サーバーを止める時は
docker-compose stop
とします。感じたこと
まだまだDockerに関する知識は浅いですがとにかく環境を構築する事ができました!
環境構築中MySQLの認証プラグインのエラーが発生してかなり苦戦したのですが、
どうやらMySQL8.0は
【4】docker-compose.ymlの作成のところで
command: mysqld --default-authentication-plugin=mysql_native_password
を書かないとエラーが出てしまうようです。
このエラーを解決する為に様々な方法を試していくうちに
MySQLの権限エラーが新たに出るなどして泥沼にハマっていき
10時間ぐらいかかって解決して何とか環境構築できました(汗)環境構築はとりあえずできましたが
何がどうなっているのかなどまだまだDockerを理解できていない部分が多いので
今後更に深く学習してみようと感じました。参考
[Rails] DockerでRails + MySQLの開発環境をつくる手順
丁寧すぎるDocker-composeによるrails + MySQL on Dockerの環境構築(Docker for Mac)
Docker Composeのインストール方法(CentOS7.3)
- 投稿日:2019-09-29T17:41:54+09:00
Dockerコンテナで、Keras + TensorFlow / Jupyter notebook環境を簡単にデプロイする
Kerasを活用して、デープラーニングを動作させようと考えた場合、環境整備に手間取るのがめんどくさいですよね。
今回は、Dockerコンテナから、Keras + tensorFlow / Jupyter notebook環境を簡単に整備できるようになりました。
私の個人リポジトリ"ttsubo/study_of_deeplearning_with_keras"と、このQiita記事にて、作業履歴を共有しておきます。⬛︎ 事前準備
Dockerコンテナを動かすUbuntuサーバから、GPUが扱えるようにしておく必要があります。
(1) Ubuntuサーバ側の環境セットアップ
具体的には、Qiita記事: "Dockerで、GPU対応なコンテナ環境を整備する"のセットアップが終わっているものとします。
(2) "study_of_deeplearning_with_keras"リポジトリの取得
Dockerコンテナから、Keras + tensorFlow / Jupyter notebook環境を整備できるように、事前にリポジトリを用意しておきましたので、以下の要領で、リポジトリを取得しておいてください。
$ git clone https://github.com/ttsubo/study_of_deeplearning_with_keras.git(3) cuDNNファイルを別途、入手する
Dockerコンテナ内にcnDNNパッケージをインストールする必要があるので、cuDNN Archive から
cuDNN v7.6.2 (July 22, 2019), for CUDA 10.0
をダウンロードしておいてください。なお、ダウンロードするためには事前にメンバー登録が必要です。
- cuDNN Runtime Library for Ubuntu18.04 (Deb)
- cuDNN Developer Library for Ubuntu18.04 (Deb)
- cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)
そして、
build/download
フォルダに配置しておいてください。$ cd build/download/ $ ls -l total 314384 -rw-r--r-- 1 ttsubo ttsubo 164426244 Sep 29 14:36 libcudnn7_7.6.2.24-1+cuda10.0_amd64.deb -rw-r--r-- 1 ttsubo ttsubo 152045132 Sep 29 14:36 libcudnn7-dev_7.6.2.24-1+cuda10.0_amd64.deb -rw-r--r-- 1 ttsubo ttsubo 5442884 Sep 29 14:36 libcudnn7-doc_7.6.2.24-1+cuda10.0_amd64.deb(4) Dockerイメージをビルドします
$ docker-compose buildちなみに、Dockerfileファイルは、こんな感じです。
DockerfileFROM nvidia/cuda:10.0-devel-ubuntu18.04 MAINTAINER Toshiki Tsuboi <t.tsubo2000@gmail.com> RUN apt update \ && apt install -y \ git-core \ build-essential \ python-dev \ python-openssl \ libssl-dev \ libbz2-dev \ libffi-dev \ libsqlite3-dev \ libreadline-dev \ zlib1g-dev \ libsm6 \ libxext6 \ libxrender-dev \ libblas-dev \ curl \ vim \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # install pyenv ENV HOME /root ENV PYENV_ROOT $HOME/.pyenv ENV PATH $PYENV_ROOT/bin:$PATH RUN git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv RUN echo 'eval "$(pyenv init -)"' >> $HOME/.bashrc \ && eval "$(pyenv init -)" # install python using pyenv RUN apt update \ && apt install -y libssl1.0-dev \ && pyenv install anaconda3-5.3.1 \ && pyenv global anaconda3-5.3.1 # install pip WORKDIR / ADD https://bootstrap.pypa.io/get-pip.py / RUN python get-pip.py \ && rm get-pip.py # install python package WORKDIR /root COPY requirements.txt /root RUN /root/.pyenv/shims/pip install -r requirements.txt # install cuDNN COPY download /root/debian_packages RUN cd /root/debian_packages \ && dpkg -i \ libcudnn7_7.6.2.24-1+cuda10.0_amd64.deb \ libcudnn7-dev_7.6.2.24-1+cuda10.0_amd64.deb \ libcudnn7-doc_7.6.2.24-1+cuda10.0_amd64.deb #setup jupyter RUN /root/.pyenv/shims/jupyter notebook --generate-config \ && sed -i -e "s/#c.NotebookApp.ip = 'localhost'/c.NotebookApp.ip = '0.0.0.0'/" /root/.jupyter/jupyter_notebook_config.py \ && sed -i -e "s/#c.NotebookApp.allow_remote_access = False/c.NotebookApp.allow_remote_access = True/" /root/.jupyter/jupyter_notebook_config.py \ && sed -i -e "s/#c.NotebookApp.token = '<generated>'/c.NotebookApp.token = ''/" /root/.jupyter/jupyter_notebook_config.py EXPOSE 8888 ENTRYPOINT ["sh", "-c", "/root/.pyenv/shims/jupyter notebook --allow-root"]⬛︎ 実際に、動かしてみる
今回、動かしてみるデープラーニング用Pythonスクリプトは、Keras repoが提供しているサンプルアプリです。
keras/examples/mnist_cnn.py'''Trains a simple convnet on the MNIST dataset. Gets to 99.25% test accuracy after 12 epochs (there is still a lot of margin for parameter tuning). 16 seconds per epoch on a GRID K520 GPU. ''' from __future__ import print_function import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras import backend as K batch_size = 128 num_classes = 10 epochs = 12 # input image dimensions img_rows, img_cols = 28, 28 # the data, split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() if K.image_data_format() == 'channels_first': x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols) input_shape = (1, img_rows, img_cols) else: x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) input_shape = (img_rows, img_cols, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 print('x_train shape:', x_train.shape) print(x_train.shape[0], 'train samples') print(x_test.shape[0], 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1])(1) Dockerコンテナを起動する
Docker-composeを使って、Dockerコンテナを起動します。
この段階で、Dockerコンテナ内では、Jupyter notebook環境も常駐するようになっています。$ docker-compose up Creating Keras ... done Attaching to Keras Keras | [I 05:43:15.263 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret Keras | [W 05:43:15.379 NotebookApp] All authentication is disabled. Anyone who can connect to this server will be able to run code. Keras | [I 05:43:15.403 NotebookApp] JupyterLab extension loaded from /root/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/jupyterlab Keras | [I 05:43:15.404 NotebookApp] JupyterLab application directory is /root/.pyenv/versions/anaconda3-5.3.1/share/jupyter/lab Keras | [I 05:43:15.406 NotebookApp] Serving notebooks from local directory: /root Keras | [I 05:43:15.406 NotebookApp] The Jupyter Notebook is running at: Keras | [I 05:43:15.406 NotebookApp] http://(Keras or 127.0.0.1):8888/ Keras | [I 05:43:15.406 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). Keras | [W 05:43:15.407 NotebookApp] No web browser found: could not locate runnable browser.(2) Dockerコンテナ内に、入って、サンプルアプリを起動する
まずは、Dockerコンテナに入ります
$ docker exec -it Keras bashそして、サンプルアプリを起動します。
$ python examples/mnist_cnn.py
root@Keras:~# python examples/mnist_cnn.py Using TensorFlow backend. x_train shape: (60000, 28, 28, 1) 60000 train samples 10000 test samples ... (snip) Train on 60000 samples, validate on 10000 samples Epoch 1/12 2019-09-29 06:00:43.489125: I tensorflow/stream_executor/dso_loader.cc:152] successfully opened CUDA library libcublas.so.10.0 locally 60000/60000 [==============================] - 8s 127us/step - loss: 0.2654 - accuracy: 0.9186 - val_loss: 0.0628 - val_accuracy: 0.9785 Epoch 2/12 60000/60000 [==============================] - 7s 115us/step - loss: 0.0888 - accuracy: 0.9736 - val_loss: 0.0430 - val_accuracy: 0.9849 Epoch 3/12 60000/60000 [==============================] - 7s 112us/step - loss: 0.0677 - accuracy: 0.9802 - val_loss: 0.0394 - val_accuracy: 0.9871 Epoch 4/12 60000/60000 [==============================] - 7s 114us/step - loss: 0.0566 - accuracy: 0.9832 - val_loss: 0.0321 - val_accuracy: 0.9885 Epoch 5/12 60000/60000 [==============================] - 7s 114us/step - loss: 0.0480 - accuracy: 0.9860 - val_loss: 0.0350 - val_accuracy: 0.9882 Epoch 6/12 60000/60000 [==============================] - 7s 110us/step - loss: 0.0450 - accuracy: 0.9864 - val_loss: 0.0274 - val_accuracy: 0.9897 Epoch 7/12 60000/60000 [==============================] - 7s 113us/step - loss: 0.0395 - accuracy: 0.9883 - val_loss: 0.0292 - val_accuracy: 0.9903 Epoch 8/12 60000/60000 [==============================] - 7s 114us/step - loss: 0.0351 - accuracy: 0.9890 - val_loss: 0.0309 - val_accuracy: 0.9893 Epoch 9/12 60000/60000 [==============================] - 7s 112us/step - loss: 0.0342 - accuracy: 0.9892 - val_loss: 0.0288 - val_accuracy: 0.9906 Epoch 10/12 60000/60000 [==============================] - 7s 111us/step - loss: 0.0328 - accuracy: 0.9900 - val_loss: 0.0264 - val_accuracy: 0.9918 Epoch 11/12 60000/60000 [==============================] - 7s 112us/step - loss: 0.0305 - accuracy: 0.9901 - val_loss: 0.0280 - val_accuracy: 0.9916 Epoch 12/12 60000/60000 [==============================] - 7s 117us/step - loss: 0.0289 - accuracy: 0.9911 - val_loss: 0.0268 - val_accuracy: 0.9917 Test loss: 0.026753987711756782 Test accuracy: 0.9916999936103821GPUを使用した場合、1エポック当たり、7秒程度で、学習が進んでいく様子が確認できますね。
ちなみに、CPUを使用した場合は、1エポック当たり、41秒程度で学習が進んでいきました。
私のGPU環境GeForce GTX 1060 3GB
だと、CPUよりも、約6倍も、学習に要する時間が短縮できるようです。root@Keras:~# python examples/mnist_cnn.py Using TensorFlow backend. Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz 11493376/11490434 [==============================] - 8s 1us/step x_train shape: (60000, 28, 28, 1) 60000 train samples 10000 test samples ... (snip) Train on 60000 samples, validate on 10000 samples Epoch 1/12 60000/60000 [==============================] - 41s 679us/step - loss: 0.2666 - accuracy: 0.9189 - val_loss: 0.0607 - val_accuracy: 0.9819 Epoch 2/12 60000/60000 [==============================] - 41s 677us/step - loss: 0.0895 - accuracy: 0.9733 - val_loss: 0.0402 - val_accuracy: 0.9866 Epoch 3/12 60000/60000 [==============================] - 41s 677us/step - loss: 0.0673 - accuracy: 0.9798 - val_loss: 0.0365 - val_accuracy: 0.9879 Epoch 4/12 60000/60000 [==============================] - 41s 677us/step - loss: 0.0550 - accuracy: 0.9835 - val_loss: 0.0341 - val_accuracy: 0.9885 Epoch 5/12 60000/60000 [==============================] - 41s 678us/step - loss: 0.0477 - accuracy: 0.9857 - val_loss: 0.0293 - val_accuracy: 0.9908 Epoch 6/12 60000/60000 [==============================] - 41s 677us/step - loss: 0.0424 - accuracy: 0.9871 - val_loss: 0.0283 - val_accuracy: 0.9913 Epoch 7/12 60000/60000 [==============================] - 41s 678us/step - loss: 0.0387 - accuracy: 0.9881 - val_loss: 0.0275 - val_accuracy: 0.9906 Epoch 8/12 60000/60000 [==============================] - 41s 678us/step - loss: 0.0340 - accuracy: 0.9897 - val_loss: 0.0261 - val_accuracy: 0.9909 Epoch 9/12 60000/60000 [==============================] - 41s 677us/step - loss: 0.0319 - accuracy: 0.9902 - val_loss: 0.0291 - val_accuracy: 0.9906 Epoch 10/12 60000/60000 [==============================] - 41s 676us/step - loss: 0.0307 - accuracy: 0.9906 - val_loss: 0.0287 - val_accuracy: 0.9918 Epoch 11/12 60000/60000 [==============================] - 41s 676us/step - loss: 0.0277 - accuracy: 0.9916 - val_loss: 0.0282 - val_accuracy: 0.9917 Epoch 12/12 60000/60000 [==============================] - 41s 676us/step - loss: 0.0271 - accuracy: 0.9915 - val_loss: 0.0267 - val_accuracy: 0.9921 Test loss: 0.026685928908488858 Test accuracy: 0.9921000003814697(3) 最後に、jupyter notebook経由で、サンプルアプリを起動してみる
Web browserから、
http://(Keras or 127.0.0.1):8888/
にアクセスします。
そして、notebookを起動すると、こんな感じの結果が確認できました。
⬛︎ 終わりに、、、
Keras + TensorFlow / Jupyter notebook環境が簡単に、デプロイできるようになりました。
デープラーニング動作検証を通じて知識を習得する場合には、デープラーニング環境を色々とスクラップ&ビルドできるのが望ましいと思うので、まさに、Dockerコンテナ活用のわかりやすい事例だと思います。
- 投稿日:2019-09-29T16:24:15+09:00
NextcloudをDockerでお手軽に構築してみる
概要
OSSのオンラインストレージサービス「Nextcloud」をDockerで構築してどのように使えるのか確認してみます
$ docker -v Docker version 18.09.2, build 6247962 $ docker-compose -v docker-compose version 1.23.2, build 1110ad01Nextcloud立ち上げ
まずNextcloudのコンテナを立ち上げて、ブラウザからアクセスをしてみます
イメージはOfficial Imageが用意されているのでこちらを使います
https://hub.docker.com/_/nextcloudまた、Apacheとfpmのイメージがありますが、今回は起動してすぐに使えるApacheのイメージを使います
docker-compose.ymlversion: '2' services: web: image: nextcloud:16.0.5-apache ports: - "8080:80"docker-compose.ymlを作成し、コンテナを起動します
$ docker-compose build $ docker-compose up -dこれでNextcloudが立ち上がったので、ブラウザでアクセスしてみます
初回アクセス時には管理者アカウントの作成とDBの初期設定を行う画面が表示されるので、
一旦DBはこのままで管理者アカウントを入力してセットアップを完了しますセットアップ完了後、作成した管理者でログインした状態でトップページが表示されます
デフォルトでサンプルファイルがいくつか用意されています
PDFファイルを選択すると、内蔵されたビュワーで表示されます
テキストファイルを選択すると、エディターが表示されてそのまま編集することができます
その他にもNextcloudにはアプリというものが用意されており、
プラグインのような形で機能の追加や画面のカスタマイズを行うことができますDBとの連携
NextcloudではDBにSQLite, MySQL, MariaDB, PostgreSQLを使用することができ、
先ほどは別途環境を用意しなくても良いSQLiteでセットアップを行いましたが、
本番環境でも使用できるようにPostgreSQLのコンテナを立ち上げて接続を行いますまず先ほどのコンテナを一度落としておきます
$ docker-compose downdocker-compose.ymlを以下のように変更します
docker-compose.ymlversion: '2' services: web: image: nextcloud:16.0.5-apache volumes: - webdata:/var/www/html ports: - "8080:80" db: image: postgres:11.5-alpine ports: - "5432:5432" volumes: - dbdata:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=secret volumes: webdata: dbdata:コンテナを落としてもデータを永続化できるようにデータボリュームを追加しています
この状態で再度コンテナの立ち上げを行います
$ docker-compose up -dコンテナが起動したらブラウザでアクセスします
先ほどと同じように管理者アカウントを入力し、ストレージとデータベースをクリックして以下のように入力します
- データベース:PostgreSQL
- ユーザー名:postgres
- パスワード:secret
- データベース名:nextcloud
- ホスト名:db:5432
※データベース名はここで入力したものをセットアップ時に自動作成してくれるため、
事前に作成しておく必要はありませんセットアップが完了すると先ほどと同じようにトップページが表示されます
DBのコンテナに入って見てみるとテーブルなどが作成されていることが確認できます
bash-5.0# psql -U postgres nextcloud psql (11.5) Type "help" for help. nextcloud=# \d List of relations Schema | Name | Type | Owner --------+--------------------------------------+----------+---------- public | oc_accounts | table | oc_admin public | oc_activity | table | oc_admin public | oc_activity_activity_id_seq | sequence | oc_admin public | oc_activity_mq | table | oc_admin public | oc_activity_mq_mail_id_seq | sequence | oc_admin public | oc_addressbookchanges | table | oc_admin public | oc_addressbookchanges_id_seq | sequence | oc_admin public | oc_addressbooks | table | oc_admin public | oc_addressbooks_id_seq | sequence | oc_admin public | oc_appconfig | table | oc_admin public | oc_authtoken | table | oc_admin public | oc_authtoken_id_seq | sequence | oc_admin public | oc_bruteforce_attempts | table | oc_admin public | oc_bruteforce_attempts_id_seq | sequence | oc_admin public | oc_calendar_invitations | table | oc_admin public | oc_calendar_invitations_id_seq | sequence | oc_admin public | oc_calendar_resources | table | oc_admin public | oc_calendar_resources_id_seq | sequence | oc_admin public | oc_calendar_rooms | table | oc_admin public | oc_calendar_rooms_id_seq | sequence | oc_admin public | oc_calendarchanges | table | oc_admin public | oc_calendarchanges_id_seq | sequence | oc_admin public | oc_calendarobjects | table | oc_admin public | oc_calendarobjects_id_seq | sequence | oc_admin public | oc_calendarobjects_props | table | oc_admin public | oc_calendarobjects_props_id_seq | sequence | oc_admin public | oc_calendars | table | oc_admin public | oc_calendars_id_seq | sequence | oc_admin public | oc_calendarsubscriptions | table | oc_admin public | oc_calendarsubscriptions_id_seq | sequence | oc_admin public | oc_cards | table | oc_admin public | oc_cards_id_seq | sequence | oc_admin public | oc_cards_properties | table | oc_admin public | oc_cards_properties_id_seq | sequence | oc_admin public | oc_collres_accesscache | table | oc_admin public | oc_collres_collections | table | oc_admin public | oc_collres_collections_id_seq | sequence | oc_admin public | oc_collres_resources | table | oc_admin public | oc_comments | table | oc_admin public | oc_comments_id_seq | sequence | oc_admin public | oc_comments_read_markers | table | oc_admin public | oc_credentials | table | oc_admin public | oc_dav_shares | table | oc_admin public | oc_dav_shares_id_seq | sequence | oc_admin public | oc_directlink | table | oc_admin public | oc_directlink_id_seq | sequence | oc_admin public | oc_federated_reshares | table | oc_admin public | oc_file_locks | table | oc_admin --More--
- 投稿日:2019-09-29T16:21:20+09:00
ファイル構造のベストプラクティスを目指す
リモートで開発する際にどのようなファイル構造が一番良いのか?
今回試したのは
/home/username/src
をホームディレクトリとして、
その下に各プロジェクトを作り、そこにソースコードをすべて入れていくスタイル。
Githubのレポジトリもそこに入れてしまう。
そして、開発はDockerを用いて行い、docker-compose.ymlでマウントを以下のように指定する。volumes: - /home/username/src/projectA:/root/srcこうすると、リモートサーバーの構造もすっきりするし、一つのコンテナ内ではそのプロジェクトに関わるもののみが見えて綺麗。
完成イメージ
リモートサーバーhome └─ username └─ src ├─ projectA │ ├─ git_repository │ └─ src └─ projectB ├─ git_repository └─ srcDockerコンテナroot └─ src ├─ git_repository └─ src
- 投稿日:2019-09-29T16:21:20+09:00
python開発環境のファイル構造
リモートで開発する際にどのようなファイル構造が一番良いのか?
今回試したのは
/home/username/src
をホームディレクトリとして、
その下に各プロジェクトを作り、そこにソースコードをすべて入れていくスタイル。
Githubのレポジトリもそこに入れてしまう。
そして、開発はDockerを用いて行い、docker-compose.ymlでマウントを以下のように指定する。
docker-composeはgitレポジトリのものをコピーして/home/username/src/projectA/src
下に置く。volumes: - /home/username/src/projectA:/rootこうすると、リモートサーバーの構造もすっきりするし、一つのコンテナ内ではそのプロジェクトに関わるもののみが見えて綺麗。
完成イメージ
リモートサーバーhome └─ username └─ src ├─ projectA │ ├─ git_repository │ └─ src │ ├─ docker-compose.yml │ └─ other source codes └─ projectB ├─ git_repository └─ srcDockerコンテナroot ├─ git_repository └─ srcsrcディレクトリを整備
srcディレクトリ下に
notebook
ディレクトリとpythonfile
ディレクトリを作成し、そこに入れる。
- 投稿日:2019-09-29T11:14:18+09:00
Docker + Laravel で躓いていた点
Laravel を触ってみよう、ということで Mac 上の Docker に入れてみようとしましたが、躓いた点があったためメモ。
Laravel は初めてですし、Docker もちょっと触った程度なので、非常につまらないつまづきです。ちなみに Dokcer のイメージは、以下のを使用
PHP 用コンテナ
FROM php:7.1-apache COPY php.ini /usr/local/etc/php/ RUN apt-get update \ && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev \ && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcryptMySQL 用コンテナ
FROM mysql:5.7 COPY ./my.cnf /etc/mysql/conf.dいずれも、
cat /etc/issue
Debian GNU/Linux 9 \n \l
1. artisan が実行できない。
Voyager を入れようと思って、
php artisan voyager:install
とコマンドを打つと、
Could not open input file: artisan
と出てしまいました。ええ?と思ったのですが、artisan はプロジェクトのルート(artisan ファイルが置かれているディレクトリ)で実行しないといけない、というだけでした。2. Laravel から MySQL につながらない
Laravel をインストールし終えて http://localhost/ が表示されるようになり、プロジェクト用のデータベースを作成し、次に
php artisan migrate
しようとしたのですが、
SQLSTATE[HY000] [2002] No such file or directory
と出てしまい、失敗します。
.env
の DB_HOST の値を、localhost
,127.0.0.1
, MySQL のコンテナ名に変えるなどしてみますが、いずれもダメ。原因と対応
Mac のターミナルから
php artisan migrate
のコマンドを打っていたのが原因でした(それだけ >_<)。
docker exec -it PHPのコンテナ名 /bin/bash
でコンテナにログインして、 laravel プロジェクトのルートディレクトリからphp artisan migrate
する必要がありました。ちなみに、 試行錯誤の中、DB_HOST 名を以下のように指定した場合のメッセージをそれぞれ書き出してみます。
localhost の場合
SQLSTATE[HY000] [2002] No such file or directory
127.0.0.1 の場合
SQLSTATE[HY000] [2002] Connection refused
MySQL のコンテナ名の場合
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known
MySQL コンテナのIPアドレスの場合
SQLSTATE[HY000] [2002] Operation timed out
※ コンテナのIPアドレスはdocker exec -it MySQLのコンテナ名 /bin/bash
でログインして、cat /etc/hosts
で確認できます。3. localhost/admin が Not Found
Voyager のインストールも終わって、いざ http://localhost/admin にアクセスしたのですが、 Not Found。
うーん、と思ったのですが、 apache の mod_rewrite が有効になっていないだけでした。
/etc/apache2/mods_available/rewrite.load
を/etc/apache2/mods_enabled
に移してコンテナを再起動すればOKでした。終わりに
問題が、Laravel にあるのか Voyager にあるのか Docker にあるのか、Docker なら docker-compose.yml にあるのか確認すべき箇所がたくさんあって難儀しました。
少しでも参考になれば幸いです。自身は、そのうちまた同じところでつまづきそう。
- 投稿日:2019-09-29T06:59:27+09:00
Mac に Docker をインストールする手順
まず、GUI アプリケーションのインストールと管理もターミナルから( コマンドで )行うことができるようになる「 Homebrew Cask 」をインストールします。
$ brew cask ==> Tapping homebrew/cask Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask'... remote: Enumerating objects: 3654, done. remote: Counting objects: 100% (3654/3654), done. remote: Compressing objects: 100% (3645/3645), done. remote: Total 3654 (delta 23), reused 621 (delta 7), pack-reused 0 Receiving objects: 100% (3654/3654), 1.21 MiB | 2.01 MiB/s, done. Resolving deltas: 100% (23/23), done. Tapped 1 command and 3544 casks (3,659 files, 3.9MB). Homebrew Cask provides a friendly CLI workflow for the administration of macOS applications distributed as binaries. Commands: --cache display the file used to cache the Cask audit verifies installability of Casks cat dump raw source of the given Cask to the standard output create creates the given Cask and opens it in an editor doctor checks for configuration issues edit edits the given Cask fetch downloads remote application files to local cache home opens the homepage of the given Cask info displays information about the given Cask install installs the given Cask list with no args, lists installed Casks; given installed Casks, lists staged files outdated list the outdated installed Casks reinstall reinstalls the given Cask style checks Cask style using RuboCop uninstall uninstalls the given Cask upgrade upgrades all outdated casks zap zaps all files associated with the given Cask See also "man brew-cask"これで、次のコマンドを実行するだけで、Docker をインストールすることができるようになっているはずです。
$ brew cask install docker無事、インストールが終わったら、アプリを起動してください。
以下のコマンドで、バージョンを確認することができます。$ docker -v Docker version 19.03.2, build 6a30dfc $ docker-compose -v docker-compose version 1.24.1, build 4667896b
- 投稿日:2019-09-29T00:04:42+09:00
仮想環境
仮想環境
プログラムを開発するにあたり、開発環境の構築が必要になる。
というのも、本番環境であるサーバーにプログラムを上げる前に自分のパソコン上、つまりローカル環境で自分が書いたコードが
ちゃんと機能しているかをブラウザアプリケーションを使って確認しないといけないからである。このローカル環境の構築には様々あり、次の3種類は有名である。
①MAMP,XAMPP
②vagrant
③Docker①MAMP,XAMPP
これらは「Apache」「MySQL」「PHP」を一括してまとめたパッケージで、インストールするLAMP環境が自分のOS上に整えることができる。
ただし、OSは現在自分が使っているPCのOSなので自分のPC上では動いても、本番環境の異なるOSで動いているサーバーに
プログラムを上げたら動かない、なんてこともある。②vagrant
上で説明した①MAMP、XAMPPは現在使っているPCのOS上で動かすが、vagrantは仮想化ソフトのVirtual Boxを使うことで、
自分のPCのOSとは分離独立したOSを立ち上げることができる(MAC PC上でwindowsを動かすことができる)。これにより、本番環境を想定した開発をすることができ、不具合が起きるといったことは起きない。
ただ、次の2点のデメリットもある。
・仮想環境の構築におけるストレージの負担が大きい
・環境のシェアがしずらい③Docker
vagrantと同様、仮想環境を構築して開発するものだが、決定的な違いとしてコンテナ化という概念がある。
まず、imageファイルと呼ばれるmysqlやphp、nginxなどの各環境の実行ファイルを作成しておく。
これらを開発したい環境に合わせて選び、それらだけで構築した仮想環境を立ち上げることができる。この環境こそがコンテナと呼ばれるもので、非常に軽量なためvagrantのようにPC全体に負担がかかることがない。
また、imageファイルは使い回すことができるため、チーム開発で環境をシェアして全く同一の環境を整えることができる。imageファイルを統合してコンテナを立ち上げるファイル(.yml)をComposeFileといい、shell上で、
下のように打つことで簡単にコンテナが立ち上がる。docker-compose up -d [imageファイル名]下がComposeFileファイルで以下のような書き方をする。今回はapache(phpモジュール搭載)とmysqlとphpmyadminについて
記載している。
このComposeFileにはポート番号などの設定が書かれており、ここを書き換えることで設定を変更することができる。docker-compose.ymlversion: '3' # 設定ファイルの文法のバージョン3を利用する。 services: # 1. phpモジュールを搭載したapacheをインストールするコンテナ。 php: build: ./php # phpディレクトリのDockerfileに基づいてコンテナ作成 volumes: - ../www:/var/www # ホストのhtmlディレクトリをphpコンテナのドキュメントルートと同期。 ports: - 8080:80 # ホストの8080番ポートをコンテナの80番ポートにフォワード(転送) depends_on: - mysql # 2. mysqlをインストールするコンテナ mysql: image: mysql:5.7 # mysql5.7のイメージをそのまま利用。 # mysqlの起動時に文字コードを指定 command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci volumes: - ./db:/var/lib/mysql # ホストOSのdbフォルダ内にmysqlコンテナのDBの内容を保存 environment: - MYSQL_ROOT_PASSWORD=root # mysqlのルートパスワードを設定 - MYSQL_DATABASE=sample # デフォルトで作成するデータベース名を設定 - MYSQL_USER=testuser # デフォルトで作成するDBユーザー名を設定 - MYSQL_PASSWORD=password # デフォルトで作成するDBユーザーのパスワードを設定 - "TZ=Asia/Tokyo" # タイムゾーンを設定 # 3. phpmyadminをインストールするコンテナ phpmyadmin: image: phpmyadmin/phpmyadmin # phpmyadminのコンテナイメージをそのまま利用 environment: - PMA_HOST=mysql # 上記で作成したmysqlコンテナに接続 depends_on: - mysql # 上記で作成したmysqlコンテナとリンクする ports: - 8888:80 # ホストの8888番ポートをphpmyadminコンテナの80番ポートに転送 volumes: - ./pma/sessions:/sessions # ホストOSのpmaディレクトリ内にphpmyadminコンテナのセッションファイルを保存