20190929のdockerに関する記事は18件です。

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_pytorch
sudo   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_pytorch

pip3 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.2

torch 1.2.0a0+eddebaf

ちゃんと追加されている

ここでは環境構築の手順だけ残しておくのですが今後動作検証とかするつもりです.

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

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

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

ラズパイ Zero W(ARM v6l)Buster Lite に Docker をインストールする手順【2019/09 版】

RaspberryPi Zero W に arm32v6 用 Docker CE をインストールする手順です。

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.deb

TS;DR

  1. RaspberryPi Zero W に Buster Lite をインストール、ロケールの設定などを行う。

  2. 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
    
  3. 公式の Docker インストールスクリプトを実行する。

    $ sudo curl -sL get.docker.com | bash
    ...
    
  4. 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
    

参考文献

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

ラズパイ 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 をインストールする手順です。

TL;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.deb
docker-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 のインストール手順

  1. RaspberryPi Zero W に Buster Lite をインストール、ロケールの設定などを行う。

  2. 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
    
  3. 公式の Docker インストールスクリプトを実行する。

    $ sudo curl -sL get.docker.com | bash
    ...
    
  4. 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
    
  5. 必要(毎回 sudo をつけるのが面倒)なら現在のユーザーを docker グループに追加する

    sudo gpasswd -a $USER docker
    sudo reboot now
    

docker-compose のインストール手順

Stretch と同じ手順なので、そちらをご覧ください。

参考文献

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

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 は専用のインターフェイスを用意していて、実行すると次にようになります。

image.png

このウィンドウでの操作は次にようになります。

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.vimのデモはこちらです。

docker-composeはコンテナへのアタッチできるサブコマンドexecがありますが、こちらはdocker-compose.vimには実装していません。
なぜならdocker.vimにはその機能があり、そちらを使用すれば解決するからです。

docker-compose.vimは複数のコンテナを管理するためのプラグインという位置づけで、
個別のコンテナの管理や操作はdocker.vimのが優れているので、そちらを使用したほうが良いでしょう。

docker-compose.vimの今後

とりあえずがーっと作ったので、もう少しよくあるユースケースの情報を収集して、便利そうなら機能を追加する予定です。
この記事を読んで、これができたら便利そう、などの意見があればぜひコメント頂ければと思います。

最後に

docker.vimdocker-compose.vimを使えば、
Vimでコンテナを使った開発がさらに楽になるので、ぜひとも両方を入れてみて下さい。

そして良いなと思ったらGitHubのスターを押して頂けると励みます。
お礼にバナナあげるかもしれません。

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

最近よく使っている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.yml
version: '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: redis

servicesに対してwebアプリケーションや他のミドルウェアのDockerイメージに関する設定内容を記載しています。
appのところにはdepends_onがありますが、これは記載されている他のイメージとの依存関係を示すものになっています。依存関係のあるものが解決してからappの内容が動作します。
それぞれbuildのところで、どのDockerfileを使用してDockerイメージをbuildするかを設定しているのがわかると思うので、Dockerfileも記載しましょう。

./app/Dockerfile

./app/Dockerfile
FROM node:latest

WORKDIR /home/app

COPY ./app/package*.json ./

RUN npm install

COPY ./app ./

EXPOSE 3000

./mysql/Dockerfile

./mysql/Dockerfile
FROM mysql:5.7

# ADD ./mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf

EXPOSE 3306

./redis/Dockerfile

./redis/Dockerfile
FROM redis

# COPY redis.conf /usr/local/etc/redis/redis.conf

EXPOSE 6379

実行

docker-compose.ymlのあるディレクトリで実行します。

build

$ docker-compose build

起動

$ docker-compose up -d

exec

# nodeのコンテナ
$ docker-compose exec app bash

# redisのコンテナ
$ docker-compose exec redis bash

# mysqlのコンテナ
$ docker-compose exec mysql bash

ここに記載していないコマンドはこちらの方の記事が参考になります。
docker-compose コマンドまとめ

おわりに

個人的に利用することの多そうな環境をメモがてら書いていきましたが、
間違いやよりよい方法があればぜひ教えてください?‍♀️

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

dockerで開発環境構築時にvendor,node_modulesなどのフォルダをどうやっていくか

dockerおよびcomposeで開発環境を構築するときに、皆さんは依存物のフォルダをどう扱っていますか?

依存物のフォルダとは、いわゆる

  • rubyやphpのvendor
  • Node.jsのnode_modules

等のことです。

dockerで開発環境を構築する上でこのフォルダを扱うのが面倒なことがあり、私が調べた範囲で2つの解決策がありますので紹介します。

ちなみに、このような依存内容を格納するフォルダの一般名称はどなたか知りませんか?
この記事では以下では依存物フォルダと書きます。

何が面倒なのか → 普通にマウントすると消える

このようなdocker-compose.ymlとします。説明のために省略していますが、本来は他のservicesもあるでしょう。

docker-compose.yml
services:
  web:
    build:
      context: ./laravel
    volumes:
      - ./laravel:/var/www
  • 普通にcomposer install等のコマンドを書いたDockerfileを用意
  • frontendやbackendなどのソースコードをマウントする(上のvolumesのところです)

というような感じで普通にdocker-compose upすると、依存物フォルダの中身は空になってしまいます。

実はこれは当然の挙動で、ホスト側にnode_modulesが存在しないので、docker image内に作られた依存物フォルダが、マウント時に上書きされて隠されるからです。

ググってもすぐに同様の問題を抱えている人を見つけられます。

どうするか

私が調べた範囲だと、解決策は2つあります。

  • volume trickを使う
  • 依存物フォルダも素直にホストからマウントした上で、コンテナからインストールする

ただし、各々に利点と欠点があります。

解決策1: volume trickを使う

ホストからコンテナにマウントする際に消されたくないフォルダを、docker volumeとしてマウントすることで、消えることを防ぐことができます。
参考: https://jdlm.info/articles/2019/09/06/lessons-building-node-app-docker.html

docker-compose.yml
services:
  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がいいかも。後で調べます。

参考

その他:依存物フォルダにはdelegated オプションを使う

マウント時のオプションで少し状況は改善します。上に挙げたどちらの手段でも使っておくと良いと思います。ただし、劇的な改善とまではいきませんでした。

docker-compose.yml
services:
  web:
    build:
      context: ./laravel
    volumes:
      - ./laravel:/var/www
      - ./laravel/node_modules:/var/www/node_modules:delegated # <-

https://docs.docker.com/docker-for-mac/osxfs-caching/#tuning-with-consistent-cached-and-delegated-configurations

cachedとdelegatedは、ホスト側かコンテナ側からか、どちらからの書き込みが多いかで選びましょう

まとめ

dockerで依存物フォルダを扱う方法は、2つある。

  • volomes trickを使うか
  • 諦めて素直にまるごとマウントした上で、ビルド後にインストールをするか

ホスト側から依存物フォルダの中身が見える代わりに、書き込み速度が遅くなるか、というトレードオフになっています。

上記以外の選択肢や、改善のためのtipsをご存知の方がいらっしゃいましたら、ぜひコメントを頂ければ幸いです。

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

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が異なるからです。
これらを同じくすれば治りました

対応内容

  1. .envにhostのLinux user id、group id、user nameを書いておく
  2. docker-compose.ymlのargsを使って、.envで書いたuser id、group id、user nameをDockerFileに渡す
  3. DockerFileはdocker-compose.ymlから渡されたuser id、group id、user nameを使ってユーザーを作る
  4. Docker コンテナを作った後にvolumesの権限を直してくれるshell scriptを書く

環境

Linux

  • NAME : Kali GNU/Linux
  • VERSION : 2019.1

Docker Compose

  • VERSION : 1.23.1

Docker

  • VERSION : 18.09.4

構成図

dirs.PNG

.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=vagrant

docker-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/$UNAME

Dockerfile

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を書くと、もっと便利かもしれません。

以上

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

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=password

4. 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 5432

5. 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 = auto

8. 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

スクリーンショット 2019-09-29 19.33.06.png

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

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

[初心者]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 Dockerfile
Dockerfile
FROM 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 Gemfile
Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.3'
$ touch Gemfile.lock

【4】docker-compose.ymlの作成

$ vi docker-compose.yml
docker-compose.yml
version: '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.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost

database.ymlが上記のようになっているので
下記のように書き換える。

config/database.yml
default: &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-rails1.png

感じたこと

まだまだ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)

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

【初心者】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 Dockerfile
Dockerfile
FROM 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 Gemfile
Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.3'
$ touch Gemfile.lock

【4】docker-compose.ymlの作成

$ vi docker-compose.yml
docker-compose.yml
version: '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.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost

database.ymlが上記のようになっているので
下記のように書き換える。

config/database.yml
default: &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-rails1.png

感じたこと

まだまだ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)

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

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ファイルは、こんな感じです。

Dockerfile
FROM 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.9916999936103821

GPUを使用した場合、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を起動すると、こんな感じの結果が確認できました。
minist_cnn.png

⬛︎ 終わりに、、、

Keras + TensorFlow / Jupyter notebook環境が簡単に、デプロイできるようになりました。
デープラーニング動作検証を通じて知識を習得する場合には、デープラーニング環境を色々とスクラップ&ビルドできるのが望ましいと思うので、まさに、Dockerコンテナ活用のわかりやすい事例だと思います。

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

NextcloudをDockerでお手軽に構築してみる

概要

OSSのオンラインストレージサービス「Nextcloud」をDockerで構築してどのように使えるのか確認してみます

$ docker -v
Docker version 18.09.2, build 6247962
$ docker-compose -v
docker-compose version 1.23.2, build 1110ad01

Nextcloud立ち上げ

まずNextcloudのコンテナを立ち上げて、ブラウザからアクセスをしてみます

イメージはOfficial Imageが用意されているのでこちらを使います
https://hub.docker.com/_/nextcloud

また、Apacheとfpmのイメージがありますが、今回は起動してすぐに使えるApacheのイメージを使います

docker-compose.yml
version: '2'
services:
  web:
    image: nextcloud:16.0.5-apache
    ports:
      - "8080:80"

docker-compose.ymlを作成し、コンテナを起動します

$ docker-compose build
$ docker-compose up -d

これでNextcloudが立ち上がったので、ブラウザでアクセスしてみます

http://localhost:8080

スクリーンショット 2019-09-28 18.14.12.png

初回アクセス時には管理者アカウントの作成とDBの初期設定を行う画面が表示されるので、
一旦DBはこのままで管理者アカウントを入力してセットアップを完了します

スクリーンショット 2019-09-28 18.19.37.png

セットアップ完了後、作成した管理者でログインした状態でトップページが表示されます

デフォルトでサンプルファイルがいくつか用意されています

スクリーンショット 2019-09-28 18.23.37.png

PDFファイルを選択すると、内蔵されたビュワーで表示されます

スクリーンショット 2019-09-28 18.25.35.png

テキストファイルを選択すると、エディターが表示されてそのまま編集することができます

その他にもNextcloudにはアプリというものが用意されており、
プラグインのような形で機能の追加や画面のカスタマイズを行うことができます

DBとの連携

NextcloudではDBにSQLite, MySQL, MariaDB, PostgreSQLを使用することができ、
先ほどは別途環境を用意しなくても良いSQLiteでセットアップを行いましたが、
本番環境でも使用できるようにPostgreSQLのコンテナを立ち上げて接続を行います

まず先ほどのコンテナを一度落としておきます

$ docker-compose down

docker-compose.ymlを以下のように変更します

docker-compose.yml
version: '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

コンテナが起動したらブラウザでアクセスします

http://localhost:8080

先ほどと同じように管理者アカウントを入力し、ストレージとデータベースをクリックして以下のように入力します

  • データベース: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-- 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ファイル構造のベストプラクティスを目指す

リモートで開発する際にどのようなファイル構造が一番良いのか?

今回試したのは

/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
          └─ src
Dockerコンテナ
root
 └─ src
    ├─ git_repository
    └─ src
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
          └─ src
Dockerコンテナ
root
 ├─ git_repository
 └─ src

srcディレクトリを整備

srcディレクトリ下にnotebookディレクトリとpythonfileディレクトリを作成し、そこに入れる。

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

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 mcrypt

MySQL 用コンテナ

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 にあるのか確認すべき箇所がたくさんあって難儀しました。

少しでも参考になれば幸いです。自身は、そのうちまた同じところでつまづきそう。

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

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.png
以下のコマンドで、バージョンを確認することができます。

$ docker -v
Docker version 19.03.2, build 6a30dfc
$ docker-compose -v
docker-compose version 1.24.1, build 4667896b
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

仮想環境

仮想環境

プログラムを開発するにあたり、開発環境の構築が必要になる。
というのも、本番環境であるサーバーにプログラムを上げる前に自分のパソコン上、つまりローカル環境で自分が書いたコードが
ちゃんと機能しているかをブラウザアプリケーションを使って確認しないといけないからである。

このローカル環境の構築には様々あり、次の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.yml
version: '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コンテナのセッションファイルを保存
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む