コンテンツにスキップ

Dockerコマンド

Dockerとは

コンテナ仮想化により、アプリケーションを動かすプラットフォーム。

コンテナ仮想化においてはアプリケーションと依存関係を丸ごとコンテナと呼ばれるものに格納して動かす。これのおかげで環境を作ったり壊したり、別の環境で動かすことが容易になるメリットがある。

似たようなメリットを享受できる仕組みにOS仮想化(仮想マシン)があるが、コンテナ仮想化はOSまで仮想化しない分、軽量と言われている。

Dockerイメージの中には例えばubuntuなどOSっぽいものもあるが、Docker上でOSとしてのUbuntuが動くわけではない。 これらはUbuntuのシェルや基本的なツール、ライブラリが含まれている環境であり、カーネルは含まれない。カーネルはホストOSのものがコンテナに対して共有される。

用語一覧

Docker Engine overview | Docker Docs

名前 説明
Docker Engine Docker Daemon、Docker CLI、Docker APIの総称。
Docker Daemon コンテナを管理するバックエンドプロセス。
Docker CLI ユーザーがDocker Daemonと対話するためのCLI。docker runとかdocker imagesとかのあれ。
Docker API プログラムやスクリプトからDocker Daemonを制御するためのREST API。
Dockerソケット Docker CLIがDockerデーモンと通信するためのファイル。通常はunix:///var/run/docker.sock
Dockerイメージ Dockerコンテナを作成するためのテンプレート。
Dockerコンテナ Dockerイメージを元に実行されるプロセス。
サービス Docker Composeが管理する単位。1つ以上のDockerコンテナからなる。例えばdbサービスとしてMySQLコンテナを100個起動させるよう定義できる。
コンテキスト Docker CLIの接続先ソケットに関する設定。docker context use defaultでroot権限のソケット、docker context use rootlessでルートレスのソケットに接続する。
Docker Compose Docker CLIの一機能。複数のコンテナを制御できる。

Docker Compose (docker compose, docker-compose) について

dockerコマンドで1つのコンテナを動かせるのに対して、こちらはサービスという単位でコンテナを動かすことができる。

docker-composeの機能はdocker composeとして統合されたようで、Docker Engineをインストールすればdocker composeを使うことができる。

ただしRootless Dockerインストール時はdocker composeが使えないようで、別途docker-composeをインストールする必要がある。

docker

イメージ一覧を確認する

1
2
3
4
$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED        SIZE
jenkins/jenkins   lts       9c4d4de88494   6 days ago     464MB
hello-world       latest    feb5d9fea6a5   7 months ago   13.3kB

ボリューム一覧を確認する

1
$ docker volume ls

コンテナのプロセス一覧を確認する

1
2
3
$ docker ps -a
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                         NAMES
xxxxxxxxxxxx   some-image             "docker-entrypoint.s…"   31 seconds ago   Up 30 seconds   0.0.0.0:8085->3000/tcp, [::]:8085->3000/tcp   sharp_dubinsky

コンテナを停止する

1
2
# docker stop {containerId}
$ docker stop xxxxxxxxxxxx

コンテナを削除する

1
2
# docker rm {containerId}
$ docker rm xxxxxxxxxxxx

イメージを削除する

イメージID指定で削除できないときはリポジトリ名指定で削除できることがある。

1
2
3
4
5
6
7
# docker rmi {imageId}
# docker rmi {repositoryName}
$ docker rmi xxxxxxxxxxxx

# Error response from daemon: conflict: unable to delete
# というエラーが出たら以下で削除する
$ docker rmi -f {imageId}

未使用のイメージを削除する

docker image pruneで不要のものは削除できる。

1
2
3
4
5
6
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
(中略)

Total reclaimed space: 7.665GB

全削除系

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# コンテナを全停止
$ docker stop $(docker ps -a -q)

# コンテナを全削除
$ docker rm $(docker ps -a -q)

# イメージを全削除
$ docker rmi -f $(docker images -q)

# コンテナ、ネットワーク、未使用イメージ、キャッシュ全削除
$ docker system prune

イメージをビルドする

1
2
3
# docker build -t {imageName}:{tagName} .
$ docker build -t some-image:latest .
$ docker build -t some-image:1.0.0 .

イメージをプッシュする

1
2
3
# docker tag {imageName}:{tagName} {url}/{imageName}:{tagName}
$ docker tag some-image:1.0.0 xxx.xxx.xxx.xxx:xxxx/some-image:1.0.0
$ docker push xxx.xxx.xxx.xxx:xxxx/some-image:1.0.0

イメージをプッシュするMakefile (Node.js)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
URL=xxx.xxx.xxx.xxx:xxxx
IMAGE_NAME=image-name
TAG_NAME := $(shell jq -r ".version" package.json)

build:
    docker build -t $(IMAGE_NAME):$(TAG_NAME) .

tag:
    docker tag $(IMAGE_NAME):$(TAG_NAME) $(URL)/$(IMAGE_NAME):$(TAG_NAME)

push: tag build
    docker push $(URL)/$(IMAGE_NAME):$(TAG_NAME)

Dockerイメージをtarにする

1
2
3
4
5
# tarにする
$ docker save -o $FILE_NAME $IMAGE_NAME

# tarを読み込む
$ docker load -i $FILE_NAME

リソースの使用量を確認する

1
$ docker stats

docker compose

composeでコンテナを実行する

1
$ docker compose up -d

-dをつけるとデタッチモードとなり、バックグラウンドで動作させることができる。

composeでイメージをビルドしつつコンテナを実行する

1
$ docker compose up -d --build

composeでコンテナを停止する

1
$ docker compose down

composeでコンテナを再起動する

docker-compose.ymlの変更は適用されないようなので注意すること。

1
$ docker compose restart

composeでコンテナをアップデートする

1
$ docker compose pull

composeでコンテナの中に入る

コンテナは起動させておく必要がある。

1
$ docker compose exec {containerName} bash

composeでコンテナの状態を確認する

1
$ docker compose ps

composeでroot権限でコンテナの中に入る

コンテナは起動させておく必要がある。

1
$ docker compose exec -u root {containerName} bash

composeでログ(標準出力、標準エラー出力)を確認する

1
2
3
4
$ docker compose logs $CONTAINER_NAME

# ずっと確認し続ける
$ docker compose logs -f $CONTAINER_NAME

トラブルシューティング

Cannot connect to the Docker daemon at unix:///run/user/1002//docker.sock. Is the docker daemon running?

docker-composeが起動しないとき。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
$ systemctl --user status docker.service
● docker.service - Docker Application Container Engine (Rootless)
     Loaded: loaded (/home/{ユーザー名}/.config/systemd/user/docker.service; enabled; preset: enabled)
     Active: activating (start) since Fri 2024-07-19 19:54:31 JST; 4s ago
       Docs: https://docs.docker.com/go/rootless/
   Main PID: 7806 (rootlesskit)
     CGroup: /user.slice/user-1002.slice/user@1002.service/app.slice/docker.service
             └─7806 rootlesskit --state-dir=/run/user/1002/dockerd-rootless --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/ru>

Jul 19 19:54:34 ubuntu2404 dockerd-rootless.sh[7843]: time="2024-07-19T19:54:34.994971241+09:00" level=warning msg="failed to find iptables" error="exec: \"iptables\": executable file not found in $PATH"
Jul 19 19:54:34 ubuntu2404 dockerd-rootless.sh[7843]: time="2024-07-19T19:54:34.995940323+09:00" level=info msg="stopping event stream following graceful shutdown" error="<nil>" module=libcontainerd namespace=moby
Jul 19 19:54:34 ubuntu2404 dockerd-rootless.sh[7843]: time="2024-07-19T19:54:34.996308355+09:00" level=info msg="stopping healthcheck following graceful shutdown" module=libcontainerd
Jul 19 19:54:34 ubuntu2404 dockerd-rootless.sh[7843]: time="2024-07-19T19:54:34.997666624+09:00" level=info msg="stopping event stream following graceful shutdown" error="context canceled" module=libcontainerd namespace=plugins.>
Jul 19 19:54:35 ubuntu2404 dockerd-rootless.sh[7843]: failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to register "bridge" driver: failed to create NAT chain DOCKER: ipt>
Jul 19 19:54:36 ubuntu2404 dockerd-rootless.sh[7813]: [rootlesskit:child ] error: command [/home/{ユーザー名}/bin/dockerd-rootless.sh] exited: exit status 1
Jul 19 19:54:36 ubuntu2404 dockerd-rootless.sh[7806]: [rootlesskit:parent] error: child exited: exit status 1
Jul 19 19:54:36 ubuntu2404 systemd[335]: docker.service: Main process exited, code=exited, status=1/FAILURE
Jul 19 19:54:36 ubuntu2404 systemd[335]: docker.service: Failed with result 'exit-code'.
Jul 19 19:54:36 ubuntu2404 systemd[335]: Failed to start docker.service - Docker Application Container Engine (Rootless).

iptablessudo apt autoremoveで消えたらしい。インストールする。

1
$ sudo apt install -y iptables

Cannot connect to the Docker daemon at unix:///run/user/1000/docker.sock. Is the docker daemon running?

Rootless Dockerを削除したあともゴミが残っていた。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ docker context ls
NAME         DESCRIPTION                               DOCKER ENDPOINT                      ERROR
default      Current DOCKER_HOST based configuration   unix:///var/run/docker.sock
rootless *   Rootless mode                             unix:///run/user/1002//docker.sock
$ docker context use default
default
Current context is now "default"
$ docker context rm rootless
rootless
$ docker context ls
NAME        DESCRIPTION                               DOCKER ENDPOINT               ERROR
default *   Current DOCKER_HOST based configuration   unix:///var/run/docker.sock

Network docker_default Resource is still in use

1
2
3
$ docker compose down
[+] Running 1/1
 ! Network docker_default  Resource is still in use

docker-compose.ymlの変更を下に戻した状態で再度コマンドを試すこと。

Error response from daemon: cannot stop container: permission denied

1
2
3
4
$ docker compose down
[+] Running 1/1
  Container gitlab  Error while Stopping                                                                                                              14.2s
Error response from daemon: cannot stop container: 2e51326be4f1b23cc7e8a67409749fe46e93e14f9416b272695abd5fe5b11918: permission denied
1
2
3
4
$ sudo service docker restart
$ sudo systemctl restart docker.socket docker.service
$ docker rm -f $CONTAINER_ID
$ sudo reboot

failed to bind host port for 0.0.0.0:xxxx:xxx.xxx.xxx.xxx:xxx/tcp: address already in use

ポートを占有していそうなコンテナがあれば止める。

1
2
$ docker stop $CONTAINER_ID
$ docker rm $CONTAINER_ID

それでもだめならポートを使っているプロセスを探してkillする。

1
2
3
4
5
$ sudo lsof -i :4431
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 3171 root    7u  IPv4  21804      0t0  TCP *:4431 (LISTEN)
docker-pr 3178 root    7u  IPv6  21805      0t0  TCP *:4431 (LISTEN)
$ sudo kill 3171 3178

Error response from daemon: failed to create task for container: Unimplemented: failed to start shim: start failed: unsupported shim version (3): not implemented

システムを再起動する。

1
$ sudo reboot