dockerについてメモ

只需要记录自己努力过的事情。

Docker周边术语。

Dockerエンジン

Dockerにおいてコンテナ仮想化を実現するためのコアとなる機能を持った部分がDockerエンジン
Dockerエンジによってコンテナ作成などの機能が提供されている

Dockerfile

Dockeイメージを作成するための指示書となる設定ファイル。
Dockerfileという名前のファイルがデフォルトでビルド時に使用される。(別名のものを使用することも可能)

Dockerイメージ

dockerコンテナを作成するための雛形となるもの
アプリケーション、ライブラリ、設定ファイルなどのアプリケーションに必要なものを一式まとめたもの
出来上がったアプリケーションをdocekerイメージとして保存して、別のサーバーに持っていくことで同じ環境(コンテナ)を別サーバー上で再現することができる

ビルドキャッシュ

Dockerイメージをビルドした際に、イメージのレイヤーごとにビルド結果がキャッシュされる。このキャッシュのことをビルドキャッシュと呼ぶ。
Dockerfileをもとにビルドした内容に差がない場合、2回目以降のビルドは初回より早くなる。
Dockerfileに変更があったり、関連するファイルに差があった場合、ビルドキャッシュは使われず再度ビルドが行われるそうな

Dockerコンテナ

dockerイメージをもとにされるコンテナ型仮想環境のことをdockerコンテナと呼ぶ
イメージからコンテナを作成することで、何度も同じ環境のコンテナを作成することができる
コンテナを起動することであらかじめイメージにセットアップしたアプリケーションの機能を提供することができる

DockerHub

Dockerイメージを保存するためのサービス
AWSでいうところのECR

ブリッジネットワーク

同一のDockerホスト上でコンテナ間通信するために使用されるネットワーク。
同一のブリッジネットワークに属するコンテン同志は相互に通信することができる。

使用Docker的好处

    • プログラムの実行環境を素早く立ち上げることができる

 

    • 再現性のある環境を用意できる

本番でもdockerを使う場合、開発環境と本番環境との差異が生まれにくくなる

設定ファイル(dockerfile)を共有することでプロジェクトメンバー間で同じ環境を立ち上げることができる
PCの環境を汚さずに済む

在容器启动时执行命令。

$ docker run イメージ名 実行したいコマンド

据说,如果在图像名称后面加上命令,那么它就会被执行。

$ docker run docker/whalesay cowsay Hello~~~!
//これを実行すると

Unable to find image 'docker/whalesay:latest' locally
latest: Pulling from docker/whalesay
Image docker.io/docker/whalesay:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
00bf65475aba: Pull complete
c57b6bcc83e3: Pull complete
8978f6879e2f: Pull complete
8eed3712d2cf: Pull complete
Digest: sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b
Status: Downloaded newer image for docker/whalesay:latest
 ___________
< Hello~~~! >
 -----------
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/

看起来鲸鱼在说话并且正常移动。

最新的:从docker/whalesay拉取

docker/whalesayイメージのlatestがpullされています。

e190868d63f8: 拉取完成

imageっちゅうのはレイアーの積み重ねでできているそうで
その各レイアーイメージがpullされている。

摘要:sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b

将获取到的图像使用SHA256进行加密。

状态:已下载最新版本docker/whalesay的映像。

图像获取结果

我们再试一次吧。

$ docker run docker/whalesay cowsay Hello~~~!
 ___________
< Hello~~~! >
 -----------
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/

由于镜像已经被拉取,所以现在使用了刚刚拉取的镜像。

$ docker image ls | grep docker/whalesay
docker/whalesay                       latest      6b362a9f73eb   7 years ago     247MB

当我查看本地的镜像时,发现刚刚拉取的镜像。

获取镜像 / 删除容器 / 删除镜像

イメージ取得

$docker pull イメージ名

tagを指定しない場合latestタグのものが自動的に選ばれる。
latestタグと言ってもそれが最新であるというものではないらしい

$docker pull hello-world
$ docker image ls | grep hello
hello-world                           latest      feb5d9fea6a5   13 months ago   13.3kB
$ docker run hello-world
Hello from Docker!

コンテナ削除

imageを削除する前に立ち上げたコンテナを削除する必要がある

$docker rm コンテナid
//コンテナ確認
$docker container ls -a | grep hello
21983004b274   hello-world              "/hello"                 2 minutes ago   Exited (0) 2 minutes ago                                      brave_elion

//コンテナ削除
$docker rm 21983004b27

删除图片

$ docker image rm イメージid
//もしくは
$ docker rmi イメージid
//イメージ確認
$ docker image ls | grep hello

//イメージ削除
$ docker rmi feb5d9fea6a5

Dockerfile -> Docker文件

Docker的网络

确认正在创建的网络

$ docker network ls
NETWORK ID     NAME                      DRIVER    SCOPE
286e88a25efd   bridge                    bridge    local
19f3778cfa48   host                      host      local

查看网络详细信息

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "286e88a25efd0cdb9f346f962767d641f90ded6217930238a9ae3b4b9aa59f27",
        "Created": "2022-11-03T07:28:07.469054236Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

DockerCompose 可以被中国话母语者这样表达:Docker组合

执行步骤

    • イメージの指定

Dockerfileを指定、もしくはDockerHubなどにあるものを使う

docker-composer.ymlを定義する

dockerコンテナ起動時の設定を定義するもの
dokcer runコマンドにオプションで色々つけるようなこと

docker-compose upを実行

容器登录

在使用Docker命令时

$ docker exec -it コンテナ名 /bin/bash
or
$ docker exec -it コンテナ名 /bin/sh
//立ち上がってるコンテナを確認
$ docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS          PORTS                NAMES
471f14219833   sample_nginx         "/docker-entrypoint.…"   20 minutes ago   Up 20 minutes   0.0.0.0:80->80/tcp   sample_nginx
81f7898f575f   sample_app           "docker-php-entrypoi…"   20 minutes ago   Up 20 minutes   9000/tcp             sample_app
08a95be64589   postgres:12-alpine   "docker-entrypoint.s…"   20 minutes ago   Up 20 minutes   5432/tcp             sample_db

//sample_appコンテナに入ってみる
$ docker exec -it sample_app /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown
//↑入れなかった
/bin/shで入る
$ docker exec -it sample_app /bin/sh
/app #

我对为什么/bin/bash不行而/bin/sh可以行有些不太明白。

如果使用docker-compose的情况下

$ docker-compose exec サービス名 /bin/sh

我们这次是以一个叫app的服务名字进行启动的。

$ docker-compose exec app /bin/sh
/app #

Docker的三种挂载方式

ボリュームマウント

ホストPC上にコンテナ用のデータファイルを作成し、コンテナ内の特定のディレクトリパスにマッピングする。複数のコンテナから1つのボリュームを共有することができる。コンテナ内で作成したファイルの永続化にはこのボリューム方法が推奨されている。

バインドマウント

ホストPCの特定のディレクトリ(絶対パス指定)を、コンテナ内の特定のディレクトリパスにマッピングする。ホスト側からコンテナで操作したファイルを確認する際にはバインドマウントは有効。開発する際などに利用すると良さそう。

tmpfsマウント

ホストPCのメモリ領域を、コンテナの特定のディレクトリパスにマッピングする。