Dockerコマンドの例

このページは、Dockerのコマンドの例をまとめる予定のページです。

目次

注意

  • このページを作ったひとが備忘のためにまとめているため網羅性はありません。
  • バージョン 20.10.21 時点のものです。将来のバージョンで仕様が変更されている場合は使用できない可能性があります。
  • 現在の作業ディレクトリのパスを示す $(pwd) は、使用している端末によって変更してください。
    • PowerShell: ${pwd}
    • コマンドプロンプト: %cd%
  • 各ソフトウェアの実行は試験・検証用として記載しています。(コードの動作確認などの用途で使用する想定のもので、実運用を想定していません)

基本的なコマンド

イメージの取得 (pull)

イメージの取得 (Docker Hubにあるイメージ名やタグを指定。取得していなくてもdocker runなどでイメージが自動取得されるので使用しなくてもいいことが多い)
docker pull イメージ名など

# 例
# docker pull python
# docker pull python:3

イメージの一覧 (images)

イメージの一覧
docker images

イメージの削除 (rmi)

イメージの削除
docker rmi イメージ名など

# 例
# docker rmi python
# docker rmi python:3

イメージのビルド (build)

作業ディレクトリ上のDockerfileからイメージのビルド
docker build .

コンテナの実行 (run)

対話系のコンテナの実行 (端末で入出力を行いたい場合 -it (--intaractive --tty)、実行終了後にコンテナを削除したい場合 --rm を使用する)
docker run -it --rm イメージ名 コマンド
バックグラウンド実行系のコンテナの実行 (バックグラウンド実行のために -d (--detach)、停止などの操作のための名前付けに --name を使用する)
docker run -d --name コンテナ名 イメージ名
ポートフォワード (-p)
docker run -d --name コンテナ名 -p ホスト側ポート:コンテナ側ポート イメージ名

# 例 (8080ポートでnginxの80ポートにアクセスできるようにする)
# docker run -d --name nginx-tmp -p 8080:80 nginx
ボリュームのマウント (ホスト側のディレクトリやファイルをコンテナで使用できるようにするために -v (--volume) を使用する)
docker run -v ホスト側ディレクトリやファイル:コンテナ側ディレクトリやファイル (その他のオプション略)

# 例 (ホスト側作業ディレクトリを /usr/share/nginx/html にマウント)
# docker run -d --rm --name nginx-tmp -v $(pwd):/usr/share/nginx/html -p 8080:80 nginx
環境変数の指定 (-e (--env))
docker run -e 変数名=(その他のオプション略)

# 例 (環境変数MYSQL_ROOT_PASSWORD=passを指定)
# docker run -d --rm --name mysql-tmp -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 mysql
同じネットワークの別コンテナにコンテナ名でアクセスできるように設定 (--network を使用する。ネットワークはdocker network createで作成)
docker run --network=ネットワーク名 (その他のオプション略)

# 例 (network-tmpネットワークを作成して接続)
# docker network create network-tmp
# docker run -d --rm --name mysql-tmp -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=demo --network=network-tmp mysql
# docker run -it -d --name php-tmp -v $(pwd):/tmp --network=network-tmp php
別コンテナにコンテナ名でアクセスできるように設定 (--link を使用する。コンテナの /etc/hosts に別コンテナの設定が追加される)
docker run --link=コンテナ名 (その他のオプション略)

# 例 (mysql-tmpコンテナにリンク)
# docker run -it -d --name php-tmp -v $(pwd):/tmp --link=mysql-tmp php

コマンドの実行 (exec)

コマンドの実行
docker exec -it コンテナ名 コマンド

# 例 (bashの実行)
# docker exec -it コンテナ名 bash

コンテナのログ表示 (logs)

コンテナのログ表示
docker logs コンテナ名

情報表示 (inspect)

情報表示
docker inspect イメージ名、コンテナ名、ネットワーク名、IDなど

# 例
# docker inspect mysql
IPアドレスの取得 (--format (-f) は Goのテンプレート形式)
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' コンテナ名

# 例
# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-tmp

コンテナの停止 (stop)

コンテナの停止
docker stop コンテナ名

コンテナの削除 (rm)

コンテナの削除 (実行中のコンテナでも削除したい場合 -f (--force) を使用する)
docker rm -f コンテナ名

ネットワーク (network)

ネットワークの作成 (network create)

ネットワークの作成
docker network create ネットワーク名

ネットワークの削除 (network rm)

ネットワークの削除 (強制削除はないため、接続しているコンテナをすべて停止する必要がある)
docker network rm ネットワーク名

サービス構成 (compose)

構成の作成・実行 (up)

構成の作成・実行
docker compose up
構成の作成・実行 (バックグラウンド実行のために -d (--detach) を使用する)
docker compose up -d
構成の再作成・実行 (強制再作成に --force-recreate, 前回起動した際の匿名ボリュームを削除する場合 -V (--renew-anon-volumes) を使用する)
docker compose up --force-recreate -V

構成内のコンテナのコマンド実行 (exec)

docker compose exec サービス名 bash 

# 例 (サービス名はdocker-compose.yml に記載してあるservicesの1段下の名称)
# docker compose exec nginx-tmp bash 

構成の停止・削除 (down)

構成の停止・削除
docker compose down

各ソフトウェアの実行 (試験用)

Node.js

一時的に対話モードで実行
docker run -it --rm node
一時的にコードを実行
docker run -it --rm node -e "console.log(1)"
一時的にファイルを実行
docker run -it --rm -v $(pwd):/tmp node node /tmp/ファイル名

PHP

一時的に対話モードで実行
docker run -it --rm php
一時的に対話モードで実行 (+ PDO MySQLドライバをインストールする例)
docker run -it --rm php docker-php-ext-install pdo_mysql; php -a
一時的にコードを実行
docker run -it --rm php -r "echo 1;"
一時的にファイルを実行
docker run -it --rm -v $(pwd):/tmp php /tmp/ファイル名
一時的にファイルを実行 (複数コマンド + PDO MySQL)
# コンテナ実行 (作業ディレクトリを/tmpにマウントしてインタラクティブ + バックグラウンド実行)
docker run -it -d --name php-tmp -v $(pwd):/tmp php
# (別コンテナにコンテナ名でアクセス可能にする場合--networkや--linkを使用)
# docker run -it -d --name php-tmp -v $(pwd):/tmp --link=mysql-tmp php

# 拡張インストール
docker exec -it php-tmp docker-php-ext-install pdo_mysql
# ファイル実行 (PDOのDSNは--networkや--linkを使用していればコンテナ名で接続可。new PDO('mysql:host=mysql-tmp;dbname=demo', $user, $pass) など)
docker exec -it php-tmp php /tmp/test.php
# コンテナ停止・削除
# docker rm -f php-tmp
一時的にApacheを起動 (作業ディレクトリのファイルを http://localhost:8080/ の下でアクセスできるようにする)
docker run -d --name php-tmp -v $(pwd):/var/www/html -p 8080:80 php:apache
# コンテナ停止・削除
# docker rm -f php-tmp
一時的にApacheを起動 (上記 + PDO MySQL)
# コンテナ実行
docker run -d --name php-tmp -v $(pwd):/var/www/html -p 8080:80 php:apache
# (別コンテナにコンテナ名でアクセス可能にする場合--networkや--linkを使用)
# docker run -d --name php-tmp -v $(pwd):/var/www/html -p 8080:80 --link=mysql-tmp php:apache

# 拡張インストール
docker exec -it php-tmp docker-php-ext-install pdo_mysql
# Apache再起動
docker exec -it php-tmp /etc/init.d/apache2 reload
# コンテナ停止・削除
# docker rm -f php-tmp

Python

一時的に対話モードで実行
docker run -it --rm python
一時的にコードを実行
docker run -it --rm python python -c "print(1);"
一時的にファイルを実行
docker run -it --rm -v $(pwd):/tmp python python /tmp/ファイル名

Ruby

一時的に対話モードで実行
docker run -it --rm ruby
一時的にコードを実行
docker run -it --rm ruby ruby -e "puts 1"
一時的にファイルを実行
docker run -it --rm -v $(pwd):/tmp ruby ruby /tmp/ファイル名

Perl

一時的に対話モードで実行
docker run -it --rm perl
一時的にコードを実行
docker run -it --rm perl perl -e "print(1)"
一時的にファイルを実行
docker run -it --rm -v $(pwd):/tmp perl perl /tmp/ファイル名

MySQL

一時的に起動 (ホスト・ポート: localhost:3306 (ポートフォワード), ユーザー名: root, パスワード: pass)
docker run -d --rm --name mysql-tmp -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 mysql
# コンテナ停止・削除
# docker rm -f mysql-tmp
一時的に起動 (上記 + 初期DB作成。例ではdemo)
docker run -d --name mysql-tmp -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=demo -p 3306:3306 mysql
一時的に起動 (上記 + 作業ディレクトリ上のSQL実行)
docker run -d --name mysql-tmp -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=demo -v $(pwd)/init.sql:/docker-entrypoint-initdb.d/init.sql -p 3306:3306 mysql

# init.sqlの例
# 
# CREATE TABLE emp (id serial, name text);
# INSERT INTO emp (name) VALUES ('emp1'), ('emp2'), ('emp3');

MariaDB

一時的に起動 (ホスト・ポート: localhost:3306 (ポートフォワード), ユーザー名: root, パスワード: pass)
docker run -d --name mariadb-tmp -e MARIADB_ROOT_PASSWORD=pass -p 3306:3306 mariadb
# コンテナ停止・削除
# docker rm -f mariadb-tmp
一時的に起動 (上記 + 初期DB作成。例ではdemo)
docker run -d --name mariadb-tmp -e MARIADB_ROOT_PASSWORD=pass -e MARIADB_DATABASE=demo -p 3306:3306 mariadb
一時的に起動 (上記 + 作業ディレクトリ上のSQL実行)
docker run -d --name mariadb-tmp -e MARIADB_ROOT_PASSWORD=pass -e MARIADB_DATABASE=demo -v $(pwd)/init.sql:/docker-entrypoint-initdb.d/init.sql -p 3306:3306 mariadb

PostgreSQL

一時的に起動 (ホスト・ポート: localhost:5432 (ポートフォワード), ユーザー名: postgres, パスワード: postgres)
docker run -d --name pg-tmp -e POSTGRES_PASSWORD=postgres -p 5432:5432 postgres
# コンテナ停止・削除
# docker rm -f pg-tmp
一時的に起動 (上記 + 作業ディレクトリ上のSQL実行)
docker run -d --rm --name pg-tmp -e POSTGRES_PASSWORD=postgres -v $(pwd)/init.sql:/docker-entrypoint-initdb.d/init.sql -p 5432:5432 postgres

# init.sqlの例
# 
# CREATE USER demo;
# CREATE DATABASE demo;
# GRANT ALL PRIVILEGES ON DATABASE demo TO demo;
# \c demo
# CREATE TABLE emp (id serial, name text);
# INSERT INTO emp (name) VALUES ('emp1'), ('emp2'), ('emp3');

nginx

一時的に起動 (http://localhost:8080 ポートフォワード)
docker run -d --name nginx-tmp -p 8080:80 nginx
# コンテナ停止・削除
# docker rm -f nginx-tmp
一時的に起動 (上記 + 作業ディレクトリのファイルを http://localhost:8080/ の下でアクセスできるようにする)
docker run -d --name nginx-tmp -v $(pwd):/usr/share/nginx/html -p 8080:80 nginx
一時的に起動 (上記 + 作業ディレクトリ上のnginx.confの適用)
docker run -d --name nginx-tmp -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -v $(pwd):/usr/share/nginx/html -p 8080:80 nginx
一時的に起動 (上記 + 作業ディレクトリ上のdefault.confの適用)
docker run -d --name nginx-tmp -v $(pwd)/default.conf:/etc/nginx/conf.d/default.conf -v $(pwd):/usr/share/nginx/html -p 8080:80 nginx
コンテナ上のnginx.confの取得
docker cp nginx-tmp:/etc/nginx/nginx.conf $(pwd)/nginx.conf

PHP + Apache + MySQL (compose)

ファイル構成
- (作業ディレクトリ)
    - docker-compose.yml
    - Dockerfile
    - index.php
./docker-compose.yml。作業ディレクトリのファイルを http://localhost:8080/ の下でアクセスできるようにする
services:
  php-tmp:
    build: .
    volumes:
      - .:/var/www/html
    ports:
      - "8080:80"

  mysql-tmp:
    image: mysql
    restart: always
    # volumes:
      # 初期SQL実行が必要な場合追加 (./init.sqlにSQLを用意する)
      # - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      # 設定が必要な場合追加 (./my.cnfに設定を用意する。Windowsの場合は読み取り専用にする)
      # - ./my.cnf:/etc/mysql/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: pass
      # 初期DBが必要な場合追加
      # MYSQL_DATABASE: demo
      # タイムゾーンの指定が必要な場合追加
      # TZ: Asia/Tokyo

  # DBデータをブラウザ上から確認したい場合追加 (http://localhost:8888 サーバ: mysql-tmp, ユーザ名: root, パスワード: pass)
  # adminer:
  #   image: adminer
  #   restart: always
  #   ports:
  #     - "8888:8080"
./Dockerfile
FROM php:apache
RUN docker-php-ext-install pdo_mysql
./index.php
<?php
echo 'PHP: ' . PHP_VERSION . '<br>';
// ホストはMySQLのコンテナ名を指定 (この例ではmysql-tmp)
$pdo = new PDO('mysql:host=mysql-tmp', 'root', 'pass');
echo "MySQL: {$pdo->query('SELECT VERSION()')->fetchColumn()}";

// 出力例
// PHP: 8.2.1
// MySQL: 8.0.31
./my.cnf を用意する場合の例
[mysqld]
general_log=1
general_log_file=/tmp/general.log
実行 (実行後 http://localhost:8080/ にアクセス)
# 実行 (-d付きでも可)
docker compose up
# 停止・削除
# docker compose down
その他のコマンド
# 匿名ボリュームを削除して再作成・実行 (-d付きでも可。匿名ボリュームが残っていると初期SQLが実行されないため削除する)
docker compose up --force-recreate -V

# MySQLのみ再作成・実行
docker compose up mysql-tmp --force-recreate -V

# MySQLコマンド実行
docker compose exec mysql-tmp mysql -p

PHP + Apache + PostgreSQL (compose)

ファイル構成
- (作業ディレクトリ)
    - docker-compose.yml
    - Dockerfile
    - index.php
./docker-compose.yml。作業ディレクトリのファイルを http://localhost:8080/ の下でアクセスできるようにする
services:
  php-tmp:
    build: .
    volumes:
      - .:/var/www/html
    ports:
      - "8080:80"

  pg-tmp:
    image: postgres
    restart: always
    # 初期SQL実行が必要な場合追加 (./init.sqlにSQLを用意する)
    # volumes:
    #   - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      POSTGRES_PASSWORD: postgres
      # 初期DBが必要な場合追加
      # POSTGRES_DB: demo
      # タイムゾーンの指定が必要な場合追加
      # TZ: Asia/Tokyo

    # DBデータをブラウザ上から確認したい場合追加 (http://localhost:8888 サーバ: pg-tmp, ユーザ名: postgres, パスワード: postgres)
    # adminer:
    #   image: adminer
    #   restart: always
    #   ports:
    #     - "8888:8080"
./Dockerfile
FROM php:apache
RUN apt-get update && apt-get install -y libpq-dev
RUN docker-php-ext-install pdo_pgsql
./index.php
<?php
echo 'PHP: ' . PHP_VERSION . '<br>';
// ホストはMySQLのサービス名を指定 (この例ではpg-tmp)
$pdo = new PDO('pgsql:host=pg-tmp', 'postgres', 'postgres');
echo "PostgreSQL: {$pdo->query('SELECT VERSION()')->fetchColumn()}";

// 出力例
// PHP: 8.2.1
// PostgreSQL: PostgreSQL 15.1 (Debian 15.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
実行 (実行後 http://localhost:8080/ にアクセス)
# 実行 (-d付きでも可)
docker compose up
# 停止・削除
# docker compose down

PHP + nginx + MySQL (compose)

ファイル構成
- (作業ディレクトリ)
    - docker-compose.yml
    - Dockerfile
    - default.conf
    - index.php
./docker-compose.yml。作業ディレクトリのファイルを http://localhost:8080/ の下でアクセスできるようにする
services:
  mysql-tmp:
    image: mysql
    restart: always
    # volumes:
      # 初期SQL実行が必要な場合追加 (./init.sqlにSQLを用意する)
      # - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      # 設定が必要な場合追加 (./my.cnfに設定を用意する。Windowsの場合は読み取り専用にする)
      # - ./my.cnf:/etc/mysql/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: pass
      # 初期DBが必要な場合追加
      # MYSQL_DATABASE: demo
      # タイムゾーンの指定が必要な場合追加
      # TZ: Asia/Tokyo

  php-tmp:
    build: .
    volumes:
    # PHPファイル実行用
    - .:/usr/share/nginx/html

  nginx-tmp:
    image: nginx
    restart: always
    volumes:
      # php-fpm 設定用
      - ./default.conf:/etc/nginx/conf.d/default.conf
      # 作業ディレクトリのPHPファイル以外のファイルを表示させたい場合追加
      # (注: この例の構成だとdocker-compose.ymlなども見える状態になります)
      # - .:/usr/share/nginx/html
    ports:
      - "8080:80"

    # DBデータをブラウザ上から確認したい場合追加 (http://localhost:8888 サーバ: mysql-tmp, ユーザ名: root, パスワード: pass)
    # adminer:
    #   image: adminer
    #   restart: always
    #   ports:
    #     - "8888:8080"
./Dockerfile
FROM php:fpm
RUN docker-php-ext-install pdo_mysql
./default.conf
server {
    root /usr/share/nginx/html;
    index index.php;

    location ~ \.php$ {
        # PHPのサービス名を指定 (この例ではphp-tmp)
        fastcgi_pass   php-tmp:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
./index.php
<?php
echo 'PHP: ' . PHP_VERSION . '<br>';
// ホストはMySQLのサービス名を指定 (この例ではmysql-tmp)
$pdo = new PDO('mysql:host=mysql-tmp', 'root', 'pass');
echo "MySQL: {$pdo->query('SELECT VERSION()')->fetchColumn()}";

// 出力例
// PHP: 8.2.1
// MySQL: 8.0.31
実行 (実行後 http://localhost:8080/ にアクセス)
# 実行 (-d付きでも可)
docker compose up
# 停止・削除
# docker compose down

参考