Ubuntu 20.04にDockerをインストールして使う方法

0 株式
0
0
0
0

導入

Dockerは、コンテナ内のアプリケーションプロセスの管理プロセスを簡素化するプログラムです。コンテナを使用すると、リソースが分離されたプロセスでアプリケーションを実行できます。仮想マシンに似ていますが、コンテナはより移植性が高く、リソースを効率的に使用でき、ホストオペレーティングシステムへの依存度が低くなります。.

Docker コンテナのさまざまなコンポーネントの詳細な紹介については、「Docker エコシステム: 共通コンポーネントの紹介」をご覧ください。.

このチュートリアルでは、Ubuntu 20.04にDocker Community Edition(CE)をインストールして使用します。Docker自体のインストール、コンテナとイメージの操作、そしてDockerリポジトリへのイメージのプッシュを行います。.

注記

この記事では、UbuntuサーバーにDockerをインストールする手順を説明します。Dockerアプリケーションをライブサーバーにワンクリックでデプロイしたい場合は、DigitalOceanアプリケーションプラットフォームをご検討ください。.

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • Ubuntu 20.04 サーバーは、非ルート sudo ユーザーとファイアウォールを含む、Ubuntu 20.04 サーバー初期セットアップ ガイドに従ってセットアップされました。.
  • 手順 7 と 8 に示すように、独自のイメージを作成して Docker Hub にプッシュする場合は、Docker Hub アカウントが必要になります。.

ステップ1 – Dockerをインストールする

公式Ubuntuリポジトリで提供されているDockerインストールパッケージは、最新バージョンではない可能性があります。最新バージョンを確実に入手するために、公式DockerリポジトリからDockerをインストールします。そのためには、新しいパッケージソースを追加し、ダウンロードの有効性を確認するためにDockerのGPGキーを追加してから、パッケージをインストールします。.

まず、利用可能なパッケージのリストを更新します。

sudo apt update

次に、apt が HTTPS 経由でパッケージを使用できるようにするための前提条件パッケージをいくつかインストールします。

sudo apt install apt-transport-https ca-certificates curl software-properties-common

次に、公式 Docker リポジトリの GPG キーをシステムに追加します。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker リポジトリを APT ソースに追加します。

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

これにより、新しく追加されたリポジトリの Docker パッケージでパッケージ データベースも更新されます。.

デフォルトの Ubuntu リポジトリではなく、Docker リポジトリからインストールしていることを確認してください。

apt-cache policy docker-ce

Docker のバージョン番号は異なる場合がありますが、次のような出力が表示されます。

docker-ce:
Installed: (none)
Candidate: 5:19.03.9~3-0~ubuntu-focal
Version table:
5:19.03.9~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

docker-ce はインストールされていませんが、Ubuntu 20.04 (標準) の Docker リポジトリからのインストール候補であることに注意してください。.

最後に、Docker をインストールします。

sudo apt install docker-ce

これでDockerがインストールされ、デーモンが起動し、プロセスが起動時に起動するようになりました。実行されていることを確認してください。

sudo systemctl status docker

出力は次のようになり、サービスが稼働中であることが示されます。

Output
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 24321 (dockerd)
Tasks: 8
Memory: 46.4M
CGroup: /system.slice/docker.service
└─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Dockerをインストールすると、Dockerサービス(デーモン)だけでなく、dockerコマンドラインツール(Dockerクライアント)も利用できるようになります。このチュートリアルの残りの部分では、dockerコマンドの使い方を見ていきます。.

ステップ2 – SudoなしでDockerコマンドを実行する(オプション)

デフォルトでは、dockerコマンドはrootユーザー、またはDockerインストールプロセス中に自動的に作成されるdockerグループに所属するユーザーのみが実行できます。sudoをプレフィックスとして付けず、またはdockerグループに所属せずにdockerコマンドを実行しようとすると、次のような出力が表示されます。

Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.

docker コマンドを実行するときに sudo を入力したくない場合は、ユーザー名を docker グループに追加します。

sudo usermod -aG docker ${USER}

新しいグループ メンバーシップを適用するには、サーバーからログアウトして再度ログインするか、次のように入力します。

su - ${USER}

続行するには、ユーザーパスワードの入力を求められます。.

次のように入力して、ユーザーが docker グループに追加されたことを確認します。

groups
sammy sudo docker

ログインしていないユーザーを docker グループに追加する必要がある場合は、次のコマンドを使用してそのユーザー名を明示的に宣言します。

sudo usermod -aG docker username

この記事の残りの部分では、docker コマンドを docker グループのユーザーとして実行することを前提としています。そうしない場合は、コマンドの末尾に sudo を追加してください。.

次に docker コマンドを調べてみましょう。.

ステップ3 – Dockerコマンドの使用

docker を使用するには、一連のオプションとコマンドに続いて引数を渡します。構文は次のとおりです。

docker [option] [command] [arguments]

利用可能なすべてのサブコマンドを表示するには、次のように入力します。

docker

Docker 19 時点では、利用可能なサブコマンドの完全なリストは次のとおりです。

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 docker-subcommand --help

Docker に関するシステム全体の情報を表示するには、次のコマンドを使用します。

docker info

これらのコマンドをいくつか見てみましょう。まずは画像の操作から始めましょう。.

ステップ4 – Dockerイメージの操作

DockerコンテナはDockerイメージから構築されます。デフォルトでは、DockerはこれらのイメージをDocker Hubから取得します。Docker Hubは、Dockerプロジェクトを管理するDocker社が運営するDockerレジストリです。誰でもDocker Hub上で独自のDockerイメージをホストできるため、必要なアプリケーションやLinuxディストリビューションのほとんどは、そこにホストされているはずです。.

Docker Hub にアクセスしてイメージをダウンロードできるかどうかを確認するには、次のように入力します。

docker run hello-world

出力は、Docker が正常に動作していることを示しています。

Output
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
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 search ubuntu

このスクリプトはDocker Hubをクロールし、検索文字列に一致する名前を持つすべてのイメージのリストを返します。この場合、出力は次のようになります。

Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 10908 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 428 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 244 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 218 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 108 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with
...

OFFICIAL列の「OK」は、プロジェクトの背後にある企業によって構築およびサポートされているイメージであることを示します。使用したいイメージを特定したら、pullサブコマンドを使用してコンピューターにダウンロードできます。.

次のコマンドを実行して、公式の Ubuntu イメージをコンピューターにダウンロードします。

docker pull ubuntu

次の出力が表示されます。

Output
Using default tag: latest
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

イメージをダウンロードしたら、run サブコマンドを使ってダウンロードしたイメージを使ってコンテナを実行できます。hello-world の例で見たように、run サブコマンドを使って docker を実行した際にイメージがダウンロードされていない場合、Docker クライアントはまずイメージをダウンロードし、それからそのイメージを使ってコンテナを実行します。.

コンピュータにダウンロードされた画像を表示するには、次のように入力します。

docker images

出力は次の図のようになります。

Output
REPOSITORY 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 スイッチを組み合わせることで、コンテナへの対話型シェルアクセスが可能になります。

docker run -it ubuntu

コンテナ内で作業していることを反映してコマンド ラインが変更され、次のようになります。

Output
root@d9b100f2f636:/#

コマンドラインのコンテナIDをメモしてください。この例ではd9b100f2f636です。このコンテナIDは、後でコンテナを削除する際に必要になります。.

これで、コンテナ内で任意のコマンドを実行できます。例えば、コンテナ内のパッケージデータベースを更新してみましょう。コンテナ内ではrootユーザーとして実行しているので、コマンドの前にsudoを付ける必要はありません。

apt update

次に、任意のアプリケーションをインストールします。Node.jsをインストールしてみましょう。

apt install nodejs

公式UbuntuリポジトリからNode.jsがインストールされます。インストールが完了したら、Node.jsがインストールされていることを確認してください。

node -v

ターミナルにバージョン番号が表示されます。

Output
v10.19.0

コンテナ内で行った変更は、そのコンテナにのみ適用されます。.

コンテナを終了するには、コマンド プロンプトで exit と入力します。.

次に、システム内のコンテナの管理について見てみましょう。.

ステップ6 – Dockerコンテナの管理

Dockerをしばらく使用すると、コンピューター上にアクティブな(実行中の)コンテナと非アクティブなコンテナが多数存在するようになります。アクティブなコンテナを表示するには、次のコマンドを使用します。

docker ps

次のような出力が表示されます。

Output
CONTAINER ID IMAGE COMMAND CREATED

このチュートリアルでは、2つのコンテナを起動しました。1つはhello-worldイメージから、もう1つはUbuntuイメージから起動しました。どちらのコンテナも現在は実行されていませんが、システム上には残っています。.

すべてのコンテナ(アクティブと非アクティブ)を表示するには、-a スイッチを指定して docker ps を実行します。

docker ps -a

次のような出力が表示されます。

1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 8 seconds ago quizzical_mcnulty
a707221a5f6c hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago youthful_curie

最後に作成したコンテナを表示するには、 -l スイッチを渡します。

docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty

停止したコンテナを起動するには、docker start にコンテナIDまたはコンテナ名を続けて指定します。ここでは、IDが1c08a7a0d0e4のUbuntuベースのコンテナを起動してみましょう。

docker start 1c08a7a0d0e4docker start 1c08a7a0d0e4

コンテナが起動し、docker ps を使用してそのステータスを表示できます。

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 3 minutes ago Up 5 seconds quizzical_mcnulty

実行中のコンテナを停止するには、docker stop に続けてコンテナIDまたはコンテナ名を指定します。今回は、Dockerがコンテナに割り当てた名前(quizical_mcnulty)を使用します。

docker stop quizzical_mcnulty

コンテナが不要になった場合は、コンテナIDまたは名前を指定してdocker rmコマンドで削除します。docker ps -aコマンドを使用して、hello-worldイメージに関連付けられたコンテナIDまたは名前を確認し、削除します。.

docker rm youthful_curie

–name スイッチを使用して、新しいコンテナを起動し、名前を付けることができます。また、–rm スイッチを使用して、停止後に自動的に削除されるコンテナを作成することもできます。これらのオプションやその他のオプションの詳細については、docker run help コマンドを参照してください。.

コンテナはイメージに変換でき、それを使って新しいコンテナを作成できます。どのように動作するか見てみましょう。.

ステップ7 – Dockerイメージ内のコンテナに変更を加える

Dockerイメージを起動すると、仮想マシンと同じようにファイルの作成、変更、削除が可能です。変更はコンテナにのみ適用されます。コンテナを起動したり停止したりすることはできますが、docker rmコマンドで削除すると、変更内容は永久に失われます。.

このセクションでは、コンテナの状態を新しい Docker イメージとして保存する方法を説明します。.

Ubuntuコンテナ内にNode.jsをインストールすると、イメージからコンテナが実行されますが、このコンテナはコンテナの作成に使用したイメージとは異なります。しかし、このNode.jsコンテナを、後で新しいイメージのベースとして使用したい場合もあるでしょう。.

次に、次のコマンドを使用して、新しい Docker イメージ インスタンスに変更を加えます。.

docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

-m スイッチはコミットメッセージ用で、自分や他のユーザーが変更内容を理解できるようにします。-a は作成者を指定するために使用します。container_id は、チュートリアルの前半で対話型Dockerセッションを開始する際に指定したIDです。Docker Hubに追加のリポジトリを作成していない場合は、通常はDocker Hubのユーザー名になります。.

たとえば、コンテナ ID が d9b100f2f636 のユーザー sammy の場合、コマンドは次のようになります。

docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

イメージをプッシュすると、新しいイメージはコンピューターのローカルに保存されます。このチュートリアルの後半では、他のユーザーがアクセスできるように、Docker HubなどのDockerレジストリにイメージをプッシュする方法を学習します。.

Docker イメージを再度リストすると、新しいイメージと、その派生元の古いイメージが表示されます。

docker images

次のような出力が表示されます。

Output
REPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
...

この例では、ubuntu-nodejs は Docker Hub にある既存の Ubuntu イメージから派生した新しいイメージです。サイズの違いは、変更が加えられたことを示しています。この例では、変更点は Node.js がインストールされたことです。そのため、次回 Node.js がプリインストールされた Ubuntu を使用してコンテナを実行する必要があるときは、新しいイメージを使用できます。.

Dockerfileからイメージをビルドすることもできます。これにより、新しいイメージへのソフトウェアのインストールを自動化できます。ただし、これはこのチュートリアルの範囲外です。.

次に、新しいイメージを他のユーザーと共有して、そのイメージからコンテナーを作成できるようにします。.

ステップ8 – DockerイメージをDockerリポジトリに転送する

既存のイメージから新しいイメージを作成した後の次の論理的なステップは、それを少数の友人、Docker Hub、またはアクセス可能な他のDockerレジストリ上の全世界と共有することです。Docker Hubやその他のDockerレジストリにイメージを送信するには、そのレジストリのアカウントが必要です。.

このセクションでは、DockerイメージをDocker Hubにプッシュする方法を説明します。独自のプライベートDockerレジストリを作成する方法については、「Ubuntu 18.04でプライベートDockerレジストリを設定する方法」をご覧ください。.

イメージをプッシュするには、まず Docker Hub にログインします。.

docker login -u docker-registry-username

Docker Hubのパスワードで認証するように求められます。正しいパスワードを指定すれば、認証は成功するはずです。.

注: Dockerレジストリのユーザー名がイメージ作成時に使用したローカルユーザー名と異なる場合は、レジストリユーザー名でイメージにタグを付ける必要があります。最後の手順の例では、次のように入力します。

docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

その後、次のようにして画像を使用できます。

docker push docker-registry-username/docker-image-name

ubuntu-nodejs イメージを Sami リポジトリにプッシュするには、コマンドは次のようになります。

docker push sammy/ubuntu-nodejs

画像のアップロードには時間がかかる場合がありますが、完了すると出力は次のようになります。

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...

イメージをレジストリにプッシュすると、下の画像のようにアカウント ダッシュボードにリストされます。.

プッシュ試行でこのタイプのエラーが発生した場合は、ログインしていない可能性があります。

Output
The 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アカウントにログインし、もう一度プッシュしてみてください。その後、Docker Hubのリポジトリページにプッシュが反映されているか確認してください。.

これで、docker pull sammy/ubuntu-nodejs を使用してイメージを新しいマシンにプルし、それを使用して新しいコンテナを実行できるようになりました。.

結果

このチュートリアルでは、Dockerをインストールし、イメージとコンテナを操作し、変更したイメージをDocker Hubにプッシュしました。これで基本が理解できたので、DigitalOceanコミュニティの他のDockerチュートリアルもぜひご覧ください。.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

あなたも気に入るかもしれない