・Docker Hubの登録
・Docker Desktopのインストール
Homebrew:brew install --cask docker
Dockerコマンドをよく使う表記方法でまとめました。オプションは網羅していませんので、あしからず。
なお、私は、Udemyの「米国AI開発者がゼロから教えるDocker講座」(講師:「かめ れおん」さん) でDockerを勉強しました。とにかく説明がわかりやすく体系だった内容のため、DockerのみならずLinuxの知識も身に付きます。
なによりも、プロのデータサイエンティストの方が講師をされているので、実践的で信頼性の高い素晴らしい受講体験をすることができます。
本ブログの内容は、この講座の内容を後から思い出すためのアンカーとして断片的な内容を記録したものとなっていますので、しっかりDockerを学びたい人は「かめ れおん」さんの講座を受講してみてください。
Dockerとは?
「Docker」とは、「コンテナ技術を使い、OS内に仮想的な開発環境を構築するためのツール」をいいます。Dockerを使用することで、異なるOSであっても同一の開発環境を実現することができます。
Dockerの大まかなフローは以下のイメージです。(※ピンクの文字はコンテナの状態を表しています。)
- registry:「Docker image」を管理するクラウドサービス。Dockerでは「Docker Hub」を主に使用する。registryからDocker imageをダウンロード(pull)したり、アップロード(push)することが可能。
- repository:Docker Hub上にあるDocker imageの集まり。Docker imageがバージョン毎にtag付けして管理されている。
- Docker file:Docker imageの設計図。「docker build」コマンドでDocker imageを生成できる。
- Docker image:containerを作成するためのテンプレート。「docker run」コマンド等でcontainerを生成できる。
- container:仮想的な開発環境。自身のOSやファイルシステムとは分離された環境。
Dockerのバージョン確認
- % docker --version:インストールされているDockerのバージョンを表示する。
Docker Hubとの連携
- % docker login:Docker Hubにログインする。
- % docker logout:Docker Hubからログアウトする。
- % docker pull <image>:Docker HubからDocker imageをダウンロード(pull)する。
- % docker push <username>/<repository>:docker imageをDocker Hubにアップロード(push)する。(Docker Hubのregistryにpushする際、image名は<username>/<repository>と表記する必要がある。)
Docker imageの操作
- % docker images:Host(Dockerを起動しているパソコン)にあるDocker imageの一覧を表示する。
- % docker tag <source> <target>:<source>イメージにイメージ名<target>を付与する。
- % docker rmi <image>:HostにあるDocker imageを削除する。「rmi」は「ReMove Image」の略。
コンテナ操作
- % docker run <image> <command>:Docker imageからコンテナを生成し、<command>実行後にinactive(コンテナが起動していない状態)にする(run=create+start)。<command>を指定しなければデフォルトコマンドが実行される。Docker imageがHostに無い場合は自動的にpullもする。「-it」オプションを追加することでコマンド実行後の状態を保持できる。「--rm」オプション(「ReMove」の略)を追加することで、コンテナをExit(プログラム停止)後に削除することができる。「--name <container_name>」オプションを追加することで、コンテナ名を指定してrunすることができる。
→HostとContainerの関係に関するrunコマンドのオプションについては、「Host & Container」の項目を参照。
% docker run -it ubuntu bash:ubuntu(OSの一種)イメージからコンテナを生成し、同時にコマンド「bash」(bashは「シェル」(OSに命令を渡すプログラム)の一種)を起動する。※HOST(macOS等)に別のOS(ここではubuntu)の仮想環境を構築している。
※「-it」オプションは、「-i」(Hostからcontainerへの入力を可能にする)と「-t」(整えて出力する)をまとめたもの。「i」は「Interactive」、「t」は「Teletypewriter(標準入出力端末)」の略。
※bashを終了する際等、「# exit」でプログラムを停止することで、コンテナがExited(inactive)になる。
※「Ctrlキー+Pキー+Qキー」で「detach」(コンテナとの接続は切れているが、バックグラウンドでコンテナが起動している状態)する。
※「docker run」コマンドに「-d」オプションを追加することで、コンテナ実行後に「detached mode」(detachの状態)にすることができる。(なお、detached mode以外のモードを「foreground mode」(コンテナと接続されており、コンテナが起動している状態)という。)
- % docker restart <container>:inactiveなコンテナを「active」(コンテナが起動している状態)にする(コンテナを再起動する)。
- % docker attach <container>:「attach」(detachしたコンテナに再接続)する。
- % docker exec <container> <command>:activeなコンテナのプログラムを実行する。「docker run」コマンドと同様に「-it」オプションを追加することでコマンド実行後の状態を保持できる。
- % docker stop <container>:コンテナをinactiveにする。
- % docker rm <container>:inactiveなコンテナを削除する。
- % docker system prune:inactiveなコンテナを全て削除する。
- % docker ps:activeなコンテナの一覧を表示する。「ps」は「Process Status」の略。オプション「-a」(「a」は「All」の略)を追加することでinactiveを含む全てのコンテナを表示できる。
- % docker inspect <container>:コンテナの情報を表示する。「| grep -i <str>」を追加することで検索する文字列を指定できる(「-i」は「ignore」の略。大文字小文字を無視する。)。
- % docker rename <old_container_name> <new_container_name>:コンテナ名を変更する。
Host & Container
- % docker run -v <host_directory>:<container_directory>:ホストのディレクトリ<host_directory>をコンテナのディレクトリ<container_directory>に割り当てる(コンテナからホストのディレクトリを参照している状態(「mount」という))。なお、<container_directory>が存在しない場合は自動的に作成もする。
- % docker run -u <user_id>:<group_id>:ユーザーIDとグループIDを指定してコンテナに入る(指定しない場合は、root権限で入ることになる。ホストのディレクトリをmountしている場合は注意。)。<user_id>を「$(id -u)」、<group_id>を「$(id -g)」とすることで、ホストのアクセス権限と同じ権限でコンテナに入ることができる。
- % docker run -p <host_port>:<container_port>:ホストのポートをコンテナのポートに繋げる(「publish」するという)。(例えば、ホストが外部クラウドにある場合、ホスト(この場合、Webサービスとなる)を指定するためにポート番号を使用する。ただし、このままではコンテナのWEBサービスには繋がらないため、ホストのポート番号とコンテナのポート番号を繋げる必要がる。)
- % docker run --cpus <# of CPUs>:コンテナがアクセスできる上限のCPUを設定。<# of CPUs>には物理コア数を指定。
- % docker run --memory <byte>:コンテナがアクセスできる上限のメモリを設定。
Docker imageの生成
- % docker commit <container> <new_image_name>:コンテナからDocker imageを生成する。<new_image_name>に「:<TAG>」を加えることで、タグ名を指定することができる(タグ名はデフォルトで「latest」)。
- % docker build <build_context>:「Dockerfile」(Docker imageの内容を定義したテキストファイル。ファイル名も「Dockerfile」とする。)からDocker imageを生成する。生成直後のイメージ名は「none」となる。このイメージを「dangling image」という。「build context」(Dockerfile及びその他の関連ファイルが保管されたディレクトリ)がカレントディレクトリの場合は、<build_context>部分を「.」とする。なお、M1チップのMacの場合は、「docker build --platform linux/amd64 <build_context>」とする必要があるので注意。「 -t <image_name>」オプションを追加することで、image名を指定することができる。また、<image_name>に「:<TAG>」を加えることで、タグ名を指定することもできる(タグ名はデフォルトで「latest」)。「-f <dockerfile>」オプションを追加することで、「build context」外にあるDockerfileからDocker imageを生成することができる。また、Dockerfileのファイル名が「Dockerfile」以外の場合でもDocker imageを生成することができる。
- % docker save <image> > <tar_file_name>.tar:Docker imageをtar形式のファイルに変換して保存する。
- % docker load < <tar_file>.tar:tar形式のファイルをDocker imageに戻す。