Dockerまとめ

よく使うDocker関連コマンドとマウント、ネットワーク仕様などについてまとめました。

よく使うコマンド一覧

Docker

# イメージ取得
$ docker pull イメージ名[:タグ名]

# コンテナ起動
$ docker run イメージ名[:タグ名] コマンド
# 例
$ docker run ubuntu:17.10 cat /etc/lsb-release

# 動作中のコンテナ表示
$ docker ps

# 動作終了も含めたコンテナ表示
$ docker ps -a

# コンテナ削除
$ docker rm コンテナ名orコンテナID

# 起動+コンテナ内のシェルに入る(イメージにより使えるシェルは異なる)
$ docker run -it --name コンテナ名 イメージ名[:タグ名] /bin/bash
# 抜けるときはCtrl+P>Ctrl+Q

# コンテナに再接続
$ docker attach コンテナ名orコンテナID

# コンテナの再開
$ docker start コンテナ名orコンテナID

# コンテナの停止
$ docker stop コンテナ名orコンテナID

# コンテナからイメージ作成
$ docker commit コンテナID イメージ名[:タグ名]

# イメージ削除
$ docker rmi イメージ名

# 起動中のコンテナでシェルに入る(イメージにより使えるシェルは異なる)
$ docker exec -it コンテナ名orコンテナID /bin/bash

# コンテナのログ確認
$ docker logs -t コンテナ名orコンテナID

コンテナIDを指定するときは、IDが一意に特定できればよいので、基本的には以下の例のように先頭2桁の指定で十分です。

$ docker run -d --rm alpine:3.23.3 top
0c496d427f2ac7b838d3a881c75f42ed4d7850541bb71a14ff258392528a2ec6
$ docker ps
CONTAINER ID   IMAGE           COMMAND   CREATED         STATUS        PORTS     NAMES
0c496d427f2a   alpine:3.23.3   "top"     2 seconds ago   Up 1 second             determined_carver
$ docker stop 0c
0c

Docker Compose

# 起動
$ docker compose up

# ymlファイルを変更したものを反映したいとき
$ docker compose up --build

一度起動したものはDocker Desktop上のコンテナ一覧に出てくるので、初回起動時とyamlファイル更新時以外の操作は基本的にGUI上でできます。

Dockerのファイルマウント方法

ローカルディレクトリをマウントしたい場合の指定方法

--mount type=bind,src=ローカルディレクトリのパス,dst=Dockerコンテナ上のパス

ローカルディレクトリのパスはOS毎の記法に合わせます(Windowsなら\区切り)。

Windowsでのマウント例(PowerShellで入力)

  • カレントディレクトリ直下にmysql_initディレクトリとmysqlディレクトリを作成し、それぞれをDockerコンテナ上の/docker-entrypoint-initdb.dディレクトリと/var/lib/mysqlディレクトリにマウントしています。
  • 読み取り専用でマウントしたい場合は、readonlyまたはroオプションを追加します。
$ docker run -it --rm --name temp-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw `
--mount type=bind,src="$(pwd)\mysql_init",dst=/docker-entrypoint-initdb.d,readonly `
--mount type=bind,src="$(pwd)\mysql",dst=/var/lib/mysql `
mysql:9.6.0

Ubuntuでのマウント例

$ docker run -it --rm --name temp-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw \
--mount type=bind,src="$(pwd)/mysql_init",dst=/docker-entrypoint-initdb.d,readonly \
--mount type=bind,src="$(pwd)/mysql",dst=/var/lib/mysql \
mysql:9.6.0

Dockerのvolumeをマウントしたい場合の指定方法

--mount type=volume,src=volume名,dst=Dockerコンテナ上のパス

Ubuntudでのマウント例(Windowsの場合も改行の\以外は同様)

# 指定するvolumeがない場合は最初に作成しておく
$ docker volume create vol-mysql

$ docker run -it --rm --name temp-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw \
--mount type=volume,src=vol-mysql,dst=/var/lib/mysql \
mysql:9.6.0

Dockerのネットワークについて

ユーザー定義ネットワークを作成し、それをコンテナに割り当てると、同じネットワーク上のコンテナはコンテナ名で名前解決し、相互に通信できます。

# ユーザー定義ネットワーク作成
$ docker network create nw1
# ネットワーク一覧表示
$ docker network ls

# 作ったネットワークに割り当て
$ docker run -dit --rm --name=c1 --network=nw1 alpine:3.23.2 ash
$ docker run -dit --rm --name=c2 --network=nw1 alpine:3.23.2 ash

# ネットワークnw1に存在するコンテナが確認できる
$ docker network inspect nw1

# c1のコンテナからc2のコンテナへ疎通確認
$ docker exec c1 ping -c 3 c2

# c2のコンテナからc1のコンテナへ疎通確認
$ docker exec c2 ping -c 3 c1

linkオプションを使うことで、疎通先のコンテナ名に別名(エイリアス)を付けることも可能です。

# c2のコンテナ名にc2-aliasという別名を設定
$ docker run -dit --rm --name=c3 --network=nw1 --link c2:c2-alias alpine:3.23.2 ash

# c3のコンテナからc2のコンテナへ疎通確認
$ docker exec c3 ping -c 3 c2

# c3のコンテナからc2のコンテナへエイリアス使って疎通確認
$ docker exec c3 ping -c 3 c2-alias

ネットワーク割り当て、エイリアスの設定はコンテナ起動後に変更することも可能です。

# nw1に割り当てない状態で起動
$ docker run -dit --rm --name=c4 alpine:3.23.2 ash

# nw1に割り当て
$ docker network connect nw1 c4

# c4のコンテナからc2のコンテナへ疎通確認
$ docker exec c4 ping -c 3 c2

# nw1の割り当て解除
$ docker network disconnect nw1 c4
# nw1に割り当てない状態で起動
$ docker run -dit --rm --name=c5 alpine:3.23.2 ash

# nw1に割り当てをし、エイリアスも設定
$ docker network connect --link c2:c2-alias nw1 c5

# c5のコンテナからc2のコンテナへエイリアスで疎通確認
$ docker exec c5 ping -c 3 c2-alias

Docker Composeのyamlファイルサンプル

WordPressとMySQLを組み合わせて使う場合

name: wordpress-test
services:
  wp:
    image: wordpress:6.9.0
    restart: "no"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: mysecret
      WORDPRESS_DB_NAME: db1
      WORDPRESS_DEBUG: 0
      WORDPRESS_CONFIG_EXTRA: |
        //Enable error logging.
        @ini_set('log_errors', 'On');
        @ini_set('error_log', '/var/www/html/wp-content/elm-error-logs/php-errors.log');
        //Don't show errors to site visitors.
        @ini_set('display_errors', 'Off');
        if ( !defined('WP_DEBUG_DISPLAY') ) {
          define('WP_DEBUG_DISPLAY', false);
        }
    ports:
      - "8085:80"
    depends_on:
      - db
    networks:
      - nw1
    volumes:
      - type: bind
        source: ./wp-content/themes
        target: /var/www/html/wp-content/themes
      - type: bind
        source: ./wp-content/plugins
        target: /var/www/html/wp-content/plugins
  db:
    image: mysql:9.6.0
    restart: "no"
    environment:
      MYSQL_ROOT_PASSWORD: mysecret
      MYSQL_DATABASE: db1
    networks:
      - nw1
    volumes:
      - type: volume
        source: wp-data
        target: /var/lib/mysql
networks:
  nw1:
volumes:
  wp-data:

Docker Desktopのインストール方法

私の場合は、Windows11上で以下の手順でDocker Desktopをインストールしました。詳細な手順は公式サイト(https://www.docker.com/ja-jp/products/docker-desktop/)を確認してください。

  1. PowerShell上でWSL2を有効化($ wsl --install)
  2. Docker Desktop Installerをダウンロードし、実行
  3. インストール後にDocker Desktopを起動
    • PowerShell上でdockerコマンドが使えることを確認($ docker --version など)
  4. WSL2上にUbuntuなどの特定のディストリビューションを入れ、そこでdockerを使いたい場合
    • docker desktopの設定>Resources>WSL integrationでdistro毎に有効化を行い、docker desktopを再起動する

関連記事

サイト内記事

公式サイト・マニュアルなど