Dockerの非特権モード

Dockerはrootで動かすイメージが強いのですがlxcと同じように非特権モードでも動きます。lxcがベースになってるから当たり前のことですが、調べてみてもなかなか事例が見つからなかったのでまとめてみました。

まずsubuidとsubgidを編集します。linux mintを使っているのでほかのディストリビューションはわかりませんが似たような構成になっていると思います。

# cat /etc/subuid

user1:100000:65536
 lxd:165536:65536
 root:165536:65536

# cat /etc/subgid

user1:100000:65536
 lxd:165536:65536
 root:165536:65536

Dockerの設定を追加します。(例:user1)

# cat /etc/docker/daemon.json

{
 "userns-remap": "user1"
 }

起動ファイルを編集します。

# cat /etc/init.d/docker

DOCKER_OPTS="--userns-remap=default"

Dockerを再起動します。

# systemctl restart docker

これで非特権モードが使えるようになります。

Dockerの基本コマンド集

コマンドが覚えきれないのでよく使うコマンドのチートシートを作ってみました。

Dockerのイメージサーチ

docker search IMAGE

eg) docker search debian

Dockerイメージのダウンロード

docker pull IMAGE

Dockerのイメージリスト

docker images
OR
docker image list

コンテナの起動

docker run -t -i IMAGE /bin/bash

# コンテナをデーモンモードで起動する
docker run -d -t -i IMAGE /bin/bash

# コンテナ名を指定して起動する
docker run -t -i --name NAME IMAGE /bin/bash

# ホスト名を指定して起動する
docker run -t -i  -h HOST NAME --name NAME IMAGE /bin/bash

# コンテナを終了時に破棄する指定で起動する
docker run --rm -t -i IMAGE /bin/bash

# ホストのポートを割り当てて起動する
docker run -d -p 80:80 --name NAME IMAGE

Note: HOST port:CONTAINER port

# ホスト/etcをコンテナの/root/etcにマッピングして起動する
docker run -v /etc:/root/etc -t -i IMAGE

# CPUを割り当てて起動する
docker run -c 200 -i -t IAMGE /bin/bash

# メモリを割り当てて起動する
docker run -m 512m -i -t IMAGE /bin/bash

# 自動起動
docker run -dit --restart unless-stopped redis

コンテナ操作

# コンテナにアタッチする
docker attach CONTAINER ID or CONTAINER NAME

# initでコンテナを起動している場合にアクセスする
docker exec -t -i CONTAINER ID or CONTAINER NAME bash

# コンテナをスタートする
docker start CONTAINER ID or CONTAINER NAME

# コンテナをアタッチしてスタートする
docker start -a CONTAINER ID or CONTAINER NAME

# コンテナを終了する
docker stop CONTAINER ID or CONTAINER NAME

# コンテナを強制終了する
docker kill CONTAINER ID or CONTAINER NAME

Dockerの情報

# 起動しているコンテナのリスト表示する
docker ps

# 起動していないコンテナ含めてのリスト表示する
docker ps -a

# 直前に終了したコンテナの表示する
docker ps -l -q

# コンテナのプロセスを表示する
docker top CONTAINER

# コンテナのログを表示する
docker logs -f CONTAINER

# コンテナ情報を表示する
docker inspect CONTAINER

# イメージ情報を表示する
docker inspect IMAGE

# Dockerのバージョンを表示する
docker version

# 動作中のDockerの情報を表示する
docker info

削除

# コンテナを削除する
docker rm CONTAINER ID or CONTAINER NAME

# イメージを削除する
docker rmi IMAGE

イメージ操作

# コンテナからイメージを作成する
docker commit CONTAINER ID or CONTAINER NAME NEW IMAGE

# イメージをファイルに保存する
docker save IMAGE > /tmp/IMAGE.tar

# イメージを呼びこむ
docker load < /tmp/IMAGE.tar

# dockerfileからイメージをビルドする
docker build

# キャッシュを無効にしてビルドする
docker build --no-cache=true

# コンテナからtar fileを作成する
docker export CONTAINER > filename.tar

 

ネットワーク

# ネットワークブリッジを作成する
docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 --opt "com.docker.network.bridge.name"="docker1" server

# ネットワークブリッジの情報を表示する
docker network inspect docker1

# ネットワークブリッジにコンテナをアタッチする
docker network connect docker1 CONTAINER ID or CONTAINER NAME