- 投稿日:2020-07-11T20:45:06+09:00
「君がデータサイエンティスト?百年速い」といったあいつを見返すまで ~Win 10 Home上にDocker作って「データサイエンス100本ノック(構造化データ加工編)」のSQL版を起動するまで、編~
すべてのはじまり
奴:「君がデータサイエンティスト?百年速いんじゃない?」
・・・いいだろう。やってやろうじゃないか。(その日の深夜)下調べは十分だ。どうやらPython(パイソン),R,SQLが使える必要があるらしい。ふふふ、勝ったな。SQLなら昔、かじったことがある。そのためには、この「データサイエンス100本ノック(構造化データ加工編)」が一番の近道だということも分かった。よ~し、さっそくこの愛機、無銘(:中華ノートPC)へインストールするぜ!
ふむふむ、まずはDockerが必要、と。
よし、ダウンロードOK!実行!っと。ん?なんだこのエラー?
Docker Desktop requires Windows 10 Pro/Enterprise (15063+) or Windows 10 Home (19018+).
Windows 10 Homeのかたは、Ver.19018以上にしなさいってことか。そういや、しばらく、Windows Updateしていなかったかもな。・・あれ?Windows Updateを最新化したのに、まだ、同じメッセージだ。
そういえば、DockerってWin10Proじゃないとだめって聞いたことがあるような。データサイエンス100本ノックではDockerToolboxが必要って書いてあったな。あれ?そんなのDockerにないな。
ヤバイ。詰んだ。。。
くっ、このままでは、あいつにまた馬鹿にされる。底辺ネット民のGGR力を舐めてもらっては困るな。・・・ふむふむ。
Windows 10 Home で WSL 2 + Docker を使うなら、そもそも、Powershellでコマンド実行が必要やったのね。
お、もっとわかりやすいのがここに。あれ?そしたら、データサイエンス100本ノックのInstall手順↓からはずれるぞ。
$ git clone [Repository URL]
$ cd 100knocks-preprocess
$ docker-compose up -d --build
どうやったらいいんだ?
そだそだ、こういう時こそ、おちついて公式ドキュメントだ。ふむふむ。わかったぞ。以下が公式pdfに書かれている手順だ。
1. Gitをインストールする。
2. Dockerをインストールする。
3. 100本ノックリポジトリをクローンする。
4. ターミナル等でdocker-composeファイルのあるディレクトリまで移動
5. ターミナル等でコンテナ作成コマンドを実行する。だけど、 Win 10 Home の場合は、
1. WSLをインストールする。
2. Dockerをインストールする。
3. 100本ノックリポジトリをZIPダウンロードして自分のホームディレクトリ配下に展開する。
4. ターミナル等でdocker-composeファイルのあるディレクトリまで移動(cd 100knocks-preprocess)
5. ターミナル等でコンテナ作成コマンドを実行する。(docker-compose up -d --build)
ということだと理解。早速試してみよう...そういや、そういった場合は、Dockerのコンテナを再起動して再実行として書いてあったな。
Docker Desktopにいって、(Stop)停止っと。そして起動(Start)。
そんで、
docker-compose up -d --build
の再実行!と、おお!エラーがきえた!ふふふ、よっしゃー!きたこれ!
http://localhost:8888
(ここ からもいけるようにしておくよ)
たぶん、このpreprocess_knock_SQL.ipynbてやつをダブルクリックやな!
きたきた!これで、あとはSQLをつかいこなすだけだぜ~。
- 投稿日:2020-07-11T20:33:48+09:00
別で起動したdockerコンテナをdocker composeのコンテナに認識させる
紹介する内容
- docker-compose.ymlにないdockerコンテナをdocker composeのコンテナに認識させます
- docker-compose.ymlはdockerコンテナ2つ立てる設定にしておいて、別でdockerコンテナ立ててdocker-compose psに3つに見える例を見せます
結論
docker composeはdockerコンテナのlabelを基準として仲間を判定している
- 筆者の調査不足かもしれませんが、公式ドキュメントで該当する内容は発見できませんでした。
- ですが、docker composeのソースコードからlabelが関わっていることを確認しました。
- https://github.com/docker/compose/blob/4bf623d53da363d576bfb4e57d139df97032f004/compose/project.py#L330
Docker Engine SDKsで作業しながら、動的に立てたdockerコンテナをdocker composeに編入したい時に応用できます
- docker composeが立てたコンテナのlabelを確認して、動的に立てる予定のdockerコンテナのlabelを同じくすれば可能です
labelを同じくしてdocker composeの仲間扱いされたdockerコンテナは一緒にdocker-compose downできます
紹介始めます
ディレクトリ構成
全体ソースコードは https://github.com/cheekykorkind/qiita-example/tree/master/docker-compose/allow-raw-docker-as-compose で確認できます
まず、docker composeのdockerコンテナがどのようなlabelを持っているか確認します
以下のコマンドでdocker composeで立てたコンテナ名を確認して、labelを確認します。
docker ps docker inspect コンテナ名目標であるlabelは
Config
配下のLabels
で確認できます。
必要な部分は以下の3行です。後で動的に立てるdockerコンテナのlabel付ける時に使います。"com.docker.compose.oneoff": ..... "com.docker.compose.project": ..... "com.docker.compose.service": .....https://docs.docker.com/engine/reference/commandline/inspect/
動的に立てるdockerコンテナのlabelをdocker composeのdockerコンテナと同じくします
上のdocker inspectから確認したlabel中身の3行を持ってファイルを作ります。
./labels
ファイルになりますcom.docker.compose.oneoff=False com.docker.compose.project=allow-raw-docker-as-compose com.docker.compose.service=compose-postgres11.7label設定を適用して動的にdockerコンテナを立てます
docker run -d --label-file ./labels nginx:1.19.0-alpine
- コマンドを説明すると
docker run -d --label-file label設定ファイルパス dockerイメージ名
です- 同じ動作できるコマンドを追加で紹介します
docker run -d --label com.docker.compose.oneoff=False --label com.docker.compose.project=allow-raw-docker-as-compose --label com.docker.compose.service=compose-postgres11.7 nginx:1.19.0-alpine
- https://docs.docker.com/engine/reference/commandline/run/#set-metadata-on-container--l---label---label-file
例を見せます
- docker composeがあるデレクトリーに移動します
cd qitta-example/docker-compose/allow-raw-docker-as-compose
- docker composeのコンテナたちをバックグラウンドで起動します
docker-compose up -d
- docker composeのコンテナだけあることを確認します
docker-compose ps
- docker composeではないdockerコンテナを起動します
docker run -d --label-file ./labels nginx:1.19.0-alpine
- 別で起動したdockerコンテナがdocker composeのコンテナに認識されました
docker-compose ps
- 投稿日:2020-07-11T20:27:45+09:00
Dockerのお勉強
はじめに
今回の題材はDockerです。会社の新人研修でLinuxやVMware等の仮想マシンについて学んだので、自分でDockerにも手を出してみようと思い、取り組んでみました。個人的な話でも、仕事でIoT/ネットワーク等のインフラ設計構築を行うので、コンテナ技術は絶対に身に付けたいという思いもあります。なので、今回はDockerの概要をアウトプットしていきたいと思いヤース。
Dockerとは
Wikipediaより
Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである。 Dockerはコンテナ仮想化を用いたOSレベルの仮想化によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。
言わずもがなですね。
仮想マシンとコンテナ
これは渋谷のコンテナストアです。行ったことないです。
まあこんな感じです(適当)仮想マシンとコンテナはよく比較対象として取り上げられることが多いので、振り返ってみます。
仮想マシン
仮想マシンは、ハードウェアに実際に搭載されているプロセッサやメモリなどの物理的なリソースを細かく分割し、それをグループにして複数の独立したサーバーのように機能させる技術のことです。なので、効率的にハードウェアのリソースを活用することができます。これを実現するソフトウェアがハイパーバイザーと呼ばれるもので、自分はVMwareのESXiを学習しました。
以上のようにコンテナ(Docker)と比較すると、コンテナの方が動きが軽いと言われています。
では、Dockerの概要について触れていきます。
ライフサイクルについて
まずは、Dockerのライフサイクルの概要についてです。
最初はVirtualBox上にCentOSをインストールして、そこでDockerを扱ってみることにしました。ゴールとしては、ブラウザからコンテナのNginxにアクセスすることです。
DockerHubから使いたいWebサーバーのDockerイメージを取得してきます。
(今回はNginxを使うことにしました。)
取得してきたイメージをもとに、コンテナを作成・起動させ、ポートを設定して、ブラウザからアクセスできるようにします。"localhost"とブラウザで入力して、以下のnginxの画面が開くようになればOKです。
構成
ここからはDocker Desktop for Macを使って、学習しました。構成としては、以下になります。
Dockerfile
上の例では、DockerHubからイメージを取得していましたが、自前でイメージを作成することも可能です。
その場合はDockerfileでイメージを作成します。(イメージを作成することをビルドだと認識しているけど、合っているのかな。。。?)#step1 ... make Ubuntu Image
FROM ubuntu:latest
#step2 ... install nginx
RUN apt-get update && apt-get install -y -q nginx
#step3 ... copy html file
COPY index.html /var/www/html
#step4 ... expose port no 80
EXPOSE 80
#step5 ... start nginx
CMD ["nginx","-g","daemon off;"]こんな次第でDockerfileを記述し、UbuntuやNginxイメージを取得して、HTMLファイルをコピーして、ポートの設定をしたりします。
これをbuildコマンドで実行すると、イメージが作成されます。ここでは、コンテナの/var/www/htmlに配置したHTMLファイルを表示させることをゴールにしていきます。
コンテナの生成・起動
イメージを生成したら、いよいよコンテナの生成・起動です。これはrunコマンドで一気に出来ちゃいます。
コンテナ名や、使用するイメージ名を指定して実行します。コンテナを生成・起動したら、docker execコマンドでバックグラウンドで動いているUbuntuにコマンドを実行して、コンテナが起動していることを確認します。
ここでは、Dockerfileで実行したように、htmlファイルが/var/www/htmlにコピーされていることを確認します。ポート80でアクセスすると、nginxのポート80にフォワードされ、以下のような画面が表示されれば、OKです。
試しに、別のポート番号(8080)を設定したコンテナを別で作成して、アクセスすると無事アクセス出来ました。
終わります
本当はDocker Composeも勉強したのですが、お時間が来たので終わりたいと思います。
お疲れさん。
- 投稿日:2020-07-11T19:49:49+09:00
MySQLのダンプファイルをDockerコンテナで復元する
概要
コンテナを使うことでローカル環境を汚さず
使い終わったらコンテナごと削除されます。ダンプファイルはMySQLが提供しているサンプルを使用しています。
Other MySQL Documentation - Example Databases
使用しているダンプファイル: world database環境
- Docker version 19.03
- MySQL 5.7
MySQLのコンテナを実行する
# コンテナを実行する $ docker container run --rm --name some-mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7 27b05b9a3337d930941c24e6a4ae507d206619de879e7067ef3855f6bc9710b5 # コンテナが実行されていることを確認する $ docker container ls --filter "name=some-mysql" CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 27b05b9a3337 mysql:5.7 "docker-entrypoint.s…" 51 seconds ago Up 49 seconds 3306/tcp, 33060/tcp some-mysqlダンプファイルからデータを復元する
# ホストにあるダンプファイルからコンテナにあるMySQLにデータを流し込む $ docker container exec -i some-mysql /bin/bash -c 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /file/to/path/world.sqlデータが復元されているか確認する
# コンテナに接続 $ docker container exec -it some-mysql /bin/bash # MySQLに接続 root@container_id /# mysql -uroot -p$MYSQL_ROOT_PASSWORD -Dworld # データーベースの確認 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | world | +--------------------+ 5 rows in set (0.00 sec) # テーブルの確認 mysql> show tables; +-----------------+ | Tables_in_world | +-----------------+ | city | | country | | countrylanguage | +-----------------+ # レコードの確認 mysql> select * from city; +----+----------+-------------+----------+------------+ | ID | Name | CountryCode | District | Population | +----+----------+-------------+----------+------------+ | 1 | Kabul | AFG | Kabol | 1780000 | | 2 | Qandahar | AFG | Qandahar | 237500 | ... | 4078 | Nablus | PSE | Nablus | 100231 | | 4079 | Rafah | PSE | Rafah | 92020 | +------+--------+-------------+----------+------------+ 4079 rows in set (0.00 sec)実行したコンテナを削除する
# コンテナを停止する $ docker container stop some-mysql some-mysql # コンテナが削除されていることを確認する $ docker container ls --filter "name=some-mysql" CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES参考
- 投稿日:2020-07-11T19:38:15+09:00
DockerでLAMP&Redis環境を構築しながら、色々使い方を覚える(備忘録)
もし不明なところや、間違いとかがあればご指摘頂けると幸いです。
やること
php-fpm(php7.4) centos7 apache2.4 mariadb phpMyadmin nodejs (with Gulp) redis
- 上記の環境をDockerで構成する
- Dockerfileと各環境の設定ファイルを構成する
- docker-compose.ymlを構成する
- docker-composeで各環境のコンテナーを起動し内部状態を確認する
- Laravel上で、MariaDBとRedisのコネクションを確認する
全体ソースコード
https://github.com/genie-oh/docker-lamp
参考にした記事&Github レポジトリ
https://qiita.com/temori1919/items/487d68a19ca1de1a63c8
https://github.com/temori1919/docker-lamp基本レファレンス
Dockerfileのレファレンス
https://docs.docker.com/engine/reference/builder/Docker Composeのレファレンス
https://docs.docker.com/compose/compose-file/1. Docker構成
1) web構成 (centos & apache)
公式 dockerhub
https://hub.docker.com/_/centos構造
docker-lamp/ `-- web | |-- Dockerfile | |-- docker.conf # Copy to /etc/httpd/conf.d | `-- logs # for apache logweb/docker.conf
Apacheのconfig。
主にバーチャルホスト関連設定を定義する。
phpの処理はphp-fpmに任せるのでproxy設定をしておく。# rootdomain <VirtualHost *:443> ... ServerName lamplocal.me VirtualDocumentRoot /var/www/html/home_root/public ... </VirtualHost> # subdomain. phpの動作が可能 <VirtualHost *:443> ... ServerName lamplocal.me ServerAlias *.lamplocal.me VirtualDocumentRoot /var/www/html/home_sub/%1/public <FilesMatch \.php$> SetHandler "proxy:fcgi://php:9000" </FilesMatch> ... </VirtualHost>web/Dockerfile
apache.2.4のインストール
任意のSSL認証書を作成
docker.confをコンテナーにコピー# centos:7のイメージを元にコンテナーを作成 FROM centos:7 # 指定のコマンド実行 RUN ... # ホストシステムからコンテナーにファイルをコピー COPY docker.conf /etc/httpd/conf.d/docker.conf # コンテナー起動時に実行するコマンド CMD ["/usr/sbin/httpd", "-DFOREGROUND"]2) php構成 (php-fpm 7.4)
公式 dockerhub
https://hub.docker.com/_/php構造
docker-lamp/ |-- php | |-- Dockerfile | |-- logs # For xdebug.log | `-- xdebug.ini # Copy to /usr/local/etc/php/conf.dxdebug.ini
xdebugの基本設定の他に、xdebug.logを残すように設定
xdebug.remote_log=/var/log/xdebug/xdebug.logDockerfile
# php:7.4-fpmのイメージを元にコンテナーを作成 FROM php:7.4-fpm # phpのイメージで提供するユティリティの`docker-php-ext-install`,`docker-php-ext-enable`でPHP EXTENSTIONを設置 RUN pecl install xdebug-2.8.1 \ && docker-php-ext-enable xdebug \ && docker-php-ext-install bcmath pdo_mysql # ホストシステムからコンテナーにファイルをコピー COPY ./xdebug.ini $PHP_INI_DIR/conf.d/ # 外部イメージから、コンテナーにファイルをコピー # 公式composerイメージから、phpコンテナーにcomposerを設置 COPY --from=composer:latest /usr/bin/composer /usr/bin/composer3) mariaDB構成
公式 dockerhub
https://hub.docker.com/_/mariadb構造
docker-lamp/ |-- db | |-- Dockerfile | |-- logs # For slow query log | `-- my.cnf # Copy to /etc/mysql/conf.dmy.cnf
参考記事
https://qiita.com/mamy1326/items/9c5eaee3c986cff65a55charsetや、slow query log、wait timeout、その他innodb関連設定
default-character-set=utf8mb4 character-set-server=utf8mb4 # slow query log slow_query_log=true slow_query_log-file=/var/log/mysql/mysql-slow.sql long_query_time=1 # コネクションタイムアウト時間 wait_timeout=28800Dockerfile
FROM mariadb COPY my.cnf /etc/mysql/conf.d/my.cnf4) redis構成
公式 dockerhub
https://hub.docker.com/_/redis構成
docker-lamp/ |-- redis | |-- Dockerfile | |-- data # for redis data | |-- logs # for redis log | `-- redis.conf # Copy to /usr/local/etc/redis/redis.confredis.conf
redis-serverの設定
参考記事
https://qiita.com/uryyyyyyy/items/9ccadcccf7f7060d544aredisのログを残すように設定
logfile "/var/log/redis/redis-server.log"Dockerfile
FROM redis RUN mkdir /var/log/redis COPY ./redis.conf /usr/local/etc/redis/redis.conf CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]5) nodeの構成
公式 dockerhub
https://hub.docker.com/_/node構成
|-- node | `-- DockerfileDockerfile
FROM node:latest RUN npm install -g gulp@3.9.1 gulp-phpunit config && \ npm install gulp@3.9.1 gulp-phpunit config && \ apt-get -y update && \ apt-get -y upgrade && \ apt-get -y install ca-certificates apt-transport-https && \ wget -q https://packages.sury.org/php/apt.gpg -O- | apt-key add - && \ echo "deb https://packages.sury.org/php/ stretch main" | tee /etc/apt/sources.list.d/php.list && \ apt-get -y update && \ apt-get -y install php7.2 php7.2-cli php7.2-common php7.2-opcache php7.2-curl php7.2-mbstring php7.2-mysql php7.2-zip php7.2-xml WORKDIR /var/www/html2. document root構成
docker-lamp/ |-- code # -- Mounted on /var/www/html | |-- config | | `-- default.json.example | |-- gulpfile.js | |-- home_root # -- root home | | `-- public # documentroot of lamplocal.jp | | `-- index.html # can run only static contents. | |-- home_sub # -- virtual host home | | `-- test # you can add directory & use by subdomain | | `-- public # documentroot of test.lamplocal.jp | | `-- index.php # can run php script | `-- nodeapp3. docker-compose.yml構成
version: '3.7' services: # centos7 apache2.4.*(http2) web: build: ./web container_name: lamp-web ports: - '443:443' volumes: - ./code:/var/www/html - ./web/logs:/var/log/httpd - cert:/etc/ssl/private restart: always env_file: .env # php-fpm 7.4 php: build: ./php container_name: lamp-php ports: - '9000' volumes: - ./code:/var/www/html - ./php/logs:/var/log/xdebug restart: always env_file: .env # mariaDB db: build: ./db container_name: lamp-db restart: always env_file: .env ports: - 3306:3306 volumes: - ./db/logs:/var/log/mysql - datastore:/var/lib/mysql # phpMyadmin phpmyadmin: container_name: lamp-phpmyadmin image: phpmyadmin/phpmyadmin env_file: .env ports: - 8080:80 depends_on: - db # node js (include gulp) node: build: ./node container_name: lamp-node restart: always tty: true environment: - NODE_ENV=production ports: - '3000:3000' volumes: - ./code:/var/www/html depends_on: - web # redis server redis: build: ./redis container_name: lamp-redis restart: always ports: - '6379:6379' volumes: - "./redis/data:/data" - "./redis/logs:/var/log/redis" volumes: cert: datastore:4. 動作確認
aliasを使っていますが、実行コマンドは
execute :
で出力しているので参考にしてください。alias設定の内容と各命令の解説はこちらを参考できます。
https://qiita.com/genie-oh/items/266857d788a85e2da8f91) build
$ al docki execute : docker images REPOSITORY TAG IMAGE ID CREATED SIZE $ al dockcb execute : docker-compose build phpmyadmin uses an image, skipping Building web ... ... Successfully built 43bb05ec0f39 Successfully tagged docker-lamp_redis:latest $ al docki execute : docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-lamp_redis latest 43bb05ec0f39 About a minute ago 104MB docker-lamp_node latest 1cffc83ebe6f About a minute ago 1.06GB docker-lamp_db latest e112492cc9c2 4 minutes ago 407MB docker-lamp_php latest 5a3452fcbf58 4 minutes ago 671MB docker-lamp_web latest 9af33e8e4219 9 minutes ago 540MB ...2) run containers
$ al dockcu execute : docker-compose up -d ... Status: Downloaded newer image for phpmyadmin/phpmyadmin:latest Creating lamp-web ... done Creating lamp-php ... done Creating lamp-redis ... done Creating lamp-db ... done Creating lamp-node ... done Creating lamp-phpmyadmin ... done $ al dockps execute : docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea93226c6b49 phpmyadmin/phpmyadmin "/docker-entrypoint.…" 17 seconds ago Up 14 seconds 0.0.0.0:8080->80/tcp lamp-phpmyadmin 52a68fde7bdd docker-lamp_node "docker-entrypoint.s…" 17 seconds ago Up 14 seconds 0.0.0.0:3000->3000/tcp lamp-node 13e52a01700e docker-lamp_php "docker-php-entrypoi…" 19 seconds ago Up 16 seconds 0.0.0.0:32837->9000/tcp lamp-php 43eb81b6410e docker-lamp_web "/usr/sbin/httpd -DF…" 19 seconds ago Up 15 seconds 0.0.0.0:443->443/tcp lamp-web 473ffaf3439b docker-lamp_redis "docker-entrypoint.s…" 19 seconds ago Up 15 seconds 0.0.0.0:6379->6379/tcp lamp-redis ae80a8fd00c6 docker-lamp_db "docker-entrypoint.s…" 19 seconds ago Up 15 seconds 0.0.0.0:3306->3306/tcp lamp-db3) access web
$ curl -k https://lamplocal.me --silent | grep "<title>" <title>Hello World</title> $ curl -k https://test.lamplocal.me --silent | grep "<title>" <title>PHP 7.4.7 - phpinfo()</title><meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" /></head>4) check each package version in container
$ al dockeit lamp-web httpd -v execute : docker exec -it lamp-web httpd -v Server version: Apache/2.4.41 (IUS) Server built: Aug 25 2019 19:41:04$ al dockeit lamp-php php -v execute : docker exec -it lamp-php php -v PHP 7.4.7 (cli) (built: Jun 11 2020 18:41:17) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Xdebug v2.8.1, Copyright (c) 2002-2019, by Derick Rethans$ al dockeit lamp-db mysql --version execute : docker exec -it lamp-db mysql --version mysql Ver 15.1 Distrib 10.5.4-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2$ al dockeit lamp-redis redis-server -v execute : docker exec -it lamp-redis redis-server -v Redis server v=6.0.5 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=db63ea56716d515f$ al dockeit lamp-node node -v execute : docker exec -it lamp-node node -v v14.5.05) down containers
$ al dockcd execute : docker-compose down Stopping lamp-phpmyadmin ... done Stopping lamp-node ... done Stopping lamp-php ... done Stopping lamp-web ... done Stopping lamp-redis ... done Stopping lamp-db ... done Removing lamp-phpmyadmin ... done Removing lamp-node ... done Removing lamp-php ... done Removing lamp-web ... done Removing lamp-redis ... done Removing lamp-db ... done Removing network docker-lamp_default6) 特定コンテナーのみ実行
$ dockcu php db Creating network "docker-lamp_default" with the default driver Creating lamp-php ... done Creating lamp-db ... done7) php, mariadb, redis 連携確認
laravelをインストールし、各コネクションを確認
# docker-lamp\code\home_sub\cgi\.env DB_CONNECTION=mysql DB_HOST=lamp-db DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=rootpw REDIS_HOST=lamp-redis REDIS_PASSWORD=null REDIS_PORT=6379# docker-lamp\code\home_sub\cgi\app\Http\Controllers\TestController.php <?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Redis; use Illuminate\Support\Facades\DB; class TestController extends Controller { public function index () { $redisResult = Redis::connection()->ping('redis pong'); $dbResult = DB::table('test')->get(); return view('test/index', compact('redisResult', 'dbResult')); } }$ curl -k https://cgi.lamplocal.me/test redisResult : redis pong dbResult : [{"id":0,"name":"abc"}]後書き
- 違うプラットフォームの開発完了などをDockerでコード化しておくと、いろんな開発環境に柔軟に対処できるのはいい。
- PythonやJava、Full Stack Javascript環境も構成してコード化しておきたい。
- 機会があれば、Dockerイメージのサービスデプロイ&運用も勉強したい。(Kubernate, AWS ECS)
- 投稿日:2020-07-11T16:47:09+09:00
ポートフォワードされたポートに対して Docker ホストから dockerize などしてもコンテナのプロセスのリッスンは待てない
タイトルが長い・・dockerize などのツールは普通は Docker ホスト上で実行するものではないですがこの記事ではあえてそうしています。
docker-compose などで複数のコンテナを実行するとき、あるコンテナがポートをリッスンするまで待つために wait-for-it とか dockerize とか(あるいは簡易なシェルスクリプトとか)で待ちますが、これは Docker ホスト上でポートフォワードされたポートに対しては機能しません。
試した環境は下記のとおり。
- CentOS 7.8.2003
- Docker 19.03.8
例えば次のように MySQL のコンテナを実行したとき、
docker run -d --rm --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=1 mysqlDocker ホスト上で dockerize を使っても MySQL のリッスンを待つことはできません。
./dockerize -wait tcp://localhost:3306 #=> 2020/07/08 22:28:53 Waiting for: tcp://localhost:3306 #=> 2020/07/08 22:28:53 Connected to tcp://localhost:3306MySQL がどういう状態でも、コンテナが開始されていれば、これは即座に応答を返します。
理由
Docker ホスト上から localhost の転送されたポートへアクセスしたとき、ホスト上では実際には docker-proxy というプロセスがリッスンしていて、トラフィックをコンテナのポートへ転送します。そのため TCP セッションは「クライアント ~ docker-proxy」と「docker-proxy ~ コンテナ」の2段階です。
クライアントは docker-proxy とのハンドシェイクが終わった時点で ESTABLISH になりますが、docker-proxy の方は accept も何もしていなかったとしてもカーネルだけでクライアントとのハンドシェイクを終わらせて backlog に入れて ESTABLISH になります。この時点ではまだ docker-proxy からコンテナへの接続は始まってもいません。ので、つまりコンテナのプロセスがリッスンしててもして無くても関係なく、クライアント側は ESTABLISH になります。
極端な話、コンテナでリッスンしないポートでも転送さえしておけば ESTABLISH になります。
docker run -d --rm --name mysql -p 9999:9999 -e MYSQL_ALLOW_EMPTY_PASSWORD=1 mysql ./dockerize -wait tcp://localhost:9999 #=> 2020/07/08 22:29:07 Waiting for: tcp://localhost:9999 #=> 2020/07/08 22:29:07 Connected to tcp://localhost:9999この動作は Docker 特有のものではなく、例えば OpenSSH のポートフォワードとかでも同じです。ユーザーランドで TCP をポートフォワードしようとするとどうしてもそうなります。
localhost 以外を指定
↑は localhost のとき、つまりループバックアドレスのときだけです。ホストの別のアドレスを指定すればコンテナのリッスンを待つことができます。
docker run -d --rm --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=1 mysql ./dockerize -wait tcp://192.0.2.123:3306 -timeout 60s #=> 2020/07/08 22:29:29 Waiting for: tcp://192.0.2.123:3306 #=> 2020/07/08 22:29:29 Problem with dial: dial tcp 192.0.2.123:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:29:30 Problem with dial: dial tcp 192.0.2.123:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:29:31 Problem with dial: dial tcp 192.0.2.123:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:29:32 Problem with dial: dial tcp 192.0.2.123:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:29:33 Problem with dial: dial tcp 192.0.2.123:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:29:34 Problem with dial: dial tcp 192.0.2.123:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:29:35 Problem with dial: dial tcp 192.0.2.123:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:29:36 Problem with dial: dial tcp 192.0.2.123:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:29:37 Problem with dial: dial tcp 192.0.2.123:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:29:38 Connected to tcp://192.0.2.123:3306なぜなら docker-proxy が使用されるのは上記のようなホストのループバックアドレスを指定したときや、dockerd で --ip-forward や --iptables で false が指定されているときだけだからです。下記の記事が詳しく解説されておりわかりやすいです(英語)。
それ以外では iptables/netfilter の PREROUTING でコンテナのポートへ直接 DNAT されるため、クライアントとコンテナが直接 TCP で接続します。のでコンテナがリッスンしていなければクライアントからの TCP ハンドシェイクの時点で RST されます。
dockerd --userland-proxy=false
dockerd を
--userland-proxy=false
で実行すれば docker-proxy が開始されず、ループバックアドレスでも DNAT されるようになるため、ホスト上でループバックアドレスを指定してもコンテナのリッスンを待つことができます。sudo vim /etc/sysconfig/docker # OPTIONS="--userland-proxy=false" sudo systemctl restart docker docker run -d --rm --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=1 mysql ./dockerize -wait tcp://localhost:3306 -timeout 60s #=> 2020/07/08 22:28:08 Waiting for: tcp://localhost:3306 #=> 2020/07/08 22:28:08 Problem with dial: dial tcp 127.0.0.1:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:28:09 Problem with dial: dial tcp 127.0.0.1:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:28:10 Problem with dial: dial tcp 127.0.0.1:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:28:11 Problem with dial: dial tcp 127.0.0.1:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:28:12 Problem with dial: dial tcp 127.0.0.1:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:28:13 Problem with dial: dial tcp 127.0.0.1:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:28:14 Problem with dial: dial tcp 127.0.0.1:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:28:15 Problem with dial: dial tcp 127.0.0.1:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:28:16 Problem with dial: dial tcp 127.0.0.1:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:28:17 Problem with dial: dial tcp 127.0.0.1:3306: connect: connection refused. Sleeping 1s #=> 2020/07/08 22:28:18 Connected to tcp://localhost:3306通常であればループバックアドレスに対しては PREROUTING は適用されませんが、sysctl で
net.ipv4.conf.$DEVICE.route_localnet = 1
にすれば出来るようになります。これはデフォだと0
ですが--userland-proxy=false
を指定して dockerd を実行すると docker0 のような仮想ブリッジデバイスでは1
に設定されます。さいごに
元々 OpenSSH のポートフォワードで存在しない宛先へ転送していても Connected になることを知っていたで Docker のポートフォワードでもそういうものだろうと思っていたのですが、何かの拍子に iptables の設定を見てみたら DNAT されていたので、あれーじゃあホストからでもコンテナプロセスのリッスンを待機できるの? と思ったらやっぱりできなくて、どういうことかと思ったらこういうことでした。
本題とは関係ありませんが docker-compose で複数のコンテナを実行するときにアプリのコンテナで MySQL のコンテナを待つだけであれば dockerize をアプリのコンテナで実行するだけで十分です。同じネットワークのコンテナ同士が通信する分には docker-proxy は関係ありません。
余談ですが MySQL に限れば
mysqladmin ping --wait
で良いかも。アプリのコンテナから実行しようとすると mysql クライアントを入れる必要がありますけど。docker run -d --rm --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=1 mysql docker exec mysql mysqladmin ping -h 127.0.0.1 --wait=10MySQL のコンテナ自身でやるときは
-h 127.0.0.1
を指定しないとUnixドメインソケットに接続してしまうので注意。Docker オフィシャルのイメージだと MySQL は最初に skip-networking で起動し(TCP無効でUnixドメインソケットのみで接続できる)、初期化が完了したあとに networking を有効にして再起動します。-h 127.0.0.1
が指定されていないと最初の初期化のために起動したタイミングで応答を返してしまいます。確実に初期化が完了して別のコンテナからの接続を受け入れる状態になっていることを確認するためには-h 127.0.0.1
が必要です。
- 投稿日:2020-07-11T14:58:36+09:00
Dockerのimage名をrepositoryとtag名で検索する
コマンド
docker images [OPTIONS] [REPOSITORY[:TAG]]
説明
docker images REPOSITORY TAG IMAGE ID CREATED SIZE openjdk 16-slim-buster 0b97ad2b2200 25 hours ago 417MB openjdk 16-jdk b735a7317062 25 hours ago 500MB mysql 8.0.20 be0dbf01a0f3 4 weeks ago 541MB quay.io/cybozu/golang 1.13-bionic ec982649cca5 4 months ago 761MB
- 上のような結果のときにREPOSITORYが
openjdk
のものだけを取り出したいときdocker images openjdk REPOSITORY TAG IMAGE ID CREATED SIZE openjdk 16-slim-buster 0b97ad2b2200 25 hours ago 417MB openjdk 16-jdk b735a7317062 25 hours ago 500MB
- タグ指定も出来る。
docker images openjdk:16-slim-buster REPOSITORY TAG IMAGE ID CREATED SIZE openjdk 16-slim-buster 0b97ad2b2200 25 hours ago 417MB
部分一致も出来る
repository
docker images quay.io/*/* REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/cybozu/golang 1.13-bionic ec982649cca5 4 months ago 761MB
- tagの指定
docker images *:16-slim-buster REPOSITORY TAG IMAGE ID CREATED SIZE openjdk 16-slim-buster 0b97ad2b2200 25 hours ago 417MB
- optionとの併用
docker images openjdk -qa 0b97ad2b2200 b735a7317062終わりに
- 今までずっとgrepかfilter使ってたけど、こっち使ったほうが便利。
参考
- 投稿日:2020-07-11T14:26:23+09:00
Webpacker::Manifest::MissingEntryError
画像のエラーを解決するのに手間取りすぎたから、備忘録メモです。
先に結論
僕の場合は
docker-compose run --rm web yarn install
したら解決した環境
【環境】
・Ruby 2.6.6
・Rails 6.0.3.2
・DockerDockerfile
qiita.rbFROM ruby:2.6 # install package to docker container RUN apt-get update -qq && apt-get install -y build-essential libpq-dev \ && apt-get install apt-transport-https \ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ && apt-get update && apt-get install -y yarn \ && curl -sL https://deb.nodesource.com/setup_10.x | bash - \ && apt-get install -y nodejs \ && mkdir /アプリ名 WORKDIR /FANTRA COPY Gemfile /アプリ名/Gemfile COPY Gemfile.lock /アプリ名/Gemfile.lock COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000確認したこと
- webpackerインストールしてるか?
- rails webpacker:install 実行ずみ (実行すると、
conflict config/webpacker.yml
が出る)- yarnインストールしてるか?
- 1.22.4
- nodejsインストールしてるか?
- v10.21.0
必要な物は揃っているはずなのになぜかできない。。。
わかってなかったこと
yarn ないし npm はruby でいうところのbundlerで、ライブラリを管理してくれるnodejsのツールのこと。
bundle install
しないと ruby のライブラリが利用できないのと同じようにyarn install
を実行しないと、 package.json によって指定されている nodejs ライブラリがダウンロードされず実行できないらしい。
webpack はnodejs のライブラリやから、このエラーを解消するためにはyarn install
をbundle install
と同じような取り扱いで実行する必要があるらしい。yarn installをしてみる
qiita.rb$ docker-compose run --rm web yarn install無事にエラーを解決することができました。
メモ
DockerfileのRUNしてるものとかymlの内容とかで実行しないといけないコマンド違ってくるのかな??
- 投稿日:2020-07-11T10:47:49+09:00
Mac+DockerでphpStormを使いWordPressテーマを一から作る(1/3)
先日、2009年から愛用していた懐かしの白いMacBook(Early 2009)を卒業して、MacBook Air2020(1,1GHz i5クアッドコア+SSD 512GB+16GB RAM)に乗り換えました。
先代はメモリを8GBまで増設して内臓HDDもSSDに換装してなんとか延命をしており、普段使用するアプリケーション(Photoshop CCの最新版とかphpStormとかableton Liveとか)はほぼストレス無く使えていました。
現在はうつ病の療養中で無職のためこれまでやってきてなかった事をしたいと思い、今更ながらSassなどこれまで業務の中で触れなかった技術を学ぼうと思い、まずはVirtualBox+CentOSで環境を作ってみたのですが、公式リポジトリのCentOSのバージョンが7系でphpも5.4系とかなり古いものでした。
そこでDockerを使ってみようとしたところ、旧マシンではOSのアップデートがSierra(10.12)で止まってしまっており現行バージョンのDocker Desktopが使えなかったので、例の一人10万円給付金を使ったMacBook Air2020の購入へと至りました。
...と前置きが長くなりましたが本題に入りたいと思います。
本稿は長くなるので3回に別けて投稿したいと思います。ゴール
Docker Desktop for Mac でWordpress環境を作り、スターターテーマのunderscores(_S)を使ったテーマ開発ができるようにする。
cssはSassを使い、phpStorm側でコンパイルが出来るようにする。
ついでにohoMyAdminも使えるようにする。前提条件
- MacOS Catalina(10.15) ※セットアップとデータ移行が済んだ状態
- phpStorm(2020.1)
ステップ
- XCodeのインストール(1/3)
- Homebrewのインストール(1/3)
- node(npm)+node-sassのインストール(1/3)
- Docker Desktop for Mac のインストール((2/3)
- Docker-composeによるコンテナの構築(2/3)
- underscores(_s)でのスターターテーマの作成とファイルの設置(3/3)
- phpStormでのSassウォッチャーの登録(3/3)
Xcodeのインストール
まずはXCodeをインストールします。
これは後にHomebrew経由でnodeを導入し、さらにnode-sassを導入するための前準備です。インストールにはそこそこ時間が掛かるので、しばらく放っておきましょう。自分は1時間くらい掛かったような。
もしくはターミナルから以下のコマンドでもインストールできるようです。
$ xcode-select --installHomebrewのインストール
インストールが完了したら次はHomebrewのインストールを行います。
HomebrewをはMacOS向けのパッケージマネージャーで必要なものをコマンドで簡単にインストールできる、というものです。
これにより後のnodeのインストールを行います。公式サイトによれば以下のコマンドでインストールが可能なようです。
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"インストールが完了したらバージョンを確認し、以下のようにバージョンが表示されればOKです。
$ brew --version Homebrew 2.4.3 Homebrew/homebrew-core (git revision 06581; last commit 2020-07-07)node(npm)+node-sassのインストール
続いてHomebrew経由でnode(npm)をインストールします。
npmとはnodeのパッケージ管理ツールの事です。$ brew install -g nodeインストールが済んだらバージョンが正常に表示されるか確認しましょう。
$ node -v v14.5.0無事、インストールできたようです。
npmのバージョンは以下のコマンドで確認できます。$ npm version { npm: '6.14.5', ares: '1.16.0', brotli: '1.0.7', cldr: '37.0', icu: '67.1', llhttp: '2.0.4', modules: '83', napi: '6', nghttp2: '1.41.0', node: '14.5.0', openssl: '1.1.1g', tz: '2019c', unicode: '13.0', uv: '1.38.0', v8: '8.3.110.9-node.23', zlib: '1.2.11' }私の環境では以上のような結果になりました。
npmのインストールが確認できたら、今度はnpmでnode-sassをインストールします。$ npm install --global --save-dev node-sass特にエラーらしきものが出ていなければOKでしょう。
以降は次のエントリーに続きます。
- 投稿日:2020-07-11T10:04:27+09:00
Rails6・unicorn、nginx、postgresのdockerコンテナを別々で立てる
紹介する内容
- dockerコンテナを三つ(Rails6とunicorn一緒に、nginx、postgres)にして立てます
- nginxのUNIX-domain socketとdocker composeのvolume活用します
結論
Rails6コンテナはunicornをforegroundで起動、nginxのUNIX-domain socketをdocker composeのvolumeマウントしたら動きます
- Rails6コンテナはunicornをforegroundで起動させて、nginxの通信を待ちながらコンテナが落ちない(exit 0)ようにします
- nginxのUNIX-domain socketをdocker composeのvolumeを使って、Rails6コンテナのunicornに共有させます
- UNIX-domain socket使いますからportはnginxとpostgresだけ開けば十分です
AWS ECSなどに活用できます
- dockerコンテナを別々に立てる予定のECSに
このコンテナ構成動くか?
の事前試しができますpriでデバックしずらくなりますから、開発環境ならRailsコンテナ一つ立てて
bundle exec rails s
することを推奨します
- binding.pryはかかりますが、ユーザーが値を入力できるところがよく分かりません
- Railsコンテナにdocker attachしてもだめでした
紹介始めます
ディレクトリ構成
全体ソースコードは https://github.com/cheekykorkind/qiita-example/tree/master/rails/6/unicorn-nginx で確認できます
nginx confファイル説明
いろいろ書かれてますが、必要な部分だけ書きます
./docker/nginx/nginx.conf
ファイルです
include /etc/nginx/conf.d/*.conf;
によって、./docker/nginx/web.conf
が読み込めます./docker/nginx/web.conf
ファイルです
- 全てのrequestが
location /
に入りますproxy_pass http://unicorn;
によってupstream unicorn
に行きますunix:/workspace/myapp/tmp/unicorn.todo.sock
に来たらUNIX-domain socketで通信します
- UNIX-domain socketを簡単に説明すると
ファイルを持って通信できる
です。
- ですから、docker composeのマウントだけでnginxとunicornが連携できます
- https://en.wikipedia.org/wiki/Unix_domain_socket
upstream unicorn { server unix:/workspace/myapp/tmp/unicorn.todo.sock fail_timeout=0; } server { listen 80; location / { ...省略 proxy_pass http://unicorn; ...省略 } ...省略 }unicorn設定ファイル説明
./config/unicorn/development.rb
ファイルですlisten "#{RAILS_ROOT}/tmp/unicorn.todo.sock"
をnginxのconfファイルの内容と同じパスを書くことでUNIX-domain socketの通信ができますdocker周り実装説明
./docker-compose.yml
ファイルですbundle exec unicorn -c ./config/unicorn/development.rb
でunicornをforegroundで起動します- UNIX-domain socketの専用volumeを作ります
volumes: nginx_socket: driver: localそして、
nginx_socket:/workspace/myapp/tmp
でdockerコンテナ中でマウントするパスを設定します。
unicornとnginxが同じファイルをマウントできるように各々のコンテナに同じく書きます。試し順番です
- docker composeがあるデレクトリーに移動します
cd qitta-example/rails/6/unicorn-nginx
- dockerコンテナをバックグラウンドで起動します
DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up -d
- 投稿日:2020-07-11T08:07:43+09:00
dockerでWhalesayイメージがpull(run)できない時の対処法
はじめに
今回は、MacPCで
Dockerのバージョン19.03.8を使用しました。$ docker --version Docker version 19.03.8, build afacb8b
某動画学習サイトの講義に沿って
DockerHubからWhalesayイメージを取得してプログラムを実行しようと
以下のコマンドを入力したところ、エラーメッセージが出力されてしまいした。
どうやらイメージの信頼性に関するエラーのようです。$ docker run docker/whalesay cowsay Hello! docker: Error: remote trust data does not exist for docker.io/docker/whalesay: notary.docker.io does not have trust data for docker.io/docker/whalesay. See 'docker run --help'.解決策
原因は、Dockerのセキュリティ機能である
DOCKER_CONTENT_TRUST(DCT)が有効になっている点でした。
これは、作成されたDockerイメージが第三者によって改ざんされていないか等を
検証する機能です。
Whalesayイメージを取得するには、この設定を無効にする必要があります。そのために、以下のコマンドを入力します。
【DCTの無効化】
$ export -n DOCKER_CONTENT_TRUST もしくは $ export DOCKER_CONTENT_TRUST=0設定完了後に、Whalesayイメージを取得・プログラム実行すると・・
$ docker run docker/whalesay cowsay Hello! ~~~中略〜〜〜 ________ < Hello! > -------- \ \ \ ## . ## ## ## == ## ## ## ## === /""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/無事にプログラムが実行できました。
なお、今回無効にしたDOCKER_CONTENT_TRUST(DCT)を再度
有効にしたい時は、以下のコマンドを入力しましょう。【DCTの有効化】
export DOCKER_CONTENT_TRUST=1
- 投稿日:2020-07-11T01:29:01+09:00
Docker上のJupyter Notebookのmatplotlibの日本語文字化けを解決する
はじめに
様々な環境でjupyterを使うたびに日本語文字化け問題に苦しんでいる気がします。
今回は解決策がドンピシャのものがなかったので、記録します。概要
Docker上のJupyter Notebookのmatplotlibの日本語文字化けを解決する。
(Dockerfileに追記する形で進めます。)ポイント
- フォントファイルの置き場所を確認する
- フォントのダウンロード
- 確認した場所にフォントファイルを置く
- matplotlibの設定ファイルの場所を確認
- matplotlibのフォントを設定
- キャッシュの場所確認
- キャッシュを削除
作業
1.フォントファイルの置き場所を確認する
jupyter上で確認。
import matplotlib.font_manager as fm fm.findSystemFonts()['/ファイル置き場PATH/なんとか.ttf',
'/ファイル置き場PATH/なんか.ttf'] のように表示されると思います。(3で使う)2. フォントのダウンロード
IPAexフォントから「IPAexゴシック」をダウンロード。
Dockerfileと同じディレクトリにipaexg.ttf置いておく。3. 確認した場所にフォントファイルを置く
Dockerfileに追記。
COPY ipaexg.ttf /ファイル置き場PATH(1で確認)/4. matplotlibの設定ファイルの場所を確認
jupyter上で確認。
import matplotlib matplotlib.matplotlib_fname()'/設定置き場PATH/matplotlib/matplotlibrc'のように表示されると思います。(5で使う)
5. matplotlibのフォントを設定
Dockerfileに追記。
RUN echo 'font.family : IPAexGothic' >> /設定置き場PATH/matplotlib/matplotlibrc6. キャッシュの場所確認
jupyter上で確認。
import matplotlib as mpl mpl.get_configdir()'/キャッシュ置き場PATH/.cache/matplotlib'のように表示されると思います。(6で使う)
7. キャッシュの削除
!rm -r /キャッシュ置き場PATH/.cache/matplotlibおわり
- 投稿日:2020-07-11T00:00:05+09:00
【Rails/Docker/mysql】ホストPC直下で開発していたWEBアプリをコンテナで動かしてみたぉ
はじめに
Udemyの動画でDockerを学んだ後、ローカルホストで開発していたアプリケーションをコンテナで動かしてみました。
以下を参考にしながら、まずはdocker-composeを使わずにやってみました。
参考
udemy 米国AI開発者がゼロから教えるDocker講座
https://hub.docker.com/_/rails
https://qiita.com/tatsuya-miyamoto/items/08bd6ea142d02708614f
https://qiita.com/y-suna/items/e52b3af1d80c52b66b31
https://qiita.com/Masato338/items/f162394fbc37fc490dfb実行環境
アプリケーションサーバ(コンテナ直下): puma4.3.3 (rails5.2.4.1 / ruby 2.5.1)
Database(ホスト直下): MySQL 5.6.47
コンテナ(ホスト直下): docker 19.03.8
ホスト: macOS Catalina 10.15.5実施手順
既存アプリケーションを壊さないよう、対象となるアプリケーションのフォルダをコピーして実行しました。
$ cp -r ~/project/memo-space ~/project/memo-space_v2~/project/memo-space -> ~/project/memo-space_v2
Dockerfileを作成する。
DockerfileFROM ruby:2.5.1 RUN apt-get update RUN apt-get install -y mysql-client nodejs vim --no-install-recommends RUN rm -rf /var/lib/apt/lists/* RUN mkdir /myproject WORKDIR /myproject ADD Gemfile /myproject/Gemfile ADD Gemfile.lock /myproject/Gemfile.lock RUN gem install bundler ADD . /myprojectDockerfileに基づきビルド
terminal$ cd ~/projects/memo-space_v2 $ docker build .docker image を確認します。
terminaldocker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> df22a2c4c7f7 56 minutes ago 1.07GB ...dockerを実行します。
この時、ホストのrails pumaのポート3000番とmysqlのポート3306番にコンテナのポートを紐づけます。
また、ホストのアプリケーションフォルダ「~/projects/memo-space_v2」にコンテナのフォルダ「/myproject」をマウントします。terminal$ docker run -it -p 3000:3000 -p 3306:3306 -v ~/projects/memo-space_v2:/myproject df22a2c4c7f7 bashファイル「Gemfile.lock」を削除します。
terminal$ rm Gemfile.lockbundle installを実行し、必要なGemをインストールします。
terminal$ bundle installdatabase.ymlに記載された既存のアプリの定義を次の通り修正します。
修正箇所
・mysqlのhost(追記)
・アプリケーション名(修正)config/database.yml# MySQL. Versions 5.0 and up are supported. # # Install the MySQL driver # gem install mysql2 # # Ensure the MySQL gem is defined in your Gemfile # gem 'mysql2' # # And be sure to use new-style password hashing: # http://dev.mysql.com/doc/refman/5.7/en/old-client.html # default: &default adapter: mysql2 encoding: utf8 pool: 5 username: root password: socket: /tmp/mysql.sock development: <<: *default database: memo-space_v2_development #修正 host: docker.for.mac.localhost #追記 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: memo-space_v2_test #修正 # As with config/secrets.yml, you never want to store sensitive information, # like your database password, in your source code. If your source code is # ever seen by anyone, they now have access to your database. # # Instead, provide the password as a unix environment variable when you boot # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database # for a full rundown on how to provide these environment variables in a # production deployment. # # On Heroku and other platform providers, you may have a full connection URL # available as an environment variable. For example: # # DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" # # You can use this database configuration with: # # production: # url: <%= ENV['DATABASE_URL'] %> # production: <<: *default database: memo-space_v2_production #修正 adapter: postgresql # database: postgresql encording: unicorde pool: 5 username: memo-space url: <%= ENV['DATABASE_URL'] %> password: <%= ENV['MEMO-SPACE_DATABASE_PASSWORD'] %>※既存アプリでは、元々production環境として、heroku上のpostgresqlを利用しており上記の記載となっていますが、未修正です。
※コンテナからホストPCへのアクセスは、次の通り指定することで実行できました。
terminalmysql --host=docker.for.mac.localhost -u root
dbをcreateします。
terminalrails db:create
dbをmigrateします。
terminalrails db:migrate
コンテナの全てのインタフェースにバインディングすることで、ホストPCからアクセスできるようにします。
terminalrails s -p 3000 -b '0.0.0.0'
以上により、ホストPCからブラウザでURL「localhost:3000」を指定し、アプリにアクセスできました。