20200125のdockerに関する記事は23件です。

CentOS7 Docker + Docker Compose のインストール

この記事に書かれている事

CentOS7 への Docker 及び Docker-compose のインストール

  • SeLinuxの無効化
    いろいろと制限が出るから無効化しちゃいましょう。
  • Dockerのインストール
  • 動作確認
  • Docker Composeのインストール

しばらく触らないと忘れちゃうので備忘録として、、、

SeLinuxの無効化

  • コマンドで監視モードに変更
  • 再起動後は無効化されるように設定ファイルを変更
[user01@cent7 ~] getenforce
Enforcing
[user01@cent7 ~] sudo setenforce 0
[user01@cent7 ~] getenforce
Permissive
[user01@cent7 ~] sudo vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
##SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
[user01@cent7 ~]

Dcokerのインストール

古いモジュールの削除

以前インストールしていたら古いモジュールを削除しましょう。

[user01@centos7 ~]$ sudo yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine \
> docker-engine-selinux
[user01@centos7 ~]$ sudo rm /etc/yum.repos.d/docker.repo

必要な関連パッケージをインストール

[user01@centos7 ~]$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

Dockerのインストール

  • Docker リポジトリを追加
  • Docker インストール
[user01@centos7 ~]$ sudo yum-config-manager \
--add-repo https://download.docker.com/linux/centos/docker-ce.repo
[user01@centos7 ~]$ sudo yum install docker-ce docker-ce-cli containerd.io

Docker管理者をdockerグループに追加

グループ docker に参加させることで sudo せずに dockerコマンドを実行できるようになります。
この設定をしなくてもsudoすれば良いだけなので必要に応じて任意で実行してください。
以下の設定例では $USER (ログイン中のユーザ) をDocker管理者に追加しています。

[user01@centos7 ~]$ LANG=C man usermod
[user01@centos7 ~]$ sudo usermod -aG docker $USER
 [sudo] user01 のパスワード:
[user01@centos7 ~]$ id $USER
uid=1000(user01) gid=1000(user01) groups=1000(user01),10(wheel),980(docker)
[user01@centos7 ~]$

usermod -a の瀬説明は LANG=ja_JP.UTF-8 では出てきません。
LANG=Cで確認してください。

動作確認

  • Docker の起動
  • Docker 自動起動設定
  • 動作確認
[user01@centos7 ~]$ sudo systemctl start docker
[user01@centos7 ~]$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[user01@centos7 ~]$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2019-03-09 12:16:43 JST; 17s ago
     Docs: https://docs.docker.com
 Main PID: 12648 (dockerd)
   CGroup: /system.slice/docker.service
           mq12648 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.470344031+09:00" level=info msg="[graphdriver] using prior storage driver: overlay"
 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.470393144+09:00" level=warning msg="[graphdriver] WARNING: the overlay st... release"
 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.474175363+09:00" level=info msg="Graph migration to content-addressabilit... seconds"
 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.475348040+09:00" level=info msg="Loading containers: start."
 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.076457928+09:00" level=info msg="Default bridge (docker0) is assigned wit... address"
 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.342253505+09:00" level=info msg="Loading containers: done."
 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.372317576+09:00" level=info msg="Docker daemon" commit=774a1f4 graphdrive...n=18.09.3
 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.372423919+09:00" level=info msg="Daemon has completed initialization"
 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.398960579+09:00" level=info msg="API listen on /var/run/docker.sock"
 3月 09 12:16:43 centos7 systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
[user01@centos7 ~]$ 
[user01@centos7 ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:

Docker Composeのインストール

参考)
Install Docker Compose

とりあえず手順通りにインストール。変数の扱いに注意。
ただ、最新版をインストールしたい場合 github を参照し最新版のversionを確認して curl で指定する URLのバージョン番号を調整しましょう。

依存パッケージの導入

alpine Linux の場合しか書いてないのでとりあえずスルー

Docker Compose のインストール

すごく簡単です。

  • github のファイルをダウンロード
  • 実行権限を付与
  • 必要なら Link を作成
Install Docker Compose に書いてるコマンドサンプル(失敗します)
[user01@cent7 ~]$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

こっちのコマンドを実行
[user01@cent7 ~]$ sudo curl -L https://github.com/docker/compose/releases/download/v1.25.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0   1354      0 --:--:-- --:--:-- --:--:--  1356
100 16.4M  100 16.4M    0     0  1328k      0  0:00:12  0:00:12 --:--:-- 1676k
[user01@cent7 ~]$ sudo chmod +x /usr/local/bin/docker-compose
[user01@cent7 ~]$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】Qiita 週間いいね数ランキング【タグ別】

他のタグ

集計期間

01月18日 ~ 01月25日

いいね数ランキング

1位: 「procs:新しいプロセス表示・検索ツール」の更新紹介

Mac Windows Linux Rust Docker
35いいね
@dalanceさん(01月23日 16時28分の投稿)

2位: Laradockを使ってLaravel環境を構築した

PHP Laravel Docker docker-compose LaraDock
17いいね
@inagackyさん(01月20日 09時37分の投稿)

3位: 2020年の開発者が知っておくべき11の必須技能→回答編 → 並べ替え→項目合併(8項目)→内容追記

Python Git Docker 自己評価
13いいね
@kaizen_nagoyaさん(01月22日 02時33分の投稿)

4位: 【スターターキット】Scrapy&MariaDB&Django&Dockerでデータ自動収集ボットシステムを構築する

Python Django mariadb Docker Scrapy
9いいね
@Makotunesさん(01月20日 16時17分の投稿)

5位: DockerとSELinux

SELinux Docker
5いいね
@ttt_okamotoさん(01月24日 07時33分の投稿)

6位: 『フカシギの数え方』 おねえさんといっしょ:組み合わせ爆発の凄さ

Python Docker graphillion 数え上げ 組み合わせ爆発
5いいね
@kaizen_nagoyaさん(01月21日 02時23分の投稿)

7位: DjangoアプリをDocker上に構築しAWS Fargateにデプロイする

Python Django AWS Docker Fargate
4いいね
@keita_gawaharaさん(01月23日 13時05分の投稿)

8位: Autosar文書を読む(準備)

英語 Docker 規格 AUTOSAR 略号
4いいね
@kaizen_nagoyaさん(01月19日 12時59分の投稿)

9位: Dockerで入れたPostgreSQLへのPDO接続でエラーが出て悩んだ。

PHP PostgreSQL PDO Docker docker-compose
2いいね
@jiiiimyさん(01月23日 04時48分の投稿)

10位: Macのlocalhost上で動作しているサービスへDocker内部から接続する方法

Mac Docker
2いいね
@falconwsさん(01月22日 14時54分の投稿)

11位: Docker DesktopのGUIにダッシュボードが搭載されてコンテナやボリュームがわかりやすくなったぞ

Docker
2いいね
@ko1nksmさん(01月22日 03時13分の投稿)

12位: pip3ベースでデータサイエンス環境を作るためのDockerfile

Python pip Docker dockerfile pip3
2いいね
@hanonさん(01月20日 16時02分の投稿)

13位: 【初学者向け】セキュリティ対策入門②〜SQLインジェクション編〜

PHP 初心者 セキュリティ Docker
2いいね
@junkimatsudaさん(01月20日 12時33分の投稿)

14位: Laravelの開発環境3つとそれぞれのメリット、デメリット

PHP Vagrant Laravel Docker
2いいね
@falconwsさん(01月20日 10時46分の投稿)

15位: Docker x 可視化がうまくいかずハマったのでまとめてみた!

Python Linux Ubuntu OpenCV Docker
2いいね
@oreyutaroverさん(01月19日 23時55分の投稿)

16位: Kubernetesの構築

Docker kubernetes
2いいね
@nozomi-nishinoharaさん(01月19日 08時13分の投稿)

17位: DockerでTesseractの環境を構築してみた。。。

環境構築 Docker tesseract-ocr
2いいね
@penpentaさん(01月19日 05時24分の投稿)

18位: [Docker入門]コンテナにsshでアクセスするための設定メモ

SSH 初心者 入門 Docker コンテナ
2いいね
@kuboshu83さん(01月19日 05時11分の投稿)

19位: GCP+DockerでHTTPSな静的ページを公開する

Docker HTTPS googlecomputeengine gcp
2いいね
@kotaroooo0さん(01月19日 04時07分の投稿)

20位: DockerでDBの設定が完了するまでアプリケーションのコンテナを立ち上げないようにしようとしたらハマった

ShellScript Django mariadb Docker docker-compose
1いいね
@keii1111さん(01月25日 08時24分の投稿)

21位: [イメージ図付]Nginx+gunicorn+FlaskをDocker化[前編]

Python nginx Flask Docker dockerfile
1いいね
@mintak21さん(01月24日 13時26分の投稿)

22位: Dockerを使って数分でOpenCV&Python環境を構築して試す

Python OpenCV Docker Python3
1いいね
@hashitoさん(01月24日 00時08分の投稿)

23位: DockerでHello,World

Python Docker
1いいね
@keita_gawaharaさん(01月23日 11時50分の投稿)

24位: WSL1でDocker使いたい

Docker
1いいね
@nabさん(01月23日 04時17分の投稿)

25位: SpringBootでグループウェアの開発③〜DB接続の続き〜

Docker MyBatis SpringBoot MySQL8.0
1いいね
@r_saikiさん(01月22日 15時55分の投稿)

26位: 外部からGCE上のDockerコンテナ内のMySQLへ接続

WordPress MySQL SSH Docker gce
1いいね
@awesomestさん(01月22日 08時41分の投稿)

27位: LaravelのDockerでX-debugを有効にする

PhpStorm xdebug Laravel Docker
1いいね
@dabiddoさん(01月22日 07時53分の投稿)

28位: Dockerを使って簡単にローカルtomcat環境を作る

Docker docker-compose
1いいね
@hikarurightさん(01月22日 01時06分の投稿)

29位: SpringBootでグループウェアの開発②〜DB接続〜

Docker SpringBoot MySQL8.0
1いいね
@r_saikiさん(01月21日 14時32分の投稿)

30位: Docker上のFlask + Nginxでコンソールにログを出力する

Python nginx Flask uwsgi Docker
1いいね
@shin1103@githubさん(01月21日 07時20分の投稿)

31位: Docker MySQLのバージョン変更する方法

MySQL Laravel Docker LaraDock
1いいね
@tsurutadesuさん(01月20日 11時54分の投稿)

32位: GitBucketをMySQL8で立ち上げるdocker-composeファイル

Docker GitBucket docker-compose MySQL8.0
1いいね
@bunaImageさん(01月20日 06時11分の投稿)

33位: ラズパイ・ウェブ地図の作り方

geo RaspberryPi Docker
1いいね
@hfuさん(01月19日 21時26分の投稿)

34位: Windows10 HomeでのDockerを使ったpython環境構築手順メモ

Python Windows 環境構築 Docker
1いいね
@feketerigo210さん(01月19日 14時04分の投稿)

35位: DockerでMediaWikiとVisualEditorを入れたログ

mediawiki Docker
1いいね
@MirrgieRianaさん(01月19日 12時28分の投稿)

36位: pip環境のdockerでjupyter notebookを使いたかった(opticspy)

Python pip Docker Python3 Jupyter
1いいね
@YamKentaさん(01月19日 06時28分の投稿)

37位: k8s環境ハンズオン webアプリケーション構築実践編

Docker kubernetes
1いいね
@gamelike319さん(01月19日 04時55分の投稿)

38位: TruffleBox (React&Truffle)を用いたDockerでのdapps(ブロックチェーンアプリ)の開発環境の構築

Docker React ブロックチェーン truffle DApps
1いいね
@dl10yrさん(01月19日 03時55分の投稿)

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

【Docker】Qiita 週間いいね数ランキング【自動更新】

他のタグ

集計期間

01月20日 ~ 01月27日

いいね数ランキング

1位: DockerとSELinux

SELinux Docker
59いいね
@ttt_okamotoさん(01月24日 16時33分の投稿)

2位: 「procs:新しいプロセス表示・検索ツール」の更新紹介

Mac Windows Linux Rust Docker
42いいね
@dalanceさん(01月24日 01時28分の投稿)

3位: 2020年の開発者が知っておくべき11の必須技能→回答編 → 並べ替え→項目合併(8項目)→内容追記

Python Git Docker 自己評価
13いいね
@kaizen_nagoyaさん(01月22日 11時33分の投稿)

4位: 『フカシギの数え方』 おねえさんといっしょ:組み合わせ爆発の凄さ: docker(111)

Python Docker graphillion 数え上げ 組み合わせ爆発
5いいね
@kaizen_nagoyaさん(01月21日 11時23分の投稿)

5位: アラフォーのおっさんが一ヶ月でWebサービスを作った話

Go Docker React 文字認識 TensorFlow
4いいね
@othAnさん(01月26日 12時00分の投稿)

6位: DjangoアプリをDocker上に構築しAWS Fargateにデプロイする

Python Django AWS Docker Fargate
4いいね
@keita_gawaharaさん(01月23日 22時05分の投稿)

7位: 機械学習したデーターを爆速で販売するサービスをDockerで構築してみた

Python Flask Express Docker nuxt.js
3いいね
@masamunetさん(01月27日 15時50分の投稿)

8位: Docker for Windows で Kubernetesが起動しないときのトラブルシューティング

Docker kubernetes docker-for-windows
3いいね
@ynottさん(01月26日 09時03分の投稿)

9位: LaravelのインフラをDockerで作ってみた

Laravel Docker
2いいね
@moyashimanjyuさん(01月27日 12時22分の投稿)

10位: CentOS7 Docker + Docker Compose のインストール

CentOS Docker centos7 docker-compose
2いいね
@kichiseさん(01月25日 23時27分の投稿)

11位: [イメージ図付]Nginx+gunicorn+FlaskをDocker化[前編]

Python nginx Flask Docker dockerfile
2いいね
@mintak21さん(01月24日 22時26分の投稿)

12位: Dockerで入れたPostgreSQLへのPDO接続でエラーが出て悩んだ。

PHP PostgreSQL PDO Docker docker-compose
2いいね
@jiiiimyさん(01月23日 13時48分の投稿)

13位: Macのlocalhost上で動作しているサービスへDocker内部から接続する方法

Mac Docker
2いいね
@falconwsさん(01月22日 23時54分の投稿)

14位: docker-compose で Cloud Datastore Emulatorを立ち上げpythonアプリと連携する

Python Docker datastore gcp docker-compose
2いいね
@komtakiさん(01月22日 23時29分の投稿)

15位: Docker DesktopのGUIにダッシュボードが搭載されてコンテナやボリュームがわかりやすくなったぞ

Docker
2いいね
@ko1nksmさん(01月22日 12時13分の投稿)

16位: [Docker入門]勉強して得られたDockerの知見を色々まとめてみた(Windows・Python)

Python Linux 初心者 Docker Python3
1いいね
@simonritchieさん(01月27日 08時13分の投稿)

17位: DockerでMysqlコンテナを作る

MySQL Docker
1いいね
@h0geさん(01月26日 22時03分の投稿)

18位: 簡単なForm作成から学ぶVue(TypeScript)の書き方 その0 環境構築編

Docker Vue.js
1いいね
@Kept1994さん(01月26日 21時45分の投稿)

19位: コード内で環境名 (dev,stg,prod) を使用しないことのすすめ

JavaScript Node.js Docker サーバー 環境変数
1いいね
@ku6ryoさん(01月26日 17時26分の投稿)

20位: GoとRedisでAPIを実装する (Part.1)

Go Redis nosql Docker docker-compose
1いいね
@Moreroさん(01月26日 15時19分の投稿)

21位: 【Docker】Qiita 週間いいね数ランキング【自動更新】

Docker
1いいね
@kou_pg_0131さん(01月25日 23時17分の投稿)

22位: DockerでDBの設定が完了するまでアプリケーションのコンテナを立ち上げないようにしようとしたらハマった

ShellScript Django mariadb Docker docker-compose
1いいね
@keii1111さん(01月25日 17時24分の投稿)

23位: nuxt dockerで使う個人的な設定

Docker nuxt.js hot-reload
1いいね
@nicelandさん(01月25日 10時05分の投稿)

24位: Dockerを使って数分でOpenCV&Python環境を構築して試す

Python OpenCV Docker Python3
1いいね
@hashitoさん(01月24日 09時08分の投稿)

25位: DockerでHello,World

Python Docker
1いいね
@keita_gawaharaさん(01月23日 20時50分の投稿)

26位: WSL1でDocker使いたい

Docker
1いいね
@nabさん(01月23日 13時17分の投稿)

27位: SpringBootでグループウェアの開発③〜DB接続の続き〜

Docker MyBatis SpringBoot MySQL8.0
1いいね
@r_saikiさん(01月23日 00時55分の投稿)

28位: 外部からGCE上のDockerコンテナ内のMySQLへ接続

WordPress MySQL SSH Docker gce
1いいね
@awesomestさん(01月22日 17時41分の投稿)

29位: LaravelのDockerでX-debugを有効にする

PhpStorm xdebug Laravel Docker
1いいね
@dabiddoさん(01月22日 16時53分の投稿)

30位: Dockerを使って簡単にローカルtomcat環境を作る

Docker docker-compose
1いいね
@hikarurightさん(01月22日 10時06分の投稿)

31位: SpringBootでグループウェアの開発②〜DB接続〜

Docker SpringBoot MySQL8.0
1いいね
@r_saikiさん(01月21日 23時32分の投稿)

32位: Docker上のFlask + Nginxでコンソールにログを出力する

Python nginx Flask uwsgi Docker
1いいね
@shin1103@githubさん(01月21日 16時20分の投稿)

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

dockerで始めたNode-REDにnode-red-node-discoveryをインストールする

node-red-node-discoveryがインストールできない

「パレットの管理」からnode-red-node-discoveryノードをインストールしようとしても、失敗してしまった。

node-red-node-discovery - npm
には

please read the install instructions for the underlying npm.

For Debian / Ubuntu this requires installing

sudo apt-get install libavahi-compat-libdnssd-dev

と書いてあるが、dockerで実行しているのでそもそもコマンドが実行できない…
その後もsudoコマンドがなかったり、apt-getがなかったりで色々苦労したので、メモを残しておく。

インストール手順

dockerにrootでbashログインする。

docker exec -it --user root mynodered /bin/bash

パッケージマネージャapkを使ってlibdnsをインストールする。

apk update
apk apk add avahi-compat-libdns_sd avahi-dev

その後、Node-REDの「パレットの管理」からnode-red-node-discoveryがインストールできる。


追記

実行に失敗する

上記手順でインストールできて安心していたところ、discoverノードを使っても Error: dns service error: unknown となってしまい、実行に失敗してしまう。

対処方法 募集中

avahi-discover を実行してみて、エラーに関係しそうな以下パッケージをインストールしてみた

apk add py-gtk py-dbus dbus py-avahi py-gdbm py-gobject py-gobject3 gtk+3.0

が、

bash-5.0# avahi-discover
Traceback (most recent call last):
  File "/usr/bin/avahi-discover", line 304, in <module>
    main()
  File "/usr/bin/avahi-discover", line 297, in main
    main_window = Main_window()
  File "/usr/bin/avahi-discover", line 70, in __init__
    self.ui.add_from_file(path)
gi.repository.GLib.Error: g-file-error-quark: Failed to open file “/usr/share/avahi/interfaces/avahi-discover.ui”: No such file or directory (4)

の解決法がわからず断念。

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

docker-compose upを用いてDockerコンテナ上でDjangoを起動する

はじめに

docker-composeを用いてDockerコンテナ上でDjangoを起動させます。Macを使用します。

docker-composeを使う理由

Docknizeされたアプリケーションでは、データベースやミドルウェアのコンテナを分け、複数のコンテナでアプリケーションを構成することがあります。
それぞれのコンテナでDocker runを実行するのは面倒です。その際、docker-composeを用いると複数のコンテナを一つのコマンドで制御することが可能となります。
docker-composeはコンテナの振る舞いをdocker-compose.ymlに記載し制御します。

機能毎にコンテナを分ける構成はAWSのチュートリアルでも紹介されておりマイクロサービスと呼ばれています。
マイクロサービスを意識した構成の利点としてはアプリケーションの開発やテストが機能ごとの小さな単位で実施できる事です。
また、各コンテナを疎結合として設計すると機能毎に独立した開発ができるため、他チームの作業を意識することなく開発、デプロイ、スケールさせることが可能です。
私の経験したスタートアップの開発でも、マイクロサービスを意識した設計をしたことで、並行した開発や小さな機能単位での検証や、テストができ便利でした。

本記事はDjangoアプリをDocker上に構築しAWS Fargateにデプロイするプロジェクトの一部です。

Dcokerfileの作成

下準備として、Pipenvを用いて仮想環境にDjangoをインストールしてください。
詳細手順については別に記事を書いているのでリンクを参照してください。
https://qiita.com/keita_gawahara/items/487a635d226fb0705b13

プロジェクトのルートフォルダにDockerfileを作成します。

$ touch Dockerfile

Dockerfileに以下の内容を追記します。

FROM python:3.7-slim

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /

COPY Pipfile Pipfile.lock /
RUN pip install pipenv && pipenv install --system

COPY . /

docker buildコマンドでDockerfileをビルドします。

$ docker build .
Sending build context to Docker daemon  155.1kB
...
Step 7/7 : COPY . /
 ---> d239897dhfii9u”
Successfully built d26473003af
$touch docker-compose.yml

docker-compose.ymlに以下の内容を追記します。

version: '3.7'

services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    ports:
      - 8000:8000

docker-compose up コマンドを用いてコンテナを起動します。

$ docker-compose up
Creating network...
...
web_1  | System check identified no issues (0 silenced).
web_1  | July 13, 2019 - 16:47:03
web_1  | Django version 2.2.3, using settings 'hello_project.settings'
web_1  | Starting development server at http://0.0.0.0:8000/
web_1  | Quit the server with CONTROL-C.

http://127.0.0.1:8000 をブラウザで表示するとDjango welcome pageが表示されました。これでDocker上にDjangoを起動することができました。

CONTROL-Cで終了させたあとdocker-compose downを用いてコンテナを完全に停止させます。

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

dockerの使用でメモリが不足していたら(windows)

dockerで使用するメモリを変更する

アイコンを右クリックして、[settings]からresourcesのmemoryを上げる

Hyper-Vマネージャーで使用するメモリを変更する

Hyper-Vマネージャーを開いて、[設定]からメモリのRAM(R)の値を下げる

メモ用です

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

Docker-composeでbundle installしてるのにgemの内容反映されないんですけど

注意事項

完全に個人用メモです。公式情報でもなんでもありません。ググってこの記事に来てしまった方はお気をつけください。違っていたら即直しますのでガンガンご指摘ください。(個人用メモなので追加もしていきます)

そもそもbundle installしたらサーバー再起動しろや

なので、gemfile編集してbundle installしたら以下のコマンド打てば良い(環境によるけど)

docker-compose restart・・・コンテナ再起動

そしたらGemの内容が反映されます。

docker勉強不足だって、はっきりわかんだね。

イメージをビルドしなおしたりコンテナ削除したりしなくて良い

dockerを理解してないと以下のようなコマンドを打ち始めます

docker-compose build・・・イメージビルド

docker-compose up -d・・・コンテナ作成&起動

結果、コンテナが増えまくるわけです。(えぇ。。。)

コンテナやたら多いと思ったら原因これかよw(錯乱)

まあこの方法でも解決できるんですけどね。。

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

JetsonNano+Docker上のコンテナをホストマシンと同じセグメントに配置した時のメモ

Jetson Nano + Docker上のコンテナに、サーバを複数作ろうとしたときにコケたのでメモ。

難しく考えていたけど下の参考記事のおかげで結構簡単に解決できた。
というかたぶんこれがなかったら解決できなかった・・感謝しかない

環境

  • 開発キット:JetPack 4.3
  • OS: 18.04.3 LTS
  • Docker: 19.03.5

作りたいもの

DockerでJetson Nano上に複数サーバを構築して、あたかもホストマシンと同じセグメント上にいるかのように見せかけたいと思い、格闘しました。
単にポート変換でも行けると思うんですが、それだとあんまりイケてないなーと感じたので戦ってみました。

docker_image.png

ホストのネットワーク設定

まずはJetson Nanoのネットワーク(eth0)を確認します。

$ ifconfig
...
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.11  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 xxxx:xx:xxxx:xxxx:xxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x0<global>
        inet6 xxxxxxxxxxxxxxxxxxxx  prefixlen 64  scopeid 0x20<link>
        ether xxxxxxxxxxxxxxxxx  txqueuelen 1000  (Ethernet)
        RX packets 138314  bytes 105082864 (105.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 42142  bytes 3724547 (3.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 151  base 0x5000
...

Dockerのネットワーク設定(macvlan)

Dockerのnetworkコマンドでネットワークの一覧を確認できますが、インストール時に構成されるネットワーク設定では上の絵の環境は作成できません。

そこで、macvlanインターフェースを作成し、コンテナ起動時にそのネットワークを利用するよう設定します。

macvlanとは?

1つの物理NICに対して、仮想的なNICを複数作成することができる機能のようです。詳細は別の方の記事を参照。

Dockerのネットワーク作成

ホストのネットワーク設定をもとに、Docker createでネットワークを作成します。以下のコマンドは、Jetson Nanoのeth0上にmacvlanのネットワークを作成します。

# ネットワークの作成
$ docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 shared_nw
# 作成したネットワークの確認
$ docker network inspect shared_nw
[
    {
        "Name": "shared_nw",
        "Id": "552a5787314480bd94c43582f7a46968d7bea985b93d7a90f3923a859be32e73",
        "Created": "2020-01-24T00:31:59.856134246+09:00",
        "Scope": "local",
        "Driver": "macvlan",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24",
                    "Gateway": "192.168.1.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "parent": "eth0"
        },
        "Labels": {}
    }
]

Dockerコンテナの起動

ネットワークが作成できたので、あとはこのネットワークを利用したコンテナを起動します。
例ということで、素のApacheサーバを192.168.1.12に起動させます。

# Jetson Nanoと同じセグメント上のIP:192.168.1.12にWebサーバを起動
$ docker run -itd --net=shared_nw --ip=192.168.1.12 httpd

Webブラウザでアクセスすると、よく見る「It Works!」を見ることができます。

web_1.png

制限事項

この方法でコンテナを起動した際、制限としてJetson Nanoからコンテナへのアクセスができなくなります。
(今回の場合、例えばJetson NanoからApacheサーバへWebブラウザを使ってアクセスができません)
これはmacvlanの機能上回避する方法はないみたいです。

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

DockerのMySQLコンテナにSequelProで接続する

docker-compose.yaml

docker-compose.yaml
version: "3"
services:
    mysql:
        container_name: [MySQLのコンテナ名]
        image: mysql:5.7
        environment:
            MYSQL_DATABASE: [データベース名]
            MYSQL_USER: [ユーザー名]
            MYSQL_PASSWORD: [パスワード]
            MYSQL_ROOT_PASSWORD: [パスワード]
        ports:
            - "4306:3306"
        volumes:
            - mysql-data:/var/lib/mysql

ポート → "4306:3306"

おそらくほとんどの人が、ローカルでMySQLを起動していると思います。特別に設定していなければ、ローカルの3306番のポートがMySQLに使われていると思います。

なので、今回は、ローカルの4306番をMySQLコンテナの3306番と繋ぐように設定しています。

ターミナルからMySQLコンテナに入って確認する場合

MySQLコンテナに入ります。

ターミナル
$ docker exec -it [MySQLのコンテナ名] bash

コンテナに入れたら、MySQLに接続します。

ターミナル
$ mysql -u root -p

パスワードが要求されるので、入力して完了。

ターミナルから直接MySQLコンテナに接続したい場合

ターミナル
$ mysql -u root -p -h 127.0.0.1 -P 4306

注意点は2つあり、
・ホストはlocalhostを使用せず、IPアドレスを直接入力する
・ポート番号を指定する際は、大文字のPを使用する

SequelProで接続

docker-sequelpro.png

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

DockerでDBの設定が完了するまでアプリケーションのコンテナを立ち上げないようにしようとしたらハマった

はじめに

個人的にDjangoの環境をDockerで一発で整えられるようにしたいので、いろいろ試行錯誤しています。
GitHubリポジトリ

DockerでDBから何からまとめて管理しようとするときにはいくつかハマる箇所があると思いますが、そのひとつにDockerコンテナを立ち上げたときに、データベースの初期設定が完了してないのにアプリケーションコンテナがデータベースに接続しにいって失敗し、一生再起動し続けるというものがあります。

一見、アプリケーションコンテナ側の設定でdepends_onにデータベースを入れとけば良さそうですが、depends_onは起動順序のみを保証し、コンテナ内部の処理は全く感知してくれないので、自力で起動制御する必要があります。
参考:http://docs.docker.jp/compose/startup-order.html

その対策を行う上でいくつかハマったところがあったのでご紹介します。

環境

  • Django
  • MariaDB
  • nginx(今回は関係ない)
  • gunicorn(今回は関係ない)

ハマったこと

  1. Debianのリポジトリからmysql-clientが消え去っていた
  2. bashでmysqlコマンドを打つときにダブルクォーテーションをうまく使えなかった
  3. docker-composeのentrypointで、wait-for-it.shを実行するとき、引数でコマンドを渡そうと思ったらうまく渡らなかった

基本的な戦略

  • Djangoコンテナの起動時にshellscriptでMariaDBに対して疎通確認を行う
  • まだ繋がらないなら待つ
  • 繋がったらDjangoのコマンド実行!

1. Debianのリポジトリからmysql-clientが消え去っていた

文字通りです。最初はDjango用のコンテナにmysql-clientをインストールしてmysqlコマンドで疎通確認をしようとしていました。

Dockerfile
RUN apt-get update && apt-get install -y mysql-client

するとこんなエラーが、、、

E: Package 'mysql-client' has no installation candidate

調べてみるとDebianのリポジトリからmysql-clientが消えていました?
Debianリポジトリ:https://packages.debian.org/stable/database/
代わりにdefault-mysql-clientとmariadb-clientができていたので、mariadb-clientをインストールすることにしました。

Dockerfile
RUN apt-get update && apt-get install -y mariadb-client

2. bashでmysqlコマンドを打つときにダブルクォーテーションをうまく使えなかった

Dockerの公式サイトをみると、DBの準備が整うまで待つにはこうするといいよ!と書かれていました。

#!/bin/bash

set -e

host="$1"
shift
cmd="$@"

until psql -h "$host" -U "postgres" -c '\l'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"
exec $cmd

なのでPostgreSQLをMariaDB用に変えて以下のようにしていました。

wait-for-mariadb.sh
#!/bin/bash

set -e
. ./mariadb.env #MariaDB用の環境ファイル
host="$1"
shift
cmd="$@"

until mysql -h "$host" -u "$MYSQL_USER" -p "$MYSQL_PASSWORD" -e "show databases;" "$MYSQL_DATABASE" ; do
    >&2 echo "MariaDB is unavailable -sleeping"
    sleep 1
done

>&2 echo "MariaDB is up -executing command"
exec $cmd

まあこれが普通に間違いなんですが、、、
問題はuntilの行で、実際には以下のように実行されます(変数には適当に入れてます)。

wait-for-mariadb.sh
mysql -h sample -u sampleuser -p samplepassword -e "show databases;" sampledatabase

mysqlのコマンドでは、-optionなら引数をクォーテーションで囲う、--optionなら=でつなぐように書くので、これだと正しく実行されません。
参考:https://mariadb.com/kb/en/mysql-command-line-client/

正しくは以下のように実行されなければいけません。

wait-for-mariadb.sh
mysql -h "sample" -u "sampleuser" -p "samplepassword" -e "show databases;" sampledatabase

これで小一時間くらいハマり、原因がやっとわかったので、ダブルクォーテーションをエスケープすればいいと考えて、以下のように変えてみました。

wait-for-mariadb.sh
~略~
until mysql -h "\"$host\"" -u "\"$MYSQL_USER\"" -p "\"$MYSQL_PASSWORD\"" -e "show databases;" "$MYSQL_DATABASE" ; do
~略~

しかしこれでもうまくいかなかったので(だれか教えてください泣)、結局以下のようにしました。

wait-for-mariadb.sh
~略~
until mysql --host="$host" --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" -e "show databases;"  "$MYSQL_DATABASE" ; do
~略~

3. docker-composeのentrypointで、wait-for-xxx.shを実行するとき、引数でコマンドを渡そうと思ったらうまく渡らなかった

最初、docker-composeの設定を以下のようにしていました。

docker-compose.yml
version: '3'
services:
    django:
        ~略~
        entrypoint: ./wait-for-mariadb.sh mariadb "python manage.py migrate && gunicorn my_docker_django_project.wsgi -b 0.0.0.0:3031"

これで2番目の引数にコマンドが渡って、それをそのまま実行すればいいと思ってました。

wait-for-mariadb.sh
shift
cmd="$@"
exec $cmd

するとこんなエラーが?

django_1   | python manage.py migrate && gunicorn my_docker_django_project.wsgi -b 0.0.0.0:3031
django_1   | usage: manage.py migrate [-h] [--noinput] [--database DATABASE] [--fake]
django_1   |                          [--fake-initial] [--plan] [--run-syncdb] [--version]
django_1   |                          [-v {0,1,2,3}] [--settings SETTINGS]
django_1   |                          [--pythonpath PYTHONPATH] [--traceback] [--no-color]
django_1   |                          [--force-color] [--skip-checks]
django_1   |                          [app_label] [migration_name]
django_1   | manage.py migrate: error: unrecognized arguments: my_docker_django_project.wsgi -b 0.0.0.0:3031

どうやら&&以降のgunicornコマンドがpython manage.py migrateの引数だと思われてるようです。。。
migrateしないとアプリケーションサーバは起動してほしくないので、結局以下のようにshellscriptにベタ書きすることにしました。

wait-for-mariadb.sh
#!/bin/bash

set -e
. ./mariadb.env

host="$1"
shift
cmd="$@"

until mysql --host="$host" --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" -e "show databases;"  "$MYSQL_DATABASE" ; do
    >&2 echo "MariaDB is unavailable -sleeping"
    sleep 1
done

>&2 echo "MariaDB is up -executing command"
python manage.py migrate && gunicorn my_docker_django_project.wsgi -b 0.0.0.0:3031

exec $cmd

最後に

よかったら定期的にGitHub更新していくので見ていってください:)
https://github.com/keii1111/my_docker_django

参考情報

Compose の起動順番を制御

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

Docker + rails + mysqlで開発環境を構築

はじめに

今回は、railsの開発環境をDocker+rails+mysqlで用意します。

構成

構成はローカルのMacにDockerを立て、webとdbコンテナをdocker-composeで管理します。

スクリーンショット 2020-01-25 10.06.34.png

開発環境

Docker 19.03.5
Ruby 2.6.5
Rails 5.2.4
MySQL 5.7.29

前提条件

Macを利用

Docker Desktopをインストール

まずは、ローカルのMacにDocker Desktopをインストールします。

https://www.docker.com/get-started

スクリーンショット 2020-01-22 0.09.31.png

「Download Desktop and Take a Tutorial」のボタンをクリックすると画面が遷移し、
アカウントがある人はログイン、ない人は「Sign Up」を押してアカウントを作成します。

スクリーンショット 2020-01-22 0.14.29.png

アカウント作成後、ログインし 「Get started with Docker Desktop」を押すと画面が遷移するので「Download Docker Desktop for Mac」を押しダウンロードします。

スクリーンショット 2020-01-22 0.16.16.png

ダウンロード完了後、インストールします。
install後、Macのターミナルにてdocker versionと打ち、バージョンが出れば無事インストールは完了です。

$ docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:22:34 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea
  Built:            Wed Nov 13 07:29:19 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

web(rails)コンテナの構築

開発を行うために任意の作業ディレクトリを作成します。

$ mkdir task_app/
$ cd task_app 

Gemfileの準備

オプションでディレクトリのマウントを指定していることで、Docker環境で作成されたGemfileがローカル環境に作成されます。

$ docker run --rm -v `pwd`:/task_app -w /task_app ruby:2.6 bundle init
Unable to find image 'ruby:2.6' locally
2.6: Pulling from library/ruby
8f0fdd3eaac0: Pull complete 
d918eaefd9de: Pull complete 
43bf3e3107f5: Pull complete 
27622921edb2: Pull complete 
dcfa0aa1ae2c: Pull complete 
0e1f1dc37f65: Pull complete 
c76a82442849: Pull complete 
5161fd3df3c4: Pull complete 
Digest: sha256:f38fce2b70ba23e90d6397995bea8419b86dd3f20b73846681adb52c63c0b002
Status: Downloaded newer image for ruby:2.6
Writing new Gemfile to /task_app/Gemfile      

Gemfileがローカルに作成されますので、railsのバージョンを指定します。
利用したいバージョンに合わせて適宜修正してください。

$ vi Gemfile

# gem "rails"
gem 'rails', '~> 5.2.3'

Dockerイメージの作成

rails環境のDockerイメージを作成します。

Dockerfileの作成 → ビルド → Dockerイメージ(task_app)

※Dockerfileはないので新規作成します。

$ vi Dockerfile

FROM ruby:2.6
WORKDIR /task_app
COPY Gemfile /task_app/Gemfile
RUN bundle install

$ docker build -t task_app .

Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM ruby:2.6
 ---> a161c3e3dda8
Step 2/4 : WORKDIR /task_app
 ---> Running in a6b5dec7f0ed
Removing intermediate container a6b5dec7f0ed
 ---> 16367607e3e5
Step 3/4 : COPY Gemfile /task_app/Gemfile
 ---> 99de34366eef
Step 4/4 : RUN bundle install
 ---> Running in 8839dbf87256
Fetching gem metadata from https://rubygems.org/.............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Fetching rake 13.0.1
Fetching rails 5.2.4.1
Installing rails 5.2.4.1
Bundle complete! 1 Gemfile dependency, 41 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
Post-install message from i18n:

HEADS UP! i18n 1.1 changed fallbacks to exclude default locale.
But that may break your application.

If you are upgrading your Rails application from an older version of Rails:
Please check your Rails app for 'config.i18n.fallbacks = true'.
If you're using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be
'config.i18n.fallbacks = [I18n.default_locale]'.
If not, fallbacks will be broken in your app by I18n 1.1.x.
If you are starting a NEW Rails application, you can ignore this notice.

For more info see:
https://github.com/svenfuchs/i18n/releases/tag/v1.1.0

Removing intermediate container 8839dbf87256
 ---> 89e179509cba
Successfully built 89e179509cba
Successfully tagged task_app:latest

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
task_app            latest              89e179509cba        About a minute ago   926MB

作成されてますね。

Railsアプリの作成

作成したDockerイメージ(task_app)を利用してrails newを実行し、Railsアプリを作成します。

$ docker run --rm -v `pwd`:/task_app task_app rails new . -B --database=mysql

       exist  
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
    conflict  Gemfile
Overwrite /task_app/Gemfile? (enter "h" for help) [Ynaqdhm] 
       force  Gemfile
         run  git init from "."
Initialized empty Git repository in /task_app/.git/
      create  package.json
      create  app
      create  app/assets/config/manifest.js
      create  app/assets/javascripts/application.js
      create  app/assets/javascripts/cable.js
      create  app/assets/stylesheets/application.css
      create  app/channels/application_cable/channel.rb
      create  tmp/storage
      create  tmp/storage/.keep
      remove  config/initializers/cors.rb
      remove  config/initializers/new_framework_defaults_5_2.rb

Railsからデータベースへ接続するためのdatabase.ymlファイルが作成されますので修正します。

$ vi config/database.yml 

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 
  username: root
  password: xxxxxxx #追加: MysqlのMYSQL_ROOT_PASSWORDと同じ値
  host: db  #追加: MySQLのコンテナ名と同じ値。この後構築します。

docker-compose.ymlにwebコンテナを追加します。

Railsが起動するDockerイメージを作成します。

$ vi Dockerfile 

FROM ruby:2.6
RUN apt-get update -qq && apt-get install -y nodejs #追加
WORKDIR /task_app
COPY Gemfile /task_app/Gemfile
RUN bundle install
CMD ["rails", "server", "-b", "0.0.0.0"] #追加

RailsアプリはDocker Composeを利用して起動させます。
docker-compose.ymlを作成し、webコンテナの起動設定をdocker-compose.ymlに記載します。

# vi docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
      - '3000:3000'
    volumes:
      - .:/task_app

コンテナを停止するとmysqlのデータが消えてしまうため、データ永続化のため、volumesを入れています。

Dockerfileを編集したのでdocker-composeコマンドでDockerイメージをビルドします。

$ docker-compose build
Building web
Step 1/6 : FROM ruby:2.6
 ---> a161c3e3dda8
Step 2/6 : RUN apt-get update -qq && apt-get install -y nodejs
 ---> Running in c287be3cb98f
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  libc-ares2 libnode64 libuv1 nodejs-doc
Suggested packages:
  npm
The following NEW packages will be installed:
  libc-ares2 libnode64 libuv1 nodejs nodejs-doc
0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
Need to get 6753 kB of archives.
After this operation, 30.4 MB of additional disk space will be used.

* For more details, please refer to the Sass blog:
  https://sass-lang.com/blog/posts/7828841

Removing intermediate container 711351e6bba5
 ---> 5486636e708a
Step 6/6 : CMD ["rails", "server", "-b", "0.0.0.0"]
 ---> Running in 82d851651892
Removing intermediate container 82d851651892
 ---> a895f6cec871
Successfully built a895f6cec871
Successfully tagged task_app_web:latest

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

task_app_web        latest              a895f6cec871        8 minutes ago       1.02GB
task_app            latest              89e179509cba        About an hour ago   926MB

ここまででweb(rails)コンテナの構築が完了です。

db(mysql)コンテナの構築

depends_onにdbコンテナを追加します。
※depends_onはwebとDBコンテナの作成順序と依存関係を定義します。

# vi docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
      - '3000:3000'
    volumes:
      - .:/task_app
    depends_on: #追加
      - db  #追加
  db:  #追加
    image: mysql:5.7  #追加
    volumes:  #追加
      - ./mysql:/var/lib/mysql  #追加
    environment:  #追加
      MYSQL_ROOT_PASSWORD: 'xxxxx'  #追加: Railsのpasswordと同じ値

一旦、Dockerコンテナを起動します。

$ docker-compose up

ただし、dbコンテナはありますがRuby on Railsで利用するデータベースがないので作成します。

$ docker-compose exec web rake db:create
Created database 'task_app_development'
Created database 'task_app_test'

$ docker-compose exec db mysql -uroot -pxxxxx

mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 7

Server version: 5.7.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| mysql                |
| performance_schema   |
| sys                  |
| task_app_development | ← 作成
| task_app_test        |
+----------------------+
6 rows in set (0.00 sec)
mysql>

データベースも作成できましたので、db(mysql)コンテナの準備も完了です。

ブラウザでアクセス

http://localhost:3000/ でアクセスして確認します。

スクリーンショット 2020-01-19 23.09.22.png

見慣れた画面が出ましたね!

まとめ

Docker環境で簡単にrailsの開発環境が用意できました!

ちなみにDockerのキャラクターは、Moby(モビー)って言うらしいです。

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

ROSでRealSenseをまじめに動かしてみようとしたら環境設定が大変だった

経緯

某書籍に影響されて「Jetson Nano 超入門」を読んでSLAMやってみたにあるようにSLAMをやってみたら、一年前には困難だったあれやこれやが解決されて、スムーズにSLAMが動かせました。
調子に乗ってROSを勉強してラジコンも動かそう。
DonkeyCarからステップアップ!
と思ったら、継続的に開発しようとすると環境設定のほうが大変だったのでまとめておきます。

Windows10Pro

NVIDIAのGTX1660Tiが入ったWindows10を使用します。
Docker DeskTopを動かすために、Proにアップグレードしています。
メインの開発マシンはこれになります。

Jetson-nano

Jetson-nanoで動かします。
Dockerを使わずに環境を整えています。
JetPack4.2.2を使います。OpenCV4.1ではROSの中に動かせないものがあったので、少々古いバージョンを使用しています。
ROSやRealSenseのドライバなどもインストール済み。
「Jetson Nano 超入門」を読んでSLAMやってみたを参照。

エディタ(VSCode)

最近は仕事でも使っているので、エディタはこれ。
その時々で必要なプラグインを突っ込みながら作業をしています。
Jetson-nanoにもPCにも入れてあります。
Jetson-nanoに入れるときは、配布されているビルド済みバイナリを使わせていただきました。

ROSでRealSenseを真面目に動かしてみる3を参照。

GitHub

バックアップやJetson-nanoとPC間のソースコードの交換を考えると、GitHubに入れておくのが一番楽です。
VSCodeのプラグインで色々入れて使いやすくしておきます。

設定はROSでRealSenseを真面目に動かしてみる3を参照。

Git関連のプラグインはGitHistoryとGitLensを入れておきました。

Docker+ROS環境

Jetson-nanoにつないだ小さなディスプレイで開発するのが大変になってきたので、Windows10をProにアップグレードしてDocker DeskTopを使うことにしました。
記録を残していたら色々長くなりすぎたので、記事を分離しました。

Docker+ROSの環境をWindows10PROで整える

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

【Docker】TypeError: bytes-like object is required, not 'str'

概要

docker-compose up -d を実行すると以下のエラーが発生する。

TypeError: bytes-like object is required, not 'str'

バージョン
Docker: 19.03.5
docker-compose: 1.25.1

原因

コンテナ起動時にスローされるエラーの形式が変わったため出るエラーのようです。
docker-composeのバージョン1.25.0と1.25.1で確認されていました。

解決方法

docker-composeのアップグレードを行なったら解決しました。

$ curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

devise 導入直後のエラー(docker)

概要

[Rails] deviseの使い方(rails4版)
このサイト↑に沿ってdevise導入し、そこでこのエラーが発生しました。
その対処法を記載をしています。

エラーの内容

スクリーンショット 2019-12-26 23.25.40.png

ルーティングエラー
Rails routes で調べても特に問題なさそう・・
Rails: deviseをインストールした後のエラー
これ↑を実装したが、エラー治らず・・・

対処法

問題は恐らくdockerなのでは?となり、とりあえず
docker再起動→ローカルを再起動

docker再起動方法
右上にあるクジラを押す→restart 完了!!
スクリーンショット 2020-01-25 14.21.04.png

それでもう一度localhostをリロードすると治りました。
お疲れさまでした!!

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

docker-composeの大切な変数には環境変数を設定しよう!

はじめに

こんにちは。早速ですが、docker-composeにDBのimageを書いてる人...。
環境変数は使用していますか??

個人が作成しているポートフォリオや個人のWebアプリケーションなどでGitでバージョン管理されている方が多いと思いますが、docker-composeに『直で大切な情報を載せるはあまり良くはない...』ですよね。

そんな時に環境変数を用いて、大切な情報はgitignoreしつつ、一括で管理してしましましょう!!

ではdocker-composeにて楽々できる環境変数の設定の仕方をご紹介します。

ディレクトリの構成図を見ていく

ファイルは2つのみの単純な構成図ですが、載せておきます。笑

ディレクトリ構成図
sample-project
      ├ .env # 環境変数を設定するファイル
      └ docker-compose.yml

docker-composeと環境変数の設定ファイル.envは同ディレクトリに置かなければいけません。

まず.envの中身を書く

今回は僕がPostgreSQLを使っているので、PostgreSQLで書きますが、設定したい変数を書けばいいだけなので、簡単にカスタムできます。

注意点

必ずファイル名は.envという名前にしてください。違う名前でも実装できますが少し設定方法が変わってきてしまいます...
それについては後半で紹介しますね(/・ω・)/ コチラで後半まで飛べます

.env
POSTGRES_USER=postgres
POSTGRES_PASSWORD=passworddayo

docker-composeの中身を書く

こんなDBのコンテナのみで使うことなど無いかもしれませんが、余計な情報はなしで書きます。

docker-compose.yml
version: "3"
services: 
    db:
        image: postgres
        environment:
            - POSTGRES_USER
            - POSTGRES_PASSWORD
        ports:
            - "5432:5432"

たったこれだけで実装可能です。

ですがここにたどり着くまで様々な落とし穴があったりします。笑

僕的落とされたポイント

その1→ファイル名は.envにする件について

どうやらdocker-composeの標準装備で同ディレクトリのenvファイルで定義したものを参照してくれるみたいです。公式ドキュメント*1に書かれていことが少なすぎて、『情報量!!!』と叫びましたね。*1 docker docsへはコチラ

.envを指定しない方法

これは簡単に言うと、任意のファイル名を指定して、そのファイル内の定義したもの全てをenvironmentに入れるパターンです。
この方法については、他の方がまとめてくれている記事を紹介します*2↓
*2 docker-composeでenv_fileとenvironmentを同時に設定する際の注意点(Qiita)

その2→environmentに書くのそれだけ?問題

docker-compose.ymlを見ていただくと、evironmentにPOSTGRES_USERとPOSTGRES_PASSWORDを書いているだけですよね。笑
元々PostgreSQLの方でevironmentに設定しなければいけない変数が決まっているのですが、.envで設定した名前をdocker-compose.ymlで代入するのではなく、直でdocker-compose.ymlに書いてるのです。笑

ですがその方が『環境変数が個別に直感的に設定できる』という意味で、ファイル名を指定してファイル全体を代入するのではなく、変数を指定するやり方が僕的には良いと思ったので、.envの設定方法を紹介いたしました。

さいごに

最後まで読んでいただきありがとうございました。
間違っている点やシンプルな感想などでもございましたら、お気軽にコメントください!!

実はDjangoにて環境変数を設定する方法をメインに書きたかったのですが、Dockerありきの方法になってしまうんです。なのでそれはまた今度ということで。

DjangoやAWS,Dockerなどのバックエンドを勉強していたり、機械学習にも少し手を出しているわたくしの姿を発信しているTwitterがあるので、もし良ければ...@heacet43

参考文献

*1 Declare default environment variables in file | Docker Documentation [https://docs.docker.com/compose/env-file/]
*2 docker-composeでenv_fileとenvironmentを同時に設定する際の注意点 [https://qiita.com/zawawahoge/items/eeaf2833583949524023]

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

docker-compose イメージ サイズ確認方法

概要

筆者は個人開発や学習等でGCP(GCE)を利用しています。
無料枠で使用していますが、GCEにGrowiを立てようとしたところ、つまづきました。
具体的にはドキュメントを参考にdocker-compose upしたところシェルが戻ってこなくなりました。

ROMが足りていないと考え、
正常にGrowi構築できた環境を用意し、Growi構築にあたりROM要件の確認をしました。
この方法を記事にしました。

Growiドキュメント

https://docs.growi.org/ja/guide/

実行環境

OS

> sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.6

使用しているシェル

> echo "$SHELL"
/bin/bash

dockerバージョン

> docker --version
Docker version 19.03.2, build 6a30dfc

docker-composeバージョン

> docker-compose --version
docker-compose version 1.24.1, build 4667896b

確認方法

> docker-compose images
      Container             Repository         Tag       Image Id      Size 
----------------------------------------------------------------------------
growi_app_1             growi_app             latest   bb6255fd4f73   244 MB
growi_elasticsearch_1   growi_elasticsearch   latest   c6d9fe3d94b0   820 MB
growi_mongo_1           mongo                 3.6      e7f4a190b0a9   417 MB

結果

1.481GB必要とわかりました。

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

【rails】SystemSpec(capybara) on dockerでつまずいた時のメモ

Capyabaraの設定方法

https://qiita.com/ngron/items/f61b8635b4d67f666d75
上の記事をもとに設定

解決したかったこと

Selenium::WebDriver::Error::UnknownErrorを解決して、systemtestを行う

失敗例

Gemfile.
group :test do
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
end

成功例

Gemfile.
group :test do
  gem 'capybara'
  gem 'selenium-webdriver'
end

行ったこと

1、gem(capybara、selenium-webdriver)のバージョン固定を外す。
gemのバージョンを固定しているといつまでたってもエラー(Selenium::WebDriver::Error::UnknownError)が解決できない。
2、docker-compose build

参考記事

Rails + Selenium + DockerでSystemSpecの環境構築
https://qiita.com/ngron/items/f61b8635b4d67f666d75

ありがとうございます!!

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

goでGRPCのSimpleRPCやってみた(Unary RPC)

スクリーンショット 2020-01-25 12.11.22.png

goでgrpcのSimpleRPCを実行してみました!
この記事内容を上から行えば、動く環境が作れます。

grpc

・SimpleRPCとは
一つのデータを受け取って、一つのデータを返す

docker環境

・フォルダ構成
以下のフォルダを想定しています。

./infrastructure/docker/go-grpc/Dockerfile
./infrastructure/docker/docker-compose.yml

・フォルダを作成します。

mkdir -p ./infrastructure/docker/go-grpc
cd ./infrastructure/docker
touch docker-compose.yml ./go-grpc/Dockerfile

作成されました。
スクリーンショット 2020-01-25 12.01.00.png

・Dockerfile

FROM golang:1.13-stretch

SHELL ["/bin/bash", "-c"]
RUN apt update && apt-get install -y vim unzip

# install protc
WORKDIR /protoc
RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.2/protoc-3.11.2-linux-x86_64.zip
RUN unzip protoc-3.11.2-linux-x86_64.zip
RUN ln -s /protoc/bin/protoc /bin/protoc

# golang
WORKDIR /go-grpc
ENV GO111MODULE on
RUN go get -u github.com/golang/protobuf/protoc-gen-go

・docker-compose.yml

version: "3.7"
services:
  go-grpc:
    build:
      context: ./go-grpc/
      dockerfile: Dockerfile
    container_name: "go-grpc"
    volumes:
      - ../../:/go-grpc
    tty: true
    privileged: true

・環境に入る
以下のコマンドでdockerコンテナの中に入れます。

cd ./infrastructure/docker
docker-compose up -d
docker-compose exec go-grpc bash

protoの作成

以下dockerコンテナに入って状態で作業します。
コンパイラである「protoc」は、dockerコンテナにインストールしてあります。

足算を想定したprotoです。

mkdir ./proto
touch ./proto/calc.proto

・calc.proto

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.simple";
option java_outer_classname = "SimpleProto";

// package名
package calc;

// 上の4つのパターンをここで指定する。
service Calc {
  rpc Sum (SumRequest) returns (SumReply) {}
}

// リクエストで送る値。「1、2」はそのデータの番号。
message SumRequest {
  int32 a = 1;
  int32 b = 2;
}

// レスポンスで送る値
message SumReply {
  string message = 1;
}

・上の「.protoファイル」を、goファイルにコンパイルします。
以下のコマンドで、./pb/calcフォルダに「calc.pb.go」が自動生成されます。

protoc --proto_path ./proto --go_out=plugins=grpc:./pb/calc calc.proto

「calc.pb.go」が生成されました。

スクリーンショット 2020-01-25 12.00.10.png

goで実行

・以下のコマンドで、gomoduleを初期設定をします。

go mod init grpc-sample

以下のファイルが作成されました。
スクリーンショット 2020-01-25 11.58.16.png

「受け取る側のサーバー」と「送る側のクライアント」の2つの実行ファイルを作成します。

mkdir server client
touch ./server/main.go ./client/main.go

・./server/main.go

package main

import (
    "context"
    "fmt"
    "log"
    "net"

    pb "grpc-sample/pb/calc"

    "google.golang.org/grpc"
)

const (
    port = ":50051"
)

type server struct {
    pb.UnimplementedCalcServer
}

func (s *server) Sum(ctx context.Context, in *pb.SumRequest) (*pb.SumReply, error) {
    a := in.GetA()
    b := in.GetB()
    log.Printf("%v, %v", a, b)
    reply := fmt.Sprintf("%d + %d = %d", a, b, a+b)
    return &pb.SumReply{Message: reply}, nil
}

func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterCalcServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

・./client/main.go

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "github.com/pkg/errors"

    pb "grpc-sample/pb/calc"

    "google.golang.org/grpc"
)

func getAdress() string {
    const (
        host = "localhost"
        port = "50051"
    )
    return fmt.Sprintf("%s:%s", host, port)
}

func exec(a, b int32) error {
    address := getAdress()
    conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {
        return errors.Wrap(err, "did not connect")
    }
    defer conn.Close()
    client := pb.NewCalcClient(conn)

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    reply, err := client.Sum(ctx, &pb.SumRequest{
        A: a,
        B: b,
    })
    if err != nil {
        return errors.Wrap(err, "could not greet")
    }
    log.Printf("サーバからの受け取り\n %s", reply.GetMessage())
    return nil
}

func main() {
    exec(300, 500)
}

・サーバを実行します。

go run server/main.go

これでサーバが立ったので、クライアントからデータを送ります。

go run client/main.go

クライアント側の表示
300, 500という数字を送ったので、800という数字がサーバから返ってきました。
スクリーンショット 2020-01-25 12.05.24.png

サーバ側の表示
クライアントから、300と500という値を受け取りました。
スクリーンショット 2020-01-25 12.05.38.png

この下に、コードの説明も書きます。

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

goでGRPCのUnary RPCsやってみた(SimpleRPC)

スクリーンショット 2020-01-25 12.46.05.png

goでgrpcを実装してみました。
今回はまず、Unary RPCs(SimpleRPC)をやります!
他記事で残り3つの方式もやります。
この記事内容を上から行えば、dockerで動く環境が作れます。
dockerで実装してる記事は少ないはず。

grpcの4つの通信方式

StreamingとUnaryの組み合わせのため4つある。
詳しくは公式を参考

・Unary RPC
一つのデータを受け取って、一つのデータを返す。
動きはよくあるrestAPIと同じ。
用途:サーバ間通信、API。
(Unary : Unary)

・Server streaming RPC
サーバがクライアントに複数のリクエストを送る。
用途:サーバから任意のタイミングでクライアントに通知させたい時など。
(Streaming : Unary)

・Client streaming RPC
クライアントがサーバに複数のリクエストを送る。
用途:データアップロードや、クライアントから多くのデータを送る場合。
(Unary : Streaming)

・Bidirectional streaming RPC
双方向でデータのやりとりをする。
用途:チャットやオンライン対戦など。
(Streaming : Streaming)

環境構築

docker環境

・フォルダ構成
以下のフォルダを想定しています。

./infrastructure/docker/go-grpc/Dockerfile
./infrastructure/docker/docker-compose.yml

・フォルダを作成します。

mkdir -p ./infrastructure/docker/go-grpc
cd ./infrastructure/docker
touch docker-compose.yml ./go-grpc/Dockerfile

作成されました。
スクリーンショット 2020-01-25 12.01.00.png

・Dockerfile

FROM golang:1.13-stretch

SHELL ["/bin/bash", "-c"]
RUN apt update && apt-get install -y vim unzip

# install protc
WORKDIR /protoc
RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.2/protoc-3.11.2-linux-x86_64.zip
RUN unzip protoc-3.11.2-linux-x86_64.zip
RUN ln -s /protoc/bin/protoc /bin/protoc

# golang
WORKDIR /go-grpc
ENV GO111MODULE on
RUN go get -u github.com/golang/protobuf/protoc-gen-go

・docker-compose.yml

version: "3.7"
services:
  go-grpc:
    build:
      context: ./go-grpc/
      dockerfile: Dockerfile
    container_name: "go-grpc"
    volumes:
      - ../../:/go-grpc
    tty: true
    privileged: true

・環境に入る
以下のコマンドでdockerコンテナの中に入ります!

cd ./infrastructure/docker
docker-compose up -d
docker-compose exec go-grpc bash

実装

2つの数字を送ったら足算して返すサーバとクライアントを作成します。

protoの作成

以下dockerコンテナに入った状態で作業します。
コンパイラである「protoc」は、dockerコンテナにインストールしてあります。

足算を想定したprotoです。

mkdir ./proto
touch ./proto/calc.proto

・calc.proto

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.simple";
option java_outer_classname = "SimpleProto";

// package名
package calc;

// 上の4つのパターンをここで指定する。
service Calc {
  rpc Sum (SumRequest) returns (SumReply) {}
}

// リクエストで送る値。「1、2」はそのデータの番号。
message SumRequest {
  int32 a = 1;
  int32 b = 2;
}

// レスポンスで送る値
message SumReply {
  string message = 1;
}

・上の「.protoファイル」を、goファイルにコンパイルします。
以下のコマンドで、./pb/calcフォルダに「calc.pb.go」が自動生成されます。

protoc --proto_path ./proto --go_out=plugins=grpc:./pb/calc calc.proto

「calc.pb.go」が生成されました。

スクリーンショット 2020-01-25 12.00.10.png

goで実行

・以下のコマンドで、gomoduleを初期設定をします。

go mod init grpc-sample

以下のファイルが作成されました。
スクリーンショット 2020-01-25 11.58.16.png

「受け取る側のサーバー」と「送る側のクライアント」の2つの実行ファイルを作成します。

mkdir server client
touch ./server/main.go ./client/main.go

・./server/main.go

package main

import (
    "context"
    "fmt"
    "log"
    "net"

    pb "grpc-sample/pb/calc"

    "google.golang.org/grpc"
)

const (
    port = ":50051"
)

type server struct {
    pb.UnimplementedCalcServer
}

func (s *server) Sum(ctx context.Context, in *pb.SumRequest) (*pb.SumReply, error) {
    a := in.GetA()
    b := in.GetB()
    log.Printf("%v, %v", a, b)
    reply := fmt.Sprintf("%d + %d = %d", a, b, a+b)
    return &pb.SumReply{Message: reply}, nil
}

func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterCalcServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("サーバ起動失敗: %v", err)
    }
}

・./client/main.go

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "github.com/pkg/errors"

    pb "grpc-sample/pb/calc"

    "google.golang.org/grpc"
)

func getAdress() string {
    const (
        host = "localhost"
        port = "50051"
    )
    return fmt.Sprintf("%s:%s", host, port)
}

func exec(a, b int32) error {
    address := getAdress()
    conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {
        return errors.Wrap(err, "コネクションエラー")
    }
    defer conn.Close()
    client := pb.NewCalcClient(conn)

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    reply, err := client.Sum(ctx, &pb.SumRequest{
        A: a,
        B: b,
    })
    if err != nil {
        return errors.Wrap(err, "受取り失敗")
    }
    log.Printf("サーバからの受け取り\n %s", reply.GetMessage())
    return nil
}

func main() {
    exec(300, 500)
}

・サーバを実行します。

go run server/main.go

これでサーバが立ったので、クライアントからデータを送ります。

go run client/main.go

サーバ側の表示
上のコマンドを実行したので、
クライアントから、300と500という値を受け取りました。
スクリーンショット 2020-01-25 12.05.38.png

クライアント側の表示
300, 500という数字を送ったので、800という数字がサーバから返ってきました。
スクリーンショット 2020-01-25 12.05.24.png

1リクエスト1レスポンスのサーバとクライアンを動かすことができました。
これで、「めっちゃ負荷が高い処理をする機能」があった場合とかにサーバを分割できたりもする。

感想

残りの3つの通信方式もやります。
サーバ間通信やunityなどで使ってみたい。

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

dockerでmysqlコンテナを立てる時の設定 my.cnf

dockerでmysqlコンテナを立てる時の設定 my.cnf

mysqlのconf について学ぶ。

ざっと出すとこんな感じ

[mysqld]
skip-host-cache
skip-name-resolve
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4

mysql server, clientの設定がそれぞれ書いてある。

server 設定 mysqld

skip-host-cache

[https://www.na3.jp/entry/20140205/p1:embed:cite]

[https://dev.mysql.com/doc/refman/5.6/ja/host-cache.html:title]

これはDNSのキャッシュ戦略機能をオフにする宣言。

ipアドレスから引かれたホスト名がすでにキャッシュされている時にそれを使い回す機能があるそう。

docker-composeでコンテナを立てる場合、docker networkがよしなにprivate ipを当ててくれるからわざわざdnsで名前解決しなくていい。

skip-name-resolve

[http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0028:embed:cite]

[https://dev.mysql.com/doc/refman/5.6/ja/host-cache.html:title]

これも同様にDNSの名前引きを飛ばす設定。

character-set-server=utf8mb4

mb4 がポイント。

mysqlのutf8は1-3byte文字しか扱えない。

iOS, Androidの絵文字, 最近追加された難しい日本語や中国語は4byteあるためこれらの文字列を格納しようとするとエラーが起きる。

そこで utf8mb4を使う。

[https://flhouse.co.jp/article/2/utf8mb4:embed:cite]

clientも同じ

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

nuxt dockerで使う個人的な設定

Docker

npm install -g create-nuxt-app
npx create-nuxt-app プロジェクト名

ポート変更

package.json

{
  "name": "vue",
  "version": "0.1.0",
  "private": true,
  "scripts": {
+    "dev": "PORT=8080 nuxt",
    ....
  },

nuxt-config.js

module.exports = {
  server: {
+    port: 8080, // デフォルト: 3000
+    host: '0.0.0.0' // デフォルト: localhost
  },

ホットリロード

nuxt-config.js

module.exports = {
  ...
+  watchers: {
+    webpack: {
+        poll: true
+    }
  }

SPAモード

nuxt-config.js

module.exports = {
+  mode: 'spa',

レイアウトの変更

xxx.vue内
使用するレイアウトは layouts/testlo.vue

export default {
+  layout: 'testlo',
  components: {
    AppLogo
  }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EmacsとDockerで簡単LaTeX環境構築

TL;DR

(use-package yatex                                                                                   
  :mode ("\\.tex\\'" . yatex-mode)                                                                   
  :config                                                                                            
  (let (                                                                                             
        (prefix "docker run --rm -v $PWD:/workdir paperist/alpine-texlive-ja ")                      
        (cmds '(                                                                                     
                bibtex-command                                                                       
                dvi2-command                                                                         
                makeindex-command                                                                    
                tex-command                                                                          
                YaTeX-dvipdf-command                                                                 
                )))                                                                                  
    (cl-loop for cmd in cmds collect (set cmd (concat prefix (eval cmd)))))) 

はじめに

LaTeXの環境構築のためにローカル環境を汚すことに抵抗ある人は多いだろう.
そんな人のために親切な方がDockerイメージを公開してくれている.
各コマンドをエイリアスに登録しても良いのだが,YaTeXを使っている人はLaTeXのコマンドを直接実行することは基本的にないので,init.elに書いてしまおう,というおはなし.

(気が向き次第追加執筆予定)

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

Rails4系で統合テストをDocker環境内で行う

はじめに

今回Railsのバージョンアップに向けて不足していた箇所のテストを書いていました。
その一環で統合テストを書こうとして軽く詰まったので似たような境遇方のためになればと思い(こんなレアケースに遭遇する人は少ないと思いますが)記事にしました。

なぜ統合テストなのか

プロダクトで使用している外部サービスのAPIがjsにしか対応しておらず、プロダクト内で重要な機能の一部に組み込まれていたため。

環境

Rails 4系
Ruby 2.5.7
Rspec 3.9.1
capybara 3.30.0

対象

  • すでにRspecのテスト環境が整っている。
  • dockerを用いて開発を行なっている。
    • dockerを用いていない場合はローカルにインストールされているブラウザを使用すれば簡単に実装できると思います。

Railsアプリケーションが入っているコンテナにchromeなどを導入する

ブラウザ用にコンテナを分けるか迷いましたが、circleciにブラウザが導入されているRubyのイメージがあったため開発環境下でもRailsアプリケーションが入っているコンテナに導入することにしました。

Dockerfileに以下のchromeやseleniumなどをインストールするためのコマンドを書き足します。

Dockerfile
FROM ruby:2.5.7
# 下記の内容については現在の設定内容に合わせて変更してください。

# googleが用意している公開鍵をaptに追加
RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -

# aptに安定版chromeがインストールできるレポジトリgoogle-chrome.listを追加します。
RUN echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list

# aptで必要なパッケージをインストールします。
# seleniumをpipでインストールするため一緒にインストールします。
RUN apt-get update -qq && apt-get install -y [nodejsやRDBMSのクライアントなど] google-chrome-stable python3-pip

# seleniumでchromeを動かすためのchromedriverをダウンロードします。
# installしているchromeのバージョンに対応したchromedriverをインストールする必要があるため
# http://chromedriver.storage.googleapis.com/LATEST_RELEASE
# でchromeの安定バージョンを取得することができるため、その値を用いてchromedriverのバージョンを指定しています
RUN LATEST_RELEASE=$(curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE) &&\
    wget http://chromedriver.storage.googleapis.com/$LATEST_RELEASE/chromedriver_linux64.zip

# ダウンロードしたchromedriverを解凍します。 このときPATHが通っている階層に配置しましょう。
RUN unzip chromedriver_linux64.zip -d /bin/

# pipでseleniumをインストールします。
RUN pip3 install selenium

# これより下はRailsのインストールなど既存のコードになるかと思います。

Rails側で統合テストを動かす設定

Gemfileに以下を追加

Gemfile
gem 'selenium-webdriver'

rails_helper.rbに以下を追加

rails_helper.rb
require 'selenium-webdriver'

以下の内容を設定ファイルを作成して記述する。(rails_helper.rbなどに書いても可)

spec/support/capybara.rb
Capybara.register_driver :selenium do |app|
  option = Selenium::WebDriver::Chrome::Options.new(
    args: %w[--headless --disable-gpu --no-sandbox]
  )
  Capybara::Selenium::Driver.new(
    app,
    browser: :chrome,
    options: option,
    timeout: 600, # この設定がないとテスト内容によってはcircleciで Net::ReadTimeout となってしまう
    desired_capabilities: { accept_insecure_certs: true }
  )
end
Capybara.javascript_driver = :selenium

以上の設定で統合テストが実行できる環境が出来上がったと思います。

さいごに

Rails4系で統合テストのやり方を調べるとcapybara-webkitを使用した記事しか出てこなかったり、良さげなやり方を見つけてもsystem testに対応していなかったりとなにから導入していいのか調べるところからで少し詰まってしまいました。。。
また、せっかくdockerを使用しているので初めはブラウザ用のコンテナを用意しましたがコンテナ間の接続に証明書が必要でした。
証明書の発行まで書こうかと思いましたがcircleciでブラウザーが含まれたimage(今回だとcircleci/ruby:2.5.7-node-browsers)があったため分けずに構築してみました。
初めての内容ばかりだったのでおそらく改善できる点がたくさんあると思います。
改善点や気になったことがあればコメントで教えていただけると嬉しいです!

参考記事

https://qiita.com/zo30005/items/a5dcede868a3d1cca4a8
https://www.google.com/linuxrepositories/
https://www.linuxbabe.com/ubuntu/install-google-chrome-ubuntu-18-04-lts
https://circleci.com/docs/2.0/circleci-images/#language-image-variants

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