Dockerメモ


注意:初心者のメモなので間違っていたり、理解が浅いものが多数あると思われます。

Dockerとは

超簡単にいうと仮想化の技術。ただし、仮想マシンのような完全な仮想化できはなく、ホストOSの一つのOSを共有して利用しているので、完全仮想化より高速で軽い。コンテナは実行環境を他のプロセスから隔離して、その中でアプリケーション等を動作させる技術で、異なる計算機間で同じ構成の環境を簡単に構築できる。仮想マシンのように複数のOSを使うことはできないが、Linuxのカーネルを含まないことで軽量化され、可搬性が高い。Dockerfileとしてコード化することができるのでGitのレポジトリにソースコードと一緒に管理することができ、cloneやpullしたときにDockerfileからコンテナを作ることで開発環境まで構築できるようになる。

色々あったけど、結局は

  • Dockerイメージを作れば、開発環境を構築する手間を省ける
  • 開発環境と本番環境で全く同じ構成にできる

というのが便利らしい。

<参考文献>
https://udemy.benesse.co.jp/development/system/docker.html
https://tech-lab.sios.jp/archives/21675
<いい感じにまとめてくれてる記事>
https://qiita.com/gold-kou/items/44860fbda1a34a001fc1

Docker Desktopのインストールのメモ

環境:Windows10 Pro

  • WSLを有効化してUbuntu20.04を入れる。
  • Windows Updateで詳細オプションにある「Windowsの更新時に他のMicrosoft製品の更新プログラムを受け取る」をオンにして更新を調べるとWSLのLinux Kernelが更新される。
  • wsl --set-version Ubuntu-20.04 2を実行するとwsl2を利用できる。上の更新ができていないとLinux Kernelの更新をしてくださいと出て怒られる。バージョンはwsl -l -vで確認できる。
  • Windows proならHyper-Vを有効化、homeならCPU仮想化なんちゃらを有効化する。昔はhyper-Vは必須だったが、今はhomeでもDocker Desktopが使えるらしい。homeの方はうまくいくか未確認。
  • Docker Desktopをインストール
  • エラーなく起動できたらインストール完了

Docker用語メモ(超雑)

  • Docker レポジトリ:Dockerイメージを管理するところ。一つのレポジトリにはtagで管理されたイメージが保管されている。公式のレポジトリサーバーであるDocker Hubではレポジトリの保存ができる。
  • Docker Image:コンテナを作るもの。必要な設定やコマンドがまとまっている。
  • tag:イメージのバージョンを管理するもの
  • コンテナ:イメージをもとに作られる仮想環境。ホストOSのカーネルを利用する。

Dockerの使い方メモ

libraryにあるhello-worldイメージを持ってきて実行する。Ubuntuのイメージからコンテナを作り作業してレポジトリを更新する。

  • Ubuntuを起動してdocker loginでログインする
  • docker pull hello-worldでDockerイメージを持ってくる
  • docker imagesでイメージを見る
  • docker psで動いているコンテナの状況を見れる。止まっているコンテナも全部見たいときはdocker ps -aで見れる。
  • docker run hello-worldでコンテナを作る。このコンテナは"Hello from Docker!"と出力してexitする。つまりrunコマンドはコンテナの作成+実行を行っている。ちなみに作成と実行を別々に行うにはdocker create <image>docker startを使う。ただし、ここで実行されるのはデフォルトのコマンド、Hello-worldでは/helloコマンドが勝手に実行される。
  • docker run -it ubuntu bashでubuntuのイメージからubuntuのコンテナを作り、対話するためにbashを起動する。docker run <image> <command>とすることでデフォルトのコマンドを上書きして別のコマンドを実行できる。つまりubuntuイメージのデフォルトコマンドをbashに上書きして実行する。ただし、実はubuntuのデフォルトコマンドは/bin/bashだったりするので上書きする必要はない。ちなみに-itは-iはインプット可能、-tは表示をきれいにするオプションである。-iがあることでSTDINというチャネルをホストからコンテナに繋げることができる。よくわからなくてもおまじないだと思ってつけるといいっぽい。
  • 作業を終えたらexitでコンテナから抜ける
  • exitしたコンテナにもう一度入るときはdocker restart <container-id>でexitの状態からup状態にできる。docker ps -aで状態を見れる。
  • docker exec -it <container-id> bashで再度作ったコンテナからbashを起動する
  • コンテナからイメージを作るときはdocker commit <container-id> <image-name>でコミットできる。イメージの名前の後ろに:をつけると後ろはタグになる。
  • Docker Hubで新しいレポジトリを作る。レポジトリ名は/となる。
  • イメージをレポジトリに上げるためにはレポジトリの名前とイメージの名前が一致している必要がある。docker tag <source> <target>で新しいイメージ名のイメージができる。古い名前のイメージもそのまま残っている。docker imagesでIMAGE IDを見ると同じIDになっている。
  • docker push <image>でレポジトリにプッシュする。
  • docker rmi <image>でローカルのイメージを削除できる。

最後に

DockerFileの詳細とかbuildとかまではまだ手をつけられていないので、そのうち勉強したらメモ書きとして残すかもしれない。機械学習の環境構築が大変だったり、Githubにあげられてるサンプルコードの実行環境用意するのが面倒だったりするので、自分でなにか作ったときはDockerfileから一発で呼び出せるようにしてドヤりたい。