" />
本ページはプロモーションが含まれています。

スポンサーリンク

Docker

Docker入門1~DockerDesktop/dockerコマンド~

なぜ、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のオプション

$ 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 runのオプション

起動中コンテナの状態を表示する -> 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の予約語

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

削除しようとしているネットワークは、コンテナで使用されているため削除できません。

解決方法

ネットワークに紐づいているコンテナを停止・削除してからネットワークの削除を試行しましょう。

参考文献

Docker-docs-ja

この本で入門しました。めちゃくちゃわかりやすいです。

スポンサーリンク

-Docker