20200711のdockerに関する記事は13件です。

「君がデータサイエンティスト?百年速い」といったあいつを見返すまで ~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)
ということだと理解。早速試してみよう...

おや?5の段階でエラーがでたぞ。
C__WINDOWS_system32_cmd.exe 2020_07_11 20_20_51.png

そういや、そういった場合は、Dockerのコンテナを再起動して再実行として書いてあったな。
Docker Desktopにいって、(Stop)停止っと。そして起動(Start)。
Container list 2020_07_11 20_22_28.png

そんで、docker-compose up -d --build の再実行!

と、おお!エラーがきえた!ふふふ、よっしゃー!きたこれ!
http://localhost:8888ここ からもいけるようにしておくよ)
JupyterLab - Google Chrome 2020_07_11 20_37_46.png

おう、!なんか開いた!このworkの下やな。
JupyterLab - Google Chrome 2020_07_11 20_39_54.png

たぶん、このpreprocess_knock_SQL.ipynbてやつをダブルクリックやな!
JupyterLab - Google Chrome 2020_07_11 20_41_35.png

きたきた!これで、あとはSQLをつかいこなすだけだぜ~。

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

別で起動したdockerコンテナをdocker composeのコンテナに認識させる

紹介する内容

  • docker-compose.ymlにないdockerコンテナをdocker composeのコンテナに認識させます
    • docker-compose.ymlはdockerコンテナ2つ立てる設定にしておいて、別でdockerコンテナ立ててdocker-compose psに3つに見える例を見せます

結論

docker composeはdockerコンテナのlabelを基準として仲間を判定している

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 で確認できます

  • 全体図
    allD.png

  • 動的で立てるdockerコンテナが使うlabel設定ファイル部分
    labelD.png

まず、docker composeのdockerコンテナがどのようなlabelを持っているか確認します

以下のコマンドでdocker composeで立てたコンテナ名を確認して、labelを確認します。

docker ps
docker inspect コンテナ名

inspectCommand.png

目標であるlabelはConfig配下のLabelsで確認できます。
必要な部分は以下の3行です。後で動的に立てるdockerコンテナのlabel付ける時に使います。

"com.docker.compose.oneoff": .....
"com.docker.compose.project": .....
"com.docker.compose.service": .....

inspectLabelPart.png

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

label設定を適用して動的にdockerコンテナを立てます

例を見せます

  1. docker composeがあるデレクトリーに移動します
    • cd qitta-example/docker-compose/allow-raw-docker-as-compose
  2. docker composeのコンテナたちをバックグラウンドで起動します
    • docker-compose up -d
  3. docker composeのコンテナだけあることを確認します
    • docker-compose ps
  4. docker composeではないdockerコンテナを起動します
    • docker run -d --label-file ./labels nginx:1.19.0-alpine
  5. 別で起動したdockerコンテナがdocker composeのコンテナに認識されました
    • docker-compose ps

allow-container-as-compose.gif

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

Dockerのお勉強

はじめに

今回の題材はDockerです。会社の新人研修でLinuxやVMware等の仮想マシンについて学んだので、自分でDockerにも手を出してみようと思い、取り組んでみました。個人的な話でも、仕事でIoT/ネットワーク等のインフラ設計構築を行うので、コンテナ技術は絶対に身に付けたいという思いもあります。なので、今回はDockerの概要をアウトプットしていきたいと思いヤース。

Dockerとは

Wikipediaより

Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである。 Dockerはコンテナ仮想化を用いたOSレベルの仮想化によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。

言わずもがなですね。

仮想マシンとコンテナ

image.png
これは渋谷のコンテナストアです。行ったことないです。
まあこんな感じです(適当)

仮想マシンとコンテナはよく比較対象として取り上げられることが多いので、振り返ってみます。

仮想マシン

仮想マシンは、ハードウェアに実際に搭載されているプロセッサやメモリなどの物理的なリソースを細かく分割し、それをグループにして複数の独立したサーバーのように機能させる技術のことです。なので、効率的にハードウェアのリソースを活用することができます。これを実現するソフトウェアがハイパーバイザーと呼ばれるもので、自分はVMwareのESXiを学習しました。

以上のようにコンテナ(Docker)と比較すると、コンテナの方が動きが軽いと言われています。

では、Dockerの概要について触れていきます。

ライフサイクルについて

まずは、Dockerのライフサイクルの概要についてです。
最初はVirtualBox上にCentOSをインストールして、そこでDockerを扱ってみることにしました。ゴールとしては、ブラウザからコンテナのNginxにアクセスすることです。

スクリーンショット 2020-07-11 16.10.54.png
DockerHubから使いたいWebサーバーのDockerイメージを取得してきます。
(今回はNginxを使うことにしました。)
取得してきたイメージをもとに、コンテナを作成・起動させ、ポートを設定して、ブラウザからアクセスできるようにします。

"localhost"とブラウザで入力して、以下のnginxの画面が開くようになればOKです。
スクリーンショット 2020-07-07 20.50.45.png

構成

ここからはDocker Desktop for Macを使って、学習しました。構成としては、以下になります。スクリーンショット 2020-07-11 19.24.00.png

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です。
スクリーンショット 2020-07-11 10.29.29.png

試しに、別のポート番号(8080)を設定したコンテナを別で作成して、アクセスすると無事アクセス出来ました。

終わります

本当はDocker Composeも勉強したのですが、お時間が来たので終わりたいと思います。
お疲れさん。

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

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

参考

Docker Hub - MySQL Description

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

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 log

web/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.d

xdebug.ini

xdebugの基本設定の他に、xdebug.logを残すように設定

xdebug.remote_log=/var/log/xdebug/xdebug.log

Dockerfile

# 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/composer

3) mariaDB構成

公式 dockerhub
https://hub.docker.com/_/mariadb

構造

docker-lamp/
|-- db
|   |-- Dockerfile
|   |-- logs            # For slow query log
|   `-- my.cnf          # Copy to /etc/mysql/conf.d

my.cnf

参考記事
https://qiita.com/mamy1326/items/9c5eaee3c986cff65a55

charsetや、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=28800

Dockerfile

FROM mariadb
COPY my.cnf /etc/mysql/conf.d/my.cnf

4) 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.conf

redis.conf

redis-serverの設定

参考記事
https://qiita.com/uryyyyyyy/items/9ccadcccf7f7060d544a

redisのログを残すように設定

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
|   `-- Dockerfile

Dockerfile

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/html

2. 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
|   `-- nodeapp

3. 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/266857d788a85e2da8f9

1) 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-db

3) 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.0

5) 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_default

6) 特定コンテナーのみ実行

$ dockcu php db
Creating network "docker-lamp_default" with the default driver
Creating lamp-php ... done
Creating lamp-db  ... done

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

ポートフォワードされたポートに対して 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 mysql

Docker ホスト上で 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:3306

MySQL がどういう状態でも、コンテナが開始されていれば、これは即座に応答を返します。

理由

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

MySQL のコンテナ自身でやるときは -h 127.0.0.1 を指定しないとUnixドメインソケットに接続してしまうので注意。Docker オフィシャルのイメージだと MySQL は最初に skip-networking で起動し(TCP無効でUnixドメインソケットのみで接続できる)、初期化が完了したあとに networking を有効にして再起動します。-h 127.0.0.1 が指定されていないと最初の初期化のために起動したタイミングで応答を返してしまいます。確実に初期化が完了して別のコンテナからの接続を受け入れる状態になっていることを確認するためには -h 127.0.0.1 が必要です。

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

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使ってたけど、こっち使ったほうが便利。

参考

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

Webpacker::Manifest::MissingEntryError

画像のエラーを解決するのに手間取りすぎたから、備忘録メモです。

スクリーンショット 2020-07-10 16.38.40.png

先に結論

僕の場合はdocker-compose run --rm web yarn installしたら解決した

環境

【環境】
・Ruby 2.6.6
・Rails 6.0.3.2
・Docker

Dockerfile

qiita.rb
FROM 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 installbundle install と同じような取り扱いで実行する必要があるらしい。

yarn installをしてみる

qiita.rb
 $  docker-compose run --rm web yarn install 

無事にエラーを解決することができました。

メモ

DockerfileのRUNしてるものとかymlの内容とかで実行しないといけないコマンド違ってくるのかな??

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

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を導入するための前準備です。

AppStoreからXcodeを検索してポチればOKです。
2020-07-10-11.18.20.jpg

インストールにはそこそこ時間が掛かるので、しばらく放っておきましょう。自分は1時間くらい掛かったような。

もしくはターミナルから以下のコマンドでもインストールできるようです。

$ xcode-select --install

Homebrewのインストール

インストールが完了したら次は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でしょう。

以降は次のエントリーに続きます。

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

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 で確認できます

  • 全体図
    allD.png

  • Rails6とunicorn dockerファイルデレクトリー

  • nginx dockerファイルデレクトリー
    dockerD.png

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で通信します
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が同じファイルをマウントできるように各々のコンテナに同じく書きます。

試し順番です

  1. docker composeがあるデレクトリーに移動します
    • cd qitta-example/rails/6/unicorn-nginx
  2. dockerコンテナをバックグラウンドで起動します
    • DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up -d

unicorn.gif

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

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

Docker上のJupyter Notebookのmatplotlibの日本語文字化けを解決する

はじめに

様々な環境でjupyterを使うたびに日本語文字化け問題に苦しんでいる気がします。
今回は解決策がドンピシャのものがなかったので、記録します。

概要

Docker上のJupyter Notebookのmatplotlibの日本語文字化けを解決する。
(Dockerfileに追記する形で進めます。)

ポイント

  1. フォントファイルの置き場所を確認する
  2. フォントのダウンロード
  3. 確認した場所にフォントファイルを置く
  4. matplotlibの設定ファイルの場所を確認
  5. matplotlibのフォントを設定
  6. キャッシュの場所確認
  7. キャッシュを削除

作業

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/matplotlibrc

6. キャッシュの場所確認

jupyter上で確認。

import matplotlib as mpl
mpl.get_configdir()

'/キャッシュ置き場PATH/.cache/matplotlib'のように表示されると思います。(6で使う)

7. キャッシュの削除

!rm -r /キャッシュ置き場PATH/.cache/matplotlib

おわり

スクリーンショット 2020-07-11 1.27.04.png

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

【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を作成する。

Dockerfile
FROM 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 . /myproject

Dockerfileに基づきビルド

terminal
$ cd ~/projects/memo-space_v2
$ docker build .

docker image を確認します。

terminal
 docker 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.lock

bundle installを実行し、必要なGemをインストールします。

terminal
$ bundle install

database.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へのアクセスは、次の通り指定することで実行できました。

terminal
mysql --host=docker.for.mac.localhost -u root

dbをcreateします。

terminal
rails db:create

dbをmigrateします。

terminal
rails db:migrate

コンテナの全てのインタフェースにバインディングすることで、ホストPCからアクセスできるようにします。

terminal
rails s -p 3000 -b '0.0.0.0'

以上により、ホストPCからブラウザでURL「localhost:3000」を指定し、アプリにアクセスできました。

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