Docker入門編と上級編(基本+実戦+上級+Compose+Swarm)の超詳細版

Docker 入門および上級 (基本 + 実用 + 上級)

1. Docker の紹介

1.1 ドッカーの概要

Docker はオープン ソースで軽量です应用容器引擎

適用シナリオ

  • Web アプリケーションのパッケージ化と公開の自動化。
  • 自動テストと継続的統合、リリース。
  • データベースまたはその他のバックエンド アプリケーションをサービス指向の環境にデプロイして調整します。

Docker と仮想マシンの比較

  • 従来の仮想マシンは、ハードウェアを仮想化し、完全なオペレーティング システムを実行してから、このシステムにソフトウェアをインストールして実行します。
  • The container in Docker runs directly in the host machine. コンテナーには、独自のカーネルまたは仮想ハードウェアはありません。各コンテナーは互いに分離されており、各コンテナーには独自のファイル システムがあり、相互に影響を与えません。

コンテナ化の利点

  • アプリケーションのより迅速な配信と展開
  • アップグレードと拡張が容易
  • システムの運用と保守が容易
  • より効率的なリソース利用

Dockerの構成仓库、镜像和容器
ここに画像の説明を挿入

  • 鏡像

Docker イメージには、パッケージ化されたアプリケーションとその依存環境が含まれています。Win のプログラム インストール パッケージに似ています。

  • 鏡倉庫

Docker イメージ ウェアハウスは、Docker イメージを格納し、さまざまなユーザーやコンピューター間でこれらのイメージを共有しやすくするために使用されます。Win がインストール パッケージを配置する倉庫に似ています。

  • 容器

通常、Docker コンテナーは、Docker イメージに基づいて作成された Linux コンテナーです。実行中のコンテナーは、Docker ホストで実行されているプロセスです。Winによってインストールされたプログラムに似ています。

1.2 Docker のインストール、設定、アンインストール

Docker のインストール手順

0. インストールの失敗を避けるために、古いバージョンを削除します

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

1. 安装docker, -y は、インストールが成功するまでインストールを要求しないことを意味します

yum install -y docker-ce docker-ce-cli containerd.io

2.启动dockerバージョン情報を確認する

systemctl start docker
docker version

ここに画像の説明を挿入

3.配置国内镜像仓库

vim /etc/docker/daemon.json
{
    "registry-mirrors": [
        "https://registry.docker-cn.com"
    ]
}

構成が完了したら、docker サービスを再起動する必要があります。

systemctl restart docker  # 重启docker服务
systemctl status docker  # 确认docker服务正常运行

4.ドッカー设置为开机启动

systemctl enable docker

5.卸载Docker

# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源  . /var/lib/docker是docker的默认工作路径
rm -rf /var/lib/docker

1.3 Docker利用の流れ

ここに画像の説明を挿入

1.4 Docker アクセスの原則

Docker は Client-Server 構造のシステムで、Docker のデーモン プロセスはホスト上で実行され、クライアントからは Socket を介してアクセスされます。Docker Server は、Docker-Client からコマンドを受け取った後、コマンドを実行します!
ここに画像の説明を挿入

1.5 Docker 共通コマンド

Docker コマンドの公式アドレス

1.5.1 基本コマンド

docker version# docker のバージョン情報を表示する
docker info# docker のシステム情報を表示する (イメージやコンテナーの数を含む)
docker 命令 --help# ヘルプ コマンド (オプションのパラメーターを表示できます)

1.5.2 ミラーリング コマンド

docker imagesすべてのローカル ミラーを表示

[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB
# 解释:
1.REPOSITORY  镜像的仓库源
2.TAG  镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小

# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id

docker search検索ミラー

[root@localhost ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10308     [OK]
mariadb                           MariaDB is a community-developed fork of MyS…   3819      [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   754                  [OK]
percona                           Percona Server is a fork of the MySQL relati…   517       [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   86
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   79
centurylink/mysql                 Image containing mysql. Optimized to be link…   60                   [OK]

# 可选参数
Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output
      
      
# 搜索收藏数大于3000的镜像
[root@localhost ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10308     [OK]
mariadb   MariaDB is a community-developed fordockerk of MyS…   3819      [OK]

docker pull 镜像名[:tag]ダウンロードミラー

階層化されたダウンロード、docker イメージのコア -ユニオン ファイル システム (UnionFS)

# 如果不写tag默认就是下载最新版 latest
docker pull mysql	
# 指定版本下载
docker pull mysql:5.7

docker rmiミラーを削除

# 1.删除指定的镜像id
docker rmi -f 镜像id
# 2.删除多个镜像id
docker rmi -f 镜像id 镜像id 镜像id
# 3.删除全部的镜像id
docker rmi -f $(docker images -aq)

1.5.3 コンテナ コマンド

コンテナーは、Docker イメージに基づいて作成されます。

# 先拉取一个centos镜像
docker pull centos

docker run [Options] imageコンテナを実行する

docker run [Options] image

#参数说明
--name="名字"           指定容器名字
-d                     后台方式运行
-it                    使用交互方式运行,进入容器查看内容
-p                     指定容器的端口
	-p ip:主机端口:容器端口  配置主机端口映射到容器端口
	-p 主机端口:容器端口(常用)
	-p 容器端口
-P                     随机指定端口
-e					   环境设置
-v					   容器数据卷挂载

コンテナcentosを実行して入力します

[root@localhost ~]# docker run -it centos /bin/bash
[root@ce2bbae9f151 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

コンテナを出る

exit 	# 停止容器并退出(后台方式运行则仅退出)
Ctrl+P+Q  # 不停止容器退出

docker ps実行中のコンテナーを表示する

# 查看当前正在运行的容器
docker ps 
     
-a   # 查看所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q   # 只显示容器的id

docker start 容器idコンテナを起動する

docker start 容器id          # 启动容器
docker restart 容器id        # 重启容器
docker stop 容器id           # 停止当前运行的容器
docker kill 容器id           # 强制停止当前容器

1.5.4 その他の共通コマンド

docker logsビュー・ログ

docker logs -tf 容器id
docker logs --tail num 容器id  # num为要显示的日志条数

docker topコンテナー内のプロセス情報を表示する

docker top 容器id

docker inspectコンテナーのメタデータを表示する

docker inspect 容器id

通常、コンテナはバックグラウンドで実行されるため、コンテナに入ります。構成を変更するためにコンテナに入る必要がある場合があります

  • docker exec
# docker exec 进入容器后开启一个新的终端,可以在里面操作
docker exec -it 容器id /bin/bash
  • docker attach
# docker attach 进入容器正在执行的终端
docker attach 容器id

docker cpコピー操作

# 拷贝容器的文件到宿主机中
docker cp 容器id:容器内路径  宿主机路径

# 拷贝宿主机的文件到容器中
docker cp 宿主机路径 容器id:容器内路径

# 注意:源文件在哪就在哪进行复制操作
# 在主机中创建test.txt文件,并复制到centos容器的/home路径下
touch test.txt
docker cp /home/test.txt 08d1f5d4e7b1:/home/

1.5.5 画像のエクスポートとインポート

1.エクスポートとインポートを使用する

これらの 2 つのコマンドは、コンテナーを介してイメージをエクスポートおよびインポートするためのものです。

docker export 容器id > xxx.tar [路径]
docker import [- 镜像名] < xxx.tar

2. 保存と読み込みを使用する

これらの 2 つのコマンドは、ミラーリングを通じてミラーをエクスポートおよびインポートするためのものです。

docker save 镜像id > xxx.tar [路径]
docker load < xxx.tar

1.6 Docker イメージの作成

Docker イメージは、実際にはレイヤーごとのファイル システムで構成されており、ファイル システムのこのレイヤーは、イメージのメタデータを表示するUnionFS联合文件系统。
ために使用されます。用docker image inspect

docker image inspect nginx:latest

# 镜像的分层信息 ,层级文件可以共享
"RootFS": {
    "Type": "layers",
    "Layers": [
        "sha256:87c8a1d8f54f3aa4e05569e8919397b65056aa71cdf48b7f061432c98475eee9",
        "sha256:5c4e5adc71a82a96f02632433de31c998c5a9e2fccdcbaee780ae83158fac4fa",
        "sha256:7d2b207c26790f693ab1942bbe26af8e2b6a14248969e542416155a912fec30d",
        "sha256:2c7498eef94aef8c40d106f3e42f7da62b3eee8fd36012bf7379becc4cd639a2",
        "sha256:4eaf0ea085df254fd5d2beba4e2c11db70a620dfa411a8ad44149e26428caee4"
    ]
}

ミラー機能

  • All Docker images start from a base 镜像层. コンテンツを追加または変更すると、現在のイメージ レイヤーの上に新しいイメージ レイヤーが作成されます。
  • Docker イメージはすべて読み取り専用で、コンテナーが起動すると、新しい書き込み可能なレイヤー ( 容器层) がイメージの上に読み込まれます。

提交镜像 docker commit

# 使用docker commit 命令提交容器成为一个新的镜像版本
docker commit -m=“提交的描述信息”  -a="作者" 容器id 目标镜像名:[TAG] 

デフォルトの Tomcat イメージの webapps フォルダーには何も含まれていないため、ファイルを webapps.dist から webapps フォルダーにコピーする必要があります。次に、自分でミラーを作成します。ファイルを webapps.dist から webapps フォルダーにコピーし、ミラーを新しいミラーとして送信します。画像のデフォルトの webapps フォルダーの下にファイルがあるようにします。

# 1.复制项目到webapps下
[root@localhost ~]# docker run -it tomcat /bin/bash
root@3762239532cf:/usr/local/tomcat# cd webapps
root@3762239532cf:/usr/local/tomcat/webapps# ls
root@3762239532cf:/usr/local/tomcat/webapps# cp -r ../webapps.dist/* .
root@3762239532cf:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
# 2.项目访问 http://192.168.0.105:8080/
# 3.提交容器作为一个新的镜像
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED         STATUS         PORTS                                       NAMES
41d0b9c0da0e   tomcat    "catalina.sh run"   4 minutes ago   Up 4 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   agitated_mccarthy
[root@localhost ~]# docker commit -m="add webapps" -a="buckletime" 41d0b9c0da0e mytomcat:1.0
sha256:6bbddb87eb6f909f77c6f851b25edd5a02ad9632f397b68f65f4169b9874f02a
# 4.查看镜像列表
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mytomcat     1.0       6bbddb87eb6f   31 seconds ago   684MB
tomcat       latest    fb5657adc892   3 months ago     680MB
centos       latest    5d0da3dc9764   6 months ago     231MB
# 5.运行新的容器并查看文件
[root@localhost ~]# docker run -it mytomcat:1.0 /bin/bash
root@5c04b86e6369:/usr/local/tomcat# ls webapps
ROOT  docs  examples  host-manager  manager

2. コンテナのデータ量

2.1 データ量の紹介

Docker はアプリケーションと実行環境をパッケージ化して、実行するコンテナーを形成します. Docker コンテナーによって生成されたデータが docker commit によって新しいイメージを生成しない場合、データはイメージの一部として保存され、コンテナーが削除されるときに、データは自然に消えます。Docker にデータを保存するには、ボリュームを使用します。| |

ボリュームは、1 つ以上のコンテナーに存在し、Docker によってコンテナーにマウントされるディレクトリまたはファイルですが、ボリュームはユニオン ファイル システムに属していないため、ユニオン ファイル システムをバイパスして永続的なストレージを提供したり、共有データの特徴: .

ボリュームは になるように設計されています数据的持久化和同步,容器间可以数据共享

データ ボリュームの特徴:

  • データ ボリュームはコンテナ間でデータを共有または再利用できます
  • ボリュームの変更は直接反映されます
  • データ ボリュームの変更は、ミラーの更新に含まれません。

2.2 データ量の使用

コンテナーを実行し、データ ボリュームをマウントするコマンドを指定します。

docker run -it -v 主机目录:容器目录

# 1.运行centos容器,并指定挂载数据卷
[root@localhost ~]# docker run -it -v /home/main_data/:/home/docker_data centos /bin/bash
# 2.使用docker inspect查看容器的元数据,查看是否挂载成功
[root@localhost ~]# docker inspect 9f80a90b6c54
"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/main_data",
                "Destination": "/home/docker_data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]
# 3.在主机中创建文件
[root@localhost main_data]# touch main.txt
[root@localhost main_data]# ls
main.txt
# 4.查看容器中的文件
[root@9f80a90b6c54 /]# ls /home/docker_data/
main.txt

例: MySQL コンテナがデータ ボリュームを作成してデータを同期する

Linux での MySQL のデフォルトのデータ ファイル格納ディレクトリは /var/lib/mysql であり、デフォルトの構成ファイルは /etc/mysql/conf.d に設定されています.MySQL イメージまたはコンテナーが削除された後のデータ損失を避けるために、以下は確立されたデータ ボリュームで、MySQL のデータとファイルを格納します。

# 1.启动mysql  挂载数据卷
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 mysql 
# 2.远程连接mysql服务,若无权限,进入mysql容器中修改远程连接权限
docker exec -ti 36d4806c765a /bin/bash
# 登录mysql
mysql -u root -p
# 修改root 可以通过任何客户端连接
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 3.使用客户端创建mytest数据库并查看主机中同步的数据,数据同步成功
[root@localhost data]# ls /home/mysql/data

2.3 docker volume コマンド

[root@localhost data]# docker volume --help

Commands:
  create      # 创建数据卷
  inspect     # 查看数据卷详情
  ls          # 查看所有数据卷列表
  prune       # 删除所有未使用的卷
  rm          # 删除数据卷

docker volume createデータ ボリュームの作成

[root@localhost data]# docker volume create my-vol

docker volume lsすべてのデータ ボリュームのリストを表示する

[root@localhost data]# docker volume ls

docker volume inspectデータ ボリュームの詳細を表示する

[root@localhost data]# docker volume inspect my-vol 
[
    {
        "CreatedAt": "2022-04-07T12:52:42+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

docker volume rmデータ ボリュームの削除

[root@localhost data]# docker volume rm my-vol

docker volume prune未使用のボリュームをすべて削除する

[root@localhost data]# docker volume prune

docker rm -vコンテナを削除すると、関連するボリュームも削除されます

2.4 名前付きマウントと匿名マウント

匿名でマウント

匿名マウントとは、データ ボリュームを指定するときに、コンテナー パスのみを指定し、対応するホスト パスを指定しないことを意味します。したがって、対応するマップされたホスト パスは、デフォルト パス内に/var/lib/docker/volumes/自動生成された随机命名フォルダーになります。

# 运行并匿名挂载Nginx容器
[root@localhost data]# docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看卷列表
[root@localhost data]# docker volume ls
DRIVER    VOLUME NAME
local     0e102dae2f6731494400f7c98c11c835293c030b736588d80d4296b96f10c71d
local     my-vol

名前付きマウント

名前付きマウントとは、指定されたパス マウントとは異なる、指定されたフォルダー名を指します。ここで指定されたフォルダー名は、Docker によって指定され、デフォルトのデータ ボリューム パスの下にあります。docker volume ls コマンドを使用して、現在のデータ ボリュームのディレクトリ ステータスを確認します。

# 运行并具名挂载Nginx容器
[root@localhost data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看卷列表
[root@localhost data]# docker volume ls
DRIVER    VOLUME NAME
local     0e102dae2f6731494400f7c98c11c835293c030b736588d80d4296b96f10c71d
local     juming-nginx
local     my-vol
# 查看数据卷详情,注意主机路径也是默认数据卷路径下
[root@localhost data]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2022-04-07T13:10:39+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

匿名マウント、名前付きマウント、および指定パス マウントのコマンドは次のとおりです。

  • 匿名マウント-v 容器内路径、非推奨
  • 名前付きマウント-v 卷名:容器内路径
  • マウントするパスを指定-v 宿主机路径:容器内路径

拡張子: データ ボリューム マッピングに関連するパラメーターを指定します: ro/rw

  • ro - readonly 読み取り専用。読み取り専用が設定されている場合、このパスはコンテナではなく、ホスト マシンによってのみ操作できることを意味します
  • rw ----- readwrite 読み書き可能
[root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
[root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

2.5 データ ボリューム用の Dockerfile

Dockerfiledockerイメージとコマンドスクリプトファイルをビルドするためのビルドファイルです。ミラーリングは、このスクリプトを使用して生成できます。

ディレクティブをDockerfile で使用して、VOLUME1 つ以上のデータ ボリュームをイメージに追加できます。

dockerfile脚本

# 脚本中指令(大写)
# 基础镜像
FROM centos
# 匿名挂载
VOLUME ["volume01","volume02"]
CMD echo "----end----"
# 命令行环境
CMD /bin/bash

スクリプトを実行してイメージをビルドするdocker build

[root@localhost docker_test_volume]# docker build -f dockerfile1 -t buckletime-centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 0af875dd3c35
Removing intermediate container 0af875dd3c35
 ---> 3876cf15e836
Step 3/4 : CMD echo "----end----"
 ---> Running in 73344c7d325a
Removing intermediate container 73344c7d325a
 ---> ce432169d4d9
Step 4/4 : CMD /bin/bash
 ---> Running in 8e12aeb63375
Removing intermediate container 8e12aeb63375
 ---> b74eed3e6de1
Successfully built b74eed3e6de1
Successfully tagged buckletime-centos:1.0
# 查看镜像
[root@localhost docker_test_volume]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
buckletime-centos   1.0       b74eed3e6de1   15 seconds ago   231MB
mytomcat            1.0       6bbddb87eb6f   3 hours ago      684MB
nginx               latest    12766a6745ee   8 days ago       142MB
tomcat              latest    fb5657adc892   3 months ago     680MB
mysql               latest    3218b38490ce   3 months ago     516MB
centos              latest    5d0da3dc9764   6 months ago     231MB

データ量を見る

# 启动自己构建的镜像并进入容器
[root@localhost docker_test_volume]# docker run -it b74eed3e6de1 /bin/bash
# 查看目录
[root@20978f76e318 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
# 查看数据卷挂载信息
[root@localhost docker_test_volume]# docker inspect 20978f76e318
"Mounts": [
    {
        "Type": "volume",
        "Name": "9bdb13dbdd9a543a00b01e6a84475c6877547a5b722617d1f2afa0546f5cbb47",
        "Source": "/var/lib/docker/volumes/9bdb13dbdd9a543a00b01e6a84475c6877547a5b722617d1f2afa0546f5cbb47/_data",
        "Destination": "volume01",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "volume",
        "Name": "2edc8939b90a1a6f3b684a279819b7f0f20fd89f9eebc9a78a4318fb77cf22ba",
        "Source": "/var/lib/docker/volumes/2edc8939b90a1a6f3b684a279819b7f0f20fd89f9eebc9a78a4318fb77cf22ba/_data",
        "Destination": "volume02",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

Mounts の下に、ホストのマウント ディレクトリが表示されます。ホスト ディレクトリが dockerfile で指定されていないため、これは匿名マウントであり、ランダムな名前のパスが /var/lib/docker/volumes/ ディレクトリに生成されます。

2.6 データボリュームコンテナ

コンテナ データ ボリュームとは、コンテナ間のデータ同期を実現するために、複数のコンテナ間でデータを同期するためのデータ ボリュームの確立を指します。

ここに画像の説明を挿入
最初にコンテナ 1 を起動します。volume01 と volume02 はマウント ディレクトリです。

docker run -it --name cnetos01 buckletime-centos:1.0

次に、コンテナ 2 を起動し、コンテナ 2 とコンテナ 1 を設定して、パラメーターで--volumes-fromデータ ボリュームのマウント関係を確立します。

docker run -it --name centos02 --volumes-from cnetos01 buckletime-centos:1.0

データ ボリューム コンテナーの概要:

  • コンテナー間の構成ファイルとデータの同期。データ ボリューム コンテナーのライフ サイクルは、コンテナーが使用されなくなるまで続きます。
  • -v を使用してホストに永続化すると、ホスト内のデータは削除されず、永続的に有効になります。

3. Dockerfile

3.1 Dockerfile の紹介

Dockerfiledocker イメージをビルドするビルド ファイルで、命令脚本文件. ミラーリングは、このスクリプトを使用して生成できます。

ビルド手順

  1. 编写dockerfile文件
  2. docker build 构建镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

Dockerfile の基本

  • コマンドは大文字でなければなりません
  • 命令は上から順に実行されます
  • # はコメントを意味します
  • 各コマンドは、新しいイメージ レイヤーを作成してコミットします
    ここに画像の説明を挿入

3.2 Dockerfile の説明

FROM基本的なイメージ、すべてここから構築されます
MAINTAINER. イメージ メンテナーの説明、名前 + 電子メール.
RUNイメージの構築時に実行する必要があるコマンド.
COPYターゲット イメージにファイルをコピーします.
ADDターゲット イメージにファイルを追加します. tar ファイルと URL パスがサポートされています.ハングする
WORKDIRイメージの作業ディレクトリ
VOLUMEを指定します ロードするディレクトリは、コンテナー内のパスのみを指定できます. ホストのパスは、デフォルトのマウント ディレクトリです. コンテナーによって公開されているポートを指定します. そのときに実行するコマンドを指定し
EXPOSEます
CMD.コンテナの起動. 最後のコマンドのみが有効になり、置き換えることができます.
ENTRYPOINTCMD と同様に、
ENVビルド時に環境変数を設定するコマンドを追加できます.

3.3 実際の Dockerfile

戦闘 1: 公式の centos イメージに基づいてカスタマイズされた centos を構築する

公式の centos イメージは最小バージョンであり、多くのコマンドが欠落しています。公式の centos イメージに基づいて contos をカスタマイズできます

1. dockerfile ファイル dockerfile-mycentos を書き込みます。

FROM centos:7
MAINTAINER buckletime<[email protected]>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum install -y vim
RUN yum install -y net-tools

EXPOSE 80

CMD echo "-----end------"
CMD /bin/bash

2. dockerfile を使用してイメージをビルドする

docker build -f Dockfile文件 -t 目标镜像:[tag] 目标位置

[root@localhost dockerfile]# docker build -f dockerfile-mycentos -t mycentos:0.1 .
...
Step 9/9 : CMD /bin/bash
 ---> Running in d5083707b308
Removing intermediate container d5083707b308
 ---> b6a1205a01ec
Successfully built b6a1205a01ec
Successfully tagged mycentos:0.1
# 查看镜像
[root@localhost dockerfile]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
mycentos            0.1       b6a1205a01ec   3 minutes ago    580MB
centos              7         eeb6ee3f44bd   6 months ago     204MB

3. テストを実行する
ここに画像の説明を挿入

4.docker historyコマンドを使用して、ミラー イメージのビルド プロセスを分析できます。

# 通过 docker history 命令来分析刚刚构建的镜像过程
[root@localhost dockerfile]# docker history b6a1205a01ec
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
b6a1205a01ec   23 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
8c604ec85c0d   23 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
ad5af97ad072   23 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
3cdf414340ac   23 minutes ago   /bin/sh -c yum -y install vim                   216MB     
cdc69b9b3a21   24 minutes ago   /bin/sh -c yum -y install net-tools             161MB     
ff54b51b10da   24 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
d62c8129ba70   24 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
5bc36fed9ecf   24 minutes ago   /bin/sh -c #(nop)  MAINTAINER buckletime<187…   0B        
eeb6ee3f44bd   6 months ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      6 months ago     /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      6 months ago     /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB

コンバット 2: CMD 命令と ENTRYPOINT 命令の違い

CMDコンテナの起動時に実行するコマンドを指定します. 最後のコマンドのみが有効になり、置き換えることができます.
ENTRYPOINTCMD と同様に, コマンドを追加できます.

CMD コマンド テスト

1.vim dockerfile-cmd

FROM centos:7
CMD ["pwd"]
CMD ["ls","-a"]

2. ミラー イメージを構築する

[root@localhost dockerfile]# docker build -f dockerfile-cmd -t cmd-test:1.0 .

3. テストを実行する

[root@localhost dockerfile]# docker run -it cbe86f605790
.   .dockerenv	       bin  etc   lib	 media	opt   root  sbin  sys  usr
..  anaconda-post.log  dev  home  lib64  mnt	proc  run   srv   tmp  var
# 要想追加命令 -l ,CMD指令会报错,只能使用全部命令去替换 ls -al
[root@localhost dockerfile]# docker run -it cbe86f605790 -l
docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
[root@localhost dockerfile]# docker run -it cbe86f605790 ls -al
total 12
drwxr-xr-x.   1 root root     6 Apr  7 09:02 .
drwxr-xr-x.   1 root root     6 Apr  7 09:02 ..
-rwxr-xr-x.   1 root root     0 Apr  7 09:02 .dockerenv
-rw-r--r--.   1 root root 12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Nov 13  2020 bin -> usr/bin
drwxr-xr-x.   5 root root   360 Apr  7 09:02 dev
drwxr-xr-x.   1 root root    66 Apr  7 09:02 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Nov 13  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Nov 13  2020 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 241 root root     0 Apr  7 09:02 proc
dr-xr-x---.   2 root root   114 Nov 13  2020 root
drwxr-xr-x.  11 root root   148 Nov 13  2020 run
lrwxrwxrwx.   1 root root     8 Nov 13  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Apr  7 01:43 sys
drwxrwxrwt.   7 root root   132 Nov 13  2020 tmp
drwxr-xr-x.  13 root root   155 Nov 13  2020 usr
drwxr-xr-x.  18 root root   238 Nov 13  2020 var

ENTRYPOINT コマンド テスト

1.vim dockerfile エントリポイント

FROM centos:7
ENTRYPOINT ["pwd"]
ENTRYPOINT ["ls","-a"]

2. ミラー イメージを構築する

[root@localhost dockerfile]# docker build -f dockerfile-entrypoint -t entrypoint-test:1.0 .

3. テストを実行する

[root@localhost dockerfile]# docker run -it 1ff2ec561a44
.   .dockerenv	       bin  etc   lib	 media	opt   root  sbin  sys  usr
..  anaconda-post.log  dev  home  lib64  mnt	proc  run   srv   tmp  var
# 追加命令 -l
[root@localhost dockerfile]# docker run -it 1ff2ec561a44 -l
total 12
drwxr-xr-x.   1 root root     6 Apr  7 09:06 .
drwxr-xr-x.   1 root root     6 Apr  7 09:06 ..
-rwxr-xr-x.   1 root root     0 Apr  7 09:06 .dockerenv
-rw-r--r--.   1 root root 12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Nov 13  2020 bin -> usr/bin
drwxr-xr-x.   5 root root   360 Apr  7 09:06 dev
drwxr-xr-x.   1 root root    66 Apr  7 09:06 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Nov 13  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Nov 13  2020 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 242 root root     0 Apr  7 09:06 proc
dr-xr-x---.   2 root root   114 Nov 13  2020 root
drwxr-xr-x.  11 root root   148 Nov 13  2020 run
lrwxrwxrwx.   1 root root     8 Nov 13  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Apr  7 01:43 sys
drwxrwxrwt.   7 root root   132 Nov 13  2020 tmp
drwxr-xr-x.  13 root root   155 Nov 13  2020 usr
drwxr-xr-x.  18 root root   238 Nov 13  2020 var

戦闘 3: Tomcat イメージを作成するための Dockerfile

1.環境を整える

Tomcat と jdk の圧縮パッケージを準備する

[root@localhost dockerfile]# ll
总用量 188324
-rwxr-xr-x. 1 root root  11560971 4月   7 17:26 apache-tomcat-9.0.62.tar.gz
-rwxr-xr-x. 1 root root 181260798 4月   7 17:26 jdk-8u65-linux-x64.tar.gz
-rw-r--r--. 1 root root         0 4月   7 18:39 readme.txt

2. Dockerfile を書く

正式名称は ですDockerfile。この名前をそのまま使用してください。ビルド時に -f を指定する必要はありません。

FROM centos:7
MAINTAINER buckletime<[email protected]>

ENV MYPATH /usr/local
WORKDIR $MYPATH

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u65-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.tar.gz /usr/local/

RUN yum -y install vim

ENV JAVA_HOME /usr/local/jdk1.8.0_65
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/logs/catalina.out

3. イメージをビルドする

[root@localhost dockerfile]# docker build -t mytomcat:2.0 .
Successfully built 874b2eaffc8f
Successfully tagged mytomcat:2.0

4. イメージを開始する

[root@localhost dockerfile]# docker run -d -p 9090:8080 --name mytomcat \
-v /home/buckletime/dockerbuild/tomcat/project:/usr/local/apache-tomcat-9.0.62/webapps/project \
-v /home/buckletime/dockerbuild/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.62/logs mytomcat:2.0

アクセステスト: http://192.168.0.105:9090 Tomcat のホームページへの入力に成功

5. プロジェクトを公開する

ボリュームがマウントされているため、プロジェクトをローカルに配置することでプロジェクトを直接公開できます

実際の戦闘 4: SpringBoot プロジェクトは Docker イメージにパッケージ化されています

  1. Springboot プロジェクトのパッケージ化。例として jar パッケージを次に示します。

  2. Linux にアップロードして Dockerfile に書き込む

    [root@localhost idea]# ls
    demo-0.0.1-SNAPSHOT.jar  Dockerfile
    
    FROM java:8
    
    # 将demo-0.0.1-SNAPSHOT.jar 复制 到容器中并重命名为 app.jar
    COPY demo-0.0.1-SNAPSHOT.jar app.jar
    
    CMD ["--server.port=8080"]
    
    EXPOSE 8080
    
    ENTRYPOINT ["java","-jar","app.jar"]
    
  3. ビルドイメージ

    [root@localhost idea]# docker build -t springbootdemo:1.0 .
    [root@localhost idea]# docker images
    REPOSITORY       TAG                IMAGE ID       CREATED          SIZE
    springbootdemo   1.0                d9648a49a226   50 seconds ago   661MB	
    
  4. 実行、テスト

    [root@localhost idea]# docker run -d -p:8888:8080 --name mydemo springbootdemo:1.0
    [root@localhost idea]# curl localhost:8888/hello
    hello buckletime![root@localhost idea]# 
    

実戦5:鏡像公開

イメージを Docker Hub に公開する

  1. Docker Hub公式サイト、アカウント登録

  2. docker loginアカウントにログイン

    [root@localhost ~]# docker login --help
    
    Usage:  docker login [OPTIONS] [SERVER]
    
    Log in to a Docker registry.
    If no server is specified, the default is defined by the daemon.
    
    Options:
      -p, --password string   Password
          --password-stdin    Take the password from stdin
      -u, --username string   Username
    
  3. を使用してdocker pushミラーを送信します

    # 发布镜像最好带上版本号,可以使用docker tag 命令修改镜像名称和版本号
    docker tag 6d27817ecb31 buckletime/mycentos:2.0
    # docker push 发布镜像
    docker push buckletime/mycentos:2.0
    

イメージを Alibaba Cloud Container Service に公開する

  1. Alibaba Cloud にログインして、コンテナ イメージ サービスを見つけます。
  2. 名前空間を作成する
  3. コンテナ イメージを作成する
  4. コンテナ イメージの説明に従ってイメージを公開します

四、Dockerまとめ

ここに画像の説明を挿入

5.Docker ネットワーク

簡単に学習できるように、最初にすべてのコンテナとイメージを空にします

# 清空所有容器
docker rm $(docker ps -aq)
# 清空所有镜像
docker rmi $(docker images -aq)

5.1 Docker ネットワークの理解

ここに画像の説明を挿入
1. Tomcat コンテナー tomcat01 を実行し、コンテナーのアドレスを表示します。

[root@localhost ~]# docker run -d -P --name tomcat01 tomcat
[root@localhost ~]# docker exec -it tomcat01 ip addr

ここに画像の説明を挿入

実行時はip addrコンテナアドレスのダイレクトビューを使用 エラー報告があり、ipコマンドが見つからない場合があります コンテナにiproute2をインストールする必要があります 公式のTomcatには
yumコマンドはありませんapt-getコマンドを使ってインストールしますiproute2 と ping コマンド

[root@localhost ~]# docker exec -it tomcat01 /bin/bash
root@8e57c8b48890:/usr/local/tomcat# apt-get update
root@8e57c8b48890:/usr/local/tomcat# apt-get -y install iproute2 iproute2-doc
root@8e57c8b48890:/usr/local/tomcat# apt-get -y install inetutils-ping

コンテナーの IP は docker によって割り当てられるため、コンテナーとホストは同じネットワーク セグメントにあります。Linux主机与容器之间能 ping 通

[root@localhost ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.046 ms

2. 別の Tomcat コンテナー tomcat02 を実行し、コンテナーのアドレスを表示します。

[root@localhost ~]# docker run -d -P --name tomcat02 tomcat
[root@localhost ~]# docker exec -it tomcat02 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
70: eth0@if71: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

それは見つけることができます:

  • このコンテナは、すべてペアでネットワーク カードを運ぶことがわかりました
  • evth-pairこれは仮想デバイス インターフェイスのペアであり、それらはすべてペアで表示され、一方はプロトコルに接続され、もう一方は相互に接続されます. この機能により、evth-pair はさまざまな仮想ネットワーク デバイスを接続するためのブリッジとして機能します。
  • OpenStac、Docker コンテナ間の接続、および OVS 間の接続はすべて evth-pair テクノロジーを使用します

3. 2 つの tomcat01 と tomcat02 に ping を実行できますか? 同じネットワーク セグメントでも同じように ping を実行できます

[root@localhost ~]# docker exec -it tomcat02 ping 127.17.0.2
PING 127.17.0.2 (127.17.0.2): 56 data bytes
64 bytes from 127.17.0.2: icmp_seq=0 ttl=64 time=0.099 ms
64 bytes from 127.17.0.2: icmp_seq=1 ttl=64 time=0.051 ms

ここに画像の説明を挿入
結論は

  • すべてのコンテナーがネットワークを指定していない場合、コンテナーは docker0 によってルーティングされ、docker は使用可能な IP をコンテナーに割り当てます。
  • Docker は Linux ブリッジを使用しています
  • Docker のすべてのネットワーク インターフェイスは仮想であり、転送効率が高い

ここに画像の説明を挿入

5.2 コンテナの相互接続 --link

--linkコマンドはコンテナを接続できるため、コンテナを使用できます容器名访问

[root@localhost ~]# docker exec -it tomcat02 ping tomcat01
ping: unknown host
# --link命令 连接容器 tomcat03 连接 tomcat02 
[root@localhost ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
# tomcat03 能通过容器名访问 tomcat02
[root@localhost ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.137 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.061 ms
# 但是tomcat02 不能通过容器名访问 tomcat03
[root@localhost ~]# docker exec -it tomcat02 ping tomcat03
ping: unknown host

重要な原則: --link は、ホストにコンテナ名のマッピング関係を追加することであり、これは一方向の接続です。

[root@localhost ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.3	tomcat02 03da12909222
172.17.0.4	8e77f2a544a5

実際の開発では、 --link を使用することはお勧めしません。構成は hosts ファイルを変更することであり、一方通行の構成です。

5.3 コンテナ相互接続カスタムネットワーク

docker0 はコンテナー名を使用した接続アクセスをサポートしていないため、docker0 は使用しないでください。カスタム ネットワークを使用します。

docker network注文

[root@localhost ~]# docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
9eeca5a5158c   bridge    bridge    local
c60f472b3848   host      host      local
a959f5564b21   none      null      local

ネットワークモード

  • bridge: bridge (docker のデフォルト、カスタムネットワークもブリッジモードを使用)
  • ホスト: ホストとネットワークを共有します
  • none: ネットワークを設定しません
  • container: コンテナ ネットワーク接続 (限定的で、めったに使用されません)

ネットワークを作成する

docker network createネットワークを作成する

  • --driver 模式(デフォルトブリッジ)
  • --subnet 子网
  • --gateway 网关
# docker network create 创建网络
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
2b9f9c88b69fbb9917c550d0b8017471e246aeb2c8b17c1667ece8a19b086bca
[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
9eeca5a5158c   bridge    bridge    local
c60f472b3848   host      host      local
2b9f9c88b69f   mynet     bridge    local
a959f5564b21   none      null      local

独自のネットワークが作成されます。

docker network inspect mynetネットワークの詳細を表示

ここに画像の説明を挿入
コンテナを起動してネットワークを指定する--net

[root@localhost ~]# docker run -d -P --name tomcat-net01 --net mynet tomcat
972542a6d6516b6d03d81493d03c1f60cecb5160e4ecdad44fb4d18e4430b03f
[root@localhost ~]# docker run -d -P --name tomcat-net02 --net mynet tomcat
f4fd35dcefcd8059af0b0a0c607b137b9c8d4c9d6ba0ae2cf6be23d8a3498992
# 这样两个容器可以直接使用容器名互相连接访问
[root@localhost ~]# docker exec -it tomcat-net01 ping tomcat-net02
PING tomcat-net02 (192.168.0.3): 56 data bytes
64 bytes from 192.168.0.3: icmp_seq=0 ttl=64 time=0.137 ms
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.061 ms

カスタム ネットワークの利点

  • クラスターごとに異なるネットワークを使用して、クラスターが安全で正常であることを確認します。

5.4 ネットワーク接続

docker network connect 网络 容器コンテナをネットワークに接続する

[root@localhost ~]# docker network connect --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container

テスト

# 使用docker0启动两个tomcat
[root@localhost ~]# docker run -d -P --name tomcat04 tomcat
[root@localhost ~]# docker run -d -P --name tomcat05 tomcat
# tomcat04和 自定义网络mynet下的tomcat-net01连接,此时肯定是不通的
[root@localhost ~]# docker exec -it tomcat04 ping tomcat-net01
ping: unknown host
# docker network connect 将容器tomcat04连接到mynet网络中
docker network connect mynet tomcat04
# 再次连接,可以连通
[root@localhost ~]# docker exec -it tomcat04 ping tomcat-net01
PING tomcat-net01 (192.168.0.2): 56 data bytes
64 bytes from 192.168.0.2: icmp_seq=0 ttl=64 time=0.137 ms
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.061 ms

docker network inspect mynet ネットワークの詳細を確認し、コンテナー tomcat04 が mynet ネットワークに追加されていることを確認します。つまり、2 つの IP アドレスを持つコンテナーです。

ここに画像の説明を挿入

5.5 Docker ネットワーク戦闘

コンバット 1: Redis クラスターのデプロイ

ここに画像の説明を挿入

# 1.创建redis网络
[root@localhost ~]# docker network create redis_net --subnet 172.38.0.0/16 --gateway 172.38.0.1
# 2.通过shell脚本创建6个redis配置
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >>/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 3.通过shell脚本启动6个redis容器
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis_net --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done
# 4.配置集群。进入一个redis容器中,注意,redis没有/bin/bash 命令,使用/bin/sh 
[root@localhost ~]# docker exec -it redis-1 /bin/sh
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

構成クラスタ コマンドを実行すると、クラスタ構成が成功したことを示す次の情報が表示されます。

ここに画像の説明を挿入
5. Redis クラスターのテスト

redis-cli -cそれはredisクラスタに入ることであり、redis-cliスタンドアロン版のredisに入ることです。

  • cluster info: クラスター情報の表示
  • cluster nodes: クラスタ ノード情報を表示します
/data # redis-cli -c
127.0.0.1:6379> cluster nodes
8dea9b0ac434985556f08543f663a1d149772b75 172.38.0.11:6379@16379 myself,master - 0 1649398430000 1 connected 0-5460
29c361a494c043eb2597a3702537bf9553b89c95 172.38.0.16:6379@16379 slave c356c34a7fe0bf89b0abdcf538a910c1444da20e 0 1649398429000 6 connected
187da435dedcc35a48d0236bb8cbb2a2410d354e 172.38.0.15:6379@16379 slave 8dea9b0ac434985556f08543f663a1d149772b75 0 1649398430636 5 connected
17c460274af7f601846685dd91a39cc244823e17 172.38.0.14:6379@16379 slave 554f73de745a0dbdbe8bb8d805b93c622cb98a73 0 1649398429530 4 connected
554f73de745a0dbdbe8bb8d805b93c622cb98a73 172.38.0.13:6379@16379 master - 0 1649398429127 3 connected 10923-16383
c356c34a7fe0bf89b0abdcf538a910c1444da20e 172.38.0.12:6379@16379 master - 0 1649398430133 2 connected 5461-10922
127.0.0.1:6379> set name buckletime
-> Redirected to slot [5798] located at 172.38.0.12:6379
OK

クラスタ内の設定値はランダムに処理されます(172.38.0.12)。このとき、172.38.0.12 で redis-2 コンテナーを停止し、redis サービスのダウンタイムをシミュレートして、データがまだ存在するかどうか、および今の値が取得できるかどうかを確認します。

[root@localhost ~]# docker stop redis-2
redis-2
127.0.0.1:6379> get name
-> Redirected to slot [5798] located at 172.38.0.16:6379
"buckletime"

クラスターに再度入ると、今の値を取得できることがわかります。これは、データが影響を受けておらず、可用性が高いことを示しています。
次の図に示すように、クラスター ノード情報を再度確認します。redis-2 ノードのステータスは失敗であり、クラスターは自動的に別のマスターを選択します。
ここに画像の説明を挿入

6. Docker Compose のスタンドアロン展開

6.1 Docker Compose の紹介とインストール

Compose は に使用されます定义和运行多容器 Docker 应用程序的工具Compose を使用すると、次のことができます使用 YML 文件来配置应用程序需要的所有服务その後、1 つのコマンドで、すべてのサービスを YML ファイル構成から作成および開始できます。

詳しい紹介はDocker Composeの公式サイトを参照してください 公式サイトのチュートリアルはとても詳しく書かれているので、公式サイトで詳しく読むことができます。

Compose で使用される 3 つのステップ:

  • Dockerfileアプリケーションの環境を定義するために使用します。
  • docker-compose.yml分離された環境で一緒に実行できるように、アプリケーションを構成するサービスを定義するために使用します。
  • 最後に、docker-compose upコマンドをアプリケーション全体を起動して実行します。

docker-compose.yml の設定例は以下の通りです。

version: '3'
services:
  web:
    build: .
    ports:
   - "5000:5000"
    volumes:
   - .:/code
    - logvolume01:/var/log
    links:
   - redis
  redis:
    image: redis
volumes:
  logvolume01: {
    
    }

2つの概念を理解する

  • Service service、プロジェクトで使用される単一のサービス モジュール (web、redis、mysql など)。
  • プロジェクトproject、ブログなど、プロジェクトを構成する関連サービスの集まり...

Docker Compose のインストール

Linux に Docker Compose をインストールします。1.下载 2.授权

# 下载 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 授权
sudo chmod +x /usr/local/bin/docker-compose

6.2 Docker Compose のクイック エクスペリエンス

1.创建一个应用. python + フラスコ + redis で実装されたカウンター。

vim app.py、アプリケーションコードを書く

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

vim requirements.txt、必要な依存関係

flask
redis

2.创建Dockerfile

vim Dockerfile、Docker イメージのビルド

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

3.定义docker-compose.yml

vim docker-compose.yml、構成ファイルでサービス情報を定義

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

4.用Compose构建和运行应用程序

docker-compose up -dパラメータは、バックグラウンドの開始を示します

[root@localhost demo_compose]# docker-compose up
Creating network "demo_compose_default" with the default driver
Building web
Sending build context to Docker daemon  4.608kB
Step 1/10 : FROM python:3.7-alpine
...
Creating demo_compose_web_1   ... done
Creating demo_compose_redis_1 ... done
...
web_1    |  * Running on http://127.0.0.1:5000
web_1    |  * Running on http://172.18.0.2:5000 (Press CTRL+C to quit)

Compose のワークフローは、構築プロセスから見ることができます

  • 「フォルダ名_デフォルト」という名前のネットワークを作成します
  • docker-compose.yml 構成ファイルを読む
  • 構成ファイルのサービス定義に従って、サービスをビルドして開始します

結果のテストを実行します。

[root@localhost idea]# curl 172.18.0.2:5000
Hello World! I have been seen 1 times.
[root@localhost idea]# curl 172.18.0.2:5000
Hello World! I have been seen 2 times.
[root@localhost idea]# curl 172.18.0.2:5000
Hello World! I have been seen 3 times.
[root@localhost idea]# curl 172.18.0.2:5000
Hello World! I have been seen 4 times.

5.停止程序

  • Ctrl + C非バックグラウンド起動、このコマンドを使用できます
  • docker-compose stop-d バックグラウンド起動でこのコマンドを使用できます
  • docker-compose down [--volumes]

ストップとダウンの違い使用down会完全删除容器. 使用stop是停止一次パラメータ --volumes は、コンテナが使用するデータ ボリュームを削除することを意味します

6.3 Docker Compose のデフォルトの命名規則

1.サービス名の命名規則を作成する

View Running Servicesを使用して、docker psサービス名の命名規則が次のようになっていることを確認します。文件夹名_服务名_num

[root@localhost idea]# docker ps
CONTAINER ID   IMAGE              NAMES					COMMAND                  CREATED          STATUS          PORTS                                       
f8d252c277d0   redis:alpine       demo_compose_redis_1  "docker-entrypoint.s…"	 18 minutes ago   Up 18 minutes   6379/tcp                                    
e29dfaeda7c5   demo_compose_web   demo_compose_web_1	"flask run"              18 minutes ago   Up 18 minutes   0.0.0.0:8000->5000/tcp, :::8000->5000/tcp

Compose 起動サービスはクラスターとして起動され、num はコピーの数を表します

2. ネットワーク名の命名規則

ネットワーク リストを表示するために使用しますdocker network ls。ネットワーク名の命名規則は次のとおりです。文件夹名_default

[root@localhost idea]# docker network ls
NETWORK ID     NAME                   DRIVER    SCOPE
9eeca5a5158c   bridge                 bridge    local
5fcff058a02c   demo_compose_default   bridge    local
c60f472b3848   host                   host      local

このように、同じプロジェクト フォルダーの下で、すべてのサービスにドメイン名を介してアクセスできます。

6.4 docker-compose.yml 構成ルール

公式ウェブサイト docker-compose.yml 構成の詳細

version: "3.9"	# 1.版本
services:		# 2.服务
  web:	# 服务名
  	# 服务配置
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"
# 3.其他配置 网络/卷/全局规则等
volumes:
network:
config:

docker-compose.yml 構成ルールを学ぶ最善の方法は、もっと書いてもっと読むことです!

6.5 Combat: Compose をビルドして実行するための springboot プロジェクトの作成

1. マイクロサービス プロジェクトを作成し、自分でカウンター (redis) を実装する

redis 依存関係を導入する

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

コントローラーのコードを書く

@RestController
public class CounterController {
    
    

    @Autowired
    StringRedisTemplate redisTemplate;

    @RequestMapping("counter")
    public String counter(){
    
    
        Long views = redisTemplate.opsForValue().increment("views");
        return "hello, buckletime, views " + views + " times";
    }
}

application.properties 構成ファイル

server.port=8080
# 配置redis 注意,不要写ip,直接写服务名再通过Compose构建服务
spring.redis.host=redis

最後に、プロジェクトを jar パッケージにパッケージ化します。

2.Dockerfile ビルドイメージ

FROM java:8

COPY *.jar app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java","-jar","app.jar"]

3. docker-compose.yml 設定を書く

version: "3.8"
services:
  mycounter:  # 服务名
    build: .  # . 表示使用当前目录下的 Dockerfile文件构建镜像
    image: mycounter  # 镜像
    depends_on:
      - redis   # depends_on 依赖 表示需要依赖redis服务
    ports:
      - "8080:8080"   # 端口映射
  redis:
    image: "redis:alpine"

4. Compose をビルドして実行する

[root@localhost mycounter]# ll
总用量 26884
-rwxr-xr-x. 1 root root 27520888 48 19:50 demo-0.0.1-SNAPSHOT.jar
-rwxr-xr-x. 1 root root      336 48 19:50 docker-compose.yml
-rwxr-xr-x. 1 root root      120 48 19:50 Dockerfile
[root@localhost mycounter]# docker-compose up -d

5.アクセステスト、正常に実行

[root@localhost mycounter]# curl localhost:8080/counter
hello, buckletime, views 1 times[root@localhost mycounter]# curl localhost:8080/counter
hello, buckletime, views 2 times[root@localhost mycounter]# curl localhost:8080/counter
hello, buckletime, views 3 times[root@localhost mycounter]# curl localhost:8080/counter
hello, buckletime, views 4 times[root@localhost mycounter]# curl localhost:8080/counter
hello, buckletime, views 5 times[root@localhost mycounter]# 

7. Docker Swarm クラスターのデプロイ

7.1 Swarm 関連の概念

群れ

クラスターの管理とオーケストレーション。Docker は swarm クラスターを初期化でき、他のノードが参加できます。

ノード

ドッカーノードです。複数のノードがネットワーク クラスタを形成します。(経営者、労働者)

サービス

このサービスは、管理ノードまたはコアであるワーカー ノードで実行できます。ユーザーアクセス!

タスク

コンテナー内のコマンド、詳細なタスク

swarm と k8s の原理は同じです

  • コマンド -> マネージャー ノード -> api -> スケジューリング -> ワーカー ノード (メンテナンス タスクの作成)

7.2 Swarm 作業モード

Docker Swarm ワーキング モードの公式ドキュメント

1. ノードの動作モード
ここに画像の説明を挿入
3. サービス、タスク、コンテナ

サービスを swarm にデプロイすると、swarm マネージャーはサービス定義をサービスの望ましい状態として受け入れます。次に、swarm 内のノードでサービスを 1 つ以上のレプリカ タスクとしてスケジュールします。これらのタスクは、swarm 内のノードで互いに独立して実行されます。

たとえば、HTTP リスナーの 3 つのインスタンス間で負荷を分散するとします。次の図は、3 つのレプリカを持つ HTTP リスナー サービスを示しています。リスナーの 3 つのインスタンスはそれぞれ、swarm 内のタスクです。
ここに画像の説明を挿入
3. タスク、スケジューリング

以下の図は、swarm モードがサービス作成リクエストを受け入れ、タスクをワーカー ノードにスケジュールする方法を示しています。
ここに画像の説明を挿入

7.3 スウォームクラスターの構築

[root@localhost ~]# docker swarm --help

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

docker swarm init --advertise-addr 172.24.82.149ノードを初期化する

ここに画像の説明を挿入

docker swarm joinノードに参加する

  • docker swarm join-token manager管理者トークンを取得する
  • docker swarm join-token workerワーカー トークンを取得する

ここに画像の説明を挿入

他の 2 つのマシン (1 つのマネージャーと 1 つのワーカー) にノードを追加します。4 ノードの Swarm クラスターを取得する

ここに画像の説明を挿入
クラスタ構築のまとめ

  • docker swarm initマスターノードを初期化する
  • docker swarm join参加ノード (マネージャー、ワーカー)

7.4 Raft コンセンサスプロトコルを理解する

7.2 この例では、クラスターには 2 つのマスターと 2 つのスレーブがあります. リーダー ノードがダウンすると、もう一方のマネージャー ノードは機能しません. 1 つのマスター ノードだけが生き残り、新しいリーダーを再選することはできません. ワーカー ノードの 1 つをマネージャー ノード、クラスターに 3 つのマスターと 1 つのスレーブがある場合、リーダー ノードがダウンしても、他の 2 つのマネージャー ノードは正常に動作できます。これは、この時点で新しいリーダーが選出される可能性があるためです。

リーダー選挙: 現在のリーダーが失敗した場合、新しいリーダーを選出する必要があります。

したがって、クラスタの高可用性を確保するには

  • マスター ノードの数は >=3 である必要があります
  • 存続するマスター ノードの数は >=2 である必要があります

簡単に言えば、Raft プロトコル: ほとんどのノードが生きている場合にのみ使用できます。

7.5 Swarm クラスタの動的伸縮サービス

[root@localhost ~]# docker service --help

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service

docker service createサービスを作成して実行する

[root@localhost ~]# docker service create -p 8888:80 --name myngnix ngnix
  • docker run コンテナ、伸縮なし
  • docker service サービス、拡張・縮小、ローリングアップデート機能あり

docker service lsサービス一覧を見る

[root@localhost ~]# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
blkxxbxk897b   myngnix   replicated   1/1        ngnix:latest   *:8888->80/tcp

ダイナミックな伸縮

  • docker service scale 服务名=numnum は、スケーリングするサービスの数を示します
  • docker service update --replicas num 服务名num は、スケーリングするサービスの数を示します
[root@localhost ~]# docker service scale myngnix=5
[root@localhost ~]# docker service update --replicas 3 myngnix

2 つの動的スケーリング コマンドは同等です。スケールの方が便利

八、Dockerのその他のコマンド(了解)

8.1 Docker スタック

docker stack は docker compose に似ています

  • docker compose スタンドアロン コンテナーの配置
  • docker スタック クラスター コンテナーの配置
[root@localhost ~]# docker stack --help

Usage:  docker stack [OPTIONS] COMMAND

Manage Docker stacks

Options:
      --orchestrator string   Orchestrator to use (swarm|kubernetes|all)

Commands:
  deploy      Deploy a new stack or update an existing stack
  ls          List stacks
  ps          List the tasks in the stack
  rm          Remove one or more stacks
  services    List the services in the stack

8.2 Docker シークレット

セキュリティ、パスワード設定、証明書など

[root@localhost ~]# docker secret --help

Usage:  docker secret COMMAND

Manage Docker secrets

Commands:
  create      Create a secret from a file or STDIN as content
  inspect     Display detailed information on one or more secrets
  ls          List secrets
  rm          Remove one or more secrets

8.3 ドッカー構成

統一された構成

[root@localhost ~]# docker config --help

Usage:  docker config COMMAND

Manage Docker configs

Commands:
  create      Create a config from a file or STDIN
  inspect     Display detailed information on one or more configs
  ls          List configs
  rm          Remove one or more configs

おすすめ

転載: blog.csdn.net/weixin_45698637/article/details/123999825