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のメモリ領域を、コンテナの特定のディレクトリパスにマッピングする。