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
システムを再起動する。