8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

改めてDockerを理解する②[コンテナの中に入ってみよう編]

Last updated at Posted at 2024-12-03

はじめに

こんにちは!ITスクールRareTECHでCS(Customer Support)を担当している池村です!
今回の記事はDockerの基本②の解説記事になります。シリーズものですので、まず先に①を見ていただけますと幸いです。

※Dockerを初めて触る人向けの記事になります。

前回の復習

前回の記事ではイメージを取得し、コンテナを作成・起動・終了・削除までを一通り行いました。使ったコマンドをおさらいしておきます。

おさらい
docker search   # イメージを検索する
docker pull     # イメージを取得する
docker run      # コンテナを作成して起動する
docker start    # 停止しているコンテナを起動する
docker stop     # 起動しているコンテナを停止する
docker rm       # コンテナを削除する

上記コマンドを理解している方々は、次のステップに進んでいきましょう。

execコマンド(コンテナの中に入る)

起動したコンテナの中にアクセスする方法を見ていきましょう。これはexecコマンドを使います。今回はまたUbuntuのコンテナを起動して、中に入ってみます。

execコマンドはかなり難しく混乱の原因ですので、今回はこのコマンドを中心に解説していきます。

前回の記事でもコンテナの中に入ったと思いますが、コンテナの起動と同時に入るのとはまた方法が違います。

まずはコンテナをrunコマンドで起動しましょう。今回は起動と一緒にコンテナに入るのではなく、バックグラウンドで起動してみます。(裏で動いておけと命令する)

Ubuntuのコンテナを起動
docker run -d ubuntu sleep infinity

裏で動いておけと命じるときのオプションは-dを使います。ただ、UbuntuなどのLinuxディストリビューションのコンテナは起動してもすぐ終了してしまうので、今回はsleep infinityのコマンドを起動時に実行することで、そのまま起動を維持させます。
以下の画像のようにCONTAINER IDが表示されて、ubuntuが裏で動き続けていますね。
image.png

では、この状態でコンテナの中にアクセスしてみましょう。

コンテナの中に入る時はexecコマンドを使います。コンテナの中の下地はLinuxです。大体はBashが入っています。なので、今回も起動時にbashを指定してコンテナに入ります。

コンテナの中に入るには
docker exec -it コンテナID or コンテナ名 /bin/bash

これもどちらかというとコンテナIDの方が楽ですね。
image.png

ここまでコンテナに入る入ると言ってきましたが、実際のexecコマンドの実態は以下です。

execはコンテナの中で特定のコマンドを実行するためのオプション!

おそらく初学者が浮かべる疑問点

Q. bashを指定しないと入れないの?

A. はい。入れないです。(何かしらのシェルを指定しないとダメ)たとえば以下のような形で実行すると、コンテナの中でコマンドを打つことができません。と言うかエラーになります。

間違ったexecコマンドの実行
docker exec -it コンテナID or コンテナ名

上記ではexecを使ってコンテナ内で行うコマンドが指定されていません。
bin/bashはLinuxで作成されたシェルプログラム、立派なコマンドです。

execはコンテナの中で指定したコマンドを実行するのが役割ですので、/bin/bashを指定する必要があります!

Q. -itは結局何をやっているの?

A. -iを指定すると、我々のPCのキーボードからの入力を受け付けることができるようになります。一応これだけも/bin/bashを指定して入力を受け付けることができるようになりますが、-tによる仮想端末がないとコマンドの出力結果などを綺麗に整形できません。

-iは入力受付を担当。
-tは画面を担当。出力の整形もする。
Bashは入力されたコマンドを解釈して、実行を担当する。

ちなみに、今回Ubuntuを使っているから/bin/bashを指定しないとダメと言っているわけではありません。基本的にコンテナの下地はLinuxです。どのコンテナ内に入る時もシェルを指定する必要があります。(Alpineが下地とかのコンテナはshを指定する必要がある。もしくは起動時にインストールするか)

これもせっかくなのでしっかり見ていきましょう。

Alpine Linux(アルパイン)

AlpineはLinuxのディストリビューションの一つです。(Linuxの種類の一つ)
これはLinuxディストリビューションの中でもかなり軽量なものです。Ubuntuのイメージの容量が100MBくらいなんですが、このAlpineは8~9MBでした。かなりの差ですね。もちろん、このイメージで作るコンテナも軽量になります。

軽量ということは起動もはやい!

今回はこれを起動してコンテナの中に入ってみましょう。

Alpine実行
docker run -it alpine

上記のコマンドを叩くと、コンテナの中でシェルを使うことができます。ただ、BashではなくBourne Shell(sh)が起動します。
以下の画像を見てみてください。シェルの表示の見た目が違いますね。
image.png

Alpine Linuxはデフォルトのシェルがより軽量でシンプルなBourne Shell(sh)を使っています。ですので、一度exitでコンテナから出ていただき、再度入る時を見てみましょう。

コンテナ再起動
docker start コンテナID or コンテナ名
docker exec -it コンテナID or コンテナ名 /bin/sh

これで再度入ることができました。
image.png

Bashが使いたいよ〜って方がいるかもなので、それも少し解説いたします。
コンテナが起動されていて、かつその中に入った状態と仮定します。

Alpineのコンテナの中
apk update && apk add --no-cache bash

私の環境での実行結果です。無事Bashがインストールされたようです。
image.png

Alpineのパッケージ管理システムはapkなので、アップデート後にBashをインストールします。
--no-cacheのオプションを今覚える必要はありません。簡単に言うと、コンテナの容量を軽量にする一つの手段です。

では一度exitでコンテナから出てもらい、再度Bashで入り直しましょう。

Bashでアクセス
docker exec -it コンテナID /bin/bash 

私は無事Bashでのアクセスに成功しました。微妙に見た目が違いますね。
image.png

余談

ちなみに毎回/bin/bashとか毎回書くのだるいですよね。
シェルのPATHは通っているので、絶対パスで書く必要は実はなかったりします。

絶対パスではないシェルの指定方法
docker exec -it コンテナID bash 
docker exec -it コンテナID sh 

おわりに

今回はDockerの基本の中でも難しい(であろう)コマンドであるexecについて解説しました。他のコマンドのことも書きたかったですが、まずはここをしっかり押さえてほしかったので、今回はこれで終わりにします。

次回はその他のコマンドをまとめてご紹介します。

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?