Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

必要のない情報収集をしないことにした

この記事を書いた背景

TwitterYoutubeをブロックする前は、それらを使って情報収集をすることがあったのですが、「必要のない情報を収集するのって意味ないんじゃね?」と思い、記事にまとめることにしました。

なぜ必要のない情報を収集する意味がないと感じたのか

(注) YoutubeよりもTwitterで世の中の情報を収集することが多いので、Twiterに絞って書きます。

なぜ必要のない情報を収集する意味がないと感じたかというと、結局その状況に直面した人が見ないと情報を価値のあるものに昇華できず、イタズラに情報収集をしているだけだなと感じたからです。その情報収集する時間があれば、自分が本来やるべきであることにも時間を注げますし。。

自分はエンジニア関連の情報を収集するためにTwitterを見るのですが、「エンジニアはこのサイトでCS勉強しろ」とか、「最先端の技術(RustやGo)を勉強して市場価値を上げろ」とか、「React18ではこのような新機能が出た」とか、「メガベンチャーに転職して年収600万行った」とか、「こういう起業パターンは失敗する」等見て「そうなんだ」と感心していた時代もありましたが、結局それらの情報って、今必要じゃないなら見ても意味ないなと感じます。CS勉強したいなと思っていないのに見ても意味ないし、仕事でRustやGo、React18を使わないのにその情報を見ても意味ないし、すぐに転職を考えていない人が転職の情報を見ても意味ないし、今すぐ起業しないのにその情報を見ても意味ないしと思います。

結局そういう情報って、自分が今こういう行動をしていて、情報が欲しいなと思った時に一気に収集する方が効率良いし、実際に使う場面に遭遇しないと、ただ情報収集しているだけで、頭に残らないし身につかないしあまり良くないなと感じます。

結論

行動していないのに、情報収集して前身していると自分は思いがちなので、それだけは避けたい。。やっぱ、行動しながらその行動に必要な情報だけを収集するのが一番良いなと感じます。この記事を書きながら何かの本で見た「やらない後悔よりやりながら軌道修正すべき」というのを思い出して、ハッとしました。あと、前職のCEOの「何をやるかを決めるより、何をやらないかを決める方が大事」という言葉も思い出して、余計ハッとしました笑。人生短いからこそ、もっと自分のことに集中したいし、身近な人に価値貢献したいし、エンジニアに捉われず、いろんな新しいことに挑戦していきたいなと感じました。

追記

今考えると、すごく当たり前のこと書いているなと感じました笑。 当時はツイッターにすごく依存していたんだなと思います笑。結局重要な情報って人づてにしか得ることができないので、無理にTwitterYoutubeで情報収集しなくても良いかなと思います。

【さわって学ぶクラウドインフラ docker 基礎からのコンテナ構築】第4章 Dockerの基本操作で知らなかったことをざっくりまとめてみた

目次

docker runコマンドは何をやっているか

docker runコマンドは、「docker pull」、「docker create」、「docker start」という3つの一連のコマンドをまとめて実行する利便性を重視したコマンドです。「実行したいコマンド」は省略でき、省略したときは、イメージの制作者が設定した既定のコマンドが指定されたことになります。

docker run コマンドは以下の書式です。

docker run オプション イメージ名 実行したいコマンド
docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

上のコマンドは以下と同じことをしています。

docker pull httpd:2.4
docker create --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4
docker start my-apache-app

コンテナ起動から終了までの流れを以下に図示しました。

(注) イメージが既に存在する場合、docker pullは実行せず、docker createとdocker startのみ実行します。

Dockerイメージの取得

Dockerイメージは、Docker HubにあるDockerリポジトリから取得します。取得するときはdocker pullコマンドを実行します。

docker pull イメージ名 or イメージID

(※) イメージ名にはタグを指定できます。タグとは Dockerイメージのバージョンみたいなものです。タグ名を指定するときは、半角のコロンで区切ります。タグ名を省略したときは、最新版を意味する「latest」という特殊なタグが指定されたものとみなされます。

(注) docker pullで入手したイメージは、Dockerホストに保存されます。もう一度、同じイメージをdocker pullしても、ダウンロードし直されることはありません。 保持しているイメージはdocker image lsコマンドで確認できます。

ubuntu@ip-10-0-12-65:~$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
e9995326b091: Pull complete 
ee55ccd48c8f: Pull complete 
bc66ebea7efe: Pull complete 
5d0f831d3c0b: Pull complete 
e559e5380898: Pull complete 
Digest: sha256:6551a833f2b232fb9e627c4815217d84894446c2b94046bfdd1d9309ec09c042
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
ubuntu@ip-10-0-12-65:~$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
httpd        latest    fe8735c23ec5   3 weeks ago   145MB

Dockerコンテナの作成

docker createコマンドを実行することで、DockerイメージからDockerコンテナを作成することができます。「実行したいコマンド」は省略でき、省略したときは、イメージの制作者が設定した既定のコマンドが指定されたことになります。 この実行したいコマンドはdocker startを実行すると、実行できます。

docker create オプション Dockerイメージ名 or イメージID 実行したいコマンド

以下のhttpdのコンテナを作るコマンドを実行する場合、「実行したいコマンド」を省略しています。この場合、httpdイメージの制作者が定めた既定のコマンド(Apacheを実行し、通信を待ち続けるためのコマンド)が暗黙的に指定されます。

docker create --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

nameオプションによる名前づけ

nameオプションを指定しないと、ランダムなコンテナ名が付けられます。 そのため、docker createでコンテナを作成する際は、nameオプションを指定してコンテナに名前をつけます。

pオプションによるポート設定

「 -p」オプションを指定することで、 Dockerホストのポート番号とコンテナのポート番号をマッピングすることができます。

-p Dockerホストのポート番号:コンテナのポート番号

例えば、「-p 8080:80」の場合、DockerホストのTCPポート8080番を、コンテナの80番に紐づけるという意味です。このようなポートマッピングをすることで、「http://DockerホストのIP:8080:でアクセスすると、その通信がコンテナのポート80番に転送され、Apacheが公開している内容が見えるようになります。

(※) pはpublish(公開)の略です。コンテナのポートの一部をホストから公開して、外部から見えるようにするという意味です。また、コンテナは、制作者によって、どのポート番号を使うかが決まっています(そしてそれはドキュメントに記載されています)。

(注) Dockerでは pオプションを指定しない限り、DockerホストとDockerコンテナとの通信はつながりません。Dockerホストを通じてDockerコンテナ内で動いているプログラムと通信するためには、明示的にpオプションの設定が必要です。

vオプションによるマウント設定

「-v」オプションは、 コンテナの特有のディレクトリに、ホストのディレクトリをマウントするオプションです。

-v ホストのディレクトリ:コンテナのディレクトリ

以下の場合、$PWDの値をコンテナの/usr/local/apache2/htdocs/に割り当てています。$PWDは、 dockerコマンドを入力した瞬間の、ホスト側のカレントディレクトリを示す環境変数です。 /usr/local/apache2/htdocs/は、コンテナ側のマウント先のディレクトリです。httpdイメージの制作者は、このディレクトリをWebコンテンツとして(ドキュメントルートとして)公開するように構成しています。

-v "$PWD":/usr/local/apache2/htdocs/

(※) コンテナは、制作者によって、「あるディレクトリにコンテンツを置く」とか「あるディレクトリを基準にコンパイルする」などが決まっています(ドキュメントに記載されています)。そこで、-vオプションを指定して、そのディレクトリにDockerホストのディレクトリを割り当てて処理するようにします。

マウントとは

マウントとは、あるディレクトリに対して、別のディレクトリを被せて、そのディレクトリの内容が見えるようにする設定のことです。マウントしている間、マウント先の元のディレクトリの内容は隠され、マウントを解除すると元に戻ります。 例えばマウント元のディレクトリAをマウント先のディレクトリBにマウントするとします。マウント先でファイルaを置いてマウントを解除した場合、マウント先はマウント前の状態に戻りますが、マウント元はマウント先の情報が同期されるので、マウント先にはファイルaが存在しています。

Dockerコンテナの開始と停止

docker createでコンテナを作成しただけだと、コンテナはまだ起動していません。docker startを実行することで、 コンテナを起動させることができます。実はdocker startはコンテナを起動させるという意味ではなく、コンテナを作成するときに指定した「実行させたいコマンド」を実行するためのコマンドです。 httpdイメージで作成したコンテナの場合、コマンドを指定していないので、docker startを実行すると、既定のコマンド(Apacheを実行し、通信を待ち続けるためのコマンド)が実行されます。 そして、そのコマンドの実行が完了すると、Dockerコンテナは停止します。 httpdコンテナの既定のコマンドは終了することがないように作られています。そのため、コンテナはずっと実行しっぱなしの状態でいられます。コンテナ内で実行中のコマンドを停止するためにはdocker stopコマンドを実行します。コンテナ内で実行中のコマンドの実行が終了するのに伴い、コンテナが停止します。

(※) docker stopでコンテナが停止しない場合、docker killコマンドを使うことで強制停止することができます。

デタッチとアタッチ

稼働中のコンテナは、何かのコマンドがずっと実行しっぱなしです。実行しっぱなしであれば、シェルのプロンプトが表示されないので、そのコマンドが終了するまで次のコマンドを入力できません。この問題はコンテナをバックグラウンドで起動させれば解決します。 コンテナをバックグラウンドで起動させるためには、「-dit」オプションを指定します。 「-dit」オプションを指定しないと、フォアグラウンドでコンテナが起動します。

Image from Gyazo

-ditオプションの役割

-ditは、 「-d」「-i」「-t」の3つのオプションを組み合わせたものです。「-d」が、端末から切り離してバックグラウンドで実行することを指定するオプションです。「-i」と「-t」は、このコンテナを端末(キーボードとディスプレイ)から操作するためのオプションです。順番に意味はなく、-itdでも大丈夫です。コンテナをバッググラウンドで起動させたい場合、「-d」オプションを指定します。コンテナをキーボードで操作したい場合、「-it」オプションを指定します。

オプション 意味
-d デタッチモード。端末と切り離した状態でバックグラウンドで実行する
-i インタラクティブモード。標準入出力及び標準エラー出力をコンテナに連結する。-iオプションを指定しないと、キー入力はコンテナに伝わりません。そして、コンテナからの出力が届きません。
-t 疑似端末(pseudo-tty)を割り当てる。疑似端末とは、カーソルの移動や文字の削除などの文字入力をサポートする端末のこと。-iオプションを指定しないと、Ctrlキーなどが使えません。

(※) 「-d」を省略して、端末と接続した状態でコンテナを実行することを「アタッチ(attach: 接続されたの意味)」と言います。

デタッチとアタッチの切り替え

アタッチ状態からデタッチ状態に切り替えるためには、「ctrl + P」、「ctrl + Q」を順番に実行します。端末がコンテナとアタッチしているので、端末からの入力をコンテナが受け取ることができます。デタッチは端末とコンテナが切り離されているので、コンテナ内で実行されているコマンドに対して何かキー操作することはできません。デタッチ状態からアタッチ状態にするためには、docker attachコマンドを実行します。

コンテナをメンテナンスする

動作中 or 停止中のコンテナに入り込んで操作するためには、 コンテナの中でシェルを実行して、そのシェルを通じて、さまざまな操作をします。

停止中のコンテナでシェルを実行する

docker runの実行したいコマンドに、/bin/bashを指定します。本来実行される既定のコマンドの代わりに、これらのシェルが起動されるようにします。このときキー操作をするので、「-it」のオプションを指定します。

docker run --name my-apache-app -it httpd:2.4 /bin/bash

lsコマンドを実行してファイルの一覧を確認したり、コンテナ内のファイルを変更したり、アプリケーションをインストールすることができます。シェルを終了させないで、コンテナとデタッチしたい場合は、「ctrl + P」、「ctrl + Q」を順番に実行します。その場合、コンテナはバッググランドで起動しています。コンテナに入った状態でシェルを停止させたい場合、exitを実行します。そうするとコマンドの実行が終了するので、コンテナは停止します。

動作中のコンテナでシェルを実行する

こちらの方が使うケースが多いです。 稼働中のコンテナに対して影響を与えることなくコンテナの中に入り込んで作業するためには、docker execコマンドを実行します。docker execコマンドとは、指定したコンテナの中でプロセスを実行するためのコマンドです。

docker exec -it コンテナ名 実行したいコマンド
docker exec -it my-apache-app /bin/bash

exitコマンドで「実行したいコマンド」を終了させることができます。このコマンドを終了させただけなので、コンテナ自体は起動したままです。

一回限り動かすコンテナの使い方

Dockerではコンテナを常時起動させる以外に、一回限り動かすコンテナの使い方があります。例えば、コンパイラや画像変換ライブラリなどの便利ツールが入ったコンテナを使って、Dcokerホストのファイルを処理したいというケースです。一度インストールしてしまうと、アンインストールが困難であったり、他の環境に影響を与えてしまう場合、このコンテナを使ったやり方だと手軽に試せます。コンテナを破棄して仕舞えば、元の状態にすぐ戻せるからです。コンテナにDockerホストのディレクトリをマウントして、コンテナ内でファイルを処理しています。その結果はマウント元のディレクトリに同期されるので、ファイルに対して処理を間接的に実行することができます。

一度限りしか動かさないコンテナの場合、--rmオプションを指定して、実行が完了したときに、コンテナを削除するようにします。また、すぐに破棄するコンテナに名前をつけても意味がないので、--nameオプションは省略します。

停止しているコンテナや使用していないイメージを一気に削除する

docker container pruneコマンドを実行すると、停止しているコンテナを全てまとめて削除できます。

docker container prune

また、docker image pruneを実行すると、どのコンテナも使用していないイメージを全て削除します。

docker image prune

ちなみに、全てのコンテナを停止させるためには、以下のコマンドを実行します。docker ps -qで、起動しているコンテナのIDのみを取得します。

docker stop $(docker ps -q)

参考記事

さわって学ぶクラウドインフラ docker基礎からのコンテナ構築 | 大澤 文孝, 浅居 尚 |本 | 通販 | Amazon

コンテナに入りたい?それ docker exec でできるよ - Qiita

コマンドでDockerコンテナを停止・削除、イメージの削除をする - Qiita

【さわって学ぶクラウドインフラ docker 基礎からのコンテナ構築】第3章 5分でWebサーバーを起動するで知らなかったことをざっくりまとめてみた

目次

概要

今回はApacheがインストールされたコンテナを実行して、Webサーバーを動かすまでの操作をやります。

(注) EC2インスタンス自体にApacheをインストールしても、WebサーバーとしてEC2インスタンスを機能させることができます。コンテナを使うことで、EC2インスタンスに直接Apacheをインストールしなくても良くなります。

dockerコマンドの書式

dockerコマンドは、次のような書式を取ります。

docker コマンド 操作対象 オプション

Docker操作の大まかな流れ

今回は、下記の流れでDockerを操作します。

  1. イメージを探す
    Docker Hubから、目的のコンテナの元となるイメージを探します。

  2. コンテナを作成する
    dockerコマンドでイメージからコンテナを作成します。これでWebサーバーが起動します。

  3. コンテンツを作る
    Webサーバーで見せたいコンテンツとしてindex.htmlを作成します。

  4. コンテナの停止と再開
    コンテナはいつでも停止することができ、また再開できます。停止中はWebサーバーとして機能しないことを確認し、再開すれば、また動き出すことを確認します。

  5. ログの確認
    コンテナを運用する上では、ログを確認する必要があります。起動したWebサーバーのログを確認してみます。

  6. コンテナを破棄する
    使用しないコンテナは破棄します。

  7. イメージを破棄する
    ディスクを消費するので、最後にダウンロードしたイメージを削除しておきます。

作業手順

手順1:
Docker HubのサイトでApacheを検索して、httpdというDockerイメージが存在するかを確認します。 Image from Gyazo

手順2:
以下のコマンドを実行して、DockerイメージをDocker Hubからプルしてきて、Dockerコンテナを起動します。nameの部分には命名したいコンテナ名を指定します。

docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

↓ コマンドを実行した時のログ

ubuntu@ip-10-0-12-65:~$ docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4
Unable to find image 'httpd:2.4' locally
2.4: Pulling from library/httpd
e9995326b091: Pull complete 
ee55ccd48c8f: Pull complete 
bc66ebea7efe: Pull complete 
5d0f831d3c0b: Pull complete 
e559e5380898: Pull complete 
Digest: sha256:5fa96551b61359de5dfb7fd8c9e97e4153232eb520a8e883e2f47fc80dbfc33e
Status: Downloaded newer image for httpd:2.4
141390abadd3e74a4f379557236891b159bc42551b71946debcef02320b4c758
ubuntu@ip-10-0-12-65:~$ 

手順3:
「docker ps」と入力すると、稼働中のコンテナの一覧が表示されます。「STATUS」の部分が「Up」と表示されていれば、コンテナが起動しています。

ubuntu@ip-10-0-12-65:~$ docker ps
CONTAINER ID   IMAGE       COMMAND              CREATED         STATUS         PORTS                                   NAMES
141390abadd3   httpd:2.4   "httpd-foreground"   3 minutes ago   Up 3 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   my-apache-app

手順4:
EC2インスタンスIPアドレスでEC2インスタンスにアクセスすると、ApacheのWebページが表示されます。

手順5:
コンテナを停止するためには、「docker stop」コマンドを使用します。 stopコマンドにはコンテナ名 or コンテナIDを指定します。

docker stop コンテナ名 or コンテナID

docker psは稼働中のコンテナしか表示しないので、稼働中ではないものを含むすべてのコンテナを表示したい場合は-aオプションを指定します。 STATUSが「Exited」になっていれば、終了していることが分かります。

ubuntu@ip-10-0-12-65:~$ docker ps -a
CONTAINER ID   IMAGE       COMMAND              CREATED          STATUS                      PORTS     NAMES
141390abadd3   httpd:2.4   "httpd-foreground"   16 minutes ago   Exited (0) 19 seconds ago             my-apache-app

(注) docker stopコマンドはコンテナを停止させるだけであって、コンテナは残り続けるので、注意が必要です。

手順6:
コンテナを再開させるためには、docker startコマンドを使用します。

docker start コンテナ名 or コンテナID

手順7:
実行中のコンテナのログを確認したい場合、docker logsコマンドを使用します。

docker logs コンテナ名 or コンテナID

手順8:
docker stopしてもコンテナは停止するだけで残り続けます。そのため、ディスクを圧迫します。コンテナを使わないのであれば、コンテナを停止するのではなく、docker rmコマンドでコンテナを削除します。コンテナを削除するためには、docker stopコマンドでコンテナを一旦停止させる必要があります。

手順9:
実際にどのようなイメージをダウンロードしたのかは、docker image lsコマンドで確認できます。

ubuntu@ip-10-0-12-65:~$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
httpd        2.4       fe8735c23ec5   2 weeks ago   145MB

コンテナを破棄しても、ダウンロードしたイメージは残ったままです。これは同じDockerイメージからコンテナを作るときに再ダウンロードしないようにするためです。Dockerイメージはディスクを消費するので、使わない場合は削除しましょう。 docker image rmコマンドでDockerイメージを削除します。 削除したいイメージ名を指定します。イメージ名は「REPOSITORY:TAG」の書式で指定します。

docker image rm REPOSITORY:TAG

参考記事

さわって学ぶクラウドインフラ docker基礎からのコンテナ構築 | 大澤 文孝, 浅居 尚 |本 | 通販 | Amazon

Docker Hub

【さわって学ぶクラウドインフラ docker 基礎からのコンテナ構築】第2章 Dockerを利用できるサーバーを作るで知らなかったことをざっくりまとめてみた

目次

概要

今回は、AWS上にDockerを利用できる環境を整備して、実際に手を動かしながらDockerの使い方を習得します。

ディストリビューション付属のパッケージとDocker提供のパッケージ

Docker Engineは、Linuxディストリビューションに含まれています。そのため、yumコマンドやaptコマンドでインストールできます。それとは別にDocker社もDocker Engineのパッケージを提供しています。

ディストリビューション付随のものはyumコマンドやaptコマンドでインストール・アップデートできます。しかし、ディストリビューションによっては、インストールされているDockerのバージョンがまちまちです。一方、Docker提供のパッケージを利用する場合、常に最新版を利用することができます。しかし、アップデートは自分で追う必要があります。保証やセキュリティアップデートなどの運用の面では、ディストリビューションの方が良いです。しかし、学習目的の場合、最新版を使うのが良いので、Docker提供のパッケージが良いです。

(※) yumコマンドはRed Hat Enterprise LinuxCentOS系におけるパッケージのインストールコマンドです。aptコマンドはUbuntuFedoraなど、Debian系のパッケージのインストールコマンドです。

Dockerが使えるEC2インスタンスを作る大まかな流れ

  1. EC2インスタンスの準備
    UbuntuがインストールされたEC2インスタンスを用意します。この時、EC2インスタンスのセキュリティグループも設定します。
  2. EC2インスタンスへのSSH接続
    sshコマンドでEC2インスタンスに接続します。
  3. Docker Engineのインストール
    EC2インスタンスSSH接続した後、いくつかのコマンドを実行して、Docker Engineをインストールします。

作業手順

(※) EC2インスタンスの準備と、EC2インスタンスへのSSH接続は特に説明することがないので省略させていただきます。

手順1:
Docker Engineをインストールします。Ubuntuのパッケージに含まれているDocker Engineではなく、Docker公式から提供されている最新版を使用します。

まず、以下のコマンドで既存のパッケージをアップデートします。

sudo apt-get update

手順2:
次にDocker Engineの実行に必要なパッケージをインストールします。

sudo apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

手順3:
DockerのオフィシャルサイトからGPGキーをダウンロードして登録しておきます。GPGキーとは、ファイルが改ざんされていないことを確認するために使われる鍵のファイルのことです。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

手順4:
Dockerの公式サイトからDocker Engineをダウンロードできるようにするために、Dockerダウンロードサイトをaptリポジトリに追加します。

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

手順5:
パッケージをアップデート後、Docker Engin一式をインストールします。

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

手順6:
Ubuntuの場合、デフォルトではrootユーザーのみDockerを利用できます。rootユーザーに切り替えるのは面倒なので、次のコマンドを実行して、ubuntuというユーザーでも、Dockerを利用できるようにします。

sudo gpasswd -a ubuntu docker

手順7:
一旦切断して、SSHで再接続します。これでインストールは完了です。Docker Engineをインストールすると、「docker」というコマンドが使えます。

ubuntu@ip-10-0-12-65:~$ docker -v
Docker version 20.10.21, build baeda1f

参考記事

さわって学ぶクラウドインフラ docker基礎からのコンテナ構築 | 大澤 文孝, 浅居 尚 |本 | 通販 | Amazon

Docker Engineとは何か

【さわって学ぶクラウドインフラ docker 基礎からのコンテナ構築】第1章 コンテナの仕組みと利点で知らなかったことをざっくりまとめてみた

目次

Dockerとは

Dockerとは、コンテナ技術を実現するためのソフトウェアです。 Dockerは、Docker EngineをインストールしたLinux環境で動作します。

コンテナとは

コンテナとは、 ざっくり言うと、アプリケーションの実行に必要なプログラムやライブラリ、各種設定ファイルなどをひとまとめにして、隔離して実行するための仕組みまたは空間のことです。

コンテナのメリット

コンテナのメリットは、コンテナ自体をコピーして別のコンピュータで動かせることです。また、Dockerコンテナを使うことで、なんでもひとまとめにして、Docker Enginさえあればすぐに実行することができます。

従来の仮想化技術とコンテナの違い

従来の仮想化技術ではゲストOSが必要でした。コンテナの場合、ゲストOSは必要ではありません。そのため、OSのリソースを使わないのでリソースの節約になります。コンテナ環境ではOSは共通で利用して、アプリが使用するCPU・メモリ・ファイル・プロセス等はそれぞれのコンテナで管理します。

以下の画像がわかりやすかったので引用させていただきます。

↓ 画像引用(コンテナとは何か解説、従来の仮想化と何が違う?DockerやKubernetesとは?)

Docker Engineとは

Docker Engineとは、「Dockerイメージ」や「Dockerコンテナ」を制御するためのプログラムです。 DockerはLinux上で動作するソフトウェアです。Linuxに「Docker Engine」をインストールすると、Dockerのコンテナ(Dockerコンテナと呼ぶ)を実行できるようになります。

(※) Docker Engineをインストールしたコンピュータを「Dockerホスト」と呼びます。

(注) Docker Desktopというソフトウェアを利用すれば、Linux環境にしなくても、Mac環境やWindows環境で動かすことができます。

Dockerを操作するためのdockerコマンド・Docker Composeコマンド

Dcoker Engineには、コンテナを操作する様々なインターフェース(dockerコマンド or Docker Composeコマンド)が備わっています。

Dockerイメージとは

Dockerコンテナを一から作るのは、必要なライブラリ、フレームワーク、コマンドなどをインストールする必要があるので結構めんどくさいです。そのため、Dockerコンテナを作る場合、Dockerイメージを元にコンテナを作成します。Dockerイメージとは、 コンテナを作成するために必要なファイルを全てまとめてパッケージ化したものです。

Dockerイメージの種類

Dockerイメージは2種類存在します。 「基本的なLinuxディストリビューションだけのDockerイメージ」と「アプリケーション入りDockerイメージ」です。

  1. 基本的なLinuxディストリビューションだけのDockerイメージ
    UbuntuCentOSなどのLinuxディストリビューションだけで構成されている基本的なDockerイメージです。必要なものを追加でインストールして独自のコンテナを作成したい場合に使用します。
  2. アプリケーション入りDockerイメージ
    アプリケーション入りDockerイメージは、 既にアプリケーションがインストールされていて、すぐに使えるDockerイメージです。 ApacheやNginx、MySQLなどが既にインストールされているDOckerイメージなど様ざまな種類が存在します。

Dockerレジストリとは

Dockerレジストリとは、 Dockerイメージを管理しているサーバーのことです。 Dockerレジストリの代表的な例は、Docker Hubです。Dockerレジストリは「Dockerリポジトリ」という単位でイメージを管理します。

Dockerでは、Dockerレジストリ上で管理されているDockerリポジトリに登録されているDockerイメージをダウンロードして、ダウンロードしたDockerイメージからDockerコンテナを作成します。

(※) Docker Hubでは、公式のオフィシャルイメージと、個人や団体などが自由に登録できる非オフィシャルイメージの2種類が提供されています。

Docker Desktopとは

Docker Desktopとは、 WindowsMacOSでDockerを動かすためのソフトウェアです。 Docker Desktopの内部にはLinuxカーネルが含まれており、WindowsMacOS上でDocker Desktopを実行すると、Linuxが実行され、その上でDockerを実行できます。

Docker Desktopのメリット

Docker Desktopのメリットは、サーバーで動かすのと同じDockerコンテナをローカルで実行できるところです。

Dockerのメリット・デメリット

メリット

  1. アプリケーション入りDockerイメージを使うと、システムを簡単に構築できる
  2. Dockerイメージを作成することで、複製を作りやすい

デメリット

  1. Linuxシステム上でしか動かない
  2. 仮想サーバーと違って、完全な分離ではない
    Dockerは隔離した空間でプログラムを実行する技術にすぎません。

参考記事

さわって学ぶクラウドインフラ docker基礎からのコンテナ構築 | 大澤 文孝, 浅居 尚 |本 | 通販 | Amazon

Dockerとは何か?初心者にもわかりやすく仕組みやメリットを解説 | キツネの惑星

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション10: マルチタスク(プロセスとジョブ)で知らなかったことをざっくりまとめてみた

目次

プロセスとは

プロセスとは、メモリ上で実行状態にあるプログラム(ファイル)のことです。 すごくざっくりいうとプロセスとは、サーバー上で実行中のプログラムのことです。 Linuxカーネルから見た時の処理の単位とも言えます。

(※)コマンドの実態はディスク上に保存されたファイルです。シェルからコマンドを実行すると、Linuxカーネルはディスクからコマンドのファイルを読み出してメモリに格納します。そのメモリに格納された内容に従って、CPUがプログラムを実行します。ここでメモリ上で実行可能状態にあるプログラムのことをプロセスと言います。

ジョブとは

ジョブとは、シェルのコマンドラインに入力している一つの行のことです。 シェルから見た処理の単位とも言えます。コマンドが一つだけの場合、プロセスとジョブは同じ数(1つ)になります。パイプラインにより2つ以上のコマンドを組み合わせると、ジョブは1つだが、プロセスはコマンドの数だけ生成されます。

(※)ctrl + zでジョブを一時停止することができます。ctrl + cでフォアグラウンドジョブを終了させることができます。

psコマンド

psコマンドは、process statusの略です。 psコマンドはプロセスの状態を確認するためのコマンドです。 TTYはどのターミナルでコマンドを実行したのかを表しています。TIMEはCPUの利用時間です。

[ec2-user@ip-10-0-10-10 repos]$ ps
  PID TTY          TIME CMD
22056 pts/0    00:00:00 bash
22824 pts/0    00:00:00 ps

(注) psコマンドにオプションを指定する場合、BSDオプション(ハイフンのつかないオプション)で指定することが多いです。

psコマンドのオプション

psコマンドは以下のようなオプションを持ちます。

オプション 意味
x 別のターミナルやデーモンを含めた全てのプロセスを表示
a 全てのユーザーのプロセスを表示
u 詳細情報も含めてプロセスを表示

デーモンとは

デーモンとは、 コンピュータ上で常時起動されている、特定の処理を行うプロセスのことです。 ざっくりいうとデーモンとは、コンピュータ上で常時起動して特定の処理を行うプログラムのことです。

例えば、WebサーバーはいつでもHTTPリクエストを処理できるように、httpd(HTTPデーモン)というプロセスを常時動かしています。

jobsコマンド

jobsコマンドは、ジョブの状態を確認するためのコマンドです。

[ec2-user@ip-10-0-10-10 repos]$ jobs
[ec2-user@ip-10-0-10-10 repos]$ sleep 10
^Z
[1]+  Stopped                 sleep 10
[ec2-user@ip-10-0-10-10 repos]$ jobs
[1]+  Stopped                 sleep 10
[ec2-user@ip-10-0-10-10 repos]$ 

lオプションをつけて実行すると、プロセスIDも含めて実行中、停止中のジョブを表示することができます。lはlongの略です。

[ec2-user@ip-10-0-10-10 repos]$ jobs -l
[1]+ 22919 Stopped                 sleep 10

1つのジョブで2つのコマンドを組み合わせて実行した場合、jobsコマンドを実行すると、2つのコマンドに対応するプロセスが表示されました。つまり、2つのコマンドを組み合わせた1つのジョブなので、jobsコマンドの結果が1つのジョブだが、2つのプロセスが存在していることがわかりました。

[ec2-user@ip-10-0-10-10 repos]$ cat /etc/crontab | sleep 10
^Z
[1]+  Stopped                 cat /etc/crontab | sleep 10
[ec2-user@ip-10-0-10-10 repos]$ ps
  PID TTY          TIME CMD
22056 pts/0    00:00:00 bash
22932 pts/0    00:00:00 sleep
22933 pts/0    00:00:00 ps
[ec2-user@ip-10-0-10-10 repos]$ jobs
[1]+  Stopped                 cat /etc/crontab | sleep 10
[ec2-user@ip-10-0-10-10 repos]$ jobs -l
[1]+ 22931 Done                    cat /etc/crontab
     22932 Stopped                 | sleep 10
[ec2-user@ip-10-0-10-10 repos]$ 

ジョブが持つ3つの状態

ジョブは 3つの状態を持ちます。 「停止」、「フォアグラウンド」、「バックグラウンド(裏側で実行されている)です。

ジョブをフォアグラウンドに変更する

ジョブをフォアグラウンドに変更するためには、fgコマンドを実行します。

fg %ジョブ番号
[ec2-user@ip-10-0-10-10 repos]$ jobs
[1]+  Stopped                 cat /etc/crontab | sleep 10
[ec2-user@ip-10-0-10-10 repos]$ fg %1
cat /etc/crontab | sleep 10
[ec2-user@ip-10-0-10-10 repos]$ jobs
[ec2-user@ip-10-0-10-10 repos]$ 

ジョブをバックグラウンドに変更する

以下のコマンドでジョブをバックグラウンドにします。

bg %ジョブ番号

初めからコマンドをバックグラウンドで実行したい場合、&をつけます。

sleep 1000 &

ジョブを終了させる

フォアグラウンドのジョブを終了させるためには、ctrl + cを実行します。バックグラウンドのジョブを終了させたい場合、killコマンドを実行します。

[ec2-user@ip-10-0-10-10 repos]$ jobs
[ec2-user@ip-10-0-10-10 repos]$ sleep 1000 &
[1] 22965
[ec2-user@ip-10-0-10-10 repos]$ jobs
[1]+  Running                 sleep 1000 &
[ec2-user@ip-10-0-10-10 repos]$ kill %1
[ec2-user@ip-10-0-10-10 repos]$ jobs
[1]+  Terminated              sleep 1000
[ec2-user@ip-10-0-10-10 repos]$ jobs

ちなみにkillコマンドにはプロセスも指定できて、プロセスを終了させることができます。

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

デーモン

フォアグラウンド

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション9: フィルタによるテキスト処理で知らなかったことをざっくりまとめてみた

目次

wcコマンド

wcコマンドは、 文字数や行数を数えるコマンドです。 word countの略です。行数を数える場合は -l オプションを指定します(lはlineのl)。

wc -l /etc/crontab

あるディレクトリ配下のファイルやディレクトリの数を数える

wcコマンドはあるディレクトリ配下のファイルやディレクトリの数を数えるときに使用します。その場合、パイプラインを使用して、lsコマンドの標準出力をwcコマンドの標準入力にします。

[ec2-user@ip-10-0-10-10 repos]$ ls
ls.txt  rails  react  react-1  ruby.txt  sample.rb  typescript
[ec2-user@ip-10-0-10-10 repos]$ ls | wc -l
7

sortコマンド

sortコマンドは、ファイルを並べ替えるコマンドです。具体的に使用する場面を想像できなかったので、必要なときに学習します。

uniqコマンド

uniqコマンドは、重複業を取り除いて表示するコマンドです。具体的に使用する場面を想像できなかったので、必要なときに学習します。

headコマンド、tailコマンド

headコマンド、tailコマンドは、 ファイルの先頭や末尾だけを表示するコマンドです。

// 先頭3行だけを表示
head n -3
// 下から4行だけを表示
tail -n 4

head or tailのみで実行した場合、デフォルトで10行表示されます。

tailコマンドでファイルを監視する

tailコマンドはファイルの末尾を表示する以外に、ファイルの監視を行う機能もあります。指定したファイルを監視することができます。その機能を使いたい場合、-fを指定します。fはfollowの略でついていくという意味です。 つまり、ファイルの変更をついていって監視するという意味です。

tail -f 監視したいファイル名

コマンドの練習

ルートディレクトリ配下のディレクトリ数を表示する

ls -l / | grep ^d | wc -l

コマンド履歴の中から、パイプラインを使用したコマンドを、直近で実行した3個だけ表示する

history | grep \| | tail -n 3

catコマンドのヘルプメッセージのうち、ロングオプションが含まれる行だけを取り出し、cat_long_options.txtというファイルに保存する

grepでハイフン付きのキーワードを探したい場合、--を指定します。--の後ろに検索したいキーワード(--)を指定します。

cat --help | grep -- "--" > cat_long_options.txt

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

ハイフンを含む文字列を grep する - ablog