なぜ、Dockerを使うのか?
アプリのソースコード一式にdockerfileを記述しておけば、MacでもWindowsでも、Dockerをインストールしておけばすぐに環境構築ができる。
DockerがOSの違いを吸収してくれるとも言える。
開発環境がDocker化されていなければ、Macごと、Windowsごとの環境構築手順書が必要になる。
もっと言えば、PCの所有者ごとに環境構築手順書に沿って環境構築を半日ほどかけてやっていくことになる。
PCにDockerを入れておけば、dockerfileを元に一瞬で環境構築を済ませてくれる。このメリットは非常に大きい。
さらにリリース時にも、dockerfileを書いておけば、AWSであればDocker実行環境であるECSで即時に起動できるようになる。
このメリットも非常に大きい。
デメリットは初期学習コストだけ。ここは時間をかけてじっくりやるしかないが、時間をかける価値は大きい。
あなたは自身のアプリの環境をDocker化できるようになろう。
Docker Desktopをインストール
基本的には公式サイトに従えば良い。
https://docs.docker.jp/docker-for-mac/install.html
1.ダウンロードして実行
https://hub.docker.com/editions/community/docker-ce-desktop-mac/
上記サイトからDocker DesktopのインストーラーであるDocker.dmgをダウンロードする。
ダウンロードできたら、実行し、画面の指示に従ってインストールを完了する。
途中でヘルパーのインストールでパスワードを求められる。
パスワードを入力してインストールする。
DockerのQA
イメージとコンテナはどう違う?
作動中のコンテナのスナップショットがイメージである。
Dockerコマンドの基本
基本構文
$ docker run -d centos --p=1
上記のようなコマンドがあった場合、
・ run はコマンド(主コマンド)
・-d はオプション。コマンドの細かい設定を指定する。
・centos はコマンドの対象。
・--p=1 はコマンドの引数。
です。
バージョン確認 -> docker version
$ docker version
Client:
Cloud integration: 1.0.17
Version: 20.10.7
$ docker --version
Docker version 20.10.7, build f0df350
Dockerのイメージ操作
プル済みのDockerイメージを表示する -> docker images
$ docker image ls も同様。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker101tutorial latest b6fff5b4aeb7 23 hours ago 26.7MB
tahkah0124/docker101tutorial latest b6fff5b4aeb7 23 hours ago 26.7MB
nginx latest d868a2ccd9b1 9 days ago 126MB
alpine/git latest cfd9fa28a348 5 weeks ago 25.2MB
Dockerイメージを検索する -> docker search [Keyword]
$ docker search wordpress
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
wordpress The WordPress rich content management system… 4228 [OK]
bitnami/wordpress Bitnami Docker Image for WordPress 166 [OK]
Dockerイメージをプルする -> docker pull [NAME]
$ docker pull bitnami/wordpress
Using default tag: latest
latest: Pulling from bitnami/wordpress
76bfd0e40570: Pull complete
bd067ddc9840: Pull complete
Digest: sha256:d8537b449e2a71784ea5758d2b3f8bf5bda17b7157650b6fa26f014a0454a092
Status: Downloaded newer image for bitnami/wordpress:latest
docker.io/bitnami/wordpress:latest
プル済みのDockerイメージを削除する -> docker rmi [NAME]
$ docker rmi bitnami/wordpress
Untagged: bitnami/wordpress:latest
Deleted: sha256:a8166bef76d7f75459125b20fc8791cc964bfefd83f90942a8b7d724987d45c1
イメージをプルしてコンテナを作成し、起動する -> docker run
$ docker run centos
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
333cbcae3fb8: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker run イメージ名 を指定することで、
$ docker pull イメージをダウンロードする
$ docker create イメージからコンテナを作成する
$ docker start コンテナを起動する
を一度に実行できます。
docker runのオプションは覚えておきましょう。
オプション | 説明 |
-p ホストのポート:コンテナのポート --publish | ポート番号の転送先を指定する |
-v ホストのディスク:コンテナのディレクトリ --volume | ボリュームをマウントする |
-e 環境変数名= / --env | 環境変数を指定する |
-d / --detatch | デーモン実行する |
-i / --interactive | コンテナに操作端末(キーボード)を接続する |
-t / --tty | 特殊キーを使用する |
$ docker run -dit はよく使われます。
起動中のコンテナを停止する -> docker stop
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9b1f68376d5 ubuntu:latest "bash" 3 days ago Up 3 days charming_ritchie
$ docker stop c9b1f68376d5
c9b1f68376d5
$ docker stop [CONTAINER_ID or NAMES]で、起動中のコンテナを停止できます。
docker rmi の前には、必ずコンテナを停止させる必要があります。
CONTAINER_IDを指定して停止する場合は、「c9b1f68376d5」なら「c9」「c」という省略形で指定することもできます。
他のコンテナID と区別できる文字まで入力できていれば良いいようです。
Dockerのコンテナ操作
起動中のコンテナ一覧を表示する -> docker ps
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10dabc121b7b docker101tutorial:latest "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 80/tcp distracted_davinci
3baa704ccc53 nginx:latest "/docker-entrypoint.…" 21 seconds ago Up 20 seconds 80/tcp romantic_poincare
$ docker ps -a で、停止しているコンテナも含めて一覧表示できます。
コンテナを起動する -> docker run
オプション | 例 | 説明 |
-d | - | コンテナをデーモン実行する。 |
-p(--publish) [host]:[container] | -p 8000:8080 | ホストの8000番ポートを、コンテナの8080番ポートへ転送させる。 ex)ブラウザでlocalhost:8000を開くと、コンテナの8080へリクエストする。 |
起動中コンテナの状態を表示する -> docker stats [NAME]
$$ docker stats charming_ritchie
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c9b1f68376d5 charming_ritchie 0.00% 720KiB / 1.942GiB 0.04% 936B / 0B 0B / 0B 1
起動中コンテナにターミナル接続する
$ docker container exec -it [CONTAINER ID] /bin/bash
$ docker container exec -it c9b1f68376d5 /bin/bash
コンテナを削除する -> docker rm
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce7cce8e593f httpd "httpd-foreground" About a minute ago Exited (0) 7 seconds ago apa3
$ docker rm apa3
$ docker ps -a
docker rmi はイメージを削除するのに対して、docker rm はコンテナを削除します。
docker create で作った、またはdocker runで自動で作られたコンテナを削除するものです。
DockerでUbuntuを起動して、ターミナルで入る
1.Ubuntuのイメージを取得
docker pull コマンドで、ubuntuのイメージを取得します。
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6f86eded34a1: Pull complete
Digest: sha256:aba80b77e27148d99c034a987e7da3a287ed455390352663418c0f2ed40417fe
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
2.Ubuntuを起動する
Dockerデスクトップからubuntuの行のRUNボタンを押します。
すると、ubuntuが起動されます。
3.Ubuntuに入る
起動したubuntuに入るには、Dockerデスクトップの「Containers / Apps」タブから、ubuntuイメージが記載されている行の、CLIボタンを押します。
すると、このようにシェルでUbuntuに入ることができました。
Dockerfileをビルドしてイメージを作成する
Dockerfileを記述する
FROM ubuntu
CMD ["echo", "hello world!"]
予約語 | 説明 |
FROM [image] | 元になるイメージを指定する。 |
CMD | コンテナ作成時(docker run)に任意のコマンドを実行する。 |
WORKDIR [dir] | 任意のディレクトリに移動する。 |
COPY [from] [to] | ファイルやディレクトリをコピーする。 |
RUN | ビルド時(docker build)に任意のコマンドを実行する。 |
Dockerfileをビルドしてイメージを作る
$ cd Dockerfileのディレクトリ
$ docker build -t hello .
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello latest bccc6db4dce1 3 minutes ago 65.6MB
hello の部分は任意のイメージ名で登録します。
buildしたイメージを実行する
$ docker run hello
hello world!
Docker操作時のエラー
エラー
$ docker run mysql1 -dit -e MYSQL_ROOT_PASSWORD=hogehoge mysql
Unable to find image 'mysql1:latest' locally
docker: Error response from daemon: pull access denied for mysql1, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
解決策
イメージ名の指定が間違っていることが多い。
または構文を間違っている可能性がある。
上記例の場合、 --nameオプションが抜けている。
M1 Macでdocker: no matching manifest for linux/arm64/v8 in the manifest list entries.
エラー
$ docker run --name mysql1 -dit -e MYSQL_ROOT_PASSWORD=hogehoge mysql
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
See 'docker run --help'.
解決方法
pull または run するときに --platform linxu/amd64 を指定する。
$ docker run --name mysql1 -dit -e MYSQL_ROOT_PASSWORD=hogehoge --platform linux/amd64 mysql
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
b4d181a07f80: Pull complete
2f40c47d0626: Pull complete
Digest: sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b
Status: Downloaded newer image for mysql:latest
0f6b8446514c72a840a6d0e87c8cc7698f9599c07419d0db573ac181993458c8
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f6b8446514c mysql "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 3306/tcp, 33060/tcp mysql1
invalid reference format: repository name must be lowercase.
エラー
docker: invalid reference format: repository name must be lowercase.
解決方法
打ち込んだコマンドをよく見ると、間違っていることが多いです。
Error response from daemon: error while removing network: network wordpress1 id xxx has active endpoints
エラー
$ docker network rm wordpress1
Error response from daemon: error while removing network: network wordpress1 id 7ae22be4eb4fe61250d41f0bfd86611660d36378080d91ae738e5ae15992933e has active endpoints
削除しようとしているネットワークは、コンテナで使用されているため削除できません。
解決方法
ネットワークに紐づいているコンテナを停止・削除してからネットワークの削除を試行しましょう。
参考文献
この本で入門しました。めちゃくちゃわかりやすいです。