20211014のdockerに関する記事は7件です。

『Linuxで動かしながら学ぶTCP/IP入門』でネットワークの基礎実践(Docker環境つき)

基本情報・応用情報技術者試験を勉強する中で、ネットワーク系の箇所に苦手意識があったので、ネットワークの基礎がわかる・自分で手を動かしながら学べる書籍を探していたところ、『Linuxで動かしながら学ぶTCP/IP入門』を見つけました。 「ネットワークの初歩」的な内容ですが、今まであった所謂解説本とは異なり、実際にpingやtcpdumpコマンドを使いながら疎通を覗くことで、パケットやEthenetヘッダーの動きを知ることができます。 以下、各章で学ぶことができる内容を簡単にまとめました。このあたりの理解に不安がある方は、手を動かしながら学んでみることをおすすめします。 なお、書籍内では、検証に使用するLinux環境(Ubuntu)は実機またはVagrantを紹介していますが、実務でDockerを使用する機会が多かったので、DockerでUbuntu環境を構築しました。 環境構築 -DockerFile -docker-compose.yml FROM ubuntu:20.04 # 検証に使用するモジュールのインストールをしておく RUN apt-get update RUN apt-get -y install \ bash \ coreutils \ grep \ iproute2 \ iputils-ping \ traceroute \ tcpdump \ bind9-dnsutils \ dnsmasq-base \ netcat-openbsd \ python3 \ curl \ wget \ iptables \ procps \ isc-dhcp-client [docker-compose.yml] version: '3' services: ubuntu: build: . working_dir: /var/tmp volumes: - ./work:/var/tmp # コンテナ起動後、StatusがExitにならないようttyの設定 tty: true privileged: true TCP/IPとは TCP/IP・プロトコル・パケット・IPアドレス・ヘッダなどの基礎項目のおさらい pingの結果が読める tcpdumpでping(icmp)の通信をキャプチャできる・その内容がわかる 端末からルーターを通してインターネットに繋がるイメージをつかむ Network Namespace netnsコマンドを利用して、同一セグメント内(ネットワークアドレスが同一)の仮想ネットワークを作成できる netnsコマンドを利用して、ルーターを経由し、セグメントが2つのネットワークを作成できる ルーティングテーブルの内容を理解できる netnsコマンドを利用して、セグメントが3つ(ルーターが2つ)のネットワークを作成できる イーサネット IPのパケット トランスポート層 IPアドレスを使用して送信元・送信先を判定 イーサネットのフレーム データリンク層 MACアドレスを使用して送信元・送信先を判定 netnsコマンドを利用して、MACアドレスを基準としてパケットがイーサネットのフレームで運ばれる様子をtcpdumpでキャプチャできる 同一セグメント内のイーサネットのフレームの動きを観察できる セグメントが2つに増えた場合、イーサネットのフレームが変わる様子を観察できる ブリッジの仕組みを理解し、同一のブロードキャストドメインに複数のネットワーク機器をつなげる方法を理解する ブリッジ:それぞれのポートに繋がっているMACアドレスを学習して、必要なポートにだけフレームを転送する トランスポート層のプロトコル アプリケーションとポート番号の関係性 ncコマンドを使い、UDPで文字列を送受信する 信頼性のあるトランスポート層のプロトコルでTCPを使用する。スリーウェイハンドシェイクによってコネクションを確立した上でデータの送受信を行う流れを観察する アプリケーション層のプロトコル HTTPサーバを立てて、疎通・データの流れをキャプチャできる DNSでの名前解決の仕組みについて説明できる。OS内部のリゾルバによる挙動によってコンピュータ内部(hostsファイル)と外部(DNSサーバ)で異なる点について理解できる DHCPプロトコルでコンピュータのネットワークを自動的に設定する仕組みについて理解できる NAT グローバルIP・ローカルIPアドレスの違いが理解できる NAT・NAPTの仕組みを理解できる netnsで仮想LAN・WANを作成し、仮想LANの送信元IPアドレスがグローバルIPアドレス(=ルーターのアドレス)に書き換えられる挙動を仮想WAN側で観察できる(SourceNAT) netnsで仮想LAN・WANを作成し、仮想WANの送信先IPアドレスがローカルIPアドレス(=LAN内の特定のパソコン)に書き換えられる挙動を仮想LAN側で観察できる(DestinationNAT) ソケットプログラミング ソケットプログラミングとは ソケットの仕組みをPythonスクリプトで再現し、ソフトウェアからTCP/IPをどのように扱っているのかを理解する 最後に 今まで、用語だけ覚えて何となくの理解しかできていなかった部分について、 実際にデータの流れを追うことで、落とし込むことができたかなと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

転職活動管理アプリを作ろう⑥(laravel-admin 役割ごとのメニュー切り替え)

前回の記事は コチラ やりたいこと なんでも見れるし触れる Administrator、一般利用者を想定した users の 2 つのアカウント種別を作成したい これこそ JetStream を使った一般権限を作成 しろとか言わないでください UI イチから作るのめんどくさいので やったこと概略 権限の作成 laravel-admin では URI の部分一致で設定する 役割の作成 laravel-admin ではホワイトリスト方式 アカウントの作成 ログイン後 HOME 画面の作成、リダイレクト設定 各メニューのサイドバー表示設定 1. 権限の作成 転職活動のメインコンテンツ部分を触れる権限を作成する http://localhost/admin/auth/permissions 以下画像のように作成する 2. 役割の作成 一般利用者を想定しているので、以下のような内容を想定 閲覧不可 ダッシュボード 管理者による設定系メニュー 閲覧可能 転職活動メインコンテンツ部分 アカウント設定 (新規作成)ホーム画面 http://localhost/admin/auth/roles 以下画像のように作成する 3. アカウントの作成 http://localhost/admin/auth/users 役割の値を [2.] で作成した users にしておく 4. ログイン後 HOME 画面の作成、リダイレクト設定 $ php artisan make:controller UserHomeController ひとまず HomeController からパクって以下のようにする namespace App\Admin\Controllers; use App\Http\Controllers\Controller; use Encore\Admin\Controllers\Dashboard; use Encore\Admin\Layout\Column; use Encore\Admin\Layout\Content; use Encore\Admin\Layout\Row; class UserHomeController extends Controller { public function index(Content $content) { return $content ->title('User Home') ->description('ここはホーム画面です') ->row( view('admin::dashboard.title') ) ->row(function (Row $row) { $row->column(12, function (Column $column) { $column->append(Dashboard::environment()); }); }); } } Admin/routes.php を以下のように修正 Route::group([ 'prefix' => config('admin.route.prefix'), 'namespace' => config('admin.route.namespace'), 'middleware' => config('admin.route.middleware'), 'as' => config('admin.route.prefix') . '.', ], function (Router $router) { $router->get('/', 'HomeController@index')->name('home'); $router->resource('agents', AgentController::class); // 以下を追記 Route::group(['prefix' => 'jobhunting', 'as' => 'jobhunting.'], function() { Route::get('/home', 'UserHomeController@index')->name('home'); }); }); 作成したページへのメニューを laravel-admin にて以下のように追加 http://localhost/admin/auth/menu 役割によってログイン後のトップ画面を制御するため、Admin/Controllers/AuthController に以下メソッドを追加 /** * Get the post login redirect path. * * @return string */ protected function redirectTo() { if( Admin::user()->isRole('users') ) { // ここで制御 return config('admin.route.prefix') . '/jobhunting/home'; } // 以下は Encore\Admin\Controllers\AuthController の redirectPath() からコピペ return property_exists($this, 'redirectTo') ? $this->redirectTo : config('admin.route.prefix'); } 各役割のアカウントでログインして、動作確認 5. 各メニューのサイドバー表示設定 laravel-admin では、サイドバーのメニューごとに「どの役割に対して表示するか?」を設定できる めんどくさいが、各メニューの編集画面を開いて以下赤四角部分に表示 したい 役割を追加していく おまけ このアプリでは laravel-admin の画面しか稼働しないため、URI の /admin/ 部分を消す .env ファイルに ADMIN_ROUTE_PREFIX= を追記 プレフィックスに何も設定しない意思表示 routes/web.php の Route::get('/', function () {〜 の部分をコメントアウト laravel デフォルトのトップ画面への遷移を削除 所感 laravel-admin ではメニューの制御を UI で出来るためとても楽でした Controller を作ってルーティングまではコーディングが必要 laravel-admin のドキュメンテーションが中文しか見当たらなかったため少し苦労した ついでにドキュメンテーションをかいつまんで読んでみたけど、やりたいことが直感的にできそうでこのライブラリの素晴らしさを認識しました
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

転職活動管理アプリを作ろう⑤(laravel-admin 拡張〜テーブル作成)

前回は コチラ laravel-admin 拡張 Extension をインストール redis-manager redis の中身を閲覧できる simplemde markdown editor config https://github.com/sparksuite/simplemde-markdown-editor#configuration セッション管理を redis に変更 $ composer require predis/predis .env ファイルを以下のように修正 SESSION_DRIVER=redis : REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379 REDIS_CLIENT=predis サーバー再起動 発生したエラー Class "Redis" not found REDIS_CLIENT の値が phpredis のままだったため発生。predis に修正して対応した。 redis のまま対応しようとすると、Redis 拡張モジュールをインストールする必要がある?(未確認) 詳細は この方の記事 にあるっぽい テーブル作成 テーブル定義については コチラの記事 を参照 作り方 (例:Agents テーブル) $ php artisan make:migration create_agents_table --create=agents 作成されたマイグレーションファイルにて、定義したテーブルの構成を記載 /** * Run the migrations. * * @return void */ public function up() { Schema::create('agents', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('top_url'); $table->string('login_url'); $table->boolean('active'); $table->timestamps(); }); } $ php artisan migrate $ php artisan make:model Agent モデルを作成 $ php artisan admin:make AgentController --model=App\\Models\\Agent コントローラを作成 grid() を カスタマイズ すると、一覧画面の見せ方を変更できる form() を カスタマイズ すると、新規登録/更新画面の見せ方を変更できる app/Admin/routes.php に以下ルーティングを追記 $router->resource('agents', AgentController::class); http://localhost/admin/agents にアクセスし表示されれば OK メニュー追加 親メニュー admin 内メニューの「Menu」へ移動 以下内容を入力し submit 再ログインするとサイドバーに反映される 子メニュー admin 内メニューの「Menu」へ移動 以下内容を入力し submit 再ログインするとサイドバーに反映される
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

よく使いそうなDockerコマンドをまとめてみた

よく使うけど、たびたび検索してしまうようなコマンドをまとめていこうと思います。 (メモ帳とかでいいじゃんって思ったりはしますが・・・w) 環境 Windows(10, ホスト) Docker Desktop for Windows(20.10.8) コマンド run(コンテナ実行) dockerコンテナのcreateとstartを組み合わせたコマンド 使用例) docker run -itd --name {コンテナ名} -p 9000:9000 {Dockerイメージ} pull(イメージ取得) Dockerのイメージをローカルにダウンロードするためのコマンド 主にオフィシャルにあるやつを使ってます。 (それ以外ってどうやってやるんだろう・・・) 公式イメージページ 使用例) docker pull {Dockerイメージ} exec(コマンド実行) Dockerコンテナでコマンドを実行するためのコマンド bash使用例) ssh接続した時みたいにコンテナ内でコマンドが実行できる docker exec -it {コンテナ名} bash bashしなくてもコマンドが実行できる ls -la使用例) docker exec -it {コンテナ名} ls -la cp(コピー) ホスト⇔コンテナ間でファイルのコピーを行うためのコマンド コンテナIDは後述のpsコマンドで確認する。 docker cp {ホスト側のファイル} {コンテナID}:{コンテナ内のパス} ps(コンテナプロセス確認) 起動中のコンテナの状態を表示するためのコマンド docker ps こんな感じ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 56819f2c7c72 sonarqube:7.9.5-community "./bin/run.sh" 46 minutes ago Up 45 minutes 0.0.0.0:9000->9000/tcp sonar 768aa709e478 swaggerapi/swagger-editor "/docker-entrypoint.…" 5 months ago Up 3 seconds 80/tcp, 8080/tcp, 0.0.0.0:8085->8085/tcp wizardly_gagarin
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Dockerエラー】docker.errors.DockerException: Error while fetching server API version

環境 Docker version 20.10.7 docker-compose version 1.29.2 状況 いつものようにdocker-compose up -dしたら下記のエラー % docker-compose up -d Traceback (most recent call last): File "urllib3/connectionpool.py", line 670, in urlopen File "urllib3/connectionpool.py", line 392, in _make_request File "http/client.py", line 1255, in request File "http/client.py", line 1301, in _send_request File "http/client.py", line 1250, in endheaders File "http/client.py", line 1010, in _send_output File "http/client.py", line 950, in send File "docker/transport/unixconn.py", line 43, in connect FileNotFoundError: [Errno 2] No such file or directory During handling of the above exception, another exception occurred: Traceback (most recent call last): File "requests/adapters.py", line 439, in send File "urllib3/connectionpool.py", line 726, in urlopen File "urllib3/util/retry.py", line 410, in increment File "urllib3/packages/six.py", line 734, in reraise File "urllib3/connectionpool.py", line 670, in urlopen File "urllib3/connectionpool.py", line 392, in _make_request File "http/client.py", line 1255, in request File "http/client.py", line 1301, in _send_request File "http/client.py", line 1250, in endheaders File "http/client.py", line 1010, in _send_output File "http/client.py", line 950, in send File "docker/transport/unixconn.py", line 43, in connect urllib3.exceptions.ProtocolError: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "docker/api/client.py", line 214, in _retrieve_server_version File "docker/api/daemon.py", line 181, in version File "docker/utils/decorators.py", line 46, in inner File "docker/api/client.py", line 237, in _get File "requests/sessions.py", line 543, in get File "requests/sessions.py", line 530, in request File "requests/sessions.py", line 643, in send File "requests/adapters.py", line 498, in send requests.exceptions.ConnectionError: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "docker-compose", line 3, in <module> File "compose/cli/main.py", line 81, in main File "compose/cli/main.py", line 200, in perform_command File "compose/cli/command.py", line 60, in project_from_options File "compose/cli/command.py", line 152, in get_project File "compose/cli/docker_client.py", line 41, in get_client File "compose/cli/docker_client.py", line 170, in docker_client File "docker/api/client.py", line 197, in __init__ File "docker/api/client.py", line 221, in _retrieve_server_version docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory')) [10856] Failed to execute script docker-compose 原因 Docker Desktopを起動してなかった。 いつもPC起動時に勝手に立ち上がっていたが今朝はなぜか立ち上がらなかったまま、 docker-compose up -dしてしまっていた。 解決法 Docker Desktopを起動してdocker-compose up -d
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker for WindowsでHello,World!

インストールしたまま使わず放置していたDocker…時間ができたので使ってみることにしました。システム開発に詳しくない自分でも短時間でHello,World!できたので、手順をメモ。 やったことは、 Javaの実行環境をインストール  実行に必要な環境設定がDockerイメージとしてパッケージングされているので、それをダウンロードする Dockerイメージをカスタマイズ  今回はHello,World!を記述したHTMLファイルを追加するのみ Dockerイメージを実行  localhostにアクセスをしてindex.htmlを表示させる   以上です。 事前準備 1)Docker Desktop for Windowsをインストール https://hub.docker.com/editions/community/docker-ce-desktop-windows/ 2)Windows Terminalをインストール https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab Javaの実行環境をインストール 3)Tomcatイメージを取得 Terminalで以下のコマンドを打つだけでOK docker pull tomcat Dockerイメージをカスタマイズ 4)Dockerイメージの作成:Dockerfileの作成 Dockerfileは、ビルドのときに参照される。ファイルの中身は以下の通り。 FROM tomcat:9.0 RUN mkdir webapps/ROOT RUN echo Hello,World! >> webapps/ROOT/index.html CMD ["catalina.sh","run"] 先ほどインストールしたTomcatイメージに、"Hello,World!"を記述したindex.htmlを追加している。 5)Dockerイメージの作成:Dockerfileを用いてビルド docker build . -t hello:1.0 ※Dockerイメージの名前をhelloにしている。バージョンの記述も必須。 これで、Dockerイメージの作成完了です、早い! Dockerイメージを実行 6)helloを起動 docker run -it --rm -p 8880:8080 hello:1.0 7)以下のURLにアクセスするとブラウザにHello,World!が表示される http://localhost:8880/index.html 今回は手順だけですが、Dockerまわりの用語やコマンドの意味についても別途まとめたいと思います~。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-compose で TLSV1_ALERT_PROTOCOL_VERSION エラー 他多数

概要 ある日 docker-compose を実行したところ、TLSV1_ALERT_PROTOCOL_VERSION というエラーがでました。試行錯誤したあげく、最終的に TLS 検証を無効にしてエラーを回避しました。ちゃんと TLS で動かせる人には無用の長物かと思います。 Version 一応書いておきます。 $ docker --version Docker version 19.03.13-ce, build 4484c46 $ docker-compose version docker-compose version 1.19.0, build 9e633ef docker-py version: 2.7.0 CPython version: 2.7.13 OpenSSL version: OpenSSL 1.0.1t 3 May 2016 エラー回避手順 work-log は冗長なのでここにまとめておきます。 1. DOCKER_TLS_VERIFY, DOCKER_CERT_PATH を空にする 最終的には .bash_profile などに設定しておく $ export DOCKER_TLS_VERIFY= $ export DOCKER_CERT_PATH= 2. /etc/sysconfig/docker から tlsverify オプションを削除して dockerd を再起動 設定は抜粋です。 /etc/sysconfig/docker # Before OPTIONS="--tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem" # After OPTIONS="--tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem" ※ ちなみに、最低限 tlsverify を削除すれば動きますが、他の tls~~ を全部消しても特に問題ありませんでした。 $ sudo systemctl restart docker 3. Optional: COMPOSE_TLS_VERSION が set されている場合は unset 私は TLSV1_ALERT_PROTOCOL_VERSION が出たあとに設定していたので、unset が必要でした。 $ unset COMPOSE_TLS_VERSION Work-log ※ 注意:以下は時系列で作業ログを書いたものであり、最終的に使わなかった COMPOSE_TLS_VERSION の設定などもしているため冗長です。必要な手順のみ確認したい場合は上の方を参照してください。 ことの発端。tlsv1 はダメとのこと。 $ docker-compose up -d ERROR: SSL error: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:661) ググると COMPOSE_TLS_VERSION に TLSv1_2 を設定せよという記事が多く出てきたので設定してみる。 $ export COMPOSE_TLS_VERSION=TLSv1_2 が、今度は CERTIFICATE_VERIFY_FAILED >< $ docker-compose up -d ERROR: SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661) さらに調べていくとこの github issue を見つける。 DOCKER_TLS_VERIFY, DOCKER_CERT_PATH を空にする。 $ export DOCKER_TLS_VERIFY= $ export DOCKER_CERT_PATH= が、今度は SSLV3_ALERT_BAD_CERTIFICATE ... $ docker-compose up -d ERROR: SSL error: [SSL: SSLV3_ALERT_BAD_CERTIFICATE] sslv3 alert bad certificate (_ssl.c:661) あ、COMPOSE_TLS_VERSION 設定したままになってた。 unset する。 $ unset COMPOSE_TLS_VERSION が、今度は ERROR: Client sent an HTTP request to an HTTPS server. $ docker-compose up -d ERROR: Client sent an HTTP request to an HTTPS server. /etc/sysconfig/docker から tlsverify オプションを削除し、dockerd を restart /etc/sysconfig/docker # Before OPTIONS="--tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem" # After OPTIONS="--tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem" $ sudo systemctl restart docker It works fine. $ docker-compose up -d Creating docker_selenium-hub_1 ... done Creating docker_selenium-hub_1 ... Creating docker_chrome_1 ... done 補足 なお、/etc/sysconfig/docker から tlsverify を削除をするのみだと、WRONG_VERSION_NUMBER と言われる。 $ docker-compose up -d ERROR: SSL error: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:661) その場合、DOCKER_TLS_VERIFY, DOCKER_CERT_PATH を空にすると解決するはず。 $ export DOCKER_TLS_VERIFY= $ export DOCKER_CERT_PATH= おわり
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む