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キーを追加してダウンロードが有効であることを確認してから、パッケージをインストールします。

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

  • 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パッケージでパッケージデータベースを更新します。

  • sudo apt update

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

  • 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をインストールします。

  • 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コマンドを実行しようとすると、次のような出力が表示されます。

Outputdocker: 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グループに追加されたことを確認します。

  • id -nG
Outputsammy 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プロジェクトの背後にある会社、すなわちDockerが管理するDockerレジストリであるDocker Hubから取得します。誰でもDocker イメージ をDocker Hubでホストできるため、必要なほとんどのアプリケーションやLinuxディストリビューションでは、イメージをホストできます。

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

  • docker run hello-world

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

OutputUnable 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をクロールし、名前が検索文字列と一致するすべてのイメージのリストを返します。この場合、出力は以下のようになります。

OutputNAME                                                      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

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

OutputUsing 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クライアントは最初にイメージをダウンロードし、それを使用してコンテナを実行します。

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

  • docker images

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

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

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

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

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

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

  • docker run -it ubuntu

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

[email protected]:/# 

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

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

  • apt update

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

  • apt install nodejs

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

  • node -v

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

Outputv10.19.0 

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

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

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

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

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

  • docker ps

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

OutputCONTAINER 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 1c08a7a0d0e4

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

OutputCONTAINER 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を使用します。

  • docker stop quizzical_mcnulty

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

  • docker rm youthful_curie

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

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

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

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

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

Node.jsをUbuntuコンテナ内にインストールすると、イメージからコンテナが実行されますが、コンテナは作成に使用したイメージとは異なります。 ただし、この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セッションを開始したときに書き留めたものです。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

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

OutputREPOSITORY               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にログインします。

  • 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 イメージを sammy リポジトリにプッシュするには、コマンドは次のようになります。

  • docker push sammy/ubuntu-nodejs

このプロセスは イメージ をアップロードするため、完了するのに時間がかかる場合がありますが、完了すると、出力は次のようになります。

OutputThe 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

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

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チュートリアル をご覧ください。