Dockerの勉強メモ
序文
弱さと無知は生存の障害ではありませんが、傲慢は生存の障害です。謙虚に生きる1. Dockerの概要
1.1 Docker はなぜ登場するのですか?
まず、ソフトウェアの研究開発用に 2 セットの開発環境とオンライン本番環境を開発する必要がありますが、これらは問題が発生しやすいものです。
- バージョンアップによりサービスが利用できなくなる
- 環境の展開はさらに面倒です (特にクラスター Redis、ES、Hadoop)
たとえば、jar プロジェクトを公開するが、jar の操作が Redis、ES、Hadoop などの環境に依存する必要がある場合、つまり、プロジェクトをデプロイするには、まず上記の環境をインストールする必要があります。プロジェクトにはさらに時間と労力がかかります。このプロジェクトと環境を一緒にパッケージ化してデプロイできれば、はるかに効率的になります。
Docker は、上記の問題に対する解決策を提供します。特定のアプリケーションは、Java プログラムを apk ファイルとしてパッケージ化し、アプリ ストアに公開するのと似ています。次回使用するときにアプリ ストアでダウンロードできます。
- Java プログラム - .apk - アプリ ストアに公開 ------ ユーザーは .apk をダウンロードし、インストールして使用します。
- Java プログラム - プロジェクトと環境をミラーとしてパッケージ化 (jar + 依存環境) - Docker ウェアハウスにアップロード ------ 運用保守はリリースされたイメージをダウンロードし、直接実行します
このアイデアは、プロジェクトと環境をボックスに詰め込んだコンテナーから来ており、各ボックスは互いに分離されており、Docker は分離メカニズムを通じてサーバー リソースを最大限に活用できます。
1.2 Dockerの歴史
2010年、数人のプログラマーがパスクラウドコンピューティングサービス(LXC関連のコンテナ技術)の提供を目的としたdotCloudという会社を米国に設立した。彼らはそのテクノロジー(コンテナ化技術)を Docker と名付けましたが、Docker が誕生した当初、Docker は業界の注目を集めませんでした。
2013 年に、dotCloud のパフォーマンスがますます低下したため、オープンソースの Docker テクノロジーを選択しました。その後、Docker の利点に気づく人が増え、Docker が普及し、Docker は毎月新しいバージョンに更新されます。
2014 年 4 月 9 日に、Docker 1.0 がリリースされました。
1.3 なぜ Docker はこれほど人気があるのでしょうか?
一言で言えば、とても軽いです。コンテナ テクノロジが登場する前は、仮想マシン テクノロジ (VM) が使用されていました。Windows に Vmware をインストールし、このソフトウェアを通じて 1 つ以上のコンピュータを仮想化できましたが、これは比較的面倒でした。仮想マシンは仮想化技術に属し、Dockerコンテナ技術も仮想化技術に属します。
- VM、Linux Centos ネイティブ イメージ (つまり 1 台のコンピューター) の分離には、複数の仮想マシンを開く必要があり、数 G のストレージ領域を占有し、数分かかります
- ミラーリング メカニズムである Docker (コア環境: JDK+MySQL+Redis、非常に軽量) は分離されており、直接実行でき、必要なストレージ スペースは数十 M で、所要時間は数秒だけです。
Docker は Go 言語をベースに開発されたオープンソース プロジェクトであり、
公式 Web サイトのアドレス: https://www.docker.com/
ドキュメントのアドレス: https://docs.docker.com/
ウェアハウスのアドレス: https://hub.docker です。 com/
1.4 仮想マシン技術とコンテナ化技術の違い
- 仮想マシン テクノロジ: 従来の仮想マシンは、ハードウェアの一部を仮想化し、完全なオペレーティング システムを実行して、このシステムにソフトウェアをインストールして実行します。短所: リソースの使用量が多い、冗長な手順が多い、起動が遅い
- コンテナ化テクノロジ: 完全なオペレーティング システムをシミュレートする代わりに、以下の図のそれぞれの小さな四角形がイメージを表します。コンテナ内のアプリケーションはホスト上で直接実行され、コンテナには独自のカーネルや仮想ハードウェアがないため、非常に軽量です。各コンテナは互いに分離されており、各コンテナは独自のファイル システムを持ち、相互に影響を及ぼしません。
DevOps(開発・運用・保守)に関して
- より迅速な配信と展開
従来の展開: 大量のヘルプ ドキュメント、インストーラー
Docker 展開: パッケージ化されたイメージのワンクリック実行、リリース テスト- より便利なアップグレードとスケーリング
Docker デプロイメント アプリケーションは、ビルディング ブロックのようなものです。たとえば、プロジェクトでは SpringBoot 1.5、Redis 5、Tomcat 8 の 3 つの環境を使用します。このうち、Tomcat はアップグレードする必要があります。Docker によってイメージにパッケージ化されます。後は、イメージをアップグレードしてテストするだけです。その後のデプロイのみが必要です。この画像を使用する必要があります。サーバーのパフォーマンスがボトルネックに達した場合、横方向に拡張した方が便利です- システムの運用・保守が容易になり、
コンテナ化後はテスト環境とオンライン環境の整合性が高くなります。- コンピューティング リソースのより効率的な使用
Docker は、物理マシン上で多くのコンテナ インスタンスを実行できるカーネル レベルの仮想化です。サーバーのパフォーマンスを最大化できる
2.Dockerのインストール
2.1 Dockerの基本構成
画像: Docker イメージは、コンテナ サービスを作成できるテンプレートのようなものです tomcat イメージ ==> run ==> tomcat01 コンテナ (サービスを提供する)
コンテナ (コンテナ) : Docker はコンテナ テクノロジを使用して、1 つまたは複数のアプリケーションを独立して実行します。コンテナはイメージを通じて作成されます。コンテナはコマンドを使用して起動、停止、削除できます。
現在、コンテナは単純な Linux システムリポジトリとして理解できます。Docker ウェアハウスはイメージの保存に使用され、ウェアハウスはパブリック ウェアハウスとプライベート ウェアハウスに分かれています。DockerHub (デフォルトは外部)、Alibaba Cloud などはすべてコンテナ サーバー (構成されたイメージ アクセラレーション) を備えています
2.2 Dockerのインストール
環境の準備:
[root@ziang ~]# uname -r # 查看系统内核版本
3.10.0-1127.19.1.el7.x86_64
[root@ziang ~]# cat /etc/os-release # 查看系统信息
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
インストールを開始します。
# 1. 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2. 需要的安装包
yum install -y yum-utils
# 3. 设置镜像仓库
yum-config-manager --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 使用国内阿里云镜像仓库
# 更新yum软件包索引
yum makecache fast
# 4. 安装Docker引擎:docker引擎、docker客户端、守护进程containerd
yum install docker-ce docker-ce-cli containerd.io
# 5. 启动Docker
systemctl start docker
# 6. 查看Docker版本信息
docker version
# 7. Helloworld
docker run hello-world
# 8. 查看下载的hello-world镜像
docker images
# 9. (另)卸载Docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
Docker のデフォルトの作業パス (作業ディレクトリ): /var/lib/docker
2.3 Alibaba Cloud イメージの高速化
- Alibaba Cloud にログインし、イメージ コンテナを見つけます。
- ミラー加速度を求める
- を使用して設定します
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://f9ognzpb.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.4 docker runの実行処理
2.5 Docker の仕組み
Docker はクライアントサーバーアーキテクチャのシステムです. Docker デーモンはホスト上で動作し、クライアントからソケット経由でアクセスされます. Docker サーバーは docker-client からの命令を受け取ってから命令を実行します. Docker が VM より速いのはなぜですか
?
- Docker の抽象化レイヤーは仮想マシンよりも少ない
- Docker はホストのカーネルを使用し、VM にはゲスト OS が必要です。
図からわかるように、新しいコンテナーを作成するときに、Docker は仮想マシンのようにオペレーティング システム カーネルをリロードする必要はありません。仮想マシンがゲスト OS をロードするには数分かかりますが、Docker はホストを使用してこのプロセスを省略し、数秒かかります。
3.Dockerコマンド
ヘルプコマンド
docker version docker版本信息
docker info docker配置信息,包括镜像和容器数量
docker 命令 --help docker帮助命令,万能
公式ヘルプドキュメントのアドレス: https://docs.docker.com/engine/reference/run/
3.1 ミラーコマンド
すべてのローカル イメージを表示: docker イメージ
[root@ziang /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 4 months ago 13.3kB
rabbitmq management 246db2517862 8 months ago 186MB
# 列名解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATE 镜像的创建时间
SIZE 镜像的大小
# 可选项
--all , -a Show all images (default hides intermediate images)
--quiet , -q Only show image IDs
イメージ リポジトリ内のイメージを検索します: docker search
[root@ziang ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12047 [OK]
mariadb MariaDB Server is a high performing open sou… 4618 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 901 [OK]
# 可选项:通过搜索过滤
--filter=STARS=3000 # 搜索出来STARS大于3000的命令
イメージ ウェアハウスにイメージをダウンロードします: docker pull
[root@ziang ~]# docker pull mysql
Using default tag: latest # 如果不指定tag,默认latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete # 分层下载,docker image的核心,联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 以下两个命令等价
docker pull mysql
docker pull docker.io/library/mysql:latest
# 指定版本下载
[root@ziang ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists # 本地已存在的不再下载
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete # 仅下载缺少的
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
イメージの削除: docker rmi
# 指定tag删除
[root@ziang ~]# docker rmi -f c20987f18b13
Untagged: mysql:5.7
Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76
Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989
Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f
Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150
Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92
# 删除多个镜像(后面跟多个tag即可)
[root@ziang ~]# docker rmi -f c20987f18b13 feb5d9fea6a5 246db2517862
# 删除所有镜像
[root@ziang ~]# docker rmi -f $(docker images -aq)
3.2 コンテナコマンド
注: コンテナーはイメージを使用してのみ作成できるため、最初に centos イメージをダウンロードする必要があります: docker pull centos
新しいコンテナを作成して起動します: docker run
docker run [可选参数] image
# 可选参数
--name="dockerName" 容器名,用来区分容器
-d 以后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口,可以将主机端口映射到容器端口,方式有如下几种
-p ip:80:8080 主机ip:主机端口:容器端口
-p 80:8080 主机端口:容器端口(常用)
-p 8080 容器端口
8080 容器端口
-P 随机指定端口
# 启动并进入容器
[root@ziang ~]# docker run -it centos /bin/bash # 使用交互式运行centos镜像,进入容器中查看内容。交互运行需要借助控制台,指定使用/bin/bash控制
[root@d034a3a4f9f3 /]# ls # 查看容器内,由于是基础版本,很多命令是不完善的
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@d034a3a4f9f3 /]# exit # 退出容器
exit
コンテナーの表示: docker ps
[root@ziang ~]# docker ps # 查看当前正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@ziang ~]# docker ps -a # 查看所有运行的容器(包括曾经运行过的容器)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d034a3a4f9f3 centos "/bin/bash" 9 hours ago Exited (0) 9 hours ago vibrant_lamport
8b6f1b616774 centos "/bin/bash" 9 hours ago Exited (0) 7 hours ago strange_nash
548b160ded84 feb5d9fea6a5 "/hello" 10 hours ago Exited (0) 10 hours ago optimistic_proskuriakova
483aa315754d 246db2517862 "docker-entrypoint.s…" 8 months ago Created rabbitmq
[root@ziang ~]# docker ps -a -n=1 # 查看最近运行的1个容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d034a3a4f9f3 centos "/bin/bash" 9 hours ago Exited (0) 9 hours ago vibrant_lamport
[root@ziang ~]# docker ps -aq # 查看所有运行的容器,-q仅显示容器id
d034a3a4f9f3
8b6f1b616774
548b160ded84
483aa315754d
コンテナを終了します:終了
exit # 停止容器并退出
Ctrl + P + Q # 不停止容器退出
コンテナーの削除: docker rm
docker rm 容器id # 删除指定容器id的容器,通过-f参数可删除正在运行的容器
docker rm -f $(docker ps -aq) # 删除所有容器
docker ps -a -a|xargs docker rm # 删除所有容器
コンテナの起動と停止
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止运行中的容器
docker kill 容器id # 强制停止容器
[root@ziang ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@ziang ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d034a3a4f9f3 centos "/bin/bash" 9 hours ago Exited (0) 9 hours ago vibrant_lamport
[root@ziang ~]# docker start d034a3a4f9f3
d034a3a4f9f3
[root@ziang ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d034a3a4f9f3 centos "/bin/bash" 9 hours ago Up 3 seconds vibrant_lamport
[root@ziang ~]# docker stop d034a3a4f9f3
d034a3a4f9f3
[root@ziang ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Docker コンテナのステータスは、実行中、停止中です。run はコンテナを実行状態に開始し、stop はコンテナを停止し、rm はコンテナを非表示 (削除) にします。
3.3 その他のよく使用されるコマンド
バックグラウンドでコンテナを起動する
docker run -d 容器image
この方法でコンテナを起動した後、docker ps コマンドを使用して起動したコンテナが見つからないため、コンテナは停止しています。Docker コンテナはバックグラウンドで実行され、フォアグラウンド プロセスが必要です。フォアグラウンド アプリケーションが存在しないことが判明すると、Docker は自動的に停止します。たとえば、Nginx を起動するときに、コンテナが起動後にサービスを提供していないことが判明すると、コンテナはすぐに停止します。
コンテナログの表示: docker ログ
docker logs [可选参数] 容器id
# 可选参数
-tf # 查看日志,t表示带有时间戳
--tail n # 显示最后n条日志
デモ:
[root@ziang ~]# docker run -d centos /bin/sh -c "while true;do echo ziang.zhang;sleep 1;done"
08a4ec2e85f9b73090ea5a11955bfaba9df3027f5174b00e52fc5592247697d9
[root@ziang ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08a4ec2e85f9 centos "/bin/sh -c 'while t…" 4 seconds ago Up 3 seconds cool_hodgkin
[root@ziang ~]# docker logs -tf --tail 10 08a4ec2e85f9
2022-02-03T01:19:31.160489316Z ziang.zhang
2022-02-03T01:19:32.162057672Z ziang.zhang
2022-02-03T01:19:33.163674626Z ziang.zhang
2022-02-03T01:19:34.165353081Z ziang.zhang
2022-02-03T01:19:35.167349305Z ziang.zhang
2022-02-03T01:19:36.169027025Z ziang.zhang
2022-02-03T01:19:37.170892402Z ziang.zhang
2022-02-03T01:19:38.172620267Z ziang.zhang
2022-02-03T01:19:39.174546190Z ziang.zhang
2022-02-03T01:19:40.176468912Z ziang.zhang
2022-02-03T01:19:41.178292254Z ziang.zhang
コンテナ内のプロセス情報を表示します: docker top
docker top 容器id
[root@ziang ~]# docker top 08a4ec2e85f9
UID PID PPID C STIME TTY TIME CMD
root 4578 4558 0 09:18 ? 00:00:00 /bin/sh -c while true;do echo ziang.zhang;sleep 1;done
root 5181 4578 0 09:27 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
コンテナメタデータの表示: docker Inspection
docker inspect 容器id
[root@ziang ~]# docker inspect 08a4ec2e85f9
[
{
"Id": "08a4ec2e85f9b73090ea5a11955bfaba9df3027f5174b00e52fc5592247697d9",
"Created": "2022-02-03T01:18:56.873267955Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo ziang.zhang;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 4578,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-02-03T01:18:57.079480925Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/08a4ec2e85f9b73090ea5a11955bfaba9df3027f5174b00e52fc5592247697d9/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/08a4ec2e85f9b73090ea5a11955bfaba9df3027f5174b00e52fc5592247697d9/hostname",
"HostsPath": "/var/lib/docker/containers/08a4ec2e85f9b73090ea5a11955bfaba9df3027f5174b00e52fc5592247697d9/hosts",
"LogPath": "/var/lib/docker/containers/08a4ec2e85f9b73090ea5a11955bfaba9df3027f5174b00e52fc5592247697d9/08a4ec2e85f9b73090ea5a11955bfaba9df3027f5174b00e52fc5592247697d9-json.log",
"Name": "/cool_hodgkin",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {
}
},
"NetworkMode": "default",
"PortBindings": {
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/666f081c125b11f2c166ce349a8e6bce578d4720b1b76fdc6afd58b7c6993f43-init/diff:/var/lib/docker/overlay2/ab82fd3f5f7dfd160f732a74032059d85648202a69601a95239ef244ea6a4c3f/diff",
"MergedDir": "/var/lib/docker/overlay2/666f081c125b11f2c166ce349a8e6bce578d4720b1b76fdc6afd58b7c6993f43/merged",
"UpperDir": "/var/lib/docker/overlay2/666f081c125b11f2c166ce349a8e6bce578d4720b1b76fdc6afd58b7c6993f43/diff",
"WorkDir": "/var/lib/docker/overlay2/666f081c125b11f2c166ce349a8e6bce578d4720b1b76fdc6afd58b7c6993f43/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "08a4ec2e85f9",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"while true;do echo ziang.zhang;sleep 1;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "b3eb26048d3703c07248154ca751b1c05e9cdcdced88e3df18da451914c555fd",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
},
"SandboxKey": "/var/run/docker/netns/b3eb26048d37",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "54ca19d0722608eb645ee47d5e07d482b2d5cfe6533591d3cc33e6912e5a14a4",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "7b73a049c8d1d281d8c66fe3dc1471696c813349d7e543123860c0f82c5aba97",
"EndpointID": "54ca19d0722608eb645ee47d5e07d482b2d5cfe6533591d3cc33e6912e5a14a4",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
実行中のコンテナに入る
通常はバックグラウンドモードでコンテナを実行しますが、コンテナに入るには次の 2 つの方法を選択できます:
方法 1: docker exec -it 容器id /bin/bash
(よく使用される)
方法 2:docker attach 容器id
前者: コンテナに入るときに新しいターミナルを開きます。後者はコンテナが実行されているターミナルに入りますが、新しいターミナルは開きません
コンテナからホストにファイルをコピーする
docker cp 容器id:容器路径 主机路径
3.4 概要
attach Attach to a running container # 当前shell下attach连接指定运行镜像
build Build an image from a Dockerfile # 通过Dockerfile定制镜像
commit Create a new image from a container changes # 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path # 从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新容器,同run,但不启动容器
diff Inspect changes on a container # 查看docker容器变化
events Get real time events from the server # 从docker服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个tar归档文件[对应 import]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统镜像[对应 export]
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container # 查看容器详细信息
kill Kill a runing container # kill指定docker容器
load Load an image from a tar archive # 从一个tar包中加载一个镜像[对应 save]
login Register or Login to the docker registry server # 注册或登陆一个docker源服务器
logout Log out from a Docker registry server # 从当前Docker registry退出
logs Fetch the logs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口
pause Pause all processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或库镜像
push Push an image or repository to the docker registry server # 推送指定镜像或库镜像至docker源服务器
restart Restart a running container. # 重启运行的容器
rm Remove one or more container. # 移除一个或多个容器
rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需要先删除该容器或-f强制删除]
run Run a command in a new container. # 创建一个新的容器并运行一个命令
save Save an image to a tar archive. # 保存一个镜像为一个tar包[对应 load]
search Search for an image on the Docker Hub # 在docker hub中搜索镜像
start Start a stopped containers # 启动容器
stop Stop a running containers # 停止容器
tag Tag # 查看容器中运行的进程信息
unpause Unpause a paused container # 取消暂停容器
version Show the docker version informatioins # 查看docker版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的推出状态值
3.5 Docker を使用して Nginx をデプロイする練習をする
[root@ziang ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@ziang ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 5 weeks ago 141MB
centos latest 5d0da3dc9764 4 months ago 231MB
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内部端口
[root@ziang ~]# docker run -d --name nginx01 -p:3344:80 nginx
f7ff85d30a3099f60b88de8ec4db877ceed5a1b27722ccc5bee4b333cd7c3eb5
[root@ziang ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html {
color-scheme: light dark; }
body {
width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
ポート公開の概念
3.5 視覚化ツール
- ポーター (最初にこれを使用)
- 牧場主 (CI/CD 再利用)
ポーターとは何ですか?
操作可能なバックエンド パネルを提供する Docker グラフィカル インターフェイス管理ツール。次のコマンドを使用してポテイナーを起動します。
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/potainer
ブラウザ http://ip:8088/ からアクセスすると、次のログイン インターフェイスが表示されます。
入力後、ビジュアル パネルに従って制御できます。
4.Dockerイメージ
4.1 鏡とは何ですか?
イメージは、ソフトウェア実行環境とその実行環境に基づいて開発されたソフトウェアをパッケージ化するために使用される、軽量で実行可能な独立したソフトウェア パッケージです。イメージには、コード、ランタイム、ライブラリ、環境、変数、構成ファイルなど、特定のソフトウェアを実行するために必要なものがすべて含まれています。簡単に言うと、アプリケーションを Docker イメージとして直接パッケージ化して実行できます。
画像の取得方法:
- リモートリポジトリからダウンロード
- 友達がそれをあなたにコピーします
- ミラー Dockerfile を自分で作成する
4.2 Docker イメージの読み込み原理
UnionFS (ユニオン ファイル システム)
UnionFS (Union File System): Union File System (UnionFS) は、階層型、軽量、高性能のファイル システムです。ファイル システムへの変更をサポートし、1 つのサブミッションとしてレイヤーごとに重ね合わせることもできます。また、マウントされている異なるディレクトリを結合することもできます同じ仮想ファイル システムに統合します (複数のディレクトリを 1 つの仮想ファイル システムに統合します)。Union ファイル システムは Docker イメージの基礎です。階層化によるイメージの継承が可能で、ベースイメージ(親イメージなし)をベースに、さまざまな具体的なアプリケーションイメージを生成できます。
機能: 複数のファイル システムを同時にロードしますが、外部からは 1 つのファイル システムしか見えません。共同ロードではファイル システムの各層が重ね合わされるため、最終的なファイル システムには基礎となるすべてのファイルとディレクトリが含まれます。
Docker イメージの読み込み原理
Docker のイメージは実際にはレイヤーごとのファイル システムで構成されており、このレイヤーはファイル システム UnionFS です。
Dootfs (ブート ファイル システム) には主にブートローダーとカーネルが含まれています。ブートローダーは主にカーネルをロードします。Linux の最初の起動時に、bootfs ファイル システムがロードされます。Docker イメージの最下層は bootfs です。この層は、ブート ローダーとカーネルを含む、一般的な Linux/Unix システムと同じです。ブートのロードが完了すると、カーネル全体がメモリ内に存在します。この時点で、メモリの使用権は bootfs からカーネルに転送されます。このとき、システムは bootfs もアンインストールします。
bootfs の上にある Rootfs (ルート ファイル システム) には、一般的な Linux システムの /dev、/proc、/etc などの標準ディレクトリとファイルが含まれています。Rootfs は、Ubuntu、CentOS などのさまざまなオペレーティング システム ディストリビューションを指します。
通常、仮想マシンにインストールする CentOS のサイズは数 G 程度ですが、Docker イメージはなぜ 200M しかないのでしょうか?
合理化された OS の場合、rootfs は非常に小さくてもよく、最も基本的なコマンド、ツール、ライブラリのみを含める必要があります。最下層はホストのカーネルを直接使用するため、rootfs を提供するだけで済みます。異なる Linux ディストリビューションでは、rootfs は基本的に同じですが、rootfs は異なるため、異なるディストリビューションで bootfs を共有できることがわかります。
4.3 階層化の理解
イメージをダウンロードし、印刷されたログ出力を観察すると、イメージがレイヤーごとにダウンロードされていることがわかります。
[root@ziang ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists
c7a4e4382001: Pull complete
4044b9ba67c9: Pull complete
c8388a79482f: Pull complete
413c8bb60be2: Pull complete
1abfd3011519: Pull complete
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
理解してください:
すべての Docker イメージはベース イメージから始まり、変更が行われるか新しいコンテンツが追加されると、現在のイメージ レイヤーの上に新しいイメージ レイヤーが作成されます。
たとえば、Ubuntu Linux 16.04 に基づいて新しいイメージを作成する場合、これは新しいイメージの最初のレイヤーになります。Python パッケージをイメージに追加すると、2 番目のイメージ レイヤーがベース イメージ レイヤー上に作成されます。引き続きセキュリティ パッチを追加すると、3 番目のイメージ レイヤーが作成されます。
以下の図に示すように、画像には現在 3 つの画像レイヤーが含まれています (これはデモンストレーションのための非常に単純な例にすぎません)。
画像レイヤーを追加する際、画像は常に現在のすべての画像の組み合わせのままであることを理解することが重要です。次の図は簡単な例を示しており、各イメージ レイヤーには 3 つのファイルが含まれており、イメージには 2 つのイメージ レイヤーからの 6 つのファイルが含まれています。
上の図のミラー層は前の図とは少し異なりますが、主な目的はファイルを表示しやすくすることです。
次の図は、少し複雑な 3 層の画像を示しています。外側から見ると、画像全体には 6 つのファイルしかありません。これは、最上層のファイル 7 がファイル 5 の更新バージョンであるためです。
この場合、上の画像レイヤーのファイルが下の画像レイヤーのファイルを上書きします。これにより、ファイルの更新バージョンが新しいイメージ レイヤーとしてイメージに追加されます。
Docker は、ストレージ エンジン (新しいバージョンではスナップショット メカニズムを使用) を通じてイメージ レイヤー スタックを実装し、複数のイメージ レイヤーが統合されたファイル システムとして表示されるようにします。
Linux で使用できるストレージ エンジンは、AUFS、Overlay2、Device Mapper、Btrfs、および ZFS です。名前が示すように、各ストレージ エンジンは Linux の対応するファイル システムまたはブロック デバイス テクノロジに基づいており、各ストレージ エンジンは独自のパフォーマンス特性を持っています。
Docker は、Windows 上で 1 つのストレージ エンジン windowsfilter のみをサポートします。これは、NTFS ファイル システムに基づいて階層化と Cow を実装します。
以下の図は、システム ディスプレイと同じ 3 層イメージを示しています。すべてのミラーリング レイヤーは積み重ねられ、結合されて、外の世界に統一されたビューが提供されます。
Docker イメージ レイヤーは読み取り専用であり、コンテナーが起動すると、新しい書き込み可能なレイヤーがイメージの上に読み込まれます。この層は通常コンテナ層と呼ばれるもので、コンテナの下にあるものはすべてミラー層と呼ばれます。すべての操作はコンテナー層に基づいています
4.4 コミットイメージ
docker commit # 提交容器成为一个新的副本
docker commit -m="commit note" -a="author" 容器id 目标镜像名:[TAG] # 命令和git类似
デモ:
# 1.启动一个tomcat容器
[root@ziang ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d7f032ea599 tomcat "catalina.sh run" 9 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp nervous_maxwell
f7ff85d30a30 nginx "/docker-entrypoint.…" 7 days ago Up 7 days 0.0.0.0:3344->80/tcp nginx01
08a4ec2e85f9 centos "/bin/sh -c 'while t…" 7 days ago Up 7 days cool_hodgkin
[root@ziang ~]# docker exec -it 7d7f0 /bin/bash
root@7d7f032ea599:/usr/local/tomcat# ls webappps
# 2.tomcat官方镜像默认webapps目录下是空的,拷贝基本文件到webapps目录下
root@7d7f032ea599:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@7d7f032ea599:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@7d7f032ea599:/usr/local/tomcat# ls webapps
ROOT docs examples host-manager manager
# 3.将操作过的容器commit为一个镜像。以后可以使用该镜像启动容器
[root@ziang ~]# docker commit -a="ziang.zhang" -m="add some files to webapps" 7d7f03 tomcat.ziang.1.0
sha256:3418d38b10501944949f7230ad332d930e149a20294ee7f4e92d05b4ebd262e9
# 4.查看刚刚提交的镜像tomcat.ziang.1.0,发现它比tomcat大13MB,这就是cp操作后的结果
[root@ziang ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat.ziang.1.0 latest 3418d38b1050 9 seconds ago 693MB
nginx latest 605c77e624dd 6 weeks ago 141MB
tomcat latest fb5657adc892 7 weeks ago 680MB
redis latest 7614ae9453d1 7 weeks ago 113MB
centos latest 5d0da3dc9764 4 months ago 231MB
portainer/portainer latest 580c0e4e98b0 10 months ago 79.1MB
コンテナーの状態を保存したい場合は、コミットを通じてコンテナーを送信し、新しいイメージを取得します。
上記のコマンドを学習したら、正式に Docker の学習を開始できます。
5. コンテナのデータ量
5.1 コンテナデータボリュームとは何ですか?
Docker は、アプリケーションと環境をイメージにパッケージ化し、イメージを通じてコンテナーを起動します。2 つの質問について考えてみましょう。
- mysql コンテナを起動すると、mysql 内に大量のデータが保存されますが、このときにコンテナが強制終了されると、コンテナに保存されているデータが失われます。
- コンテナ内の設定ファイルを頻繁に変更する必要がある場合、毎回コンテナに入って変更するのは面倒です。
したがって、Docker には、コンテナー内で生成されたデータをローカルに同期するためのデータ永続化および同期メカニズムが必要です。このメカニズムはコンテナー データ ボリュームです。コンテナー内のディレクトリはローカル ディレクトリにハングされます。コンテナー データ ボリューム テクノロジを使用すると、ホストディレクトリは、
コンテナ内のディレクトリとともにマウントでき、一方のディレクトリでコンテンツが更新されると、もう一方のディレクトリも同期して更新されます。また、コンテナーが存在する限り、コンテナーが開始されているかどうかに関係なく、データの同期は継続して行われます。コンテナが rm の場合、データはまだ存在しますが、同期は行われなくなります。
概要: コンテナ データ ボリュームは、コンテナ データの永続化および同期テクノロジであり、このテクノロジはコンテナ間でも使用できます。
5.2 コンテナデータ量の利用方法1:パラメータ -v
方法 1: コンテナーの起動時に -v パラメーターを使用する
docker run -it -v 主机目录1:容器目录1 -v 主机目录2:容器目录2 ...
実践的な戦闘: MySQL をインストールし、コンテナ データ ボリュームを使用する
1.docker pull mysql:5.7
# 参数
-d 后台启动
-p 端口暴露
-v 数据卷挂载
-e 环境变量配置
--name 容器命名
2.docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
3.启动成功后,使用MySQL图形界面连接到服务器的3306端口,创建一个数据库并在其中创建表进行插入操作
4.去服务器/home/mysql/data目录下查看是否创建了该目录(数据库)与文件(表)
ホストのマウントディレクトリとコンテナ内のマウントディレクトリが存在しない場合は、自動的に作成されます。
5.3 名前付きマウントと匿名マウント
# 匿名挂载:-v 容器目录(仅指定容器目录)
[root@ziang ~]# docker run -d -P -v /etc/nginx --name nginx02 nginx # -P 随机指定端口
61dacb811c228b36fea583509bd303dcc2c22647631e6cfe2ca780c353bb29ef
# 查看所有容器数据卷情况,每一条数据代表一个真实存在的目录
[root@ziang ~]# docker volume ls
DRIVER VOLUME NAME
local 26cd6fb4a595803c408f4b43f2fb97ca46df35a2ca6634ee3dded63a5b7ed235
local 922e29647b7fcc546841088a0e9580e79c849cd669096ce306cd2c74b4d464a0
local 62326bf1e0e8601ca8e2f0961d54deae6de13d05a605b1a242551592a1a36236
local d7331eebf78e6fe7e5793efc256a3dacec290d698c28fd6eabc98a0a06b6176d
local e5300d1e74f17909816fc94b1445e7e686d27283fff2047d7128026392dad324
# 具名挂载:-v 卷名/容器目录
[root@ziang ~]# docker run -d -P -v juming-nginx:/etc/nginx --name nginx03 nginx
59d2cc2ba71fb03c01a7beb42ced116345498ecf25a60c43a411ec395aeb3dd8
[root@ziang ~]# docker volume ls
DRIVER VOLUME NAME
local 26cd6fb4a595803c408f4b43f2fb97ca46df35a2ca6634ee3dded63a5b7ed235
local 922e29647b7fcc546841088a0e9580e79c849cd669096ce306cd2c74b4d464a0
local 62326bf1e0e8601ca8e2f0961d54deae6de13d05a605b1a242551592a1a36236
local d7331eebf78e6fe7e5793efc256a3dacec290d698c28fd6eabc98a0a06b6176d
local e5300d1e74f17909816fc94b1445e7e686d27283fff2047d7128026392dad324
local juming-nginx
# 查看目录位置(在没有指定目录的情况下,所有挂载的目录都在/var/lib/docker/volumes/下)
[root@ziang ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-02-15T23:20:50+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
ボリュームは名前付きマウントを使用して簡単に見つけることができます。ほとんどの場合、名前付きマウントが使用されます。
どのような取り付け方法が使用されているかを確認するにはどうすればよいですか?
- マウントするパスを指定します: -v ホスト パス:コンテナ パス
- 匿名マウント: コンテナ内の -v パス
- 名前付きマウント: -v ボリューム名: コンテナー パス
拡大する:
# -v 容器内路径:ro
ro readonly 只读,数据只能在外部改变,容器内部只能读数据
docker run -d -P -v juming-nginx:/etc/nginx:ro --name nginx03 nginx
# -v 容器内路径:rw
rw readrwrite 可写,数据可以在外部改变,也可以在内部改变
docker run -d -P -v juming-nginx:/etc/nginx:rw --name nginx03 nginx
# 一旦设置了该权限,挂载出来的内容就会存在限定。
# 只要看到ro,就说明该目录内容只能由宿主机来操作,容器内部无法操作
5.4 コンテナ データ ボリュームを使用する方法 2: Dockerfile
DockerFile は Docker イメージを構築するために使用されるファイルで、その内容はイメージを生成するためのコマンド スクリプトです。
イメージはレイヤーごとの構造であり、DockerFile のコマンドの各行はレイヤーの 1 つに対応します。
[root@ziang containerDataVolume]# vim dockerfile1
[root@ziang containerDataVolume]# cat dockerfile1
FROM centos # 使用基础镜像
VOLUME ["volume01","volume02"] # 挂载数据卷(匿名挂载)
CMD echo "----- end -----" # 执行
CMD /bin/bash
# -f dockerfile路径;-t 镜像名
[root@ziang containerDataVolume]# docker build -f dockerfile1 -t ziangTest/centos .
Sending build context to Docker daemon 4.608kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 914d32002e92
Removing intermediate container 914d32002e92
---> a45fc8e2da0a
Step 3/4 : CMD echo "----- end -----"
---> Running in d574aa3ce16b
Removing intermediate container d574aa3ce16b
---> cff2dd066931
Step 4/4 : CMD /bin/bash
---> Running in e44806b5d641
Removing intermediate container e44806b5d641
---> e3771927547f
Successfully built e3771927547f
Successfully tagged ziangTest/centos:latest
[root@ziang containerDataVolume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ziangTest/centos latest e3771927547f 4 minutes ago 231MB
tomcat.ziang.1.0 latest 3418d38b1050 5 days ago 693MB
nginx latest 605c77e624dd 6 weeks ago 141MB
tomcat latest fb5657adc892 7 weeks ago 680MB
redis latest 7614ae9453d1 8 weeks ago 113MB
mysql latest 3218b38490ce 8 weeks ago 516MB
centos latest 5d0da3dc9764 5 months ago 231MB
portainer/portainer latest 580c0e4e98b0 11 months ago 79.1MB
[root@ziang ~]# docker run -it ziangTest/centos /bin/bash
[root@547072811dc7 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Feb 16 13:28 dev
drwxr-xr-x 1 root root 4096 Feb 16 13:28 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 14:17 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 110 root root 0 Feb 16 13:28 proc
dr-xr-x--- 2 root root 4096 Sep 15 14:17 root
drwxr-xr-x 11 root root 4096 Sep 15 14:17 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Feb 16 13:28 sys
drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp
drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x 20 root root 4096 Sep 15 14:17 var
drwxr-xr-x 2 root root 4096 Feb 16 13:28 volume01 # 挂载目录1
drwxr-xr-x 2 root root 4096 Feb 16 13:28 volume02 # 挂载目录2
[root@73216b2be2dd volume01]# exit
exit
[root@ziang ~]# docker inspect 73216b2be2dd
# 在Mounts中可看到该容器的数据卷挂载信息
この方法は比較的一般的で、独自のイメージを構築するときにボリュームをマウントできます。イメージの構築時にボリュームがマウントされていない場合は、コンテナの起動時に -v パラメータを使用してマウントできます。
5.5 データボリュームコンテナ
デモ:
[root@ziang ~]# docker run -it --name dockerA ziang/centos
[root@ziang ~]# docker run -it --name dockerB --volumes-from dockerA ziang/centos
[root@ziang ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f406eff2f33c ziang/centos "/bin/sh -c /bin/bash" 39 seconds ago Up 38 seconds dockerB
671c33eb072f ziang/centos "/bin/sh -c /bin/bash" About a minute ago Up About a minute dockerA
[root@ziang ~]# docker attach 671c33eb072f
[root@671c33eb072f /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
[root@671c33eb072f /]# cd volume01
[root@671c33eb072f volume01]# touch abc.java
[root@671c33eb072f volume01]# read escape sequence # ctrl + p + q
[root@ziang ~]# docker attach f406eff2f33c
[root@f406eff2f33c /]# cd volume01
[root@f406eff2f33c volume01]# ls
abc.java # dockerA创建的文件同步到了dockerB,相当于A被B继承,A就是数据卷容器
[root@ziang ~]# docker run -it --name dockerC --volumes-from dockerA ziang/centos
[root@aaf87d82d739 /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
[root@aaf87d82d739 /]# cd volume01
[root@aaf87d82d739 volume01]# ls
abc.java # 再创建一个dockerC同步挂载dockerA,该文件也存在
[root@ziang ~]# docker rm -f 671c33eb072f
671c33eb072f
[root@ziang ~]# docker attch f406eff2f33c
docker: 'attch' is not a docker command.
See 'docker --help'
[root@ziang ~]# docker attach f406eff2f33c
[root@f406eff2f33c volume01]# ls
abc.java # 删除dockerA,其他容器仍存在该文件
複数の MySQL コンテナ間のデータ同期
[root@ziang ~]# docker run -d -p 3345:3306 --name mysqlA -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
[root@ziang ~]# docker run -d -p 3346:3306 --name mysqlB -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysqlA mysql:5.7
概要: 構成情報はコンテナ間で転送でき、データ ボリューム コンテナのライフ サイクルは、コンテナが使用されなくなるまで継続します。
6.ドッカーファイル
6.1 DockerFile の概要
Dockerfile は、Docker イメージ、コマンド パラメーター スクリプトを構築するために使用されるファイルです。
ビルド手順:
- Dockerfileを書く
- docker build はイメージとしてビルドします
- docker run はイメージを実行します
- docker Push は DockerHub または Alibaba Cloud イメージ ウェアハウスに公開します
公式イメージの多くは基本的なパッケージであり、多くの機能を備えていないため、ユーザーは必要に応じて独自のイメージを構築する必要があります。
6.2 DockerFileのビルドプロセス
基礎知識:
- キーワードディレクティブの単語は大文字で表記されます
- 実行順序は上から下へ
- 「#」はコメントを示します
- 各命令は新しい画像レイヤーを作成して送信します。
DockerFile は開発用です。将来、プロジェクトをミラーとして公開したい場合は、DockerFile ファイルを作成する必要があります。このファイルは非常に単純です。Docker ミラーは、徐々にエンタープライズ配信の標準になっています
。
- DockerFile: ビルド ファイル、すべてのステップを定義、ソース コード
- DockerImages: DockerFile ビルドによって生成されたイメージ、最終的にリリースされ実行中の製品
- DockerContainer: コンテナはイメージによって実行され、サービスを提供します
6.3 DockerFileコマンド
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是由谁编写的,姓名+邮箱
RUN # 镜像构建时需要运行的命令
ADD # 构建步骤,比如搭建一个tomcat镜像,需要加入一个tomcat的压缩包,即添加内容
WORKDIR # 镜像的工作目录
VOLUME # 设置容器卷,挂载的目录
EXPOSE # 暴露端口,写了该参数就不需要在run -p中指定端口
CMD # 指定该容器启动时(docker run)要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定该容器启动时(docker run)要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承的DockerFile,这个时候会运行 ONBUILD的指令(触发指令)
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建时设置环境变量
6.4 実技試験
DockerHub のイメージの 99% は、基本イメージであるゼロから始まり、
デモを構築するために必要な構成とソフトウェアを追加します。
# 1.编写Dockerfile文件
[root@ziang dockerfile]# cat dockerfile-mycentoscat dockerfile-mycentos
FROM centos # 从centos开始构建
MAINTAINER ziangzhang<[email protected]> # 构建人信息
ENV MYPATH /use/local # 设置环境变量
WORKDIR $MYPATH # 工作目录(一进入镜像就会首先在工作目录)
RUN yum -y install vim # 下载vim
RUN yum -y install net-tools # 下载net-tools
EXPOSE 80 # 暴露端口
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
# 2.通过文件构建镜像
# docker build -f dockerfile文件路径 -t 镜像仓库/镜像名(镜像名称:版本号)
[root@ziang dockerfile]# cat dockerfile-mycentosdocker build -f dockerfile-mycentos -t mycentos:0.1 .
イメージの変更履歴を一覧表示します: docker History イメージ ID/イメージ名
6.4 CMD と ENTRYPOINT の違い
CMD # 指定该容器启动时(docker run)要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定该容器启动时(docker run)要运行的命令,可以追加命令
デモ:
# CMD
[root@ziang dockerfile]# cat dockerfile-cmd-test
FROM tomcat
CMD ["ls","-a"]
[root@ziang dockerfile]# docker build -f dockerfile-cmd-test -t dockerfile-cmd:0.1 .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM tomcat
---> fb5657adc892
Step 2/2 : CMD ["ls","-a"]
---> Using cache
---> 9e26f3ba0a87
Successfully built 9e26f3ba0a87
Successfully tagged dockerfile-cmd:0.1
[root@ziang dockerfile]# docker run dockerfile-cmd:0.1
.
..
BUILDING.txt
CONTRIBUTING.md
LICENSE
NOTICE
README.md
RELEASE-NOTES
RUNNING.txt
bin
conf
lib
logs
native-jni-lib
temp
webapps
webapps.dist
work
# 想在运行该容器时追加一个命令-l想达到ls -al的效果,但在CMD下-l替换了CMD ["ls","-a"],-l并非命令,所以报错
[root@ziang dockerfile]# docker run dockerfile-cmd:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
# ENTRYPOINT
[root@ziang dockerfile]# cat dockerfile-entrypoint-test
FROM tomcat
ENTRYPOINT ["ls","-a"]
[root@ziang dockerfile]# docker build -f dockerfile-entrypoint-test -t dockerfile-entrypoint:0.1 .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM tomcat
---> fb5657adc892
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 43fa27dc91b0
Removing intermediate container 43fa27dc91b0
---> e95e71dd650b
Successfully built e95e71dd650b
Successfully tagged dockerfile-entrypoint:0.1
[root@ziang dockerfile]# docker run dockerfile-entrypoint:0.1
.
..
BUILDING.txt
CONTRIBUTING.md
LICENSE
NOTICE
README.md
RELEASE-NOTES
RUNNING.txt
bin
conf
lib
logs
native-jni-lib
temp
webapps
webapps.dist
work
[root@ziang dockerfile]# docker run dockerfile-entrypoint:0.1 -l
total 168
drwxr-xr-x 1 root root 4096 Dec 22 17:07 .
drwxr-xr-x 1 root root 4096 Dec 22 17:00 ..
-rw-r--r-- 1 root root 18994 Dec 2 22:01 BUILDING.txt
-rw-r--r-- 1 root root 6210 Dec 2 22:01 CONTRIBUTING.md
-rw-r--r-- 1 root root 60269 Dec 2 22:01 LICENSE
-rw-r--r-- 1 root root 2333 Dec 2 22:01 NOTICE
-rw-r--r-- 1 root root 3378 Dec 2 22:01 README.md
-rw-r--r-- 1 root root 6905 Dec 2 22:01 RELEASE-NOTES
-rw-r--r-- 1 root root 16517 Dec 2 22:01 RUNNING.txt
drwxr-xr-x 2 root root 4096 Dec 22 17:07 bin
drwxr-xr-x 2 root root 4096 Dec 2 22:01 conf
drwxr-xr-x 2 root root 4096 Dec 22 17:06 lib
drwxrwxrwx 2 root root 4096 Dec 2 22:01 logs
drwxr-xr-x 2 root root 4096 Dec 22 17:07 native-jni-lib
drwxrwxrwx 2 root root 4096 Dec 22 17:06 temp
drwxr-xr-x 2 root root 4096 Dec 22 17:06 webapps
drwxr-xr-x 7 root root 4096 Dec 2 22:01 webapps.dist
drwxrwxrwx 2 root root 4096 Dec 2 22:01 work
6.5 実戦:Tomcatイメージの作成
1 イメージ ファイルを準備します: Tomcat 圧縮パッケージ、JDK 圧縮パッケージ
2 Dockerfile を書き込みます。正式名は ですDockerfile
。docker build はこの名前のファイルを自動的に検索します。-f パラメーターで指定する必要はありません。
FROM centos
MAINTAINER ziang.zhang<[email protected]>
COPY readme.txt /usr/local/readme.txt
ADD apache-tomcat-9.0.33.tar.gz /usr/local/
ADD jdk-8u65-linux-x64.rpm /usr/local/
RUN yum -y install vim
ENV MYWORKPATH /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_65
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/toos.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.33
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.33
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
WORKDIR $MYWORKPATH
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.33/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.33/bin/logs/catalina.out
[root@ziang zhangziang]# ls
apache-tomcat-9.0.33.tar.gz readme.txt
Dockerfile redis-6.0.6.tar.gz
jdk-8u65-linux-x64.rpm
[root@ziang zhangziang]# vim Dockerfile
[root@ziang zhangziang]# cat Dockerfile
FROM centos
MAINTAINER ziang.zhang<[email protected]>
COPY readme.txt /usr/local/readme.txt
COPY jdk-8u65-linux-x64.rpm /usr/local/
ADD apache-tomcat-9.0.33.tar.gz /usr/local/
RUN yum -y install vim
RUN rpm -ivh /usr/local/jdk-8u65-linux-x64.rpm
ENV MYWORKPATH /usr/local
ENV JAVA_HOME /usr/java/jdk1.8.0_65
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/toos.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.33
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.33
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
WORKDIR $MYWORKPATH
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.33/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.33/bin/logs/catalina.out
[root@ziang zhangziang]# docker build -t zomcat:0.1 .
[root@ziang zhangziang]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zomcat 0.1 49635e747d1d 2 minutes ago 407MB
# 挂载数据卷时,宿主机与容器中没有的目录会自动创建。挂载webapps目录后,发布的项目可以直接放置在本地
[root@ziang zhangziang]# docker run -d -p 9090:8080 --name ziangtomcat -v /home/zhangziang/tomcat/webapps:/usr/local/apache-tomcat-9.0.33/webapps/test -v /home/zhangziang/tomcat/logs:/usr/local/apache-tomcat-9.0.33/logs zomcat:0.1
6.6 独自のイメージを公開する
DockerHub に公開する
- DockerHub https://hub.docker.com/にアクセスし、自分のアカウントを登録します。
docker login
コマンドを使用してログインしますdocker push
コマンドを使用して独自のイメージを DockerHub に公開します
Alibaba Cloud 画像ウェアハウスに公開する
- Alibaba Cloud にログインし、コンテナ イメージ サービスを見つけます。
- ネームスペースとイメージリポジトリを作成する
- ミラーウェアハウスに入り、使用手順を表示します
相关命令:
$ docker login --username=tz**** registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ziang_repository/demo01:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/ziang_repository/demo01:[镜像版本号]
$ docker pull registry.cn-hangzhou.aliyuncs.com/ziang_repository/demo01:[镜像版本号]
Dockerコマンドの概要
7. Docker ネットワークの原則
7.1 docker0 について
サーバー上でコマンドを実行するとip addr
、次の 3 つのネットワーク カードが表示されます。3
つのネットワークはそれぞれ 3 つの環境を表します。では、Docker はコンテナ ネットワーク アクセスをどのように処理するのでしょうか?
まず、次の 2 つの質問について考えてください。
- マシンがコンテナの IP に ping できるかどうか
- コンテナが別のコンテナの IP アドレスに ping できるかどうか
答えは「はい」です。サーバーに docker をインストールすると、新しいネットワーク カード docker0 (ブリッジ モード) が追加されます。使用されるテクノロジは evth-pair です。docker コンテナーが起動されるたびに、IP が docker コンテナーに割り当てられます。
docker run でコンテナを起動し、IP アドレスを再度確認すると、新しいネットワーク カードが表示されていることがわかります。コンテナに入って ip addr コマンドを実行すると、ネットワーク カードが再び表示されます。これは、ネットワーク カードがコンテナの内側と外側の両方で表示されることを意味します。 コンテナを再度起動した後: 上記の実験から確認でき
ます
。ネットワーク カードがペアになっていること。evth-pair は仮想デバイス インターフェイスのペアであり、一方の端がプロトコルに接続され、もう一方の端が相互に接続されているため、通常、evth-pair はさまざまな仮想ネットワーク デバイスを接続するためのブリッジとして使用されます。たとえば、OpenStack、Docker コンテナ間の接続、および OVS 接続はすべて evth-pair テクノロジーを使用します。
結論: tomcat01 と tomcat02 は同じルーター docker0 を共有します。すべてのコンテナーがネットワークを指定しない場合、コンテナーは docker0 によってルーティングされます。Docker はデフォルトの使用可能な IP をコンテナーに割り当てます。
概要: Docker は Linux ブリッジングを使用し、ホストの docker0 が Docker コンテナのブリッジとして機能します。Docker のすべてのネットワーク インターフェイスは仮想であり、高い転送効率を備えています。コンテナが削除されると、対応するブリッジのペアが消えます。