aokirozin's log

技術と音楽とアニメと読書の健忘録

Docker Desktop for Windows のインストール

最近はWindowsやMacを使っていてLinux環境を利用したいときには、無料で使える Docker Desktop でLinuxコンテナを使うというのが定番になっているような気がしないでもない。というわけで、Windows 10 に "Docker Desktop for Windows" をインストールする方法をまとめてみた。

ところで、最近の Docker Desktop は Hyper-V を使わなくても大丈夫らしいので (使うこともできるらしいが)、使わない方法でインストールした。代わりに WSL 2 を使うらしい。これだと、Oracle Virtualbox との併存、両立というか同時に使用ができる (と思ったんですが、おそらくCPUによってできたりできなかったりするみたい)。また、Hyper-V は Proエディション以上にしかなく、Homeエディションでは今まで Docker Desktop は使えなかったのが、今では使えることになる。

システム要件

公式ドキュメントにあるように、

  • Windows 10, version 1903 以上
  • 「Windowsの機能」で「Linux用Windowsサブシステム」および「仮想マシンプラットフォーム」が有効になっていること
  • SLAT対応の 64bit CPU
  • メインメモリ4GB以上
  • BIOS上で仮想化機能が有効になっていること

の模様。

今回インストールしたマシンは、

  • Windows 10 Pro, version 20H2
  • CPU: Intel Core i9 9820X
  • RAM: 128GB

です。

事前準備

BIOS上で仮想化機能が有効になっているかの確認

Windows上から仮想化が使えるかどうか確認します。「Ctrl + Shift + Esc」キーでタスクマネージャーを開き、「パフォーマンス」タブの「CPU」の項目で、「仮想化」が「有効」になっていれば大丈夫です。なっていない場合は、BIOSの仮想化機能を有効に設定してください。設定方法はPCにより異なるため、ウェブサイトやマニュアルを参考にしてください。例えば、Intel製のCPUを搭載したPCなら「Intel® Virtualization Technology」などです。

f:id:aokirozin:20201024004745p:plain

Windowsの機能の有効化

「プログラムと機能」の「Windowsの機能の有効化または無効化」から行ってもいいのだけれど、ここではPowerShellを用いて、「Windowsの機能」の「Linux用Windowsサブシステム」および「仮想マシンプラットフォーム」を有効にします。

「Windows」キーを押したあと、「powershell」と入力し、「Ctrl + Shift」キーを押しながら「Enter」キーを押します。これで、管理者権限でPowerShellが起動します。

Linux用Windowsサブシステム (Windows Subsystem for Linux: WSL) を有効化します。

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart

仮想マシンプラットフォームを有効化します。

Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart

WSL 2 を既定のバージョンに設定する

wsl --set-default-version 2

WSL 2 Linux カーネルの更新

このページを参考に、更新プログラムをダウンロード&実行し、WSL 2 のLinuxカーネルを更新する。

PCを再起動します。

インストーラーのダウンロード

公式サイトから "Docker Desktop for Windows (Docker Desktop Installer.exe)" をダウンロードします。

インストールの実行

ダウンロードしたインストーラーを実行します。特に設定や変更する項目はないのでそのまま進めます。

f:id:aokirozin:20201024231158p:plain

f:id:aokirozin:20201024231217p:plain

f:id:aokirozin:20201024231232p:plain

"Close and restart" ボタンを押して、再起動します。

Dockerが正常に起動すると、

f:id:aokirozin:20201024234350p:plain

のようなチュートリアル画面が表示されます。

動作確認

ここではすごく簡単に、Nginxというウェブサーバのコンテナを起動して動作確認をしたいと思います。

まず、PowerShellを起動します。次に以下のコマンドを実行します。

docker container run -d --name test-nginx -p 80:80 nginx

実行時に、Windowsファイアウォールの警告が出るかもしれないので、アクセスを許可しください。このコマンドはつまり、

  • コンテナを起動しろ
  • バックグラウンド (デーモン) で
  • コンテナの名前は test-nginx とする
  • ホストの80番ポートをコンテナの80番ポートにマッピングしろ
  • イメージは nginx (のlatest) を使え

という意味になります。PowerShellのプロンプトが返ってきたら、ブラウザでlocalhostにアクセスしてみます (httpのデフォルトが80番ポート)。

f:id:aokirozin:20201025001535p:plain

無事に表示されました。

また、Docker Desktop の Dashboard を開いてみると、"Containers/Apps" に今起動した、test-nginxがあるのが分かります。一方、"Images" には今回のコンテナの元になったnginxイメージがあるのが分かります。

f:id:aokirozin:20201025001958p:plain

f:id:aokirozin:20201025002015p:plain

test-nginxコンテナは動作確認できたので、削除しておきます。nginxイメージももう使わないなら削除してしまってもいいです。

f:id:aokirozin:20201025002136p:plain

今回はここまでです。

HD60 S と OBS Studio でゲーム映像をキャプチャする (動作確認編)

Elgato HD60 S

キャプチャデバイス Elgato HD60 S がたぶん一番売れているし定番だと思う。ゲーム配信に使うなら、ハードウェアエンコードタイプじゃなくて HD60 S のように、ソフトウェアエンコードタイプが遅延しなくてよいらしい。

なお上位製品の HD60 S+ もあるけれど、これは4Kキャプチャと4Kパススルーができるので必要な人はこちらを。あとで説明するかもしれないけれど、4Kパススルーは分配器で解決できるので、フルHDまでのキャプチャで良いという人なら HD60 S で十分じゃないかと思う。

OBS Studio

ダウンロードサイトからOSを選択して、ダウンロードし、インストールする。

Elgato Game Capture

Elgato のウェブサイトからキャプチャデバイス名とOSを選択して Game Capture をダウンロードする。

Windowsの場合

Game Capture をそのままインストール (Sound Capture はインストールしてもしなくてもよい)。

Macの場合

OSB Link というソフトウェアもダウンロードしてインストールする。途中、OBS NDI Plugin など、いろんなパッケージのインストールを促されれるがとりあえずすべてインストールする (OBS NDI Plugin は必須)。

Game Capture での動作確認

Windowsの場合

Game Capture を起動する (OBS Studio は起動していないこと)。

f:id:aokirozin:20200921155036p:plain

①「デバイス」で HD60 S が認識されていて、選択されていること。②画面にキャプチャ映像が映っていること。③「ゲームオーディオ」のレベルメーターにキャプチャ音が入力されていることが確認できること。

うまく認識しないときは、Game Capture を再起動してみる。

Macの場合

Game Capture を起動する (OBS Studio は起動していないこと)。

f:id:aokirozin:20200921160443p:plain

Windowsの時とまったく同様。①「デバイス」で HD60 S が認識されていて、選択されていること。②画面にキャプチャ映像が映っていること。③「ゲームオーディオ」のレベルメーターにキャプチャ音が入力されていることが確認できること。

うまく認識しないときは、Game Capture を再起動してみる。

OBS Studio での動作確認

Windowsの場合

OBS Studio を起動する (Game Capture は起動していないこと)。

f:id:aokirozin:20200921182520p:plain

f:id:aokirozin:20200921182704p:plain

「ソース」の左下の「+」をクリックして「映像キャプチャデバイス」を選択する。

f:id:aokirozin:20200921182934p:plain

「新規作成」を選択して、名前を適当に入力して (ここでは「HD60 S」)、「OK」をクリックする。

f:id:aokirozin:20200921183228p:plain

プロパティ画面では「デバイス」から、Elgato Game Capture HD60 S っぽいものを選択する。きちんと選択すれば、画面にキャプチャされた映像が映る。そのほかの項目はそのままで「OK」をクリックする。

f:id:aokirozin:20200921184258p:plain

①画面にキャプチャされた映像が映っていること。②「音声ミキサー」の「HD60 S (ソースを追加したときにつけた名前)」のレベルメータが振れていて、音声もキャプチャされていることが確認できること。

次に実際にキャプチャされている音声をモニターしてみる。「音声ミキサー」のレベルメーターのエリアを右クリックして「オーディオの詳細プロパティ」をクリックする。

f:id:aokirozin:20200921194003p:plain

①の「音声モニタリング」の項目でモニターの出力を制御する。初期設定ではすべて「モニターオフ」になっているので、映像キャプチャデバイスである「HD60 S」を「モニターと出力」に変えてみて、音声がパソコンから聞こえるか確認する。なお、「モニターオフ」は出力はされるがモニター音としては聞こえない。例えばマイク音などはモニター不要と思えば「モニターオフ」としておけばよい。

また、デスクトップ音声などの余計な音を入れたくなければ、ミュートしておけばよい。マイクの歯車アイコンをクリックし、「プロパティ」からマイクのデバイスを選択できる。そのほか、ソースからさまざまなものを追加していくことができる。

Macの場合

OBS Link の設定

f:id:aokirozin:20200921211456p:plain

メニューバーにある OBS Link で「Game Capture HD60 S」が選択されていることを確認する。選択されていなければ選択する。そもそも OBS Link がメニューバーになければ起動する。その後、「環境設定」をクリックする。

f:id:aokirozin:20200921212115p:plain

①「OBS NDI Plugin」が正常にインストールされ、認識されていること。②「キャプチャデバイス」が「Game Capture HD60 S」となっていること。その他「出力フォーマット」などは適宜変更してもよい。

OBS Studio の設定

OBS Studio を起動する (Game Capture は起動していないこと)。

f:id:aokirozin:20200921210448p:plain

f:id:aokirozin:20200921210832p:plain

「ソース」の左下の「+」をクリックして「NDI Source」を選択する。

f:id:aokirozin:20200921212722p:plain

「新規作成」を選択して、名前を適当に入力して (ここでは「HD60 S」)、「OK」をクリックする。

f:id:aokirozin:20200921215831p:plain

プロパティ画面では「デバイス」から、「OBS Link」と付いているものを選択する。そのほかの項目はそのままで「OK」をクリックする (この画面ではキャプチャ映像が映らない場合がある)。

f:id:aokirozin:20200921221118p:plain

①画面にキャプチャされた映像が映っていること。②「音声ミキサー」の「HD60 S (ソースを追加したときにつけた名前)」のレベルメータが振れていて、音声もキャプチャされていることが確認できること。

次に実際にキャプチャされている音声をモニターしてみる。「音声ミキサー」のどれかのデバイスの「歯車アイコン」をクリックして「オーディオの詳細プロパティ」をクリックする。

f:id:aokirozin:20200921222024p:plain

Windowsの時とまったく同様。①の「音声モニタリング」の項目でモニターの出力を制御する。初期設定ではすべて「モニターオフ」になっているので、映像キャプチャデバイスである「HD60 S」を「モニターと出力」に変えてみて、音声がパソコンから聞こえるか確認する。なお、「モニターオフ」は出力はされるがモニター音としては聞こえない。例えばマイク音などはモニター不要と思えば「モニターオフ」としておけばよい。

また、マイクの歯車アイコンをクリックし、「プロパティ」からマイクのデバイスを選択できる。そのほか、ソースからさまざまなものを追加していくことができる。

次は、OBS Studio の詳しい設定をしていく。

さくらのVPSのSSH設定 (公開鍵認証)

環境

クライアント側

  • Windows 10
  • Tera Term
  • WinSCP
  • 適当なテキストエディタ

サーバ側

  • さくらのVPS
  • CentOS 7

やること

SSHの接続を公開鍵認証方式にして、接続ポート番号を22→50022に変更します。

  • パケットフィルタで新規ポート追加
  • ファイアウォールで新規ポート追加
  • SELinuxで新規ポート追加
  • sshd_configの設定変更
    • SSH接続ポート番号変更
    • 認証方式を公開鍵認証に変更
    • その他セキュリティ向上
  • 不要ポートの設定削除

まずは初期設定で接続

OSインストール時に設定したパスワードで、ポート22番にrootユーザで接続できるか確認します。サーバのIPアドレスは、さくらのVPSのコントロールパネルのサーバ→ネットワーク情報のアドレス欄からコピーできます。Tera Term でも WinSCP でも接続できることを確認します。

パケットフィルタの設定変更

カスタムOSインストールでCentOSをインストールしたので、「パケットフィルタを利用しない」になっていました。そして、ポート32767番までしか設定できないようなので、ここでは使わないことにします。利用する場合は32767以下の番号で追加すればいいでしょう。あと、一通りの設定が終わるまでは22番は削除しないように。設定が終わって、すべてOKになったら一番最後に22番を閉じます。

ファイアウォールの設定変更

現在の状態を確認

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1 eth2
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

services: dhcpv6-client ssh というところで、sshが開いています。

ssh-alt (50022番) の追加

上記のsshの設定をコピーして番号だけを50022にして適用することでssh-altというサービスとして50022番を開放します。

設定ファイルのコピー

$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-alt.xml

ssh-alt.xml を編集

$ sudo vi /etc/firewalld/services/ssh-alt.xml

  <port protocol="tcp" port="50022"/>

firewalldの設定に追加、反映

$ sudo firewall-cmd --add-service=ssh-alt --permanent
success
$ sudo firewall-cmd --reload
success
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1 eth2
  sources:
  services: dhcpv6-client ssh ssh-alt
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

これで、ssh-alt (ポート50022) がfirewalldで開放されました。

SELinuxの設定変更

現在の状態を確認

$ getenforce
Enforcing

SELinuxが有効であることが分かります。

semanageコマンドのインストール

SELinuxの設定を変更するためのコマンドであるsemanageコマンドをインストールします。これは policycoreutils-python パッケージに含まれているので以下のようにインストールします。

$ sudo yum install -y policycoreutils-python

SELinuxが許可しているポート番号を確認

$ sudo semanage port --list

長いリストが出てきます。grepでsshだけフィルタリングすると、

$ sudo semanage port --list | grep ssh
ssh_port_t                     tcp      22

22番だけ許可されていることが分かります。

SELinuxのポリシーにポートを追加

$ sudo semanage port --add --type ssh_port_t --proto tcp 50022
$ sudo semanage port --list | grep ssh
ssh_port_t                     tcp      50022, 22

これで、50022番がsshのポートとして追加されました。

sshd_configの設定変更

設定ファイルである /etc/ssh/sshd_config を編集します。

SSH接続ポート番号変更

#Port 22

の部分のコメントを外し、49152~65535番くらいのプライベートな番号をつけておけばいいと思う。

Port 50022

ここまでの設定を反映して、sshdを再起動して、50022番で接続できるか確認してみる。 sshd_configの構文に誤りがないかチェックするコマンドを実行します。

$ sudo sshd -t

何もエラーが出なければOKです。sshdを再起動します。この時いま開いているターミナルを閉じないように。もし、再起動後ログインできなくなったら、コンソールから入らなくてはいけなくなります。

$ sudo systemctl restart sshd

再起動後、Tera Term と WinSCP で変更後のポート番号でアクセスできたらOKです。

認証方式を公開鍵認証に変更

鍵の生成

ここでは、Tera Term で鍵のペアを作成します。メニューの「設定」→「SSH鍵生成」を選びます。鍵の種類はRSA、ビット数は4096で「生成」をクリックします。鍵の生成が終わったら、公開鍵 (id_rsa.pub) と秘密鍵 (id_rsa) をそれぞれ保存します。ここではパスフレーズは空でいいです。

f:id:aokirozin:20200709004744p:plain

公開鍵の転送

SCPで公開鍵 (id_rsa.pub) をVPSに転送します。ログインユーザのホームディレクトリの直下 (~/) の .ssh に (なければ作成)、そこに転送します。その後、id_rsa.pub ファイルを authorized_keys ファイルにマージします。

$ mkdir ~/.ssh          # .sshディレクトリがない場合
$ cd ~/.ssh
$ cat id_rsa.pub >> authorized_keys
$ rm -f id_rsa.pub

パーミッションの確認

.sshディレクトリは700、authorized_keysファイルは600である必要があります。

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

sshd_configの設定変更

#PubkeyAuthentication yes

のコメントを外して

PubkeyAuthentication yes

にする。

PasswordAuthentication yes

PasswordAuthentication no

にする。

sshdの再起動と接続確認

$ sudo sudo sshd -t
$ sudo systemctl restart sshd

sshd再起動後、パスワード認証ではなく、公開鍵認証でログインできたらOKです。

その他セキュリティ向上

sshd_config を編集してきます。

LoginGraceTime

#LoginGraceTime 2m

LoginGraceTime 20

にして、ユーザが20秒以内にログインを成功させないと接続を切るようにする。

PermitRootLogin

#PermitRootLogin yes

PermitRootLogin no

にして、rootユーザでログインできないようにする。

MaxAuthTries

#MaxAuthTries 6

MaxAuthTries 3

にして、1度の接続で3回までのパスワードの間違いを許可することにします。

MaxSessions

#MaxSessions 10

MaxSessions 5

にして、最大同時接続数を5にします。

PermitEmptyPasswords

#PermitEmptyPasswords no

PermitEmptyPasswords no

にして、空のパスワードを許可しないことにします。

GSSAPIAuthentication

GSSAPIAuthentication yes

GSSAPIAuthentication no

にして、GSSAPI認証は使わない。

MaxStartups

#MaxStartups 10:30:100

MaxStartups 5:75:10

として、非認証の接続が5を超えると75%の確率で拒絶をはじめて10を超えると全て拒否します。

AcceptEnv

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

#AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
#AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
#AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
#AcceptEnv XMODIFIERS

つぃて、サーバ側へ、環境変数を渡さないようにする。

AllowUsers
AllowUsers  *@*.jp

を追加して、特定ユーザからのみ接続を受け入れる。ここでは .jp ドメインのみ受け入れ (自分が使っているプロバイダは全て .jp ドメインのため)。

暗号アルゴリズム

Ciphers aes256-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-gcm@openssh.com,aes128-ctr,chacha20-poly1305@openssh.com
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
MACs umac-128-etm@openssh.com,umac-64-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128@openssh.com,umac-64@openssh.com,hmac-sha2-512,hmac-sha2-256

を追加して、弱いアルゴリズム使わわないようにする。

sshdの再起動と接続確認

$ sudo sudo sshd -t
$ sudo systemctl restart sshd

不要ポートの設定削除

新しいポートで接続できることが確認できたら、初期設定の22番ポートを無効にします。

SELinuxのポリシーから削除

SELinuxのポリシーから22番ポートをSSHの定義から外すことは上手くいかない模様。以下の削除コマンドでエラーが出てしまう。ただ、firewalldやパケットフィルタで22番を塞ぐのでセキュリティには問題はないです。

$ sudo semanage port --delete --type ssh_port_t --proto tcp 22
ValueError: Port tcp/22 is defined in policy, cannot be deleted

firewalld でssh (22番) を閉じる

sshのサービス (ssh.xml) を外す。

$ sudo firewall-cmd --remove-service=ssh --zone=public --permanent
success
$ sudo firewall-cmd --reload
success

sshが外れているか確認する。

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh-alt
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

servicesからsshが消えました。

パケットフィルタで22番の設定を削除する

さくらのVPSのパケットフィルタ利用している場合は、SSH (22番) のフィルタを削除する。


以上で、SSH接続が22番のパスワード認証から50022番の公開鍵認証になりました。

なんかVPSスケールアップしてみた

さくらのVPSを2GBで借りたけど物足りなかったので4GBにしたいと思ったら、スケールアップ機能があって、そのままスケールアップできた。差額を払えば良かった。素晴らしい。ストレージも400GBに増やした。面倒なので、またクリーンインストールした。

あとは、マルチドメインで運用するやり方とか忘れてしまった……。思い出さねば。

f:id:aokirozin:20200707002210p:plain

さくらのVPS借りた

数年ぶりさくらのVPSを借りた。メモリ2GB、SSD100GBのプラン。東京ゾーンで借りたので、月額1,780円、年額19,580円だった (それぞれ税抜)。サーバのコントロールパネルがずいぶん変わって使いやすくなっていた。さっそくOSをクリーンインストールし直して使うことにする。特に使い道は考えていないが。

Dockerとかで遊んでみたいので、OSはたぶんCentOS7にする。下の画像が標準でインストールできるOS。最新のCentOS8も使える。

f:id:aokirozin:20200704104734p:plain

自分が持っているISOイメージをアップロードしてOSインストールできるみたいだし、なかなかすごい。

SlackのクローンのRocketChatとかMattermostとか動かしてみようかな。あとは気になってるCMSのDrupal。それからメールサーバの環境をしっかり実験したい。

Python環境を構築できるAnaconda (2)

必要なパッケージのインストール

前回、

でMinicondaをインストールしたので、今回は Jupyter Notebook を使うために必要なパッケージをインストールしていきます。Jupyter Notebook とはブラウザ上で動く対話形式でPythonを実行していける実行環境です。Pythonだけではなく、他の言語にも対応しています。

インストール済みパッケージのアップデート

とりあえず、インストール済みのパッケージをアップデートしておきます。 Anaconda Prompt から、

> conda update -y --all
...
...
done

doneとでればOKです。

Jupyter Notebook のインストール

ます、現在インストールされているモジュールをconda listで確認してみます。

> conda list
# packages in environment at C:\Users\xxxxx\miniconda3:
#
# Name                    Version                   Build  Channel
ca-certificates           2020.1.1                      0
certifi                   2020.4.5.2               py38_0
openssl                   1.1.1g               he774522_0
pip                       20.1.1                   py38_1
python                    3.8.3                he1778fa_0
setuptools                47.3.0                   py38_0
sqlite                    3.32.2               h2a8f88b_0
vc                        14.1                 h0510ff6_4
vs2015_runtime            14.16.27012          hf0eaf9b_2
wheel                     0.34.2                   py38_0
wincertstore              0.2                      py38_0
zlib                      1.2.11               h62dcd97_4

モジュールは ]jupyternotebookとその依存パッケージをインストールします。

> conda install jupyter notebook
...
...
done

これで結構な数のパッケージがインストールされたはず。

Jupyter Notebook の起動

> jupyter notebook

これで、デフォルトのウェブブラウザが起動して Jupyter Notebook が表示されるはず。初期ディレクトリはユーザーのホームディレクトリ (C:\Users\xxxxx) の模様。

試しに、ここにtestという名前でPythonのファイルを作ってみます。

右上の方にある「New」から「Python 3」を選択します。

f:id:aokirozin:20200620125714p:plain

このような、「セル (Cell)」と呼ばれるものが出てくると思います。

f:id:aokirozin:20200620130017p:plain

ここにコードを書いていきます。「 + 」で実行できます。直接計算もできます。

f:id:aokirozin:20200620130322p:plain

変数も使えます。また、最終行に変数名を置くと変数がprintされます。print関数で表示させる場合と多少挙動が違うらしいです。

f:id:aokirozin:20200620130705p:plain

Jupyter Notebook の終了

Jupyter Notebook はブラウザを閉じても終了していません。Anaconda Prompt で終了処理を行う必要があります。Jupyter Notebook 起動中は Anaconda Prompt はログが流れっぱなしになっていると思いますが、そこで、「 + 」を押します。

[I 13:13:25.553 NotebookApp] Interrupted...
[I 13:13:25.554 NotebookApp] Shutting down 1 kernel
[I 13:13:25.757 NotebookApp] Kernel shutdown: 47bbe0c3-3582-41e3-ad40-88604875235c

(base) C:\Users\xxxxx>

みたいに、カーソルが帰ってくればOKです。

2020 © aokirozin