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

DockerでBINDを試してみた

普段私はDNSサーバの開発や運用に携わっているのですが、仕事の傍らDockerを勉強しています。
DockerでBINDを試してみたので、備忘録も兼ねて共有しようと思います。

キャッシュ、権威DNSの構成も試しています。

実行環境

私が試した環境は以下の通りです。

  • Windows 10
  • WSL2
  • Docker Desktop

DockerがインストールされていればMacでもLinuxでも動くはずです。

まずは1台の構成

Dockerfileの用意

ディレクトリの構成は以下となっています。

bind/
  ├ Dockerfile
  ├ named.conf 
  └ example.com 
Dockerfile
FROM centos:7

RUN yum -y update
RUN yum install -y bind
RUN /usr/sbin/rndc-confgen -a -b 512 -k rndc-key
RUN chmod 755 /etc/rndc.key

EXPOSE 53/UDP
EXPOSE 53/TCP

COPY named.conf /etc/bind/
COPY example.com /etc/bind/master/

CMD ["/usr/sbin/named", "-c", "/etc/bind/named.conf", "-g", "-u", "named"]
named.conf
include "/etc/rndc.key";
controls {
    inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc-key"; };
};

acl "access-list" {
    127.0.0.1;
    172.17.0.0/16;
};

options {
    directory "/etc/named/";
    pid-file "/run/named/";
    dump-file "/var/named/named_dump.db";
    statistics-file "/var/named/named.stats.log";

    zone-statistics yes;
    version "";
    masterfile-format text;
    recursive-clients 10000;
    tcp-clients 10000;

    allow-recursion { access-list; };
    allow-query { access-list; };
    allow-query-cache { access-list; };
};

view "internal" {
    recursion yes;

    zone "example.com" IN {
        type master;
        file "/etc/bind/master/example.com";
    };
};
example.com
$TTL 900
@     IN  SOA example.com. postmaster.example.com. (
        2020062101      ; Serial Number
        1800            ; Refresh
        900             ; Retry
        1209600         ; expire
        900             ; minimum
        )
;
      IN    NS  example.com.
      IN    A   1.2.3.4
www   IN    A   5.6.7.8

named.confの設定はほぼ最小限にしています。

用意したファイルの説明

  • BINDパッケージ

今回はBINDはyumでインストール。古いバージョンですが、試すだけなのでこれでも大丈夫です。

  • Dockerfile内のEXPOSE

通信を想定するポートを指定します。DNSでは53ポートを使用します。

  • named.conf, example.comといったファイルのコピー

BINDの設定に必要なファイルをイメージに追加します。
COPYするファイルはDockerfileを置いたディレクトリ内のファイルを指定します。

  • BINDの起動

普通はsystemctlを使って起動するのですが、コンテナだと残念ながらできないようなので、直接namedを指定して起動します。

イメージのビルド

$ docker build -t bind .

途中警告みたいなものがでるかもしれませんが、気にしなくても大丈夫です。

$ docker images
REPOSITORY              TAG             IMAGE ID            CREATED             SIZE
bind                    latest          b634adb26126        About an hour ago   412MB

イメージができたことを確認します。

ビルドしたイメージを利用してコンテナを起動

docker run -dit -p 53:53 -p 53:53/udp --name bind bind:latest

ここでは -p でポートマッピングを設定しています。

$ docker ps 
b81999d14571        bind:latest         "/usr/sbin/named -c …"   About an hour ago   Up About an hour         0.0.0.0:53->53/tcp, 0.0.0.0:53->53/udp   bind

コンテナが起動できていることを確認できれば成功です。

digで動作確認

digコマンドはドメインをDNSサーバに問いかけて、IPアドレスを教えてくれるコマンドです。
このコマンドを用いて動作確認を行いたいと思います。

ホスト側で以下のコマンドを打ってみてください

$ dig @localhost example.com

; <<>> DiG 9.16.1-Ubuntu <<>> @localhost example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58542
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 95bb6b3867347d2a659e18f05fa40fa7705d1af930ac0b3b (good)
;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            900     IN      A       1.2.3.4

;; AUTHORITY SECTION:
example.com.            900     IN      NS      example.com.

;; Query time: 10 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 05 23:43:51 JST 2020
;; MSG SIZE  rcvd: 98

example.com で設定したIPアドレス 1.2.3.4 が表示されていることがわかります。
ちなみに www.example.com を問い合わせても設定したアドレス 5.6.7.8 が表示されています。

$ dig @localhost www.example.com

; <<>> DiG 9.16.1-Ubuntu <<>> @localhost www.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17044
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: fc8594f5fe0fda2a5b28b3f65fa41035d0243f359a253da7 (good)
;; QUESTION SECTION:
;www.example.com.               IN      A

;; ANSWER SECTION:
www.example.com.        900     IN      A       5.6.7.8

;; AUTHORITY SECTION:
example.com.            758     IN      NS      example.com.

;; ADDITIONAL SECTION:
example.com.            758     IN      A       1.2.3.4

;; Query time: 10 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 05 23:46:13 JST 2020
;; MSG SIZE  rcvd: 118

キャッシュ、権威DNSの構成を試す

先程は1台のDNSサーバのみでしたが、実際の運用だとクライアントからの問い合わせを受けて、クライアントの代わりに問い合わせを行うキャッシュDNSとゾーン情報を管理している権威DNS 2つの役割を持つDNSサーバを用います。

この構成もDockerで試してみたいと思います。

コンテナ起動

まずは先程作成したコンテナを削除しましょう

$ docker rm bind

今度は2台のコンテナを作成します。

$ docker run -dit -p 53:53 -p 53:53/udp --name bind_cache bind:latest
$ docker run -dit --name bind_auth bind:latest

クライアントからの応答を受けるのはキャッシュDNSだけなので、キャッシュDNSにはポートマッピングの設定を入れます。
権威DNSはクライアントとは直接通信しないので設定していません。

一度 bind_cache, bind_auth のIPアドレスを確認しましょう。

$ docker inspect bind_cache | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

$ docker inspect bind_auth | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

bind_cache の方は 172.17.0.2bind_authの方は 172.17.0.3 というIPアドレスであることがわかりました。

キャッシュDNSの設定

キャッシュDNSの named.conf を編集するために以下のコマンドを入力してコンテナの中に入ります。

$ docker exec -it bind_cache /bin/bash

vi などで view internal の部分を以下のように編集します

/etc/bind/named.conf
・
・
・
view "internal" {
    recursion yes;

    zone "." {
        type forward;
        forwarders { 172.17.0.3; };
        forward only;
    };
};

forwarders に先程確認した権威DNSのIPアドレスを入力します。

権威DNSの設定

今度は権威DNSの named.conf を見てみましょう。

$ docker exec -it bind_auth /bin/bash

同様にvi などで named.conf を編集します
acl access-list というところに注目してください。

/etc/bind/named.conf
include "/etc/rndc.key";
controls {
    inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc-key"; };
};

acl "access-list" {
    127.0.0.1;
    172.17.0.0/16;
};
・
・

acl access-list では通信を許可するIPアドレスを指定します。
先程確認したキャッシュDNSのIPアドレスは 172.17.0.2 でした。 今回は初期設定で 172.17.0.0/16 を許可しているのでこのままでも問題ないですが、キャッシュDNSのIPアドレスを指定しておきましょう。

/etc/bind/named.conf
include "/etc/rndc.key";
controls {
    inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc-key"; };
};

acl "access-list" {
    127.0.0.1;
    172.17.0.2; // 172.17.0.2に変更
};
・
・

以上で設定は完了です。

設定を反映するために再起動しておきましょう。
2つコンテナが起動していることが確認できれば成功です。

$ docker restart bind_auth
$ docker restart bind_cache 

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS
                          NAMES
f0b2f14e26f2        bind:latest         "/usr/sbin/named -c …"   About an hour ago   Up 6 minutes        53/tcp, 53/udp                           bind_auth
b81999d14571        bind:latest         "/usr/sbin/named -c …"   2 days ago          Up 6 minutes        0.0.0.0:53->53/tcp, 0.0.0.0:53->53/udp   bind_cache

もし起動していない場合は、named.conf の設定がうまく行っていないと考えられます。(;のつけ忘れなど, docker logs を使えばエラーの内容が見れると思います)
その場合は、以下のコマンドで起動できなかったコンテナを一度削除して、コンテナを作成するところからやった方が楽かもしれません。

$ docker logs bind_XXX
$ docker rm bind_XXX または docker rm [コンテナID]

digで動作確認

先ほどと同様にdigコマンドを用いて動作確認を行います。

$ dig @localhost example.com

; <<>> DiG 9.16.1-Ubuntu <<>> @localhost example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58542
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 95bb6b3867347d2a659e18f05fa40fa7705d1af930ac0b3b (good)
;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            900     IN      A       1.2.3.4

;; AUTHORITY SECTION:
example.com.            900     IN      NS      example.com.

;; Query time: 10 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 05 23:43:51 JST 2020
;; MSG SIZE  rcvd: 98

example.com で設定したIPアドレスが表示されていることがわかります。

ちなみに権威DNSで定義ていないドメインも引くことができます。

$ dig @localhost www.google.com

; <<>> DiG 9.16.1-Ubuntu <<>> @localhost www.google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53253
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 3181d4115c9c0426b42bd02e5fa6a8a6a04cb4d481be1221 (good)
;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         300     IN      A       172.217.26.36

;; AUTHORITY SECTION:
google.com.             171777  IN      NS      ns1.google.com.
google.com.             171777  IN      NS      ns4.google.com.
google.com.             171777  IN      NS      ns3.google.com.
google.com.             171777  IN      NS      ns2.google.com.

;; ADDITIONAL SECTION:
ns4.google.com.         171777  IN      A       216.239.38.10
ns2.google.com.         171777  IN      A       216.239.34.10
ns1.google.com.         171777  IN      A       216.239.32.10
ns3.google.com.         171777  IN      A       216.239.36.10
ns4.google.com.         171777  IN      AAAA    2001:4860:4802:38::a
ns2.google.com.         171777  IN      AAAA    2001:4860:4802:34::a
ns1.google.com.         171777  IN      AAAA    2001:4860:4802:32::a
ns3.google.com.         171777  IN      AAAA    2001:4860:4802:36::a

;; Query time: 120 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Nov 07 23:01:10 JST 2020
;; MSG SIZE  rcvd: 335

感想

思っていたよりも簡単にできました。
実運用で使えるのかどうかはわかりませんが、色々試してみたい思います。
次はキャッシュDNSにUnboundを使ってみようと思います。

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

購入済みUdemy講座・学習状況 (2020/11/08~ 2020/11/09更新)

独学の教材として、先月頃からUdemyを使用し始めました。
自分が購入したものを以下記載していきたいと思います。
(セールでとりあえず買っておいた、という未着手のものが多々あります)

そもそもUdemyとは

Udemyトップページ
Udemyの仕組みに関するよくある質問

上記ページをご覧いただくとお分かりになると思いますが、動画配信のオンライン学習サービスです。
一度購入しておくと、その後期間無制限で何度も見ることができます。
"2万円"などの高額な講座もあるのですが、毎月と言ってよいほど頻繁にセールが開催され、1500円で購入できたりするので、そのタイミングでまとめ買いをするとお得かと思います。
(買って満足してしまう罠がありますが)

購入した講座一覧

※購入して積みっぱなしにしないよう戒めのために公開しておきます。

★★★受講完了済み★★★

「はじめての AI」 by Grow with Google

講座内容
AI の基礎知識とその仕組みについて学習し、画像認識や音声認識について実際のデモをご覧いただきながら体感していただきます。基本知識だけでなく、事例や具体的にそれがどのような仕組みで動いているかも紹介することで、AI を活用するヒントを得ることを目指します。

「AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得」 by 山浦 清透

講座内容
★ゼロからAWSの重要サービスを使いこなせるように!実際にネットワークやサーバーを構築し、インフラの基礎概念を習得します。
本講座は、「はじめてAWSを学ぶ方」や「インフラにあまり詳しくない方」を対象に、「AWSの重要サービスを使い、自分でネットワークやサーバーを構築できるようになる」ことを目指したコースです。
セクションごとに、インフラの基礎概念を学びながら、手を動かし実際に構築していく、という構成になっています。
  (以下略)

「Git: もう怖くないGit!チーム開発で必要なGitを完全マスター」 by 山浦 清透

講座内容
★ゼロからプロのチーム開発の現場でGitを使いこなせるよう完全マスターします
こちらのコースは未経験の方でも、プロのチーム開発の現場で必要とされるGitの全てを習得することを目的としたコースです。
  (略)
こちらのコースでは、まずGitの仕組みを図解でしっかりと理解していきます。
Gitってそもそも何のためにあるのか、コミットした時にどういう風にデータを保存しているのか、マージやリベースした時に何が起こっているのか、ブランチってどういう風に実現しているのか。
そういうことを仕組みから理解することで、Gitの分かりづらいコマンドを自信を持って使えるようになります。なにより、Gitを使う上でのハードルであるステージやブランチ、HEADの概念を完全に理解することができます。
その上で、実際にプロジェクトを作成しGitHubを用いながら、コマンドを実行して学んでいきます。
スキルを身につける上で、実際に作りながら学んでいくことはとても大切です。理解したものを実践することで本当に使えるスキルを身に付けていきます。
  (以下略)

「現役シリコンバレーエンジニアが教えるPythonで始めるスクラッチからのブロックチェーン開発入門」 by 酒井 潤

2020/11/09完了

講座内容
このコースではブロックチェーンの技術とPythonを用いて仮想通貨の送金システムを構築しながらブロックチェーンの根幹にある技術、考え方とその応用方法をハンズオンで学びます。
  (以下略)

★★★受講中★★★

「現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」 by 酒井 潤

講座内容
このコースでは、Python3の基礎である入門コースを一通り終えた後に、今後のアプリケーション開発に役立つためのPythonのテクニックやデーターベースアクセス(SQLite, MySQL, MongoDB, SQLAlchemy, memcached, Hbase, neo4j etc)、WEB(Flask, socket, RPC etc)、インフラ自動化(Fabric, Ansible)、並列化(スレッド、マルチプロセス)、テスト(Unittest, pytest, Tox, Selenium, etc)、暗号化(pycrypto, hashlib)、グラフィック(turtle, Tkinter)、データ解析(numpy, pandas, matplotlib, scikit-learn), キューイングシステム(ZeroMQ, Celery)、非同期処理(asyncio)などのPythonを使った応用編を取り入れております。
  (以下略)

★★★今後着手★★★

Python

「現役シリコンバレーエンジニアが教えるPythonでFXのシストレFintechアプリの開発」 by 酒井 潤

講座内容
今回扱うFintech技術では、日本でも人気のあるFXの自動トレードをPythonで行い、グローバルで使われているOandaサービスのAPIを使って行います。日本で人気があるという理由でFXにしましたが、FXではなくても、APIを使ってトレードするやり方さえ学べば、例えば株式や仮想通貨のトレードなどでも十分に使える技術を学ぶことができますので、FXにご興味ない方でも自動トレードが何かということを学べる講座になっております。
  (以下略)

「Python+FlaskでのWebアプリケーション開発講座!!~0からFlaskをマスターしてSNSを作成する~」 by N Matsumoto

講座内容
【この講座について】
 Pythonの基本的な使い方、Flaskのウェブアプリケーション開発の基本的な技術、Flaskの機能の有効活用方法、サーバサイドウェブフレームワークで利用されるMVTモデル、サーバサイドのセキュリティ、テーブル設計、SNSサンプルアプリケーション開発を通じた実践的なアプリケーション開発など、PythonのWebエンジニア必修のスキルが身につきます!!
  (以下略)

「Python デザインパターンマスター講座~Pythonの基本文法、コーディング規約、命名規約、プログラミング技術~」 by N Matsumoto

講座内容
【この講座について】
 プログラミングを勉強し、オブジェクト指向を覚えたが実際にどういう風にコードを書けばよいか。良いコード、恥ずかしくないコードというのはどういうコードなのか理解するためにこの講座を作成しました。
 コーディング規約、命名規約、コードレビュー、オブジェクト指向のベストプラクティスのSOLIDの原則、デザインパターンを通じて、良いプログラムが何なのかを理解し、技術力を身に着けます。
 また、デザインパターンは転職活動の面接などでも聞かれることがあり、身に着けて損のないスキルです
  (以下略)

「【E資格の前に】PyTorchで学ぶディープラーニング実装」 by 株式会社 AVILEN

講座内容
<概要>
ディープラーニングの実装、実務活用のイメージが沸かない、難しそう...そんなお悩みはありませんか?
当講座は、Pythonの基本文法とNumpyの知識さえあれば、誰でもディープラーニング(DL)を実装できるPyTorchの入門講座となっています。
特別な理論や数式は扱わず、まずは実装して、ディープラーニングのイメージを掴むことをゴールとしています。
AIスペシャリスト集団、株式会社AVILENの執行役員である吉川武文氏が、PyTorchによるディープラーニング実装術を公開。
当講座で扱うプログラムは全て皆様にプレゼントします、実務でもご活用ください。

Go

「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」 by 酒井 潤

講座内容
このコースでは、Goの基礎である入門コースを一通り終えた後に、次世代のFintech(金融+テクノロジー)のアプリケーションとしてビットコインを自動でシステムトレードを行うアプリを開発します。
多くの言語の良い部分を取りれたGoは、コードを実行する際のパフォーマンスも良く、近年急速にライブラリも充実して来ており、シリコンバレーで多くの企業が取り入れ始めました。日本では、ドキュメントも少なく、Go言語を使う機会があまりないかもしれませんが、世界のトップ企業はすでに使い始めているため、技術レベルで世界から遅れないように今からGo始めると良いかと思います。
  (以下略)

AWS

「これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(SAA-C02試験対応版)」 by Edutech Global , inc.

本講座は全てのIT従事者にとって必須となるAWSの基本資格「AWS 認定ソリューションアーキテクト – アソシエイト試験」を合格を目指し、そのための知識や経験を獲得できるように設計されています。
この講座を通して、AWSの知識とノウハウを獲得し、「AWS 認定ソリューションアーキテクト – アソシエイト試験」を突破しましょう!!

「Ultimate AWS Certified Solutions Architect Associate 2020」 by Stephane Maarek

講座内容
Concretely, here's what we'll learn to pass the AWS Certified Solutions Architect Associate exam:
- The AWS Fundamentals: IAM, EC2, Load Balancing, Auto Scaling, EBS, EFS, Route 53, RDS, ElastiCache, S3, CloudFront
- The AWS CLI: CLI setup, usage on EC2, best practices, SDK, advanced usage
- In-Depth Database comparison: RDS, Aurora, DynamoDB, Neptune, ElastiCache, Redshift, ElasticSearch, Athena
- Monitoring, Troubleshooting & Audit: AWS CloudWatch, CloudTrail
- AWS Integration & Messaging: SQS, SNS, Kinesis
- AWS Serverless: AWS Lambda, DynamoDB, API Gateway, Cognito
- AWS Security best practices: KMS, SSM Parameter Store, IAM Policies
- VPC & Networking in depth
- AWS Other Services Overview: CICD (CodeCommit, CodeBuild, CodePipeline, CodeDeploy), CloudFormation, ECS, Step Functions, SWF, EMR, Glue, OpsWorks, ElasticTranscoder, AWS Organizations, Workspaces, AppSync, Single Sign On (SSO)
- Tips to ROCK the exam

Docker

「米シリコンバレーDevOpsエンジニア監修!超Docker完全入門(2020)【優しい図解説とハンズオンLab付き】」 by CS Career Kaizen

講座内容
このコースを一文でまとめると?
このコースは、アプリ開発やDevOps経験初心者の方が、Linuxの簡単な基礎(カーネル・シェル・STDIN・STDOUT・TTY)とDocker(イメージ・コンテナ・VMとの違い・Docker compose・ネットワーキング・Volume)を初心者として1から学び、コンテナ化できるデベロパーやDevOpsとしてキャリアアップを目指す方向けのコースです。

「米国AI開発者がゼロから教えるDocker講座」 by かめ れおん

講座内容
Dockerの基本的な使い方から現場で役立つ応用的な使い方まで,米国で活躍するAI開発者が講師となって徹底的に解説します.
プログラミングの知識がない人でも,問題なく受講できます.

Kubernetes

「米シリコンバレーDevOpsエンジニア監修!超Kubernetes完全入門(2020)【優しい図解説とハンズオン】」 by CS Career Kaizen

講座内容
このコースを一文でまとめると?
このコースは、アプリ開発やDevOps経験初心〜中級者の方が、Linuxの簡単な基礎(カーネル・シェル・STDIN・STDOUT・TTY)とDocker(イメージ・コンテナ・VMとの違い・Docker compose・ネットワーキング・Volume)をベースにして、Kubernetesクラスター上にコンテナ化されたアプリをディプロイ・構築・起動というK8sデベロパー初心者として1から学び、コンテナ化できるデベロパーやDevOpsとしてキャリアアップを目指す方向けのコースです。

アジャイル開発

「現役シリコンバレーエンジニアが教えるアジャイル開発」 by 酒井 潤

講座内容
このコースでは、あらゆるレベルのビジネスプロフェッショナルが理解しやすい方法でアジャイルとスクラムの基本をカバーします。アジャイルとスクラムの基礎に関するこのコースから得られる知識を使用して、アジャイルとスクラムに適した環境を作成できます。
アジャイルとスクラムの開発方法を取り入れれば、プロジェクトが失敗するのを防ぐことにも繋がる可能があります。このAjailプロジェクト管理方法は、チームワークが特に重要であり、チームメンバー間の相互信頼を高め、対人関係を改善することもできるでしょう。
このコースは、シリコンバレーでアジャイル開発経験14年の現役エンジニアが教授いたします。

アルゴリズム

「現役シリコンバレーエンジニアが教えるアルゴリズム・データ構造・コーディングテスト入門」 by 酒井 潤

講座内容
恐らく、皆さん「アルゴリズムって本当に必要なの?」っと疑問に思っている方もいらっしゃるかと思います。例えば、「実際の現場であまり使わないなー」とか、「今の仕事はWEBのフレームワークのやり方さえ覚えれば、WEBアプリなんて簡単に作れちゃうし」などなどあるとは思います。
ただ、考えていただきたいのですが、なぜあのGAFAと言われるGoogle、Apple, Facebook、Amazonが入社試験で必ずアルゴリズム、データ構造のコーディング面接があるかを考えてみてください。
皆さんもお聞きしたことがあるかもしれませんが、Google検索アルゴリズム、Tesla自動運転アルゴリズムなど世界をリードして最先端の技術革新をしている会社では、ちょっとでもコードが早くなるように、プログラマーが、最適なコードを書く必要があるのです。
 (以下略)

Unity(C#)

「Unity3D入門の決定版!RPG開発の基本をUnityインストラクターと共に進めるハンズオンコース【スタジオしまづ】」 by 嶋津 恒彦

【講座内容】
・Unityのインストール
・Unityの操作方法とゲームを作る基礎(コードでものを変化させる方法)
・C#プログラミングの基礎(基礎的な文法をイラストと演習問題付き)
・3Dミニゲーム開発(キャラクターを移動せさてゴールしたら終了するゲーム制作)
・3Dアニメーションの基礎(設定・Scriptによる切り替えスキル)
------ここまでが準備-------
・3DRPGの開発
 ・Playerキャラクターの移動と攻撃実装
 ・Enemyキャラクターの移動と攻撃実装
 ・各キャラクターの非ダメージとHP実装
 ・コンボとスタミナとHPゲージの演出実装

「Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】」 by 嶋津 恒彦

講座内容
初心者の方でもゲームをリリースできるように、講座の構成は
Unityのインストール
Unityでゲームを作る基礎(コードでものを変化させる簡単な方法)
プログラミングの基礎(ゲーム開発に必要な最低限のスキル)
ゲーム開発のテクニック(ボタンの取得やデータの保存など)
を1話完結形式で学び、基礎力をつけた後
RPGの作成
AppStore/Google Playへのリリース
に取り掛かかります。講座を終えたときには自身のゲームを実際にストアに並べることができるようになっています。

「Unityゲーム開発入門:Unityインストラクターが教えるマリオ風2Dアクションゲームを作成する方法【スタジオしまづ】」 by 嶋津 恒彦

講座内容
任天堂からこの夏Nintendo Switch向けに発売されたスーパーマリオメーカー 2。ゲーム開発の専門的な知識がなくても
オリジナルのゲームが開発できることで注目を浴びています。この講座ではスーパーマリオメーカー 2のようにステージを作成するUnityのテクニックが習得できます。
また、ステージ作成だけではなくアクションゲーム開発に必要なC#・アニメーション・当たり判定など総合的なUnityの力がこれ一本で身につく完全攻略版です。

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

購入済みUdemy講座 (2020/11/08時点)

独学の教材として、先月頃からUdemyを使用し始めました。
自分が購入したものを以下記載していきたいと思います。
(セールでとりあえず買っておいた、という未着手のものが多々あります)

そもそもUdemyとは

Udemyトップページ
Udemyの仕組みに関するよくある質問

上記ページをご覧いただくとお分かりになると思いますが、動画配信のオンライン学習サービスです。
一度購入しておくと、その後期間無制限で何度も見ることができます。
"2万円"などの高額な講座もあるのですが、毎月と言ってよいほど頻繁にセールが開催され、1500円で購入できたりするので、そのタイミングでまとめ買いをするとお得かと思います。
(買って満足してしまう罠がありますが)

購入した講座一覧

※購入して積みっぱなしにしないよう戒めのために公開しておきます。

★★★受講完了済み★★★

「はじめての AI」 by Grow with Google

講座内容
AI の基礎知識とその仕組みについて学習し、画像認識や音声認識について実際のデモをご覧いただきながら体感していただきます。基本知識だけでなく、事例や具体的にそれがどのような仕組みで動いているかも紹介することで、AI を活用するヒントを得ることを目指します。

「AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得」 by 山浦 清透

講座内容
★ゼロからAWSの重要サービスを使いこなせるように!実際にネットワークやサーバーを構築し、インフラの基礎概念を習得します。
本講座は、「はじめてAWSを学ぶ方」や「インフラにあまり詳しくない方」を対象に、「AWSの重要サービスを使い、自分でネットワークやサーバーを構築できるようになる」ことを目指したコースです。
セクションごとに、インフラの基礎概念を学びながら、手を動かし実際に構築していく、という構成になっています。
  (以下略)

「Git: もう怖くないGit!チーム開発で必要なGitを完全マスター」 by 山浦 清透

講座内容
★ゼロからプロのチーム開発の現場でGitを使いこなせるよう完全マスターします
こちらのコースは未経験の方でも、プロのチーム開発の現場で必要とされるGitの全てを習得することを目的としたコースです。
  (略)
こちらのコースでは、まずGitの仕組みを図解でしっかりと理解していきます。
Gitってそもそも何のためにあるのか、コミットした時にどういう風にデータを保存しているのか、マージやリベースした時に何が起こっているのか、ブランチってどういう風に実現しているのか。
そういうことを仕組みから理解することで、Gitの分かりづらいコマンドを自信を持って使えるようになります。なにより、Gitを使う上でのハードルであるステージやブランチ、HEADの概念を完全に理解することができます。
その上で、実際にプロジェクトを作成しGitHubを用いながら、コマンドを実行して学んでいきます。
スキルを身につける上で、実際に作りながら学んでいくことはとても大切です。理解したものを実践することで本当に使えるスキルを身に付けていきます。
  (以下略)

★★★受講中★★★

「現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」 by 酒井 潤

講座内容
このコースでは、Python3の基礎である入門コースを一通り終えた後に、今後のアプリケーション開発に役立つためのPythonのテクニックやデーターベースアクセス(SQLite, MySQL, MongoDB, SQLAlchemy, memcached, Hbase, neo4j etc)、WEB(Flask, socket, RPC etc)、インフラ自動化(Fabric, Ansible)、並列化(スレッド、マルチプロセス)、テスト(Unittest, pytest, Tox, Selenium, etc)、暗号化(pycrypto, hashlib)、グラフィック(turtle, Tkinter)、データ解析(numpy, pandas, matplotlib, scikit-learn), キューイングシステム(ZeroMQ, Celery)、非同期処理(asyncio)などのPythonを使った応用編を取り入れております。
  (以下略)

★★★今後着手★★★

Python

「現役シリコンバレーエンジニアが教えるPythonで始めるスクラッチからのブロックチェーン開発入門」 by 酒井 潤

講座内容
このコースではブロックチェーンの技術とPythonを用いて仮想通貨の送金システムを構築しながらブロックチェーンの根幹にある技術、考え方とその応用方法をハンズオンで学びます。
  (以下略)

「現役シリコンバレーエンジニアが教えるPythonでFXのシストレFintechアプリの開発」 by 酒井 潤

講座内容
今回扱うFintech技術では、日本でも人気のあるFXの自動トレードをPythonで行い、グローバルで使われているOandaサービスのAPIを使って行います。日本で人気があるという理由でFXにしましたが、FXではなくても、APIを使ってトレードするやり方さえ学べば、例えば株式や仮想通貨のトレードなどでも十分に使える技術を学ぶことができますので、FXにご興味ない方でも自動トレードが何かということを学べる講座になっております。
  (以下略)

「Python+FlaskでのWebアプリケーション開発講座!!~0からFlaskをマスターしてSNSを作成する~」 by N Matsumoto

講座内容
【この講座について】
 Pythonの基本的な使い方、Flaskのウェブアプリケーション開発の基本的な技術、Flaskの機能の有効活用方法、サーバサイドウェブフレームワークで利用されるMVTモデル、サーバサイドのセキュリティ、テーブル設計、SNSサンプルアプリケーション開発を通じた実践的なアプリケーション開発など、PythonのWebエンジニア必修のスキルが身につきます!!
  (以下略)

「Python デザインパターンマスター講座~Pythonの基本文法、コーディング規約、命名規約、プログラミング技術~」 by N Matsumoto

講座内容
【この講座について】
 プログラミングを勉強し、オブジェクト指向を覚えたが実際にどういう風にコードを書けばよいか。良いコード、恥ずかしくないコードというのはどういうコードなのか理解するためにこの講座を作成しました。
 コーディング規約、命名規約、コードレビュー、オブジェクト指向のベストプラクティスのSOLIDの原則、デザインパターンを通じて、良いプログラムが何なのかを理解し、技術力を身に着けます。
 また、デザインパターンは転職活動の面接などでも聞かれることがあり、身に着けて損のないスキルです
  (以下略)

「【E資格の前に】PyTorchで学ぶディープラーニング実装」 by 株式会社 AVILEN

講座内容
<概要>
ディープラーニングの実装、実務活用のイメージが沸かない、難しそう...そんなお悩みはありませんか?
当講座は、Pythonの基本文法とNumpyの知識さえあれば、誰でもディープラーニング(DL)を実装できるPyTorchの入門講座となっています。
特別な理論や数式は扱わず、まずは実装して、ディープラーニングのイメージを掴むことをゴールとしています。
AIスペシャリスト集団、株式会社AVILENの執行役員である吉川武文氏が、PyTorchによるディープラーニング実装術を公開。
当講座で扱うプログラムは全て皆様にプレゼントします、実務でもご活用ください。

Go

「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」 by 酒井 潤

講座内容
このコースでは、Goの基礎である入門コースを一通り終えた後に、次世代のFintech(金融+テクノロジー)のアプリケーションとしてビットコインを自動でシステムトレードを行うアプリを開発します。
多くの言語の良い部分を取りれたGoは、コードを実行する際のパフォーマンスも良く、近年急速にライブラリも充実して来ており、シリコンバレーで多くの企業が取り入れ始めました。日本では、ドキュメントも少なく、Go言語を使う機会があまりないかもしれませんが、世界のトップ企業はすでに使い始めているため、技術レベルで世界から遅れないように今からGo始めると良いかと思います。
  (以下略)

AWS

「これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(SAA-C02試験対応版)」 by Edutech Global , inc.

本講座は全てのIT従事者にとって必須となるAWSの基本資格「AWS 認定ソリューションアーキテクト – アソシエイト試験」を合格を目指し、そのための知識や経験を獲得できるように設計されています。
この講座を通して、AWSの知識とノウハウを獲得し、「AWS 認定ソリューションアーキテクト – アソシエイト試験」を突破しましょう!!

「Ultimate AWS Certified Solutions Architect Associate 2020」 by Stephane Maarek

講座内容
Concretely, here's what we'll learn to pass the AWS Certified Solutions Architect Associate exam:
- The AWS Fundamentals: IAM, EC2, Load Balancing, Auto Scaling, EBS, EFS, Route 53, RDS, ElastiCache, S3, CloudFront
- The AWS CLI: CLI setup, usage on EC2, best practices, SDK, advanced usage
- In-Depth Database comparison: RDS, Aurora, DynamoDB, Neptune, ElastiCache, Redshift, ElasticSearch, Athena
- Monitoring, Troubleshooting & Audit: AWS CloudWatch, CloudTrail
- AWS Integration & Messaging: SQS, SNS, Kinesis
- AWS Serverless: AWS Lambda, DynamoDB, API Gateway, Cognito
- AWS Security best practices: KMS, SSM Parameter Store, IAM Policies
- VPC & Networking in depth
- AWS Other Services Overview: CICD (CodeCommit, CodeBuild, CodePipeline, CodeDeploy), CloudFormation, ECS, Step Functions, SWF, EMR, Glue, OpsWorks, ElasticTranscoder, AWS Organizations, Workspaces, AppSync, Single Sign On (SSO)
- Tips to ROCK the exam

Docker

「米シリコンバレーDevOpsエンジニア監修!超Docker完全入門(2020)【優しい図解説とハンズオンLab付き】」 by CS Career Kaizen

講座内容
このコースを一文でまとめると?
このコースは、アプリ開発やDevOps経験初心者の方が、Linuxの簡単な基礎(カーネル・シェル・STDIN・STDOUT・TTY)とDocker(イメージ・コンテナ・VMとの違い・Docker compose・ネットワーキング・Volume)を初心者として1から学び、コンテナ化できるデベロパーやDevOpsとしてキャリアアップを目指す方向けのコースです。

「米国AI開発者がゼロから教えるDocker講座」 by かめ れおん

講座内容
Dockerの基本的な使い方から現場で役立つ応用的な使い方まで,米国で活躍するAI開発者が講師となって徹底的に解説します.
プログラミングの知識がない人でも,問題なく受講できます.

Kubernetes

「米シリコンバレーDevOpsエンジニア監修!超Kubernetes完全入門(2020)【優しい図解説とハンズオン】」 by CS Career Kaizen

講座内容
このコースを一文でまとめると?
このコースは、アプリ開発やDevOps経験初心〜中級者の方が、Linuxの簡単な基礎(カーネル・シェル・STDIN・STDOUT・TTY)とDocker(イメージ・コンテナ・VMとの違い・Docker compose・ネットワーキング・Volume)をベースにして、Kubernetesクラスター上にコンテナ化されたアプリをディプロイ・構築・起動というK8sデベロパー初心者として1から学び、コンテナ化できるデベロパーやDevOpsとしてキャリアアップを目指す方向けのコースです。

アジャイル開発

「現役シリコンバレーエンジニアが教えるアジャイル開発」 by 酒井 潤

講座内容
このコースでは、あらゆるレベルのビジネスプロフェッショナルが理解しやすい方法でアジャイルとスクラムの基本をカバーします。アジャイルとスクラムの基礎に関するこのコースから得られる知識を使用して、アジャイルとスクラムに適した環境を作成できます。
アジャイルとスクラムの開発方法を取り入れれば、プロジェクトが失敗するのを防ぐことにも繋がる可能があります。このAjailプロジェクト管理方法は、チームワークが特に重要であり、チームメンバー間の相互信頼を高め、対人関係を改善することもできるでしょう。
このコースは、シリコンバレーでアジャイル開発経験14年の現役エンジニアが教授いたします。

アルゴリズム

「現役シリコンバレーエンジニアが教えるアルゴリズム・データ構造・コーディングテスト入門」 by 酒井 潤

講座内容
恐らく、皆さん「アルゴリズムって本当に必要なの?」っと疑問に思っている方もいらっしゃるかと思います。例えば、「実際の現場であまり使わないなー」とか、「今の仕事はWEBのフレームワークのやり方さえ覚えれば、WEBアプリなんて簡単に作れちゃうし」などなどあるとは思います。
ただ、考えていただきたいのですが、なぜあのGAFAと言われるGoogle、Apple, Facebook、Amazonが入社試験で必ずアルゴリズム、データ構造のコーディング面接があるかを考えてみてください。
皆さんもお聞きしたことがあるかもしれませんが、Google検索アルゴリズム、Tesla自動運転アルゴリズムなど世界をリードして最先端の技術革新をしている会社では、ちょっとでもコードが早くなるように、プログラマーが、最適なコードを書く必要があるのです。
 (以下略)

Unity(C#)

「Unity3D入門の決定版!RPG開発の基本をUnityインストラクターと共に進めるハンズオンコース【スタジオしまづ】」 by 嶋津 恒彦

【講座内容】
・Unityのインストール
・Unityの操作方法とゲームを作る基礎(コードでものを変化させる方法)
・C#プログラミングの基礎(基礎的な文法をイラストと演習問題付き)
・3Dミニゲーム開発(キャラクターを移動せさてゴールしたら終了するゲーム制作)
・3Dアニメーションの基礎(設定・Scriptによる切り替えスキル)
------ここまでが準備-------
・3DRPGの開発
 ・Playerキャラクターの移動と攻撃実装
 ・Enemyキャラクターの移動と攻撃実装
 ・各キャラクターの非ダメージとHP実装
 ・コンボとスタミナとHPゲージの演出実装

「Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】」 by 嶋津 恒彦

講座内容
初心者の方でもゲームをリリースできるように、講座の構成は
Unityのインストール
Unityでゲームを作る基礎(コードでものを変化させる簡単な方法)
プログラミングの基礎(ゲーム開発に必要な最低限のスキル)
ゲーム開発のテクニック(ボタンの取得やデータの保存など)
を1話完結形式で学び、基礎力をつけた後
RPGの作成
AppStore/Google Playへのリリース
に取り掛かかります。講座を終えたときには自身のゲームを実際にストアに並べることができるようになっています。

「Unityゲーム開発入門:Unityインストラクターが教えるマリオ風2Dアクションゲームを作成する方法【スタジオしまづ】」 by 嶋津 恒彦

講座内容
任天堂からこの夏Nintendo Switch向けに発売されたスーパーマリオメーカー 2。ゲーム開発の専門的な知識がなくても
オリジナルのゲームが開発できることで注目を浴びています。この講座ではスーパーマリオメーカー 2のようにステージを作成するUnityのテクニックが習得できます。
また、ステージ作成だけではなくアクションゲーム開発に必要なC#・アニメーション・当たり判定など総合的なUnityの力がこれ一本で身につく完全攻略版です。

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

Dockerのベースイメージの記述方法

ベストプラクティスを読んでみた

ベストプラクティス

可能であれば、自分のイメージの元として現在の公式レポジトリを使います。私たちは Debian イメージ を推奨します。これは、非常にしっかりと管理されており、ディストリビューションの中でも最小(現在は 100 MB 以下)になるよう維持されているからです。

というわけでDebian系を使うようにしましょう。

どうやって選ぶの?

  1. ベースのOSを決める。ubuntuとかcentosとかpythonとか。
  2. docker searchコマンドで公式を選ぶ。無難にSTARSが一番多いやつでいいでしょう。
  3. Dockerhubで公式のイメージを検索するとTags一覧があるのでそこから選ぶ。
  4. FROM {イメージ名}:{タグ名}

FROM python:rc-alpine3.12
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

既存のRailsアプリのローカル環境にDockerを導入する方法【Rails6 / MySQL8】

はじめに

本記事は私が既存のポートフォリオアプリのローカル環境にDockerを導入した際の手順になります。
Dockerの公式ドキュメントはPostgreSQLでの手順解説になっているためMySQLになると公式ドキュメントの手順解説はなく、
また、Rails6での情報もRails5と比べるとやはり少なく、結果、Rails6MySQLという組み合わせでの情報がとても少なかったです。
そのため、私自身様々なエラーが出て試行錯誤しましたので、本記事がこれからRails6MySQLという組み合わせでDockerを導入する方の助けになれば幸いです。
なお、筆者は就職活動中の実務未経験の初学者のため、誤っている点などあるかもしれません。
その際はコメントにて教えて頂けると幸いです。

前提条件

  • Mac版 DockerDesktopのインストールが完了していること
  • Dockerが起動済みであること

※筆者の場合、上記インストールと起動は「ゼロからはじめるDockerによるアプリケーション実行環境構築」を観ながらやりました。
Dockerの全体像を学ぶ上でもとてもわかりやすく、おすすめです。

バージョン

  • Ruby 2.6.5
  • Rails 6.0.3.2
  • MySQL 8.0.21

手順1 Dockerfile作成

既存アプリケーションのルートディレクトリにDockerfileを作成し、下記のように記述します。

※今回はアプリのディレクトリ名をsample_appとします。
ここはあなたのアプリのディレクトリ名に置き換えてください。

Dockerfile
FROM ruby:2.6.5
RUN 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
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn
WORKDIR /sample_app
COPY Gemfile ./Gemfile
COPY Gemfile.lock ./Gemfile.lock
RUN gem install bundler
RUN bundle install
COPY . /sample_app
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]

手順2 docker-compose.yml作成

こちらも手順1と同じく、既存アプリケーションのルートディレクトリにdocker-compose.ymlを作成し、下記のように記述します。

docker-compose.yml
version: '3' #docker-composeのバージョン
services:
  db:
    image: mysql:8.0.21 #既存アプリとあわせる。ターミナルに[$ mysql --version]で確認
    environment:
      MYSQL_ROOT_PASSWORD: vxgbizakqc #あなたのパスワード
      MYSQL_DATABASE: root
    ports:
      - "4306:3306"
    volumes:
      - ./mysql-confd:/etc/mysql/conf.d
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/sample_app
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
volumes:
  mysql-data:

手順3 entrypoint.sh作成

こちらも手順1・手順2と同じく、既存アプリケーションのルートディレクトリにentrypoint.shを作成し、下記のように記述します。

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /sample_app/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

手順4 config/database.ymlの編集

configディレクトリにあるdatabase.ymlを下記のように編集します。

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: vxgbizakqc #あなたのパスワード
  socket: /tmp/mysql.sock
  host: db

development:
  <<: *default
  database: sample_app_development

test:
  <<: *default
  database: sample_app_test

手順5 Dockerイメージの作成

ターミナルで下記のコマンドを実行し、Dockerイメージを作成します。

ターミナル
MacBook-Pro:sample_app$ docker-compose build

手順6 Dockerコンテナを起動

ターミナルで下記のコマンドを実行し、Dockerコンテナを起動します。

ターミナル
MacBook-Pro:sample_app$ docker-compose up

手順7 コンテナ内にデータベースを作成する

ターミナルで下記のコマンドを実行し、コンテナ内にデータベースを作成します。

ターミナル
MacBook-Pro:sample_app$ docker-compose run web rails db:create

上のコマンドを実行すると先ほど編集したdatabase.ymlを元にデータベースを作成します。
データベースの作成が成功すると下記のように表示されます。

ターミナル
reating sample_app_web_run ... done
Created database 'sample_app_development'
Created database 'sample_app_test'

手順8 作成したデータベースのマイグレーションを実行

ターミナルで下記のコマンドを実行し、データベースのマイグレーションを実行します。

ターミナル
MacBook-Pro:sample_app$ docker-compose run web rails db:migrate

データベースのマイグレーションが成功すると下記のように表示されます。

ターミナル
Creating sample_app_web_run ... done
== 20209165960112 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0253s

  #中略

-- add_index(:notifications, :comment_id)
   -> 0.0251s
== 20209165960112 CreateNotifications: migrated (0.1280s) =====================

手順9 Gemのインストール

さぁ、長かったDocker導入もこれでいよいよラストです。
ターミナルで下記のコマンドを実行し、Gemをインストールします。

ターミナル
MacBook-Pro:sample_app$ docker-compose exec web bundle install

以上です!!
localhost:3000に接続するとアプリケーションが表示されています。

参考文献

今回は以下の記事や動画教材を参考にさせて頂いた結果Dockerを導入することができました。
記事を書いて下さった方々、動画教材作成者の小島様、ありがとうございます。

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

Autowareを動かしてみた

概要

2019年2月に刊行された Autoware の書籍がある。

2020年10月に、これを見ながら、PCにインストールしてAutowareを動かしてみた。

やってみた限り、書籍記載の推奨環境で、インストール手順通りにやってもAutowareの動作までは辿りつけなかった。

書籍では、動作に必要なソフトウェアのバージョン指定が無い為、最新の環境でインストールするとバージョンの組み合わせの問題で動作できない。

また、書籍記載のgithubのリポジトリには必要なファイルが存在していなかった。

書籍記載の推奨環境とインストール手順

推奨環境

  • Ubuntu 16.04 LTS
  • Intel Core i7 (8コア)
  • メモリ 16GB以上
  • ストレージ 30GB以上のSSD
  • GPU NVIDIA GeForce GTX 980M かそれ以上のもの

インストール手順

  • 古いDockerのアンインストール
  • Docker CE のインストール(バージョン指定無し)
    • 動作確認(hello-world)
  • NVIDIA Dockerのセットアップ(バージョン v1.0.1)
    • 動作確認
  • Autoware Dockerのセットアップ(1.8.0-kinetic)

私の環境とインストール手順

推奨環境

  • Ubuntu 16.04 LTS
  • Intel Core i7 (8コア)
  • メモリ 16GB以上
  • ストレージ SSD 128GB
  • GPU NVIDIA Quadro P400

インストール手順

  • 古いDockerのアンインストール
  • Docker CE のインストール(17.12.1)
    • 動作確認(hello-world)
  • 自ユーザをdockerグループに追加して、自ユーザからdockerを起動できるようにする
  • NVIDIA Dockerのセットアップ(バージョン v2.0.3)
    • 動作確認
  • Autoware Dockerのセットアップ(1.12.0-kinetic)

参考

詳細

こちら を参照

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

【エラー解決】springをdockerで環境構築しようとした際に発生

目的

エラー発生。
Dockerで開発環境を構築した際に遭遇した。
エラー文と解決策を忘れないように載せておく

結論

以前作ったコンテナはプロジェクトではなくコマンドで削除しないと消えないことがわかった
ポート番号でエラーがおきた原因は分からなかった。

状況

javaのspringをdockerで環境構築をしようとした際に発生した。
Flywayをマイグレーションツールとして入れていた。

【環境構築】

$ docker-compose up -d
Starting vi_bank_db_1 ... error
ERROR: for vi_bank_db_1  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use
$ lsof -i :3306 →何も表示されない

エラー

ERROR: for db  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use
ERROR: Encountered errors while bringing up the project.
$ docker-compose down
WARNING: Found orphan containers (vi_bank_flyway-repair_1, vi_bank_flyway-info_1, vi_bank_flyway-migrate_1, vi_bank_flyway-clean_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Removing vi_bank_db_1 ... done
Removing network vi_bank_default
$ docker-compose up -d --remove-orphans
Creating network "vi_bank_default" with the default driver
Removing orphan container "vi_bank_flyway-migrate_1"
Removing orphan container "vi_bank_flyway-repair_1"
Removing orphan container "vi_bank_flyway-info_1"
Removing orphan container "vi_bank_flyway-clean_1"
Creating vi_bank_db_1 ... error

ERROR: for vi_bank_db_1  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use

ERROR: for db  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use

解説

Found orphan containers
同じプロジェクトにすでにコンテナがあるよ、注意されました。
以前個人で作ったコンテナが残ったままだったようです。
Dockerでの開発初めてなので勉強になります。
これのdocker-compose up -dが実行されない原因のようです。
エラーにしたがってコマンドを実行します

$ docker-compose up -d --remove-orphans

【解決策】

  • ポート番号を3306→3307に変更した
docker-compose.yml
version: '3.7'
services:
  db:
    image: mysql:8.0.20
    ports:
      - "3307:3306"

その後

$ docker-compose up -d
Recreating vi_bank_db_1 ... done
$ docker-compose exec db mysql -u docker -p
パスワード入力→成功
mysql>

発生したエラー
ERROR: for vi_bank_db_1 Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use

対処法

$ lsof -i :3306
#何も表示されない
$ docker-compose up -d
Recreating vi_bank_db_1 ... done

更新201108

エラー解決

Gradleのjavaのバージョンが設定できていなかった。

image.png

参考にした記事(いつもありがとうございます)

DockerでMySQLを利用する[docker container run オプション]

Error starting userland proxy: listen tcp0.0.0.0:3306: bind: address already in use

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

laravel migration失敗した話 

migrationに失敗してエラーが出たので、解決策を共有します。

やりたかったことは、usersテーブルの追加です。
なので、下記コマンドを実行しました。

php artisan make:migration create_users_table
//users table 作成

エラー内容

どうやら、未定義の定数だそうです。

 ErrorException 
  Use of undefined constant JSON_INVALID_UTF8_SUBSTITUTE - assumed 'JSON_INVALID_UTF8_SUBSTITUTE'

ネットで検索してみると、PHPのバージョンに関する問題でした。
PHP7.2以降じゃないと出るエラーだとか
バージョンを確認するとPHP7.1でした。

そもそも、dockerコンテナ外でmigrationしてました。
ってことで、dockerコンテナの中へ

PHPのバージョンは7.4でした

そして、
migrationも無事通りました!!

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

DockerでSambaサーバーを立てる

DockerでSambaサーバーを立ててみます。

環境

構築

dperson/samba が有名らしいので、これを使います。

https://hub.docker.com/r/dperson/samba

dockerを入れていない場合は、好きな方法でインストールしてください。

sudo snap install docker

コンテナを作ります。

sudo docker create -it -p 139:139 -p 445:445 --name smbsrv -v 共有したいパス:/path1 dperson/samba \
            -p -r\
            -u "ユーザー名;パスワード" \
            -s "share;/path1;yes;no;no;ユーザー名" 

コンテナを起動させます。

sudo docker start smbsrv

うまくいけば、以下のようなログが表示されます。

# docker logs smbsrv
Added user ユーザー名.
smbd version 4.12.2 started.
Copyright Andrew Tridgell and the Samba Team 1992-2020
daemon_ready: daemon 'smbd' finished starting up and ready to serve connections

以下のメッセージは、オプションがおかしかったときに表示されます。
適切に書き直して、作り直してください。

The 'command' (if provided and valid) will be run instead of samba

docker createの部分について簡単な説明

  • Docker自体のオプションはイメージ名「dperson/samba」より前に、dperson/sambaのオプションはイメージ名より後ろに書きます。
  • -sオプションは、 「共有フォルダ名;Docker内のSambaのアクセス場所;browseableか(ネットワークコンピューターで表示をするか);readonlyか(読み取り専用か);guestか(ゲストユーザーを認めるか);アクセス可能なユーザーリスト(,区切り)」という意味です。
  • Windowsでは、「\サーバーのIPアドレス\share」でアクセスできます。
  • -r オプションはゴミ箱の無効化です

Windowsからのアクセス

ネットワークの場所の追加をして、ユーザー名とパスワードを入力するだけです。
image.png
image.png

その他

CrystalDiskMarkをやってみました。1ギガビットイーサネットです。

HDD

ext4でフォーマット済み。
image.png

SSD

ext4でフォーマット済み。
image.png

参考

https://www.atmarkit.co.jp/ait/articles/0005/22/news008.html


  1. SATA電源が必要です。USB給電のケーブルを使いました。 

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

【Dockerチートシート】

Dockerコマンドのチートシート

コンテナをバックグラウンドで動かす(起動後にdetachする)

https://docs.docker.com/engine/reference/run/#detached--d

docker run -d <image>
コンテナからExit後に自動的に削除する

https://docs.docker.com/engine/reference/run/#clean-up---rm

docker run --rm <image>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでLaravel開発環境構築(Mac)

■構成

docker-laravel
├ docker-compose.yml
├ docker
│  ├ php
│  │  ├ php.ini
│  │  └ Dockerfile
│  └ nginx
│    └ default.conf
└ server

■手順

1.Dockerのデスクトップアプリをダウンロード

公式サイトより手順に従いダウンロード(簡単です)
https://www.docker.com/products/docker-desktop

2.Docker.appを起動

terminal
open /Applications/Docker.app

3.ディレクトリ作成

docker-laravelという作業用フォルダ(名称は任意)をデスクトップに用意し、
その中に上記構成でフォルダ、ファイルを配置します。
※面倒であれば以下より、git cloneを。
https://github.com/masayan1126/docker-laravel

4.主要ファイル

詳細は割愛します(githubを参照ください。)
・docker-compose.yml
・Dockerfile
・php.ini
・default.conf(nginx設定ファイル)

5.Dockerを起動してlaravelプロジェクトを作成

・dockerを起動(少し時間かかります)

docker-compose.ymlがあるディレクトリで実行
$ docker-compose up -d

・phpコンテナに入る

$ docker-compose exec php bash

・Laravelプロジェクト作成

・下記コマンド後にserverディレクトリ以下にLaravelプロジェクトが構築される。

root@ae5eec7aea3c:/var/www#
$ composer create-project laravel/laravel docker-laravel-app(プロジェクト名)

・localhostへアクセスし、laravelのトップ画面を確認できれば成功。

スクリーンショット 2020-11-08 16.20.51.png

6.ついでにmysqlも

・mysqlコンテナに入り、ログインできれば接続完了。

terminal
$ docker exec -it db-host-practice bash
terminal
mysql -u docker -p
Enter password: パスワード

・.envファイルを修正(docker-compose.ymlの内容に合わせる)

.env
DB_CONNECTION=mysql
DB_HOST=db-host-practice
DB_PORT=3306
DB_DATABASE=[docker-composeで定義したデータベース名]
DB_USERNAME=[docker-composeで定義したユーザ名]
DB_PASSWORD=[docker-composeで定義したパスワード名]

・マイグレーション

root@4ef799d9efc8:/var/www/docker-laravel-app#
php artisan migrate

※うまくいかなければ、以下を試す。
・php artisan cache:clear

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

pytest-dockerでデータベースをfixtureする

「データベースをDockerでfixtureするpytest環境例」として次を用意した。

こちらの記事はMySQLだったがPostgreSQLでも確認してみた。

なお、データベース接続インターフェースのライブラリーとして、

を利用したが、他のものを利用する場合もほぼ同じだと思う。

conftest.py の fixture例

pytest-dockerのサンプルでhttpbinの起動待ちしているところ、

def is_responsive(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return True
    except ConnectionError:
        return False


@pytest.fixture(scope="session")
def http_service(docker_ip, docker_services):
    """Ensure that HTTP service is up and responsive."""

    # `port_for` takes a container port and returns the corresponding host port
    port = docker_services.port_for("httpbin", 80)
    url = "http://{}:{}".format(docker_ip, port)
    docker_services.wait_until_responsive(
        timeout=30.0, pause=0.1, check=lambda: is_responsive(url)
    )
    return url

これのデータベース版。アプリケーション側ではSQLAlchemy等のORMを使う場合でも直接接続ライブラリーでconnectしてみた。ORM経由だとSQLAlchemyのcreate_engine()のタイミングなのかどうなのかよくわからないし。ドライバーライブラリー経由で接続して起動確認してるってことを明示する感じで。

MySQL container の場合

MySQLコンテナーが立ち上がりconnect()に対してExceptionがでなくなるまで待つ

def is_mysqld_ready(docker_ip):
    try:
        pymysql.connect(
            host=docker_ip,
            user=os.getenv('MYSQL_USER', ''),
            password=os.getenv('MYSQL_PASSWORD', ''),
            db=os.getenv('MYSQL_DATABASE', '')
        )
        return True
    except:
        return False

@pytest.fixture(scope="session")
def database_service(docker_ip, docker_services):
    docker_services.wait_until_responsive(
        timeout=30.0, pause=0.1, check=lambda: is_mysqld_ready(docker_ip)
    )
    return

PostgreSQL container の場合

一緒ですね。

def is_postgresql_ready(docker_ip):
    try:
        psycopg2.connect(
            "postgresql://{user}:{password}@{host}/{db}".format(
                user=os.getenv('POSTGRES_USER', ''),
                password=os.getenv('POSTGRES_PASSWORD', ''),
                host=docker_ip,
                db=os.getenv('POSTGRES_DB', '')
            )
        )
        return True
    except:
        return False
@pytest.fixture(scope="session")
def database_service(docker_ip, docker_services):
    docker_services.wait_until_responsive(
        timeout=30.0, pause=0.1, check=lambda: is_postgresql_ready(docker_ip)
    )
    return

docker-compose.yml

# MySQLの場合
version: "3"

services:
  database:
    image: mysql:5.7
    ports:
      - 3306:3306
    volumes:
      - ./initdb.d:/docker-entrypoint-initdb.d
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
# PostgreSQLの場合
version: "3"

services:
  database:
    image: postgres:13
    ports:
      - 5432:5432
    volumes:
      - ./initdb.d:/docker-entrypoint-initdb.d
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}

スキーマとテストデータの準備

あとはdocker-composeでヴォリュームマウントされ初期化実行される./initdb.d:/docker-entrypoint-initdb.d./initdb.dフォルダにSQLや初期化シェルスクリプトなどを放り込んでおけばテスト可能に。

Qiitaの記事だと、Docker で MySQL 起動時にデータの初期化を行う など。

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

Raspberry PiにDockerをインストール

概要

動作確認機種

  • Raspberry Pi 3 Model B+
  • Raspberry Pi Zero W

インストール

※参考:https://docs.docker.com/engine/install/debian/

  1. パッケージを最新化します。

    sudo apt update
    
  2. Dockerインストールスクリプトをダウンロードし、実行します。

    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    
  3. piユーザをdockerグループに参加させます。

    sudo usermod -aG docker pi
    
  4. piユーザでシェルにログインしている場合は、ログアウトしてから、ログインし直します。

    logout
    

動作確認

※参考:https://docs.docker.com/engine/install/linux-postinstall/

  1. 次のコマンドを実行し、動作確認します。

    docker -v
    
    Docker version 19.03.13, build 4484c46
    
  2. 次のコマンドを実行し、hello-worldしてみます。

    docker run hello-world
    
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    4ee5c797bcd7: Pull complete 
    Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    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.
        (arm32v7)
    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:
    https://docs.docker.com/get-started/
    

自動起動

  1. 問題なければ、Raspbian OS起動時にdockerを自動起動するように設定します。

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