見出し画像

Dockerがわからないので雑に試す 2

自分用雑メモ


前回

docker run hello-world

Hello from Docker! が出力されていれば成功。
この命令で何が起きているのか?

イメージからコンテナを作成し、コンテナを起動している。
日本語でOk?

コンテナ、実行環境の箱を作っている。
今回は「hello-world」というコンテナをイメージから作成し、実行している。
わかるようなわからないような。

  • Dockerクライアントがリクエストを送信:

    • docker run hello-world コマンドを入力すると、DockerクライアントがDockerデーモンに対して「hello-world」イメージを実行するリクエストを送ります。

  • イメージの取得:

    • Dockerデーモンは「hello-world」イメージをローカルで探し、なければDocker Hubからダウンロードします。

  • コンテナの作成と実行:

    • Dockerデーモンは「hello-world」イメージを使って新しいコンテナを作成し、そのコンテナを実行します。

  • メッセージの表示:

    • コンテナ内のアプリケーションが実行され、結果として「Hello from Docker!」というメッセージが表示されます。

イメージにはOSも含まれているが、フル機能のOSではなく最小限の要素となっている。

  • docker run hello-world

    1. ターミナルで docker run hello-world を実行する

    2. dockerデーモンに  docker run hello-world のリクエストが送信される

    3. dockerデーモンは  hello-world のイメージを探す

      1. ローカルで探す

      2. ローカルになければ Docker Hubからダウンロードする

    4. Dockerデーモンは「hello-world」イメージを使って、新しいコンテナを作成し、それを実行する

    5. 「hello-world」の実行結果として、Hello from Docker! が出力される

クラスみたいな感じ????

アプリ作成と実行

こういう流れらしい

  1. アプリコードの用意

  2. Dockerfileの用意

    作成

  3. イメージ

    作成・起動

  4. コンテナ


シンプルなPythonアプリケーションの例


1. アプリコードの用意

まず、シンプルなPythonアプリケーションを作成します。

app.py ファイルを作成

# app.py 
print("Hello, Docker!")


2. Dockerfileの用意・作成

次に、Dockerfileを作成します。
Dockerfileは、Dockerイメージをビルドするための指示書です。

Dockerfile ファイルを作成

# ベースイメージとして公式のPythonイメージを使用 
FROM python:3.9-slim 

# 作業ディレクトリを作成 
WORKDIR /app 

# ローカルのファイルをコンテナの作業ディレクトリにコピー 
COPY app.py app.py 

# アプリケーションを実行する 
CMD ["python", "app.py"]

3. イメージの作成

Dockerfileを元にDockerイメージをビルドします。

docker build -t my-python-app .

このコマンドは、カレントディレクトリの内容に基づいて my-python-app という名前のDockerイメージを作成します。

4. コンテナの起動

ビルドしたイメージを元にコンテナを作成し、実行します。

docker run my-python-app

5. 実行結果の確認

コンテナが正常に実行されると、以下のようなメッセージが表示されます。

Hello, Docker!

フルフローのまとめ

以下は、上記のステップを一連の流れとしてまとめたものです。

1.プロジェクトディレクトリの作成

mkdir my-python-app
cd my-python-app

2.アプリケーションコードの作成

echo 'print("Hello, Docker!")' > app.py

3.Dockerfileの作成

echo 'FROM python:3.9-slim 
WORKDIR /app 
COPY app.py app.py 
CMD ["python", "app.py"]' > Dockerfile

4.Dockerイメージのビルド

docker build -t my-python-app .
  • docker:Dockerクライアントコマンドを実行するための基本コマンド。

  • build:Dockerイメージをビルドするためのサブコマンド。

  • -t my-python-app:ビルドされたイメージにタグを付けるためのオプション。ここでは my-python-app という名前のタグを付けています。

  • .:Dockerfileが存在するディレクトリのパス。ここではカレントディレクトリを指定しています。

5.Dockerコンテナの実行

docker run my-python-app

この流れに従って実行すると、Dockerを使用してシンプルなPythonアプリケーションを作成し、実行することができます。

Rubyの例

1. アプリコード、アプリケーションファイルの用意

Documents配下にdockerディレクトリを作って、作業していく。

pwdとかmkdirでこの辺は適当に。
code .   でVS Codeを起動

Rubyの標準ライブラリであるWEBrickを使用して、シンプルなHTTPサーバーを作成する。

require 'webrick'

server = WEBrick::HTTPServer.new(
    DocumentRoot: './',
    BindAddress: '0.0.0.0',
    Port: 8000
)

server.mount_proc('/') do |req, res|
    res.body = 'hello'
end

server.start

2. Dockerfileの用意・作成

以下を記述する。

FROM ruby:2.7

RUN mkdir /var/www
COPY main.rb /var/www

CMD ["ruby", "/var/www/main.rb"]


  • FROM ruby:2.7:
    ベースイメージとして公式のRuby 2.7イメージを使用します。これにより、Ruby 2.7のランタイム環境が提供されます。

  • RUN mkdir /var/www:
    コンテナ内に /var/www ディレクトリを作成します。RUN コマンドは、イメージのビルド時に実行されるシェルコマンドです。

  • COPY main.rb /var/www:

    • ローカルマシンにある main.rb ファイルを、コンテナ内の /var/www ディレクトリにコピーします。COPY コマンドは、ビルドコンテキスト(通常はDockerfileが存在するディレクトリ)からファイルをコンテナ内にコピーします。

  • CMD ["ruby", "/var/www/main.rb"]:

    • コンテナが起動したときに実行されるデフォルトのコマンドを指定します。この場合、Rubyインタプリタを使用して /var/www/main.rb を実行します。CMD は、コンテナのエントリーポイントを設定します。

全体の動作

  1. ベースイメージの指定:

    • Ruby 2.7の公式イメージをベースとして使用します。これにより、Ruby 2.7の実行環境がコンテナ内に設定されます。

  2. ディレクトリの作成:

    • /var/www ディレクトリを作成します。これは、アプリケーションのファイルを配置するためのディレクトリです。

  3. ファイルのコピー:

    • ローカルマシンの main.rb ファイルをコンテナ内の /var/www ディレクトリにコピーします。これにより、Rubyスクリプトがコンテナ内で利用可能になります。

  4. デフォルトコマンドの設定:

    • コンテナが起動すると、自動的に ruby /var/www/main.rb コマンドが実行されます。これにより、main.rb スクリプトがRubyインタプリタで実行されます。

3. イメージの作成

Dockerfileを元にDockerイメージをビルドします。
カレントディレクトリにある Dockerfile を使用して、sample/webrick:latest という名前のイメージを作成します。

docker image build -t sample/webrick:latest .
  • docker image build

    • Dockerイメージをビルドするためのコマンドです。

  • -t sample/webrick:latest

    • ビルドされたイメージに sample/webrick:latest というタグを付けます。ここで sample/webrick はイメージの名前で、latest はタグ(通常、バージョンやリリース情報を示します)です。

  • .

    • Dockerfileが存在するディレクトリのパスを指定します。ここではカレントディレクトリを示しています。

docker image build と docker build の違い

  • docker image build:

    • これは docker image コマンドのサブコマンドの一つで、特にDockerイメージをビルドするためのものです。DockerのCLIが進化する過程で、コマンドの構造がより整理され、明確化されました。docker image build はその一環として、イメージ関連の操作を明示的に分けるために導入されました。

  • docker build:

    • こちらは、従来から存在するコマンドで、同じくDockerイメージをビルドするためのものです。docker build はまだ広く使用されており、機能的には docker image build と同じです。


イメージの確認

docker image ls

Dockerコマンドのヘルプ

docker --help
docker image --help

4. コンテナの作成、実行

docker container run -p 8000:8000 --name webrick sample/webrick:latest

docker container run だとうまくいかなかったのでdocker runでやった

docker run -p 8000:8000 --name webrick sample/webrick:latest


5. 実行結果の確認

ブラウザを開いて  localhost:8000



6.停止と削除

コンテナの基本ライフサイクル
作成→起動→停止→削除


ターミナルでctrl+cでプロセス中断

一覧確認
docker container ls
docker container ls -a
docker ps

停止
docker container stop webrick

削除
docker container rm webrick


一覧確認
docker container ls -a

7.各種コマンド

ログ
コマンド実行
お掃除


先ほどのコマンドを再実行(タブで再利用)
docker run -p 8000:8000 --name webrick sample/webrick:latest


バックグランウドで実行 -d
docker run -d -p 8000:8000 --name webrick sample/webrick:latest

ログ出すために、http://localhost:8000/ にアクセスしておく

docker container logs webrick


docker container exec webrick ruby -v


後片付け

docker system prune -a

  • docker system prune:

    • Dockerシステム全体から不要なデータ(停止中のコンテナ、未使用のネットワーク、未使用のボリューム、キャッシュなど)を削除するコマンドです。

  • -a:

    • 未使用のすべてのイメージも削除します。このオプションを指定しない場合、未タグのイメージ(dangling images)のみが削除されます。


#Docker

いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!