紹介
Dockerは、コンテナでアプリケーションプロセスを管理するプロセスを簡素化するアプリケーションです。コンテナを使用すると、アプリケーションをリソースを隔離したプロセスで実行できます。これらは仮想マシンに似ていますが、コンテナはより移植性が高く、リソースを効率的に利用し、ホストオペレーティングシステムに依存しています。
Dockerコンテナのさまざまなコンポーネントの詳細な紹介については、 Dockerエコシステム:一般的なコンポーネントの紹介をご覧ください。
このチュートリアルでは、Ubuntu 22.04にDocker Community Edition(CE)をインストールして使用します。 Docker自体をインストールし、コンテナとイメージを操作し、Dockerリポジトリにイメージをプッシュします。
DigitalOcean App Platformを使用してアプリケーションのデプロイを簡素化します。数分でGitHubから直接デプロイします。
前提条件
このチュートリアルに従うには、次のものが必要です:
- Ubuntu 22.04のサーバーは、Ubuntu 22.04の初期サーバーセットアップガイドに従ってセットアップされています。このセットアップには、
sudo
非rootユーザーとファイアウォールが含まれています。 - Docker Hubのアカウントがある場合は、独自のイメージを作成してDocker Hubにプッシュすることもできます(手順7と8を参照)。
ステップ1 — Dockerのインストール
公式のUbuntuリポジトリにあるDockerインストールパッケージは、最新バージョンでない場合があります。最新バージョンを取得するために、公式のDockerリポジトリからDockerをインストールします。これには、新しいパッケージソースを追加し、DockerのGPGキーをシステムに追加してダウンロードが正当であることを確認し、その後パッケージをインストールします。
まず、既存のパッケージリストを更新します:
次に、apt
がHTTPS経由でパッケージを使用できるようにするいくつかの必要なパッケージをインストールします:
次に、公式のDockerリポジトリのGPGキーをシステムに追加します:
APTソースにDockerリポジトリを追加します:
追加されたことが認識されるように、再度既存のパッケージリストを更新します:
デフォルトのUbuntuリポジトリではなく、Dockerリポジトリからインストールすることを確認します:
バージョン番号は異なる場合がありますが、次のような出力が表示されます:
docker-ce:
Installed: (none)
Candidate: 5:20.10.14~3-0~ubuntu-jammy
Version table:
5:20.10.14~3-0~ubuntu-jammy 500
500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
5:20.10.13~3-0~ubuntu-jammy 500
500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce
がインストールされていないことに注意してくださいが、インストール候補はUbuntu 22.04のDockerリポジトリ(jammy
)からです。
最後に、Dockerをインストールします:
これでDockerがインストールされ、デーモンが起動し、プロセスが起動時に有効になりました。それが実行されているかどうかを確認してください:
出力は以下のようになり、サービスがアクティブで実行されていることが示されます:
Output● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 7854 (dockerd)
Tasks: 7
Memory: 38.3M
CPU: 340ms
CGroup: /system.slice/docker.service
└─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
今、Dockerをインストールすると、Dockerサービス(デーモン)だけでなく、docker
コマンドラインユーティリティ、またはDockerクライアントも提供されます。後でこのチュートリアルでdocker
コマンドの使用方法を探ります。
ステップ2 — sudoなしでDockerコマンドを実行する(オプション)
デフォルトでは、docker
コマンドはrootユーザーまたはDockerのインストールプロセス中に自動的に作成されるdockerグループに所属するユーザーによってのみ実行できます。 sudo
を接頭辞として付けずにdocker
コマンドを実行しようとすると、次のような出力が得られます:
Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
docker
コマンドを実行するときにいつもsudo
を入力したくない場合は、ユーザー名をdocker
グループに追加してください:
新しいグループメンバーシップを適用するには、サーバーからログアウトして再ログインするか、次のように入力します:
続行するにはユーザーのパスワードを入力してください。
ユーザーがdockerグループに追加されたことを確認するには、次のように入力してください:
Outputsammy sudo docker
ログインしていないdocker
グループにユーザーを追加する必要がある場合は、次のように明示的にそのユーザー名を宣言してください:
この記事の残りの部分では、dockerグループのユーザーとしてdocker
コマンドを実行していると想定しています。それを選択しない場合は、コマンドの前にsudo
を付けてください。
次にdocker
コマンドを探索しましょう。
ステップ 3 — Docker コマンドの使用
docker
を使用するには、オプションとコマンドのチェーンに続いて引数を渡す必要があります。構文は次のようになります:
すべての利用可能なサブコマンドを表示するには、次のように入力してください:
Docker バージョン 20.10.14の現在の完全な利用可能なサブコマンドリストは次のとおりです:
Output attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
特定のコマンドで利用可能なオプションを表示するには、次のように入力してください:
Docker のシステム全体の情報を表示するには、次を使用してください:
これらのコマンドのいくつかを探索しましょう。まず、イメージを扱う作業から始めます。
ステップ4 — Dockerイメージの操作
DockerコンテナはDockerイメージから構築されます。デフォルトでは、DockerはこれらのイメージをDockerプロジェクトの背後にある会社であるDockerが管理するDockerレジストリから取得します。誰でも自分のDockerイメージをDocker Hubにホストできるため、ほとんどのアプリケーションや必要なLinuxディストリビューションはそこにホストされています。
Docker Hubからイメージをアクセスしてダウンロードできるかどうかを確認するには、次のように入力します:
出力は、Dockerが正しく動作していることを示します:
OutputUnable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Dockerは最初にhello-world
イメージをローカルで見つけられなかったため、デフォルトのリポジトリであるDocker Hubからイメージをダウンロードしました。イメージがダウンロードされると、Dockerはそのイメージからコンテナを作成し、コンテナ内のアプリケーションが実行され、メッセージが表示されました。
Docker Hubで利用可能なイメージを検索するには、docker
コマンドをsearch
サブコマンドとともに使用します。たとえば、Ubuntuイメージを検索するには、次のように入力します:
スクリプトはDocker Hubをクロールし、検索文字列と一致するすべてのイメージのリストを返します。この場合、出力は次のようになります:
OutputNAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 14048 [OK]
websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK]
ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK]
neurodebian NeuroDebian provides neuroscience research s… 88 [OK]
open-liberty Open Liberty multi-architecture images based… 51 [OK]
...
公式の列では、OKはプロジェクトの背後にある企業が構築およびサポートするイメージを示します。使用したいイメージを特定したら、pull
サブコマンドを使用してコンピュータにダウンロードできます。
次のコマンドを実行して、公式のubuntu
イメージをコンピュータにダウンロードします:
以下の出力が表示されます:
OutputUsing default tag: latest
latest: Pulling from library/ubuntu
e0b25ef51634: Pull complete
Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
イメージがダウンロードされた後、ダウンロードしたイメージを使用してコンテナを実行できます。 hello-world
の例で見たように、docker
がrun
サブコマンドで実行されるときにイメージがダウンロードされていない場合、Dockerクライアントはまずイメージをダウンロードし、それを使用してコンテナを実行します。
コンピュータにダウンロードされたイメージを表示するには、次のように入力します:
出力は次のようになります:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
このチュートリアルの後半で説明するように、コンテナを実行するために使用するイメージは変更して新しいイメージを生成し、その後、Docker Hubや他のDockerレジストリにアップロード(プッシュというのが専門用語です)できます。
では、コンテナを実行する方法を詳しく見てみましょう。
ステップ5 — Dockerコンテナの実行
前のステップで実行したhello-world
コンテナは、テストメッセージを出力した後に実行して終了するコンテナの例です。コンテナはそれ以上のものになります。それらはインタラクティブになることができます。結局のところ、それらは仮想マシンと似ていますが、リソースをより効率的に利用します。
例として、最新のUbuntuイメージを使用してコンテナを実行してみましょう。-iおよび-tスイッチの組み合わせにより、コンテナ内の対話型シェルアクセスが可能になります。
コマンドプロンプトは、今やコンテナ内で作業していることを反映するように変更され、次のようになります:
Outputroot@d9b100f2f636:/#
コマンドプロンプトには、コンテナIDが表示されます。この例では、d9b100f2f636
です。後でコンテナを削除する際には、このコンテナIDが必要になります。
今、コンテナ内で任意のコマンドを実行できます。例えば、コンテナ内のパッケージデータベースを更新してみましょう。コマンドの先頭にsudo
を付ける必要はありません。なぜなら、rootユーザーとしてコンテナ内で操作しているからです。
次に、その中に任意のアプリケーションをインストールします。Node.jsをインストールしましょう。
これにより、公式UbuntuリポジトリからNode.jsがコンテナにインストールされます。インストールが完了したら、Node.jsがインストールされていることを確認してください。
ターミナルにバージョン番号が表示されます:
Outputv12.22.9
コンテナ内で行った変更は、そのコンテナにのみ適用されます。
コンテナを終了するには、プロンプトでexit
と入力します。
次に、システム上のコンテナの管理方法を見てみましょう。
ステップ6 — Dockerコンテナの管理
しばらくDockerを使用すると、コンピューター上に多くのアクティブ(実行中)および非アクティブなコンテナがあります。アクティブなものを表示するには、次を使用します:アクティブなもの、使用します:
次のような出力が表示されます:
OutputCONTAINER ID IMAGE COMMAND CREATED
このチュートリアルでは、hello-world
イメージから1つ、およびubuntu
イメージからもう1つのコンテナを起動しました。どちらのコンテナも実行されていませんが、まだシステムに存在しています。
すべてのコンテナ(アクティブおよび非アクティブ)を表示するには、docker ps
に-a
スイッチを付けて実行します:
次のような出力が表示されます:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" About a minute ago Exited (0) 7 seconds ago dazzling_taussig
587000e49d53 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago adoring_kowalevski
最後に作成したコンテナを表示するには、-l
スイッチを渡します:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig
停止しているコンテナを開始するには、docker start
を使用して、コンテナIDまたはコンテナの名前を指定します。UbuntuベースのコンテナのIDである1c08a7a0d0e4
を使用してみましょう:
コンテナが開始され、そのステータスを確認するにはdocker ps
を使用できます:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig
実行中のコンテナを停止するには、docker stop
を使用して、コンテナのIDまたは名前を指定します。今回は、Dockerが割り当てたコンテナの名前であるdazzling_taussig
を使用します:
docker rm
コマンドを使用して、コンテナをもう必要ないと判断した場合は、コンテナIDまたは名前を使用してそれを削除します。 docker ps -a
コマンドを使用して、hello-world
イメージに関連するコンテナのコンテナIDまたは名前を見つけて削除します。
新しいコンテナを開始し、--name
スイッチを使用して名前を付けることができます。 --rm
スイッチを使用して、停止時に自動的に削除されるコンテナを作成することもできます。これらのオプションやその他の情報については、docker run help
コマンドを参照してください。
コンテナは、新しいコンテナを構築するために使用できるイメージに変換できます。その動作方法を見てみましょう。
ステップ7 — コンテナでの変更をDockerイメージにコミットする
Dockerイメージを起動すると、仮想マシンと同様にファイルを作成、変更、削除することができます。行った変更はそのコンテナにのみ適用されます。それを開始して停止することができますが、docker rm
コマンドで破棄すると、変更は永久に失われます。
このセクションでは、コンテナの状態を新しいDockerイメージとして保存する方法を示します。
Node.jsをUbuntuコンテナ内にインストールした後、イメージからコンテナを実行していますが、コンテナは作成時に使用したイメージとは異なります。ただし、このNode.jsコンテナを将来の新しいイメージの基盤として再利用したい場合があります。
次のコマンドを使用して、変更内容を新しいDockerイメージインスタンスにコミットします。
-mスイッチは、変更内容を説明するためのコミットメッセージに使用され、-aは著者を指定するために使用されます。container_id
は、以前にDockerセッションを開始した際にチュートリアルでメモしたものです。Docker Hubで追加のリポジトリを作成していない限り、repository
は通常、Docker Hubのユーザー名です。
たとえば、ユーザーsammy、コンテナIDがd9b100f2f636
の場合、コマンドは次のようになります:
イメージをコミットすると、新しいイメージがローカルに保存されます。このチュートリアルの後半では、他の人がアクセスできるようにイメージをDocker HubなどのDockerレジストリにプッシュする方法について学びます。
再度Dockerイメージをリストアップすると、新しいイメージと、それが派生した古いイメージが表示されます:
次のような出力が表示されます:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
...
この例では、ubuntu-nodejs
が新しいイメージであり、Docker Hubの既存のubuntu
イメージから派生しています。サイズの差異は行われた変更を反映しています。この例では、Node.jsがインストールされたことが変更内容です。したがって、次回UbuntuにNode.jsが事前にインストールされたコンテナを実行する必要がある場合は、新しいイメージを使用できます。
Dockerfile
からもイメージを構築できます。これにより、新しいイメージにソフトウェアのインストールを自動化できます。ただし、これはこのチュートリアルの範囲外です。
さて、他の人と新しいイメージを共有して、彼らがそれからコンテナを作成できるようにしましょう。
ステップ8 — DockerイメージをDockerリポジトリにプッシュする
既存のイメージから新しいイメージを作成した後の次の論理的なステップは、それを一部の友人、Docker Hubの世界全体、またはアクセス権がある他のDockerレジストリと共有することです。Docker Hubまたは他のDockerレジストリにイメージをプッシュするには、そこでアカウントを持っている必要があります。
イメージをプッシュするには、まずDocker Hubにログインします。
Docker Hubパスワードを使用して認証するように求められます。正しいパスワードを指定した場合、認証が成功します。
注意: Dockerレジストリのユーザー名がイメージを作成するために使用したローカルユーザー名と異なる場合は、イメージにレジストリのユーザー名をタグ付けする必要があります。前のステップで示された例では、次のように入力します。
その後、次のコマンドを使用して独自のイメージをプッシュできます。
ubuntu-nodejs
イメージを sammy リポジトリにプッシュする場合、コマンドは次のようになります。
このプロセスは、イメージをアップロードするために時間がかかる場合がありますが、完了すると出力は次のようになります:
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...
イメージをレジストリにプッシュした後、それはアカウントのダッシュボードにリストされる必要があります。以下の画像に示すように。
プッシュの試行がこのようなエラーで終了した場合、おそらくログインしていませんでした:
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required
docker login
を使用してログインし、プッシュの試行を繰り返してください。その後、Docker Hub リポジトリページ上に存在することを確認してください。
これで、新しいマシンにイメージをプルし、新しいコンテナを実行するために使用できます。docker pull sammy/ubuntu-nodejs
結論
このチュートリアルでは、Docker をインストールし、イメージとコンテナを操作し、変更したイメージを Docker Hub にプッシュしました。これで基本を理解したので、DigitalOcean Community で他の Docker チュートリアルを探索してください。
Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04