Docker
Docker Compose
Docker Engine
public
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
イメージ一覧を確認する
$ 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
ボリューム一覧を確認する
コンテナのプロセス一覧を確認する
$ 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
コンテナを停止する
# docker stop {containerId}
$ docker stop xxxxxxxxxxxx
コンテナを削除する
# docker rm {containerId}
$ docker rm xxxxxxxxxxxx
イメージを削除する
イメージ ID 指定で削除できないときはリポジトリ名指定で削除できることがある。
# docker rmi {imageId}
# docker rmi {repositoryName}
$ docker rmi xxxxxxxxxxxx
# Error response from daemon: conflict: unable to delete
# というエラーが出たら以下で削除する
$ docker rmi -f { imageId}
未使用のイメージを削除する
docker image pruneで不要のものは削除できる。
$ 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
全削除系
# コンテナを全停止
$ docker stop $( docker ps -a -q)
# コンテナを全削除
$ docker rm $( docker ps -a -q)
# イメージを全削除
$ docker rmi -f $( docker images -q)
# コンテナ、ネットワーク、未使用イメージ、キャッシュ全削除
$ docker system prune
イメージをビルドする
# docker build -t {imageName}:{tagName} .
$ docker build -t some-image:latest .
$ docker build -t some-image:1.0.0 .
イメージをプッシュする
# 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 にする
# tarにする
$ docker save -o $FILE_NAME $IMAGE_NAME
# tarを読み込む
$ docker load -i $FILE_NAME
リソースの使用量を確認する
docker compose
compose でコンテナを実行する
-dをつけるとデタッチモードとなり、バックグラウンドで動作させることができる。
compose でイメージをビルドしつつコンテナを実行する
$ docker compose up -d --build
compose でコンテナを停止する
compose でコンテナを再起動する
docker-compose.yml の変更は適用されないようなので注意すること。
compose でコンテナをアップデートする
compose でコンテナの中に入る
コンテナは起動させておく必要がある。
$ docker compose exec { containerName} bash
compose でコンテナの状態を確認する
compose で root 権限でコンテナの中に入る
コンテナは起動させておく必要がある。
$ docker compose exec -u root { containerName} bash
compose でログ(標準出力、標準エラー出力)を確認する
$ 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) .
iptablesがsudo apt autoremoveで消えたらしい。インストールする。
$ 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
$ 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
$ docker compose down
[ +] Running 1 /1
✘ Container gitlab Error while Stopping 14 .2s
Error response from daemon: cannot stop container: 2e51326be4f1b23cc7e8a67409749fe46e93e14f9416b272695abd5fe5b11918: permission denied
$ 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
ポートを占有していそうなコンテナがあれば止める。
$ docker stop $CONTAINER_ID
$ docker rm $CONTAINER_ID
それでもだめならポートを使っているプロセスを探して kill する。
$ 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
システムを再起動する。