見出し画像

【独学】TECHCAMP受講中にDockerについて学んでみた


どうも、ジュンです

いつもご視聴、コメント、高評価、ありがとうございます

TECHCAMP名古屋 73期 副業フリーランスコースの受講生です
カリキュラムが一通り終わり、チーム開発まで間があるので今日から独学で学んだことについて説明します

Dockerで60個、docker-composeで18個のことについて学んだので、それぞれ説明します。

★Dockerで学んだこと★
1.Dockerとは
仮想環境を構築するためのツールです
WindowsやMac、LinuxなどにDockerエンジンをインストールし、
その上でDockerコンテナを動かします
そのコンテナの中でアプリケーションやミドルウェア、OSなどを
動かすことができます

大事な概念として、Dockerエンジン、Dockerイメージ、Dockerコンテナ、Dockerレジストリ、Dockerfile、Dockerネットワークの6つがあるので、Dockerの学習に取り組む場合はこれらを混同しないように注意する必要があります

2.Dockerエンジン
Dockerの心臓部分です
Dockerと言えば、基本的にこのDockerエンジンを指します
DockerエンジンがインストールされているPC上でDockerコンテナが動作します
Dockerをインストールすると言ったら、
Dockerエンジンをインストールすると思っていただいて差し支えありません

3.Dockerコンテナ
Dockerコンテナ内に、LinuxのCentOSやUbuntuなどのOSが動作する環境や、
Mysqlなどのミドルウェア、RailsやWordPressといったアプリケーションまで、
様々な環境を構築することができます
これらのコンテナは、Linuxカーネルを利用して動いています
1コンテナ1プロセスです

4.Dockerイメージ
Dockerコンテナを作るためのレシピのようなものです
Dockerイメージを元にDockerコンテナが生成されます

5.Dockerレジストリ
Dockerイメージの保存場所です
Docker HubもDockerレジストリの一つです
AWSのECRもDockerレジストリの一つです
GCPのGCRもDockerレジストリの一つです

6.Dockerfile
めんどくさい環境構築をテキストで行えちゃう
すごいやつです
ベースとなるDockerイメージに加える変更を、
コードとして記述したファイルです
Dockerfileを利用することで、
簡単にオリジナルのDockerイメージを作成することができます

7.Dockerネットワーク
複数のDockerコンテナをまとめて管理するための仕組みです
Dockerコンテナにつけた名前をホスト名として指定できるようになり、
コンテナ間での通信が簡単に実現できるようになります

8.MacやWindowsでもDockerが動く理由
MacやWindowsはLinuxカーネルを持っていません
しかし、それでもDockerは動作します
理由は、MacやWindowsを利用する場合にDockerエンジンの下で
仮想のLinuxマシンがひっそりと起動するからです

9.なぜDockerを使うのか
いくつか理由があります
1.Dockerイメージがあれば、簡単に環境構築を行うことができるため
2.Dockerfileを使えば、構築手順をファイルにまとめられるため
3,Dockerコンテナは、Linuxカーネルを共有して使うため、ハイパーバイザ型と比較して軽くて速い
4,Dockerコンテナは、作っては壊すが基本のため必ず同じ環境を作成できる

10.DockerとVirtualBoxの違い
Dockerは「コンテナ型」、
VirtualBoxは「ハイパーバイザ型」です

ハイパーバイザ型はOSの上でOSを動かすためのものが動作し、そこで更にOSが動くため、負荷が高いです
コンテナ型はOS上でDockerエンジンが動き、そこでDockerコンテナが動作する仕組みのため、動作が速いです

11.MacでDockerをインストールする方法
DockerHubのアカウントを取得します
DockerHub内にあるDockerのインストーラダウンロードページに移動します
https://hub.docker.com/editions/community/docker-ce-desktop-mac
インストーラをダブルクリックします
インストール完了後、起動ファイルをApplicationフォルダにドラッグ&ドロップします
Dockerアプリケーションをダブルクリックします
起動できれば完了です
ターミナルでdocker -vと入力すればバージョンを調べることもできます
また、docker-composeも利用できるようになっている筈です
ターミナルでdocker-compose -vと入力すればバージョンを調べることができます

Dockerのインストーラダウンロードページ
https://hub.docker.com/editions/community/docker-ce-desktop-mac

12.LinuxでDockerをインストールする方法
sudo yum install -y docker

13.LinuxでDockerをインストールしたあと起動する方法
sudo service docker start

14.Play with Docker
DockerエンジンをWeb上で動かせる環境です。
ローカル環境を穢したくない人はこのサイトでDockerを動かして色々試せます。
https://labs.play-with-docker.com/

15.スナップショット
バックアップです

16.docker search Dockerイメージ名
DockerHub上にあるDockerイメージを検索します
docker search rubyと検索すると色々出てきます
OFFICIALにOKとついたものがDocker公式に認められたDockerイメージです

17.docker pull Dockerイメージ名
DockerHub上にあるDockerイメージを取り出します
docker pull nginxとするとnginxのイメージを取ってきます
docker pull Dockerイメージ名:バージョン(2.5.1など)
とすると、バージョンも指定できます
正確にはバージョンを指定しているというより、タグを指定しています

18.docker run Dockerイメージ名
指定したDockerイメージからDockerコンテナを作成します
Dockerイメージがまだローカルに無い場合は自動的にdocker pullと同等の動作を行ったあとに
Dockerコンテナを作成します

たとえば、docker run -d -p 8080:80 --name zibunno_nginx nginxとすると、
zibunno_nginxという名前のDockerコンテナでnginxが起動し、
ブラウザでlocalhost:8080とするとnginxのページが開きます

19.docker runのオプション
-it ホストとコンテナの標準入出力を繋げます
-d バックグラウンドで実行します
-p 「ホストマシンのポート:コンテナのポート」で繋げます
--name Dockerイメージと別名にしたい場合はコンテナに名前をつけます

20.docker images
ローカルのDockerイメージの一覧を表示します
DockerイメージIDも確認できます

21.docker rmi DockerイメージID
指定したDockerイメージを削除します
一応docker rmi Dockerイメージ名でも削除はできます
意図しないDockerイメージを削除してしまう可能性があるため、
DockerイメージIDを指定するのが無難です
また、指定したDockerイメージから作成したDockerコンテナが存在している場合は
Dockerイメージは削除できないのでDockerコンテナを削除してから行います

22.docker image prune
何かしらの理由で残ってしまったゴミのローカルのDockerイメージを全て削除します

23.docker image prune -a
Dockerコンテナを生成していないローカルのDockerイメージを全て削除します

24.docker ps
ローカルで起動中のDockerコンテナを一覧で表示します
DockerコンテナIDと、現在のDockerコンテナの状態も確認できます
以降の説明で出てくるコマンドの引数にDockerコンテナIDとあるものは、
Dockerコンテナ名でも問題ないですが、DockerコンテナIDを指定するほうが
指定する対象が確実になります

docker container lsは古いコマンドで、同様の動作となります

25.docker ps -a
ローカルにあるDockerコンテナを全て一覧で表示します
DockerコンテナIDと、現在のDockerコンテナの状態も確認できます

docker container ls -aは古いコマンドで、同様の動作となります

26.docker start DockerコンテナID
Dockerコンテナを起動します
Dockerコンテナが起動中もしくは停止中のみ実行できます

27.docker stop DockerコンテナID
Dockerコンテナを停止します
Dockerコンテナが起動中もしくは停止中のみ実行できます

28.docker pause コンテナID
Dockerコンテナを一時停止します
Dockerコンテナが起動中のみ実行できます

29.docker unpause コンテナID
Dockerコンテナの一時停止を解除します
Dockerコンテナが一時停止中のみ実行できます

30.docker rm コンテナID
Dockerコンテナを、IDを指定して削除します
Dockerコンテナが停止中のみ実行できます

31.docker container prune
Dockerコンテナを全て削除します

32.docker exec DockerコンテナID シェル名
Dockerコンテナにログインします
たとえば、docker exec -it nginx bashとすると、
nginxにログインします
bashでmkdir testとか打つとtestディレクトリを作成したりできます
シェルがbashの場合はexitで終了します

33.docker attach DockerコンテナID
Dockerコンテナと標準入出力を繋げます
標準入出力を繋げるだけであり、
attachの場合はexecと違い、ログアウトするとコンテナが停止します
要注意です

34.docker commit DockerコンテナID 新規Dockerイメージ名
現在のDockerコンテナの状態から、新しくDockerイメージを作成します
DockerfileからもDockerイメージを作成することができ、
DockerfileからDockerイメージを作成するほうが一般的です

35.docker system prune
停止中のDockerコンテナ、未使用のDockerイメージ、
未使用のDockerネットワークを全て削除します

36.Dockerイメージ命名規則
Dockerイメージを取得する時は、3つの命名規則を意識します
1.Docker公式のイメージ
イメージ名:タグ

2.ユーザーが作成したイメージ
ユーザー名/イメージ名:タグ

3.非公式レジストリのイメージ
レジストリ名/ユーザー名/イメージ名:タグ

タグを省略すると、:latestタグが自動的に付与されます。
:latestは、一番新しいものを表します

37.レイヤ
Dockerfileで、ベースとなるDockerイメージに加えた1つ1つの変更のことを表します
Dockerfileではこのレイヤを重ねて新たなイメージを作成していきます
gitで例えるとコミットのようなものです

38.Dockerfileの注意点
最後にフォアグラウンドで起動します
サーバーは通常バックグラウンドで起動させることが多いですが、
コンテナの場合はバックグラウンドでの実行は処理が終了したとみなされ、
コンテナが停止します
コンテナを利用する場合はフォアグラウンドで起動させ、
処理が止まらないようにする必要があります

39.docker commitと比較した場合のDockerfileのメリット
構築手順をコードとしてファイルに残すことができます
構築手順の修正が簡単です
ただのテキストファイルなので軽く、簡単に共有できます
Githubによるバージョン管理ができます

40.Dockerイメージに名前をつける方法
docker tag ユーザー名/Dockerイメージ名
のような形で命名します
命名したあと、docker imagesコマンドを実行すると
tagがついたimageが新しく追加されていることが確認できます

41.DockerHubにログインするコマンド
docker login
ユーザー名とパスワードをそれぞれ入力することで
DockerHubにログインした状態となります

42.DockerHubにDockerイメージをアップロードする方法
docker push ユーザー名/Dockerイメージ名
とします
ユーザー名が間違っていたり、そもそもDockerHubにログイン
していない場合はDockerHubから拒否(denied)されます

43.Dockerfileで使える全コマンド
FROM
RUN
CMD
COPY
ADD
ENV
WORKDIR
ARGS
ONBUILD
LABEL
ENTRYPOINT
STOPSIGNAL
MAINTAINER
VOLUME
HEALTHCHECK
EXPOSE
USER
SHELL
なお、MAINTANERコマンドは非推奨なので、
このコマンドが使われているDockerfileは既に古くなっている可能性があります

44.Dockerfileでよく利用するコマンド
FROM,RUN,CMD,COPY,ADD,ENV,WORKDIR

45.FROM
ベースとなるDockerイメージを指定します

46.RUN
Dockerコンテナ内で実行するコマンドを記述します
yumなどのコマンドを実行する際は、このコマンドをメインに使います

47.CMD
Dockerイメージからコンテナを作成するときに実行する
コマンドを実行します
そのため、1回しか使いません

48.COPY
ホストマシンにあるファイルやディレクトリをDockerコンテナにコピーします
Nginxなどの設定ファイルをコピーする際に利用します

49.ADD
COPYコマンドを拡張したコマンドです
ホストマシンにあるファイルやディレクトリをDockerコンテナにコピーします
URLを指定した場合、そのURLからファイルをダウンロードし、Dockerコンテナ内へコピーします
コピーしたものが.tarもしくは.tar.gzの場合自動で解凍してくれます

50.ENV
Dockerfileの中で利用する環境変数を設定するための命令コマンドです
cpで指定するファイルパスなど、何度も繰り返し出てくるような場合は設定しておきます

51.WORKDIR
RUNやADDなどの命令コマンドを実行するディレクトリを設定します
ディレクトリがない場合は自動で作成してくれるため、
ディレクトリ作成と移動を同時にしたい場合にも利用します

特定のディレクトリで命令コマンドを実行することが多い場合は、
設定するようにします

52.docker build -t 新規Dockerイメージ名 指定ディレクトリ
Dockerfileから
指定ディレクトリにある新規Dockerイメージ名に指定したDockerイメージを
作成します
-tは新規イメージ名でDockerイメージを作成するためのオプションです
ディレクトリはCOPYコマンドを実行する時にどのディレクトリを起点とするかを表します
.とするとローカルホストの現在のディレクトリを示します

53.docker system df
Dockerが利用しているメモリを参照することができます

54.docker builder prune
dockerfileでbuildした時に貯まるキャッシュを削除します
dockerfileをbuildしまくっていると、キャッシュが溜まり、
非常に多くのメモリを使った状態でDockerを使用することになります

55.効率的なdockerfileの書き方その1
dockerfileをbuildした時に、レイヤがキャッシュされるという特徴があります
ただし、Dockerfileに新たな命令コマンドを追加すると、
その追加した行から下の命令はキャッシュされません
buildの時間を短縮するために、変更頻度が少なそうなコマンドは上に、
変更頻度が高そうなコマンドは下に記述するのがいいです

56.効率的なdockerfileの書き方その2
Dockerfileでは命令コマンドの数だけDockerイメージのレイヤが増えていきます
このレイヤが増えていくと、Dockerイメージのサイズもどんどん大きくなっていきます
できるだけDockerイメージを軽くしておくためにも、まとめられるコマンドはまとめます
例えば、
RUN yum install -y hoge
RUN yum install -y huga
と分けずに、
RUN yum install -y hoge huga
とするのがいいということです

ただし、頻繁に変更が発生しそうなコマンドは、
キャッシュの観点からあえてまとめずに分けておくことも大切です

57.docker network ls
Dockerネットワーク一覧を表示します

58.docker run --name Dockerイメージ名 --network Dockerネットワーク名 -d 新規Dockerコンテナ名
指定したDockerイメージ名からDockerコンテナをDokerネットワークに関連付けし、
-dによってバックグラウンドで新規Dockerコンテナを指定した名称で起動します

59.docker logs DockerコンテナID
Dockerコンテナの起動コマンドを実行しても起動しないことがよくあります
その場合は、このコマンドでエラーログを確認することができます
僕の場合、railsのDockerコンテナ作成時にmysql2がないと怒られたり
pumaがないと怒られたりしたので、デバッグする時には必須のコマンドです

60.オーケストレーションツール
複数のDockerを動かすためのツールです
docker-compose、swarm、ECS、Kubernetesがあります

★docker-composeで学んだこと★

1.docker-composeとは
複数のDockerコンテナからなるアプリケーションを定義し、操作するためのツールです
Dockerイメージの作成方法やコンテナ起動時の設定などをdocker-compose.ymlに記述することで、
docker composeコマンドでまとめて操作できるようになります
実は、docker-composeを利用すると
Dockerネットワークをわざわざ自分で作成する必要がなくなります

2.docker-composeのメリット
コンテナ間の通信ができます
実行コマンドが簡潔になります
ファイルで管理するため、インフラ構成を可視化できます
Githubによるバージョン管理ができます
docker runやdocker buildを使わなくても良くなります

3.Dockerfileとdocker-composeの違い
DockerfileはDockerイメージの作成手順を記述します
docker-composeはDockerイメージのbuildやDockerコンテナの作成、
Dockerコンテナの起動方法、Dockerネットワークを使った構成の管理を記述します

4.docker-composeを書くファイル
docker-compose.ymlです
version,services,build,environment,depends_on,ports,volumes,volumes_formといったものを記述していきます

5.version
docker-composeで使用するバージョンを指定します
3だとvolumes_fromが使えません

6.services
アプリケーションを構成するためのサービスを設定します
app,db,webなどがあります

7.build
Dockerfileの場所を指定します

8.environment
コンテナ内で利用する環境変数を設定します

9.depends_on
サービス同士の依存関係を設定します

10.ports
ホストマシンとゲストマシンのポートフォワードを設定します
docker run -pと同様の設定です

11.volumes
マウントの設定をします
ホストマシンの指定されたディレクトリに、コンテナ内のログファイルをマウントすることで、
Dockerコンテナが停止してもホストマシンからログを確認することができます

12.volumes_from
コンテナ間でマウントするための設定です

13.docker-compose build
docker-compose.ymlに従い、
複数のDockerfileを参照してDockerイメージをまとめて作成します

—no-cacheをつけると、Dockerfileのキャッシュを用いずにビルドします

14.docker-compose up -d
docker-compose.ymlを元にDockerコンテナを作成し、起動します
-dは、バックグラウンドでDockerコンテナを起動するオプションです

15.docker-compose run サービス名 コマンド
docker-compose.ymlにあるサービス名を元にDockerコンテナ内でコマンドを実行します

16.docker-compose restart
docker-compose.ymlを元にDockerコンテナを再起動します
コンテナ内のサーバを再起動させて、設定ファイルを読み込ませたい場合に使えます

17.docker-compose rm
docker-compose.ymlを元にDockerコンテナを停止します

18.docker-compose down
docker-compose.ymlを元にDockerコンテナを停止し、
ネットワークごと削除します

--rmi allを末尾につけるとDockerイメージも削除します

参考にしたブログ記事とyoutuberのチャンネルを貼るので、
興味がある方は参照してみてください

■参考にしたブログとyoutubeチャンネル
★キツネさんのブログ「キツネの惑星」 Dockerの基礎を体系的に勉強する記事まとめ
https://kitsune.blog/engineer/docker

★くろかわこうへいさん 「目指せコンテナマスター :ECS, Fargate編」
https://www.youtube.com/watch?v=DS5HBTMG1RI&list=PLtpYHR4V8Mg-jbuk4yoXhXwJtreodnvzg

今回の動画は以上です
今日もまたひとつ賢くなりました

この動画がいいなと思った方はチャンネル登録、高評価、
twitterのフォロー、よろしくお願いします

それではまた次の動画でお会いしましょう
ご視聴いただき、ありがとうございました

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