20231227Docker的なものの備忘録2(失敗) localhost

20231227Docker的なものの備忘録2(失敗)


こちらは、パソコン素人です。
Docker素人です。
以下違いだらけです。自分用メモ。

(もし、投稿内容(引用等)に不具合がありましたら、削除いたしますので、ご指摘下さい。)

「Docker」というものがあるらしい。
ウィキペディアを見たが、よくわからない。

*************************************************
前回まで・・・
youtubeで解説されている方がおいでたので、試しに見てみました。(「だれでもエンジニア様」他いろんな皆様。感謝いたします。)
「だれでもエンジニア様」のを見ながら、インストール等したみた。
この動画は2021年時点のようで、少しインストール方法など変わっているのかもしれません。
(1)windows terminalを入れる。
(2)vs codeを入れる。
(3)gitを入れる。
(4)WSL2を有効化(してwindows上にlinux環境を構築)
(5)Dockerを入れる。
4,5あたりでつまづくが何とか出来た気がする。(ubuntuが2バージョン(2種類)入ったりしているが・・・汗)
*********************************************

今回:注意。今回失敗しています。(解決方法見つかっていません。)

今回も上記、「だれでもエンジニア様」のをまねてみる。
ubuntuのコマンドの練習からやってみる。
しかし、ubuntuを使うのに、VSコードで開こうとして失敗。
ここでは、windowsterminalでよかった。(使い分けが分かっていない。。。)
上の新しいタグから「ubuntu」を選択し、開く。(自分のPCでは紫の背景色)

コマンドlsとかやってみる。
(lsは、自分のいるディレクトリの中にあるファイルやディレクトリの表示。何も作っていないので、何も表示されないので正解。)

コマンドtouch(新規で空ファイルを作る)をやってみる。ふと気になったのが、「touch tmp」(tmpという空ファイルを作る)だと、「拡張子」はどうするの?ということ。正しいかどうか分からないが、tmpだと拡張子を持たないファイルを作ったことになるようだ。後から拡張子は追加可能らしい。
(↑BingChatに聞きました)

その他、自分で調べたコマンド「rmdir」・・・ディレクトリを削除する(ただし、中にファイルやサブフォルダがあると削除できない)。当該ディレクトリの1個上で使用するようだ。

+++++++++++++++++++++++++++++++++++++++++
次に、Dockerのイメージ作り、コンテナ作成起動をやってみる・・・。(イメージとコンテナの基本操作)

全く、分かっていないが。
クライアントがターミナルでdocker runすると、クライアントからホスト(多分ローカルPC)にタスクが渡される。
ホスト(のデーモン=裏で働くプログラム)が(オンライン上のdokerレジストリから当該イメージを取得し(イメージは先に上げておくようだ))
イメージ作り、コンテナ作成起動すると、runしたものが実行されるらしい。。。。。。。


(1)まず、webアプリのコードを作成(「だれでもエンジニア様」のをまねてみる。)
準備として、windowsterminalでubuntu
コマンドpwdディレクトリの表示。
ディレクトリが何もないので、documents、その下にdockerというフォルダを作った。)
ubuntuwindows ターミナルで)cd documentsで、当該ディレクトリで作業すること。

ターミナル(ububtu)で「code .」と入力。
ファイルアイコンで、ファイルを作成(dockerの下)。

ファイル名「main.rb」
コードは省略します。webrickを使ってウェブサーバーをlocalhostに作成しているようです。
(コード後から出てきます。)

(2)dockerfileを作る。(dockerfileとは、アプリコード、ライブラリ、ベースイメージで「イメージ」を作るものらしい。)
ファイル名「Dockerfile」ファイルを作成(dockerの下)。
コードは省略します。 From ruby:2.7とかRUN mkdir /var/www とか CMDとか
(コード後から出てきます。)

↑main.rbを動かすためのファイルらしいです。

上記までが「イメージを作る準備らしいです。
==========================

やっとイメージ作成「docker imege build」コマンド
ターミナルで、docker imege build -t ・・・・・・・・・(省略)

上記でイメージが作れたかを確認「docker image ls」コマンド

==========================
コンテナを作成して起動「docker container run」コマンド

上記でコンテナが作れたかを確認「docker container ls」コマンド


**************************************
これで、ブラウザで「localhost:8000」で、アクセスできるはず・・・。
見ることができない。

このページは現在機能していません。
localhostからデータは送信されませんでした。
ERR_EMPTY_RESPONSE

ERR_CONECTED_REFUSEDの時もあり。


とりあえず、コードを見直す。/////////////////////見直しとダメなとこ
localhost:8000に送信されないのはなぜ?
wsl2でdockerを使います。
以下のコードをVSコード(ubuntu)で作成。(※ubuntuwindows ターミナルで)cd documentsで、当該ディレクトリで作業すること。)(1)(2) (vsコードは、ターミナルで「code .」で開く。)

(1)main.rb
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"]


それらを以下のようにイメージ作成、コンテナ起動。(3)(4)

(3)docker image build -t sample/webrick:latest .
※「.」を忘れないこと

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

上記(3)(4)はうまくいっているハズ・・・・?
(しかし、1個。注意。実は、ubuntuでdockerのコマンドを入れようとすると最初、エラーになる・・・。で、いつもdocker desktopのsetting WSL integrationを「リフレッシュ」している。)
(wsl2 でdockerを使用しています。VSコードを開いてubuntuで、dockerコマンドを使用しようとすると、毎回最初に
The command 'docker' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.
のメッセージが出て、docker desktopのsetting、 Resources、 WSLintegrationのrefreshを行う必要があります。
(Enable integration with additional distros:には、UbuntuUbuntu-20.04があり、Ubuntuを指定しています。))


ダメなとこ:
ブラウザ(edgeもクロームも)で、localhost:8000にアクセスすると、「localhostからデータは送信されませんでした。ERR_EMPTY_RESPONSE」とのメッセージ。

↓↓↓↓↓↓

回避策を探す。
やったこと①ループバックを有効にするってやつをやってみた。
コマンドプロンプトを管理者権限で開き、
CheckNetIsolation LoopbackExempt -a -n=Microsoft.MicrosoftEdge_8weky
と入力。
⇒効果なし

やったこと②WSL2のlocalhostにアクセスするための設定方法を以下に詳しく説明します。
%USERPROFILE%ディレクトリ(ユーザーホームディレクトリ)に.wslconfigという名前のファイルを作成します。
次に、そのファイルに以下の内容を記述します:
[wsl2]
localhostForwarding=True
この設定は、WSL2の共通設定で、localhostForwarding=Trueとすることで、WSL2上で立ち上げたサーバにWindows側からlocalhostで接続できるようになります。
ファイルを保存した後、設定を反映させるためにWSL2を再起動します。再起動は、PowerShell等からwsl --shutdownコマンドを実行することで行えます。
⇒効果なし

やったこと③
高速スタートアップもやめた。
⇒効果なし

やったこと④
ブラウザのクッキーの履歴削除
⇒効果なし

BindAddress: '0.0.0.0',とかがだめなのかとか、考えたが、そうでもなさそう。
WSLだからなのか、自分が悪いのか。