Dockerは、コンテナでアプリケーションプロセスを管理する過程を簡単にするアプリケーションです。コンテナを使用すると、リソースを分離したプロセスでアプリケーションを実行できます。 VM(仮想マシン)に似ていますが、コンテナはより移植性が高く、リソースにやさしく、ホストオペレーティングシステムに依存します。
Dockerコンテナのさまざまなコンポーネントの詳細な紹介については、Docker Ecosystem: 共通コンポーネントの紹介をご覧ください。
このチュートリアルでは、Ubuntu 20.04にDocker Community Edition (CE) をインストールして使用します。Docker自体をインストールし、コンテナとイメージを操作し、イメージを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のバージョン番号は異なる場合があります。
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
コマンドの使用方法を見ていきます。
デフォルトでは、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
コマンドを見ていきましょう。
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
コマンドをいくつか見ていきましょう。まずイメージの操作から始めます。
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
の例で見たように、docker
がrun
サブコマンドで実行されたときにイメージがダウンロードされていない場合、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といいます)。
コンテナを実行する方法を詳しく見てみましょう。
前のステップで実行したhello-world
コンテナは、テストメッセージを発信した後実行および終了するコンテナの例です。コンテナはそれよりもはるかに便利であり、インタラクティブにすることができます。 結局のところ、それらはVM(仮想マシン)に似ており、リソースにやさしいだけです。
例として、Ubuntuの最新のイメージを使用してコンテナを実行してみましょう。-i スイッチと -t スイッチの組み合わせにより、コンテナへのインタラクティブなシェルアクセスが可能になります。
- docker run -it ubuntu
コマンドプロンプトは、コンテナ内で現在作業している事実を反映するように変更され、次の形式を取ります。
Outputroot@d9b100f2f636:/#
コマンドプロンプトのコンテナ IDを書き留めてください。この例では 、d9b100f2f636
です。コンテナを削除するときに、コンテナを識別するために、後でそのコンテナIDが必要になります。
これで、コンテナ内で任意のコマンドを実行できます。例として、コンテナ内のパッケージデータベースを更新しましょう。コンテナ内で root ユーザーとして操作しているため、コマンドの前に sudo
を付ける必要はありません。
- apt update
次に、アプリケーションをインストールします。Node.jsをインストールしましょう。
- apt install nodejs
これにより、公式のUbuntuリポジトリからNode.jsがコンテナにインストールされます。インストールが完了したら、Node.jsがインストールされていることを確認します。
- node -v
ターミナルにバージョン番号が表示されます。
Outputv10.19.0
コンテナ内で行った変更は、そのコンテナにのみ適用されます。
コンテナを終了するには、プロンプトでexit
と入力します。
次に、システム上のコンテナの管理を見てみましょう。
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
コマンドを参照してください。
コンテナは、新しいコンテナの構築に使えるイメージに変換できます。それがどのように機能するか見てみましょう。
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
からイメージを構築することもできます。これにより、新しいイメージでのソフトウェアのインストールを自動化できます。 ただし、これはこのチュートリアルの範囲外です。
次に、新しいイメージを他のユーザーと共有して、そこからコンテナを作成できるようにします。
既存のイメージから新しいイメージを作成した後の次の論理的なステップは、限定した友人、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
...
イメージをレジストリにプッシュすると、下のイメージに示すように、アカウントのダッシュボードに表示されるはずです。
プッシュを試みても次のエラーが発生する場合は、ログインしていない可能性があります。
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チュートリアル をご覧ください。
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
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!