新しいPCに移行したときなどに開発環境の構築を最小限で済ませるために、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
0cDocker 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.0Ubuntuでのマウント例
$ 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.0Dockerの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.0Dockerのネットワークについて
ユーザー定義ネットワークを作成し、それをコンテナに割り当てると、同じネットワーク上のコンテナはコンテナ名で名前解決し、相互に通信できます。
# ユーザー定義ネットワーク作成
$ 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 c1linkオプションを使うことで、疎通先のコンテナ名に別名(エイリアス)を付けることも可能です。
# 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-aliasDocker 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/)を確認してください。
- PowerShell上でWSL2を有効化(
$ wsl --install) - Docker Desktop Installerをダウンロードし、実行
- インストール後にDocker Desktopを起動
- PowerShell上でdockerコマンドが使えることを確認(
$ docker --versionなど)
- PowerShell上でdockerコマンドが使えることを確認(
- WSL2上にUbuntuなどの特定のディストリビューションを入れ、そこでdockerを使いたい場合
- docker desktopの設定>Resources>WSL integrationでdistro毎に有効化を行い、docker desktopを再起動する