以前、Dockerを試したことがあるが、Hyper-Vをオンにする必要があり(私のノートPCはたまたまWindows10 ProEditionだった為Hyper-Vが使えた)、パソコンの動作がメチャ重くなり止めたことがあったが、Hyper-VでなくWSL2をバックエンドで動かす事で動作も非常に軽いとのことなのでDocker Desktopを試してみたが、とても使いやすい。
尚、仮想化技術についてはこの記事、これも がわかりやすい。
Docker
WSL2
- 全般:
Windows Subsystem for Linuxの最新版(2022.4月時点)。WSL1がLinuxを疑似していたのに対してWSL2はLinxuカーネルを搭載しているのでLinuxソフトが問題なく動作できる(とのこと)。
→WSL2は、下記のDocker Desktopをインストールする際に設定された
→セットアップ過程においてLinuxカーネルが設定される。
→WSL2環境にて、Microsoft StoreよりUbuntuをインストールすると、Windows環境においてもUbuntuを使うことが可能。但し折角DockerDesktopが使えるので、こちらでUbuntuのイメージファイルをダウンロードして使ったほうが良い(と思われる)。
→エクスプローラ(フォルダ)より、\\wslにて、インストールされているソフトが判る。上記でUuntuをインストールすると、wsl配下にUbuntuが表示される(但しインストールすると2Gほど容量が取られるのでアンインストール)。 - コマンド:
- wsl -l -v
→docker-desktopとdocker-desktop-dataがVERSION2で動作していることがわかる。
- wsl -l -v
- その他:
- 再インストール後に起動しなくなったWSLのUbuntuを修復するには
⇒PowerShellでwsl –unregister Ubuntuを使ってUbuntuの登録を解除する。
- 再インストール後に起動しなくなったWSLのUbuntuを修復するには
Docker Desktop
- インストール方法
これを参照してインストールを実施。- 上記サイトを参考に仮想化がOnになっていることを確認(私の3万円のノートPCでも問題無し)
- DockerのサイトからDocker Desktopをダウンロード
- インストールが完了すると、有効化のために再起動を求められるので再起動。再起動してもPCの動作には変わりなし。
- デスクトップ上にできたDockerDesktopのアイコンをクリックすると、LinuxKernelのバージョンアップを求められたのでリンクをクリックしダウンロード。その後、Tutorialに従って、DockerDesktopのGUI内のコマンドラインを実行してコンテナを作成&起動すると、サーバが起動し、localhostでアクセス出来ることを確認。
- 私のノートPCのようにHDが64Gしかないと空き容量が少なくなるため、インストール後にシステムファイルのクリーンナップを実行するのが良い。
- (2022.6.26追記)システムアップデートで4.9.1になったら起動しなくなってしまったので、アンインストールし再度最新版をインストールして復旧。
(7.3追記)再度使用したら起動しなくなったが、Ver4.10.0が出ていたのでこちらに入れ替えたらちゃんと起動するようになった。 - (2022.10.10追記)ノートパソコンの容量が少なくなってきたことから、この記事を参考にしてDockerファイルの保存先をDドライブに変更。従来は従来はDockerイメージは\AppData\Local\Docker\wsl配下に存在していたが、実施後はここにあったファイルは無くなっている。実施後Dドライブの容量が気になるようであれば.tarファイルも削除しても良いと思う。
- Docker Desktopの使い方
Docker(Linux)
- インストール方法
※EC2にDockerをインストール実施。- SSHでEC2にログイン
- sudo snap install docker にてdockerをインストール
- ルートでdockerをインストールするとdockerコマンド実施の際に権限不足でdocker.sockにアクセスできないため、以下を実施。
ls -l /var/run/docker.sock ←現在の権限を確認
sudo chmod 666 /var/run/docker.sock ←権限を変更
ls -l /var/run/docker.sock ←権限が変更になっていることを確認
docker ps ←実行できなかったコマンドが実行できるようになっていることを確認。
Docker全般
※Docker ver1.13以降ではコマンドが整理されて追加・変更が行われている。ver 1.13以降でも旧コマンドは利用可能。下記では新コマンドは()で表記。
①イメージファイル関連
・docker pull (image pull) ubuntu:20.04 ←イメージファイルをダウンロード
・docker images (image ls) ←イメージファイルの確認
・docker image rm <イメージ名> ←イメージファイルを削除
・コンテナからイメージを作る★
a) docker commit コンテナ名 作成するイメージ名 ←commitでイメージを書き出す※コンテナ自身はコピー等出来ないので、一旦イメージファイルに落とす必要がある。
b) 若しくは、dockerfileからdocker buildにてイメージを作成する ※⑤参照
・作成したイメージファイルを保存
⇒イメージファイルを作成★した上で、以下の2つの何れかの方法で保存。
A) docker saveにてtarファイルとしてローカルに保存。
$ docker save -o ファイル名.tar 自作イメージ名
※ファイルからイメージとして取り込みたいときは「load」コマンドを使う。
B) commitした後に、DockerイメージをDocker Hubにアップロードして保存する。(参考)
$ docker push <docker hub ID> / <image名>:<タグ名>
②コンテナ関連 ※参考
・docker container run -it -d --name ubuntu2004 ubuntu:20.04
⇒イメージからコンテナを作成。
・docker ps (container ls) 起動しているコンテナを確認。
docker ps -a (container ls -a) ←コンテナ全てを確認
・docker container exec -it ubuntu2004 /bin/bash ←コンテナを実行する。
・docker stop (container stop) <コンテナ名> ←コンテナを停止
・docker rm (container rm) <コンテナ名> ←コンテナを削除
・docker cp ←ホストとコンテナ間でファイルをコピー
③ネットワーク関連
・docker network ls ←ネットワークを確認
・docker network rm <ネットワーク名> ←ネットワークを削除
④ボリューム関連
・バインドマウントとボリュームマウント
docker run -v 実際の記憶領域orボリューム名:コンテナの記憶領域パス
・docker volume create <ボリューム名>
docker volume rm <ボリューム名>
・docker volume inspect <ボリューム名> ←ボリュームの詳細情報を表示
・ボリュームの①バックアップと②リストア
⇒ボリューム自体はコピーできないので、別のコンテナ(busybox)につないで圧縮し(tarコマンド)バインドマウントに保存する という面倒な所作が必要となる。
⇒①docker run --rm -v apa000vol1:/moto -v C:\Users\ユーザー名\Documents:/saki busybox tar czvf /saki/backup_apa.tar.gz -C /moto .
⇒②docker run --rm -v apa000vol2:/moto -v C:\Users\ユーザー名\Documents:/saki busybox tar xzvf /saki/backup_apa.tar.gz -C /moto
⑤Dockerfile関連
- Dockerfile とは自分の好きなようにカスタマイズした Docker Image を作成するためのファイル。Dockerfile の配置されたディレクトリで docker build -t [イメージ名] . コマンドを実行するとローカル環境に Dockerfile の内容を元にローカル環境に Docker Image が作成される。(Dockerfile と docker-compose を利用すると何がうれしいのか?)
・Windowsローカルに材料フォルダを作成しDockerfileも作った上で、以下を実施。
docker build -t イメージファイル名 材料フォルダの場所 (or .)
・django作成例:https://engineer-ninaritai.com/docker-django/ ←Docker上にDocker環境を作り、Dockerプロジェクトはローカル(Windows)に作成される例
⑥Docker Compose ※docker-compose.yml関連
・複数のコンテナで構成するシステムを、一気に実行したり停止・廃棄したりできる。⇒これがわかりやすい。
・定義ファイルはdocker-compose.yml。実行は以下。
docker-compose -f 定義ファイルのパス up オプション
・docker-compose.ymlの中のdockerfile:にDockerfileを記載することでDockerfileを読み込む。
⑦Docker hub ※プライベートリポジトリの作成
・Docker hubへのイメージファイルのアップロードは以下のとおり。https://zenn.dev/tofucode/articles/26f8f141b84d09
- Docker hubにログイン後に、「Create Repository」ボタンを押してレポジトリを作成※すると、自分のアカウントID配下にレポジトリが作成される。
- ローカルイメージに対して、タグを作成する
>docker tag イメージ名:<tag> 自分のアカウント名/上記で作成したレポジトリ名※:<tag>
>docker push 自分のアカウント名/上記で作成したレポジトリ名※:<tag>
・Docker hubからのダウンロード
・Githubとの連携:
⇒GithubにDockerfileを作成し、github actionにてビルドを行い、githubとDocker hubとの連携設定をすると、イメージファイルがDocker hubに自動的に作成される。https://note.com/cryptomining/n/n5c7d1b10abde
⑧VSCodeにてコンテナ内にてプログラミング
・VSCodeにDev Container(旧Remote Containers)プラグインをインストールすることで、Dockerコンテナ内を直接編集したりコンテナを動かすことが出来る。
・.devcontainer/devcontainer.jsonの"dockerComposeFile"にてdocker-compose.ymlを指定することでコンテナを作成する。https://zenn.dev/benkey/articles/398c9bbc86e950
・コンテナ内からgithubへプッシュするには、コンテナにgitをインストールし(=Dockerfile)、かつローカルにある秘密鍵をコンテナにマウントする(docker-compose.yml)したうえで、上記をDevContainerで有効化させる(=devcontainer.json)。 ⇒https://zenn.dev/benkey/articles/398c9bbc86e950
⑨その他
・docker logs <コンテナ名> ←コンテナ作成の際にエラ発生した際は、ログを確認するとどのようなエラだったかが確認できる。
サンプル
●DockerHubを用いてUbuntu Desktopを動かす
$ docker run --rm -p 8080:8080 uphy/ubuntu-desktop-jp:18.04
●nodejs/npmを動かす
⇒https://zenn.dev/boarinclover/articles/a839e8d24ff9c0 にて、Dockerfile/docker-compose.ymlを用いたコンテナお試しができる(但し、これだとaptが入っていないのでパッケージが追加できない)
●nodejs/npmでアプリを動かす
⇒普通にubuntuのイメージファイルをダウンロードした上でnpmを入れようとしたところ、パッケージの依存性の関係から最新版(4.x)だとnpmが対応していないようで3.0.13-0ubuntuでないとダメのようで、ネットで調べるとこのバージョンのubuntuがubuntu:noble というもののようなので以下を実施。
docker pull ubuntu:noble ←イメージファイルをダウンロード
docker container run -it -d --name ubuntu-noble ubuntu:noble ←先ほどダウンロードしたイメージファイルからコンテナubuntu-nobleを作成。-dはバックグラウンドで動作させる為に、また-itはコンテナの中身を操作するために必要。
次にdocker desktopのGUI画面より上記コンテナを動かし、Execタブより以下を実施
apt update
apt install sudo ←まずはsudoをインストール
sudo apt install npm ←次にnpmをインストール(最新版のubuntuを使うと、ここでNGとなる。。)
npm install -g n ←nもインストール
apt install curl
apt install wget ←curl,wgetもインストールしておかないとnコマンド実行時にエラが出るので必要。
apt install vim ←こちらもインストール()
apt install git ←githubからアプリを落とすために必要
n 14.18.1 ←今回動かすアプリはnode 14.18.1を使用(package.jsonにも規定)のため、該当のnodeバージョンに切り替える
git clone https://github.com/yamachanyama/words-auth.git ←試しに自分のアプリ(node/express/angular/mongodb)をdocker環境にダウンロードしてみる
cd words-auth
vim .env にて.envファイルも追記する。
npm install ←上記を実施した上で、必要なパッケージをpackage.jsonに従いインストール ※少々時間を要する。。
cd ..
docker commit ubuntu-noble ubuntu-noble-edit ←一旦イメージファイル(ubuntu-noble-edit)に保存
docker container run -it -d -p 4200:4200 -p 8080:8080 -p 27017:27017 --name ubuntu-noble-edit-vim ubuntu-noble-edit-vim ←自分のアプリはフロントは4200(バックは8080)で起動するので、docker外部からのアクセスも同じ4200に設定。またmongodbへは27017を用いて通信しているようなのでこれも追加。(多分、4200のみの設定でいいかと思うが)
そして、package.jsonにおいて
"start": "node server.js",
"start1": "run-p debug1 debug2",
"debug1": "node server.js",
"debug2": "ng serve --proxy-config proxy.conf.json --open",
としているが、debug2において --host=0.0.0.0 の追加をしないとdocker外からlocalhostでアクセスする際にdocker内のng serverに到達できないので注意要。
この解決に1日を要した。参考(https://qiita.com/k5n/items/1a4987a430cf32e3e57d)
#変更はDocker Desktopのexec画面から修正するか、docker container exec -it ubuntu-noble-edit-vim /bin/bash でコンテナ内に入ってから変更するかいずれか。https://www.wakuwakubank.com/posts/325-docker-ubuntu/
その上で、
npm run start1
その後、localhost:4200 でブラウザアクセスするとアプリが開く。
但しこれだとイメージファイルが2Gのほどになってしまうので、次にdockerfileでマルチステージビルドを用いてビルドを実施(参考1、2)
FROM ubuntu:noble as builder
# タイムゾーンを日本に設定
ENV TZ Asia/Tokyo
RUN apt update
RUN apt -y install sudo
RUN sudo apt -y install npm
RUN npm install -g n
RUN apt -y install curl
RUN apt -y install wget
RUN DEBIAN_FRONTEND=noninteractive apt -y install vim
RUN apt -y install git
RUN n 14.18.1
WORKDIR /root
RUN git clone https://github.com/yamachanyama/words-auth.git
WORKDIR /root/words-auth
COPY .env ./
RUN npm install
FROM ubuntu:noble as dev
COPY --from=builder /usr/local/bin /usr/local/bin
COPY --from=builder /usr/local/lib/node_modules /usr/local/lib/node_modules
COPY --from=builder /root/words-auth /root/words-auth
# CMD ["cd", "/root/words-auth"]
# CMD ["npm", "run", "start1"]
これで800Mくらいに抑えられる。ちなみにvimインストールの際にエリア情報を聞かれるのでdockerfileだと上手くインストール出来ない。この記事(1,2)を参照にdockerfileに手を加えてみたがまだ上手くいかず(2024.11.23)
Kubernetes
Virtual Box
XXXの本の環境はVirtual Boxにてイメージファイルが使えるとのことなので、試そうとは思っているが、この記事を見るとWSL2(ハイパーバイザ型仮想環境)とVitul Box(ホスト型仮想環境)は共存できないとのことなので当面は無理と思われる。
コメントを残す