Tutorial

Ubuntu 20.04へのDockerのインストールおよび使用方法

Published on October 8, 2020
日本語
Ubuntu 20.04へのDockerのインストールおよび使用方法

はじめに

Dockerは、コンテナでアプリケーションプロセスを管理する過程を簡単にするアプリケーションです。コンテナを使用すると、リソースを分離したプロセスでアプリケーションを実行できます。 VM(仮想マシン)に似ていますが、コンテナはより移植性が高く、リソースにやさしく、ホストオペレーティングシステムに依存します。

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

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

必要条件

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

  • Ubuntu 20.04初期サーバーセットアップガイドに従ってセットアップされたUbuntu 20.04サーバー1台、sudo非 root ユーザー、ファイアウォール。
  • ステップ7および8に示すように、独自のイメージを作成してDocker Hubにプッシュする場合は、Docker Hubのアカウント。

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

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

まず、既存のパッケージのリストを更新します。

  1. sudo apt update

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

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

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

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

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

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

次に、追加されたリポジトリからDockerパッケージでパッケージデータベースを更新します。

  1. sudo apt update

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

  1. apt-cache policy docker-ce

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

Output of apt-cache policy docker-ce
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(focal)のDockerリポジトリからのものです。

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

  1. sudo apt install docker-ce

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

  1. 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グループに追加します。

  1. sudo usermod -aG docker ${USER}

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

  1. su - ${USER}

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

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

  1. id -nG
Output
sammy sudo docker

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

  1. sudo usermod -aG docker username

この記事の残りの部分では、dockerグループユーザーとしてdockerコマンドを実行していることを前提としています。選択しない場合は、コマンドの先頭にsudoを付けてください。

次にdockerコマンドを見ていきましょう。

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

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

  1. docker [option] [command] [arguments]

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

  1. 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

特定のコマンドで使用可能なオプションを表示するには、次を入力します。

  1. docker docker-subcommand --help

Dockerに関するシステム全体の情報を見るには、次を入力します。

  1. docker info

コマンドをいくつか見ていきましょう。まずイメージの操作から始めます。

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

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

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

  1. 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 イメージを検索するには、次のように入力します。

  1. 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 イメージをコンピュータにダウンロードします。

  1. 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の例で見たように、dockerrunサブコマンドで実行されたときにイメージがダウンロードされていない場合、Dockerクライアントは最初にイメージをダウンロードし、それを使用してコンテナを実行します。

コンピュータにダウンロードされたイメージを表示するには、次を入力します。

  1. 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レジストリにアップロードできます(技術用語ではpushedといいます)。

コンテナを実行する方法を詳しく見てみましょう。

ステップ5— Dockerコンテナの実行

前のステップで実行したhello-worldコンテナは、テストメッセージを発信した後実行および終了するコンテナの例です。コンテナはそれよりもはるかに便利であり、インタラクティブにすることができます。 結局のところ、それらはVM(仮想マシン)に似ており、リソースにやさしいだけです。

例として、Ubuntuの最新のイメージを使用してコンテナを実行してみましょう。-i スイッチと -t スイッチの組み合わせにより、コンテナへのインタラクティブなシェルアクセスが可能になります。

  1. docker run -it ubuntu

コマンドプロンプトは、コンテナ内で現在作業している事実を反映するように変更され、次の形式を取ります。

Output
root@d9b100f2f636:/#

コマンドプロンプトのコンテナ IDを書き留めてください。この例では 、d9b100f2f636 です。コンテナを削除するときに、コンテナを識別するために、後でそのコンテナIDが必要になります。

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

  1. apt update

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

  1. apt install nodejs

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

  1. node -v

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

Output
v10.19.0

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

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

次に、システム上のコンテナの管理を見てみましょう。

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

Dockerをしばらく使用すると、コンピュータ上に多くのアクティブ(実行中)および非アクティブのコンテナができます。アクティブなコンテナを表示するには、次を使用します。

  1. docker ps

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

Output
CONTAINER ID IMAGE COMMAND CREATED

このチュートリアルでは、2つのコンテナを開始しました。 1つは hello-world イメージから、もう1つは ubuntu イメージからです。これらのコンテナはもう実行されていませんが、システムにはまだ存在しています。

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

  1. 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 スイッチを渡します。

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

停止したコンテナを開始するには、 docker start を使用し、その後にコンテナIDまたはコンテナの名前を続けます。IDが 1c08a7a0d0e4 のUbuntuベースのコンテナを起動しましょう。

  1. docker 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がコンテナに割り当てた名前、quizzical_mcnultyを使用します。

  1. docker stop quizzical_mcnulty

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

  1. docker rm youthful_curie

新しいコンテナを開始して、--nameスイッチでコンテナに名前を付けられます。また、 -rm スイッチで、停止時に自己消去するコンテナを作成することもできます。 これらのオプションおよびその他の詳細については、 docker run helpコマンドを参照してください。

コンテナは、新しいコンテナの構築に使えるイメージに変換できます。それがどのように機能するか見てみましょう。

ステップ7— コンテナ内の変更をDocker イメージへ適用する

Dockerイメージを起動すると、VM(仮想マシン)でできるようにファイルを作成、変更、削除できます。加えた変更は、そのコンテナにのみ適用されます。起動と停止はできますが、 docker rm コマンドで破棄すると、変更は永久に失われます。

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

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

これを行うには、次のコマンド構造を使用して、新しいDockerイメージインスタンスへの変更をコミットします。

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

-m スイッチは、作成者を指定するために -a が使用されている間に、あなたや他のユーザーがあなたが行った変更を知るのに役立つコミットメッセージ用です。 container_idは、チュートリアルの前半でインタラクティブDockerセッションを開始したときに書き留めたものです。Docker Hubで追加のリポジトリを作成しない限り、リポジトリは通常Docker Hubユーザー名です。

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

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

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

Dockerイメージを一覧表示すると、新しいイメージと、その派生元の古いイメージが表示されます。

  1. docker images

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

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

この例では、 ubuntu-nodejsは、Docker Hubから既存の ubuntuイメージから派生した新しいイメージです。サイズの違いは、行われた変更を反映しています。この例では、変更はNodeJSがインストールされたことです。今後Node.jsが事前にインストールされたUbuntuを使用してコンテナを実行する必要がある場合、新しいイメージを使用できます。

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

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

ステップ8— DockerイメージをDockerリポジトリにプッシュする

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

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

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

  1. docker login -u docker-registry-username

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

注: Docker レジストリ名がイメージを作成した際のローカルユーザー名と異なる場合、イメージにレジストリ名をタグ付けする必要があります。前回のステップの例では、次のようになります。

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

次に、以下を使用して独自のイメージをプッシュできます。

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

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

  1. 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 ...

イメージをレジストリにプッシュすると、下のイメージに示すように、アカウントのダッシュボードに表示されるはずです。

New Docker image listing on Docker Hub

プッシュを試みても次のエラーが発生する場合は、ログインしていない可能性があります。

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 login でログインしてから、プッシュ試行を繰り返します。次に、Docker Hub リポジトリページに存在するかどうかを確認します。

これでdocker pull sammy/ubuntu-nodejsを使用して新しいマシンにイメージを取り込んで新しいコンテナを実行できます。

まとめ

このチュートリアルでは、Dockerをインストールし、イメージやコンテナを操作し、変更したイメージをDocker Hubにプッシュしました。基本を理解したら、DigitalOcean Communityの他のDockerチュートリアル をご覧ください。

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Become a contributor for community

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

DigitalOcean Documentation

Full documentation for every DigitalOcean product.

Resources for startups and SMBs

The Wave has everything you need to know about building a business, from raising funding to marketing your product.

Get our newsletter

Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

New accounts only. By submitting your email you agree to our Privacy Policy

The developer cloud

Scale up as you grow — whether you're running one virtual machine or ten thousand.

Get started for free

Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

*This promotional offer applies to new accounts only.