Open14
Docker
Dockerを学習する
なぜDockerを学ぶのか?
- 同一の解析環境を複数のマシン上に持ち込んで使うため
- 解析環境を記述してファイルとして残すことで、reproducibilityを確保するため
- デスクサイドのワークステーションとHPCの解析環境上で同一の解析環境を構築するため
- 解析環境をクラウドに持ち込むため
これまでの状況と年末までの学習予定
- Dockerイメージが配布されている解析環境をたまに使用する程度
- dockerのコマンドは基本READMEに書かれている通りに作業していて、詳しくない
- 今後、一般的な解説等を使って概要を掴む
- 普段使用している環境でdockerを使用できるように整備、dockerfileを自分で記述できるようにする
- クラウド環境でdockerを使用してみる
学習リソース
見つけた順にここにスクラップ
意気込み
頑張ろう
Dockerが使用している仮想化技術は
- コンテナ型仮想化ソフトウェア。Docker Engine
- そのほかの仮想化には、ホストOSの上にホスト型仮想化ソフトウェア(Virtualboxなど)がインストールされるものや、ハードウェアにハイパーバイザー型仮想化ソフトウェア(Hyper-v、KVM)がインストールされるものがある。いずれもゲストOSを管理する。
- コンテナ型の利点として、起動が早い、デプロイしやすいなどが挙げられる。
- 昨今は本番環境もローカル開発もコンテナ型仮想化を前提として構築することが多くなっているらしい。
- コンテナ型は他のホスト型等と比べて仮想化部分が完全には分離されていないので、ホストOSの違いがコンテナの挙動に影響するといった違いがある。
Docker XXXがたくさんある
Docker Engine
- コンテナ型仮想化ソフトウェア
- Linuxのカーネルと機能を使って動く
Docker CLI
-
docker run
,docker build
などのdocker
で始まるコマンド
Docker Desktop
- GUIアプリケーション。DockerをWindowsやMacで使うことができる
- engineやlinuxカーネルが含まれている。Docker ComposeやKubernetesも含まれている。
- Docker for WindowsやDocker for Macなどダウンロードサイトにあるものが、Docker Desktopのこと。
Docker Compose
-
docker compose up
などdocker compose
で始まるコマンドを提供する。 - Docker CLIをまとめて実行してくれるツール。
- 簡単に同じ構成を再現できるようになる。
Docker Hub
- Dockerイメージのレジストリ。Dockerイメージにとってのgithubのようなもの。
ECS/GKE
- ECS : Amazon Elastic Container Service.
- GKE : Google Kubernetes Engine.
- どちらもコンテナ管理サービスで、ローカルの開発環境に使ったコンテナをそのままデプロイすることができる場所。Linux + Docker Engine
ECR/ GCR
- ECR : Amazon Elastic Container Resistry
- GCR : Google Container Registry
- 非公開のイメージレジストリ。プライベートなDocker Hubのこと。
Kubernetes (k8s)
-
kubectl
で始まるコマンドで使う - 多数のコンテナを管理するオーケストレーションソフトウェア。コンテナを運用するためのツール。
Singularityについて
- Dockerと一緒に名前を聞くことが多いSingularityとは、科学や高性能コンピューティング環境用に設計されたオープンベースのコンテナプラットフォーム。HPC分野で普及している。
- Dockerイメージを利用することができる。
コンテナを理解する
- コンテナは特定のコマンドを実行するために作られる、1プロセス
- LinuxのNamespaceにより作られる
- コンテナは、ホストマシンの1プロセス。仮想OSが動いているわけではない
特徴
- コンテナはイメージをもとに作られる
- コンテナ同士は独立していて互いに影響しない、できない
- Dockerエンジンの上なら、ローカルマシンでも仮想マシンでも、クラウドでも動作できる
新コマンドではサブコマンドで何に対する操作なのか明示している
Previous | New command | コマンドは何をどうする |
---|---|---|
docker build |
docker image build |
image を build |
docker pull |
docker image pull |
image を pull |
docker images |
docker image ls |
image を ls |
docker run |
docker container run |
container を run |
docker create |
docker container create |
container を create |
docker start |
docker container start |
container を start |
docker ps |
docker container ls |
container を ls |
docker 基本の動作
command | 動作 | 実行例 |
---|---|---|
docker container run |
コンテナを起動する | sudo docker container run hello-world |
docker container ls |
コンテナ一覧を確認する | |
docker container ls --all |
起動していないコンテナを含めてコンテナ一覧を確認 | |
docker container stop |
起動中のコンテナを停止する | sudo docker container stop 5e34ec234251 |
docker container rm |
停止したコンテナを削除する | sudo docker container rm 5e34ec234251 |
docker rm --force |
起動中のコンテナを削除する | sudo docker container rm --force 5e34ec234251 |
コンテナの起動時
対話的操作を行う
-
--interactive
: ホストマシンのターミナルからの入力を受け付ける -
--tty
: コンテナの擬似的な出力先を作る
(base) tu@tu-server:~$ sudo docker container run --interactive --tty ubuntu:20.04
[sudo] password for tak1u:
Unable to find image 'ubuntu:20.04' locally
20.04: Pulling from library/ubuntu
1b9f3c55f9d4: Pull complete
Digest: sha256:8e5c4f0285ecbb4ead070431d29b576a530d3166df73ec44affc1cd27555141b
Status: Downloaded newer image for ubuntu:20.04
root@e7ddac0663f3:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@e7ddac0663f3:/# pwd
/
root@e7ddac0663f3:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.6 LTS"
バックグラウンド起動
-
--detach
: コンテナをバックグラウンドで実行する。常駐プロセスを起動するときなど。
(base) tu@tu-server:~$ sudo docker container run --detach --publish 8080:80 nginx:1.21
a8ce6e0d8c3691cf4246f768d57031035cfb07a47b914dcacbd805ab3668d893
(base) tu@tu-server:~$ sudo docker container list
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8ce6e0d8c36 nginx:1.21 "/docker-entrypoint.\u2026" 18 seconds ago Up 17 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp charming_joliot
削除はフォアグランドで走らせている場合と同じように行う
(base) tu@tu-server:~$ sudo docker container rm --force a8ce6e0d8c36
a8ce6e0d8c36
(base) tu@tu-server:~$ sudo docker container list
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(base) tu@tu-server:~$
コンテナ停止と同時に削除する方法
-
--rm
: コンテナが停止した時に自動で削除する
(base) tu@tu-server:~$ sudo docker container run --rm --detach --publish 8080:80 nginx:1.21
374c252e79a460794e97d2e77a926be79150e3e52baf1694a148967829e77401
- 停止を実行した場合でも、コンテナは削除される
(base) tu@tu-server:~$ sudo docker container stop 374c252e79a460794e97d2e77a926be79150e3e52baf1694a148967829e77401
374c252e79a460794e97d2e77a926be79150e3e52baf1694a148967829e77401
(base) tu@tu-server:~$ sudo docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
コンテナに名前を指定する
-
--name
: コンテナの名前を指定する - コンテナ停止時に名前を指定することも可能
- 名前は停止したコンテナも含めて重複することができない。同じ名前を使いたい場合は停止ではなく削除する必要がある。
(base) tu@tu-server:~$ sudo docker container run --name web-server-test --rm --detach --publish 8080:80 nginx:1.21
5557d55323ea1135f49fee28ccaf4cdc7149b2adb8a16bda01a7892c2e8738f1
(base) tu@tu-server:~$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5557d55323ea nginx:1.21 "/docker-entrypoint.\u2026" 11 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp web-server-test
(base) tak1u@tak1u-server:~$ sudo docker container stop web-server-test
web-server-test
(base) tu@tu-server:~$ sudo docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
コンテナの状態変更を何らかの形で保持する
- コンテナの構成変更を残して全コンテナに反映したい場合、imageを作る
- dockerfileで新しいアプリケーションが入ったイメージを作っておく、など
- コンテナのファイルを残したい場合、hostマシンと共有する
コンテナに接続
sudo docker container exec [option such as --interactive --tty] <container> command
Option | Meaning | Usage |
---|---|---|
--interactive |
コンテナの標準入力に接続する | コンテナを対話操作する |
--tty |
擬似ターミナルを割り当てる | コンテナを対話操作する |
別のターミナル画面から、先に起動しておいたコンテナの中でコマンドを実行する
- ターミナルのタブを別に開く
- 以下のコマンドを実行して、元のタブで実行したubuntuで
cat
を実行する
(base) tu@tu-server:~$ sudo docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
459b55717d39 ubuntu:20.04 "/bin/bash" 3 days ago Up 3 days u1
f2624384c689 ubuntu:20.04 "/bin/bash" 3 days ago Up 3 days n4
e32352530fde nginx:1.21 "/docker-entrypoint.\u2026" 3 days ago Up 3 days 80/tcp n1
8122138120e7 nginx:1.21 "/docker-entrypoint.\u2026" 3 days ago Up 3 days 80/tcp n2
(base) tu@tu-server:~$ sudo docker container exec u1 cat /root/hello.txt
helloworld
コンテナに接続する
- コマンドを一回一回実行するのが上のやり方。
- 起動しているコンテナのbashを直接使用した方が、構築を行なっていく際などには便利
- bashも
docker container exec
を使って起動できる
(base) tu@tu-server:~$ sudo docker container exec --interactive --tty u1 bash
[sudo] password for tak1u:
root@459b55717d39:/# ls /root
hello.txt
root@459b55717d39:/# whoami
root
- コンテナの中にあるログを調べる
- Dockerfileを書く前にbashでインストールコマンドを試し打ちする
起動しているコンテナ内で操作を行いたい場合は、ssh接続をするわけではない
docker container exec
でbash
すれば良い
imageについて
image一覧の確認
sudo docker image ls [options]
(base) tu@tu-server:~$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04 223c04ea1fd5 2 months ago 65.7MB
nginx latest 4b196525bd3c 2 months ago 197MB
hello-world latest ee301c921b8a 19 months ago 9.14kB
nginx 1.21 8f05d7383593 2 years ago 134MB
これは、container lsとは意味が異なる
(base) tu@tu-server:~$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
459b55717d39 ubuntu:20.04 "/bin/bash" 3 days ago Up 3 days u1
f2624384c689 ubuntu:20.04 "/bin/bash" 3 days ago Up 3 days n4
e32352530fde nginx:1.21 "/docker-entrypoint.\u2026" 3 days ago Up 3 days 80/tcp n1
8122138120e7 nginx:1.21 "/docker-entrypoint.\u2026" 3 days ago Up 3 days 80/tcp n2
imageが格納してあるところ
イメージを取得するためのコマンド
sudo docker image pull [option] <image>
container run
はimage pull
などのいくつかのコマンドを合わせたような便利なコマンド