バックエンドの勉強: 1. Introduction & Docker

#日記 #備忘録 #docker

注意:この記事は自分用の備忘録であって技術の解説記事ではないです。

バックエンドの勉強をはじめた

今までやりたいことをなんとなくやってきたのですが、インターンなどに申し込むにあたり何エンジニアとして申し込むべきか迷うことが多くなってきました。そこで、バックエンドエンジニアとしてのスキルを一通り揃え、一応はバックエンドエンジニアとして申し込もうかなぁ、という気持ちになってきました(追記:これはその後あんまり良い方針じゃないなぁと思い方針変更をしました)。

募集をざっと見た感じだと、「フロントエンド」「バックエンド」「iOS」「アンドロイド」「インフラ」「セキュリティ」「機械学習」みたいな区分がされている気がします。個人的に興味がある気がするのは「バックエンド」と「セキュリティ」なので、とりあえず「バックエンド」の勉強を初めてみようかなぁとなっています。セキュリティは完全理解者以外お断りのイメージ(偏見&言い過ぎかも)なので後回しにします。

とりあえずは以下の2つの記事を参考にしていくつもりです。各項目についてはいくらでも掘り下げられる気がしますが、とりあえずは最低限のことができたら次にいくことでなるべく早く多くの技術に触れる方針でいきます。

以下の記事も参考になりそうです。

早めに進めたいので言語はとりあえず使い慣れたPythonにしておきます。そのうちHaskellとかRustとかもやりたいなぁと思いつつ。

以下の内容は勉強した内容のメモであって解説ではないのであまり参考にはならないと思いますが、どの記事を読んでるのかくらいは参考になると思います。読むなら流し読みくらいがちょうど良さそうです。

ちなみに今のところmacOS Catalina Version 10.15.4を使用して進めています。


1. Dockerの勉強をする

いきなりロードマップのStep. 18から初めてしまいます。なぜここから始めるかというとPythonの環境をDockerで作りたいからです。

まあ別に勉強しなくてもなんとなくでJupyter NotebookはDockerで使えるようにできたしPipenvも入れられそうですが、よい機会なので勉強しておこうかという感じです。


この記事でできるようになったこと

上記記事に最低限できないとまずそうなことがリストアップしてあったのでこれができるようになったら次にいきます↓

・Dockerfileを書いて
・docker buildコマンドでDockerイメージをビルドして
・そのイメージを何らかのリポジトリ(DockerHub等)にdocker pushして
・そのイメージを何らかのVM上にdocker pullして
・そのイメージをdocker runしてコンテナを実行して
・そのコンテナの特定のポートに外部からアクセスする

(最後の項目以外は以下で実際にやってみました。最後の項目含めDockerの他の機能については、実際に使ってはいませんが、機能の把握はしました)


読む記事(まずは前編)


Deamonってなんだっけになったので以下の記事を軽く眺めました。

そういえばcronは使ったことがあります。


読んでるだけなのはよくない気がするので手を動かしてみます。

1. Dockerhubからmyeqlの公式イメージをpullしてコンテナを作成・起動。ちなみに上記Docker解説サイトではコンテナの作成が

$ docker create —name コンテナにつける名前 -it イメージ名 /bin/bash

となっています。細かいことですがこれは正しくは

$ docker create --name コンテナにつける名前 -it イメージ名 /bin/bash

だと思います。

2. commitしてコンテナからイメージを作成(「基本的にはDockerfileからimageに変更を加えてイメージ自作をするべきです」とのことですが)

3. Docker Hubでリポジトリを作成しローカルのコマンドラインでDocker Hubへログイン。以下のリポジトリにpushしました。

4. 作ったコンテナとimageは全て削除しておく

Dockerfileからimageを作成するのもやっておきます。以下の記事のDockerfileの内容を拝借して作ってみました。

とりあえずdocker-composeは無視してimageを作ってみました(docker-composeについては後で)。

あるimageのTAGが1つしかない時はTAGを省略しても良さそうなものですが、そのTAGがlatestでない場合は省略できないので注意です。


さっきの記事の中編をやる。

さっき作ったコンテナがvolumeを作成していたようなので削除しておきます。

最初の方に引用した最低限できないといけないことのうち、

・そのコンテナの特定のポートに外部からアクセスする

というのがまだよくわかっていませんでしたが、これはDocker Networkの説明を読んで理解できるようになりました。ここらへんは必要に迫られたらやるのでいいかなぁという気がします。


ようやくdocker-composeについての説明が出てきました。ここまで読むと他のDockerの記事でやってることの意味がわかるような気がしてきます。

docker-compose便利すぎんか??という気持ちになっています、今。

しかし、

$ docker-compose up

としたところ、"Attaching to python3"から無限時間処理が進まなくなり泣いています。処理は終わってないですが、後編に行きます。


後編読みます。

最初に挙げた最低限できるようにならないといけないことは終わりましたが、後編だけ見ないのは気持ち悪いので、ざっと眺めます。

docker-machineコマンドが使えなかったので調べてみました。

ぼくのMacにはDocker Desktop on Macの方が入っているのでdocker-machineが入っていないということらしいです(Docker Toolboxならdocker-machineが使えるはず)。いまいちどうすればよいかよくわからないです。

以下の記事を読んでなんとなくわかった気分になりました(ほんとかなぁ)。

これを読んでdocker-machineは入れなくていいっていうことかなぁと思ったのですが、さっきの公式記事に

If you do need multiple VMs, such as when testing multi-node swarms, you can continue to use Docker Machine, which operates outside the scope of Docker Desktop.

って書いてあるのでDocker for Macではmultiple VMsはできないってことですよね。でも

With Docker Desktop on Mac, you only get (and only usually need) one VM, managed by Docker Desktop.

とも書いてあるからとりあえずはone VMしか使わないつもりでいればいいのかなぁ。

HyperKitがなんなのかよくわかってないのがよくなさそうだから少し調べました。

読みました(わからないことがわかった)。Kubernetesを勉強するとわかるようになるかもしれないと感じました。

後編記事にはDocker Swarmについて書いてありますが、Desktop Docker for Macでコンテナオーケストレーションエンジンを使いたかったらKubernetes使いましょうということなのでしょうか(ぼくはよくわかってないので注意してください)。

それでは次はKubernetesについて勉強してみます、と言いたいところですが、Kubernetesは学習コストが高いらしいから後回しにしようかなぁと思っています。とりあえず後から取り組むと良いかもしれないページをメモっておきます。


追記:以下の記事を見つけました。

コメントで、

詳しくないので教えて欲しいのですが、この記事はDocker for Macのbind mountsが遅い、という内容でしょうか?
であれば、bindするのではなく、Volumeを作成してその中にソースコードなども全て閉じ込めてしまい、例えばVS CodeのRemote Developmentなどでリモート接続して開発するということでは解決できるかなと思ったのですが、想定が違いますでしょうか? ref. https://code.visualstudio.com/docs/remote/containers#_quick-start-open-a-git-repository-in-an-isolated-container-volume

というものがありました。もしDocker for Macが遅すぎると感じたらこの辺を参照すると良さそうです。


さて、とりあえずDockerは全体像のおおよその理解ができて基本的な操作もできるようになった気がするので次にいきます。Kubernetes勉強したらまた戻ってきます。

次はPythonの環境構築した後MySQLの勉強をするつもりです。


その他のいつか読みたい記事


この記事が気に入ったらサポートをしてみませんか?