Dockerコンテナを操作してみました。
はじめに
ハローワールド!マイクです。
Dockerはオープンなプラットフォームです。Dockerオブジェクトと呼ばれるイメージ、コンテナ、ネットワーク、ボリュームなどで構成され、これらを操作する事でアプリケーションを開発、配布、実行することが出来ます。
と言いますけど、実際どうなのか試したときの記録です。今回はDockerコンテナです。
使ったもの
今回の環境を下記に示しておきます。
・Ubuntu 22.04 LTS Desktop 64-bit
・Docker version 20.10.13 build a224086
あと、Ubuntuはインターネットに繋がっている必要があります。
まず、Dockerコンテナとはなんでしょう?
Dockerコンテナ(以下コンテナ)はDockerイメージ(以下イメージ)の実行可能なインスタンスです。イメージというテンプレートからアプリケーションを実行する、でも良いですかね。イメージからコンテナを作成する簡単な図を下に示したいと思います。
コンテナはDocker APIもしくはCLI(コマンドラインインターフェース)から操作(作成、実行、停止、移動、削除)することができます。
コンテナには一つ以上のネットワークを接続することが可能でnamespaceを使ってコンテナ同士もしくはホストマシーンとの隔離を管理します。
コンテナにはストレージを接続させることができます。ホストマシーンとファイルを共有することができます。(ネットワークとストレージに関しては別の記事で書きたいと思います。)
Dockerはコンテナのライフサイクル管理を行うことで、アプリケーションの開発、テスト、配布、実行をおこないます。規模が大きくなってくるとOpenShiftとかKubernetesを使う必要があるみたいです。
LinuxコンテナはLinux上で、WindowsコンテナはWindows上でしか動きません。これは、コンテナがOSのカーネルを使っているからです。コンテナはホスト上で動くプロセスなのでLinuxのps auxコマンドとかで見ることができます。Type1やType2のVM(Vertual Machine)とかと違う大きな点ではないかと思います。
次にコンテナを操作してみます
コンテナを操作する基本コマンドを以下に示したいと思います。
・新しいコンテナを実行する(新規作成)
> docker container run --publish 8080:80 nginx
nginxを80番ポートでコンテナとして実行しています。ホストのポート8080からコンテナのポート80へルーティングさせています。このコマンドを実行した際、ローカルキャッシュにnginxのイメージが無い場合はパブリックレジストリからローカルキャッシュにコピーしてからコンテナが作成されます。
> docker container run -- publish 8080:80 --detach nginx
今度はコンテナをバックグラウンドで実行しています。
> docker container run --publish 8080:80 --detach --name webserver nginx
更に、バックグラウンドで実行させたいコンテナに名前をつける方法です。コンテナ名を指定しなかった場合は内部の辞書からランダムに名前が作成されます。コンテナ名は一意です。
rmオプションをコンテナ実行時につけてあげると、コンテナを停止したときにコンテナが削除されます。なにか試すときに便利です。
> docker container run --rm -it ubuntu bash
ubuntuのコンテナをbashを実行します。itオプションはinteractive terminal、t オプション(pseudo-tty)とiオプション(interactive)の組み合わせです。コンテナプロセスが/bin/bashのような標準出力を対象とするプロセスの場合は-itオプションを付け、httpdのようなソケット等を対象とするプロセスの場合は-itオプションを付けないのが一般的らしいです。なので上の例ではbashを指定する必要はなかったです。このコンテナのbashからexitするとコンテナは停止してしまいます。停止せずに抜けるdetachするには、Ctrl+p のあとに Ctrl+qと打つとコンテナは実行されたままdetachすることができます。再度attachするには以下のコマンドを打ちます。
> docker container attach <コンテナIDもしくはコンテナ名>
exitで停止させたコンテナを再度実行したい場合は以下のコマンドを実行します。
> docker container start -ai <コンテナIDもしくはコンテナ名>
実行中のコンテナにプロセスを追加するには以下のコマンドを実行します。
> docker container exec -it <コンテナIDもしくはコンテナ名> bash
この例では動いているコンテナにbashを追加しています。
コンテナを実行するときに環境変数を渡して実行します。
> docker container run --detach --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=true mysql
この例では、Mysqlを実行するときにMYSQL_RANDOM_ROOT_PASSWORD=trueを渡しています。
コンテナの起動パラメータを確認する。
> docker container inspect <コンテナIDもしくはコンテナ名>
json形式で表示されます。
・実行中のコンテナを見る
> docker container ls
今動いているコンテナを見ることができます。今動いていないが過去に動かしたことのあるコンテナもみたい場合は下のコマンドを実行します。(実行中と停止中のコンテナが表示されます。)コンテナIDやコンテナ名がここで見ることができます。
> docker container ls -a
バックグラウンドで動いているコンテナのログを見るのは以下のコマンドを使用します。
> docker container logs <コンテナIDもしくはコンテナ名>
コンテナの中で動いているプロセスを表示させるには以下のコマンドを使用します。
> docker container top <コンテナIDもしくはコンテナ名>
コンテナの状態を表示します。(ctrl+cで表示画面から抜けます。)
> docker container status
・実行中のコンテナを停止する
> docker container stop <コンテナIDもしくはコンテナ名>
・停止中のコンテナを実行する
> docker container start <コンテナIDもしくはコンテナ名>
・実行中のコンテナを強制削除
> docker container rm -f <コンテナIDもしくはコンテナ名>
停止中のコンテナを削除するには docker container rm <コンテナIDもしくはコンテナ名>を使います。このコマンドを実行中のコンテナに使うとエラーが表示されます。
最後に
今回はコンテナについて書いてみました。他にもコンテナを作成するときに使用するメモリを指定したり出来るようなので、やってみたら追記したいと思います。最後まで読んで頂きありがとうございます。
参考
履歴
2022年06月25日:投稿
2022年07月10日:”イメージからコンテナを作成する”図を更新
この記事が気に入ったらサポートをしてみませんか?