docker笔记

前言

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到
一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,
也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

docker的优势

灵活性:即使是最复杂的应用程序也可以容器化。
轻量级:容器利用并共享主机内核,使它们在系统资源方面比虚拟机更有效率。
可移植:您可以在本地构建,部署到云上,并在任何地方运行。
松耦合:容器是高度自给自足和封装的,允许您在不影响其他容器的情况下替换或升级其中一个。
可扩展:您可以跨数据中心增加和自动分发容器副本。
安全性:容器对进程应用主动约束和隔离,而不需要用户进行任何配置。

在这里插入图片描述

Docker和虚拟机技术的区别

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离
等等,极大的简化了容器的创建和维护。使得 Docker技术比虚拟机技术更为轻便、
快捷。下面比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟
出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有
进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
特性docker容器虚拟机
启动秒级分钟级
硬盘使用一般为MB一般为GB
性能接近原生(宿主机)弱于原生
系统支持量单机支持上千个容器一般几十个

Docker中的三个重要概念

Image(镜像)一个特殊的文件系统

可以把它理解成一个虚拟机的快照(Snapshot),里面包含了你要部署的应用程序
以及它所关联的所有库。操作系统分为内核和用户空间。对于Linux而言,内核启动
后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当
于是一个root文件系统。Docker镜像是一个特殊的文件系统,除了提供容器运行时所
需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数
(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后
也不会被改变。

Container(容器)镜像运行时的实体

这里的容器就像是一台台运行起来的虚拟机,里面运行了你的应用程序,每个容器
是独立运行的他们相互之间不影响。通过一个镜像,我们可以创建许多个不同的
Container容器。镜像(Image)和容器(Container)的关系,就像是面向对象程
序设计中的类和类的实例一样,镜像是静态的定义,容器是镜像运行时的实体。
容器可以被创建、启动、停止、删除、暂停等 。容器的实质是进程,但与直接在
宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜
像使用的是分层存储,容器也是如此。容器存储层的生存周期和容器一样,容器
消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容
器删除而丢失。

Repository(仓储)集中存放镜像文件的地方

镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器
上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务(就像Git仓库一样)
,Docker Registry就是这样的服务。一个Docker Registry中可以包含多个仓库
(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。
所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的
代码仓库。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于
对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这
个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。

docker安装

操作系统要求

要安装Docker Engine,您需要以下一个CentOS版本的维护版本:
CentOS 7
CentOS 8(流)
CentOS 9(流)

卸载老的版本

旧版本的Docker使用Docker或Docker引擎。在尝试安装新版本以及相关的依赖项之前,请先卸载任何此类旧版本。

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

yum可能会报告您没有安装这些软件包。

卸载docker时,存储在/var/lib/doker/中的映像、容器、卷和网络不会自动删除。

安装方法

您可以根据需要以不同的方式安装Docker Engine:

您可以设置Docker的存储库并从中进行安装,以便于安装和升级任务。这是推荐的方法。

您可以下载RPM软件包,手动安装,并完全手动管理升级。这在无法访问互联网的气隙系统上安装Docker等情况下很有用。

在测试和开发环境中,您可以使用自动化的便利脚本来安装Docker。

使用rpm存储库进行安装

在新主机上首次安装Docker Engine之前,您需要设置Docker存储库。之后,您可以从存储库中安装和更新Docker。

设置存储库

安装yum-utils包(它提供了yum-config-manager实用程序)并设置存储库。

sudo yum install -y yum-utils

#docker镜像仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

#设置阿里镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 


安装Docker引擎

1.安装Docker Engine、containerd和Docker Compose

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

如果提示接受GPG密钥,请验证指纹是否与060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35匹配,如果匹配,请接受。

此命令安装Docker,但不会启动Docker。它还创建了一个docker组,但是,它没有通过defa向该组添加任何用户

ult。

2.启动Docker

sudo systemctl start docker

3.通过运行helloworld镜像来验证Docker引擎安装是否成功。

sudo docker run hello-world

此命令下载测试映像并在容器中运行。当容器运行时,它会打印一条确认消息并退出。

您现在已经成功安装并启动了Docker引擎。

升级Docker引擎

要升级Docker引擎,请按照安装说明,选择要安装的新版本。

从程序包安装

如果你不能使用Docker的rpm存储库来安装Docker引擎,你可以下载你的版本的.rpm文件并手动安装。每次升级Docker引擎时,都需要下载一个新文件。

1.转到https://download.docker.com/linux/centos/并选择您的CentOS版本。然后浏览到x86_64/stable/Packages/并下载要安装的Docker版本的.rpm文件。

2.安装Docker引擎,将以下路径更改为下载Docker软件包的路径。

sudo yum install /path/to/package.rpm

Docker已安装,但尚未启动。docker组已创建,但没有用户添加到该组

3.启动Docker

sudo systemctl start docker

4.通过运行helloworld镜像来验证Docker引擎安装是否成功。

sudo docker run hello-world

此命令下载测试映像并在容器中运行。当容器运行时,它会打印一条确认消息并退出。

您现在已经成功安装并启动了Docker引擎。

docker常用命令

1 镜像相关

1.1 查看镜像列表

sudo docker images

1.2 镜像搜索

sudo docker search ubuntu

比如搜索 ubuntu 基础镜像

可输出官方的镜像名称,以及 star 数量,选择一个需要的镜像下拉即可

1.3 下拉镜像

sudo docker pull 镜像名
sudo docker pull 镜像名:Tag

1.4 删除镜像

sudo docker rmi -f 镜像名/镜像ID

1.5 保存镜像

将我们的镜像 保存为tar 压缩文件 这样方便镜像转移和保存 ,然后 可以在任何一台安装了docker的服务器上 加载这个镜像

docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字

1.6 加载镜像

任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像

docker load -i 镜像保存文件位置

2 容器相关

2.1 容器列表

sudo docker ps
sudo docker ps -a # 查看所有容器 -----包含正在运行 和已停止的

2.2 创建容器

docker run -it -d --name 要取的别名 -p 宿主机端口:容器端口 -v 宿主机文件存储位置:容器内文件位置 镜像名:Tag /bin/bash 

docker start 容器id   #启动已有容器

参数含义:

-it 表示 与容器进行交互式启动(进入容器,需要加上!!!)(后台运行时不加上启动时docker会认为这个这个进程不活跃,自动关闭)
-d 表示可后台运行容器 (守护式运行)
–name 给要运行的容器 起的名字
/bin/bash 交互路径
-p 将容器的端口映射到宿主机上,通过宿主机访问内部端口
-v 将容器内的指定文件夹挂载到宿主机对应位置

-e 修改配置参数,如es默认占用内存是非常大的,需要修改参数,-e ES_JAVA_OPTS=“-Xms 64m -Xmx512m”

2.3 停止容器

sudo docker stop 容器名/容器ID

2.4 删除容器

#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)

2.5 进入容器

docker attach 容器ID/容器名   #进入正在运行中的容器,退出容器会导致容器停止
docker exec -it 容器id /bin/bash  #进入容器开启一个新的bash终端,退出容器终端不会导致容器停止

2.6退出容器

exit   #退出容器并停止
Ctrl+p+q   #退出容器,保持后台运行

2.7查看日志

docker logs -f 容器id
docker logs -f --tail 300 容器id  #查询前300行日志

2.8查看元数据

docker inspect 容器id

2.9拷贝

从容器内拷贝到当前主机

docker cp 容器id:/test.java /usr/local/src

DockerFile

DockerFile常用命令

FROM

指定基础镜像,并且必须是第一条指令。
如果不以任何镜像为基础,那么写法为:FROM scratch。

FROM <image>FROM <image>:<tag>FROM <image>:<digest> 
其中<tag>和<digest> 是可选项,默认值为latest

MAINTAINER

指定作者,国际标准为姓名加邮箱
MAINTAINER <name>

LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式。
LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
// 语法格式如下:LABEL <key>=<value> <key>=<value> <key>=<value> ...// 添加作者LABEL org.opencontainers.image.authors="cy"

ADD

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,
不同之处如下:
ADD 的优点:在执行 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,
会自动复制并解压到目标路径。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,
从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

ADD $PWD/test.jar /usr/local/

COPY

COPY 指令从 复制新文件、目录或远程文件 URL,并将它们添加到路径可以指定
多个 资源,但如果它们是文件或目录,则它们的路径被解析为相对于构建上下文的源

COPY $PWD/test.jar /usr/local/

通配符用法:
* 通配符:把所有 hom 开头的文件复制到镜像文件系统的 /mydir/ 目录下
COPY hom* /mydir/
* ? 通配符:?匹配 0 或 1 个字符,比如会把 home.txt 文件复制到 /mydir/ 目录下
COPY hom?.txt /mydir/

EXPOSE

仅仅只是声明端口。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

EXPOSE <端口1> [<端口2>...]

ENV

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

在Dockerfile中使用变量的方式
$varname
${varname}
${varname:-default value}:当变量不存在使用-号后面的值
$(varname:+default value}:当变量存在时使用+号后面的值(当然不存在也是使用后面的值)

RUN

用于执行后面跟着的命令行命令

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

ENTRYPOINT

容器启动时运行的启动命令。

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,
而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 
指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

与CMD的区别:
ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
如果在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个
完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数;
如果CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
// 实例:
1、Dockerfile 构建了 nginx:test 镜像
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

2、不传参运行,容器内会默认运行以下命令,启动主进程。
$ docker run  nginx:test    // nginx -c /etc/nginx/nginx.conf

3、传参运行,容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假
设容器内已有此文件)
$ docker run  nginx:test -c /etc/nginx/new.conf        // nginx -c /etc/nginx/new.conf

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:

避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。
(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 
WORKDIR 创建的目录才会一直存在。

WORKDIR <工作目录路径>

Docker网络

安装Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),
它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker 在创建一个容器的时候,会执行如下操作:

创建一对虚拟接口/网卡,也就是veth pair,分别放到本地主机和新容器中;
本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,
如 vethxxxxx;容器一端放到新容器中,并修改名字作为 eth0,这个网卡
接口只在容器的名字空间可见;从网桥可用地址段中(也就是与该bridge对应的network
)获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 vethxxxx。

在这里插入图片描述

容器互联

–link

通过–link可以实现容器之间的互联

#tomcat02通过 --link链接tomcat01
docker run -it -P -d --name tomcat02 --link tomcat01 fb5657adc892

##可以看到tomcat02 hosts配置文件下已配置tomcat01,可以
[root@localhost ~]# docker exec -it tomcat02 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.2      tomcat01 de436ebbf557
172.17.0.3      937c9a22a00a
[root@localhost ~]#

##tomcat01的hosts文件下未配置tomcat02,需要链接tomcat02,也需要在docker run时指定--link
[root@localhost ~]# docker exec -it tomcat01 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.2      de436ebbf557
[root@localhost ~]#

network

通过docker网络可以实现容器之间的互联

## 查看docker网络 bridge(桥接模式,也就是docker0) host(本地网络)
[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
cba235590f01   bridge    bridge    local
baf05b84bdfb   host      host      local
ea74d4b355a4   none      null      local

## 查看创建docker网络时指定的参数
[root@localhost ~]# docker network create --help
Usage:  docker network create [OPTIONS] NETWORK
Create a network
Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver 
      --config-from string   The network from which to copy the configuration
      --config-only          Create a configuration only network
      ## 指定链接方式,默认桥接,也是我们需要创建的模式
  -d, --driver string        Driver to manage the Network (default "bridge")
  	  ## 指定网关
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      ## 指定子网
      --subnet strings       Subnet in CIDR format that represents a network segment


## 创建自己的网络
docker network create -d bridge --gateway 192.168.0.1 --subnet 192.168.0.0/16 mynet

## 查看网络,已创建完毕
[root@localhost ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "3d55e2ccfed08e00e34f112bdafcf307007441da8715da89c20e54afeea80af0",
        "Created": "2023-11-08T17:47:06.611839944+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

## 创建两个容器,并指定自己创建的网络mynet
[root@localhost ~]# docker run -P -d -it --name tomcat01 --network mynet fb5657adc892
7875c3f572a65e76a53335ad01a359a009daf84fcc0e39e9015efd0daa7a9e28
[root@localhost ~]# docker run -P -d -it --name tomcat02 --network mynet fb5657adc892
819006e49b256ca8c3437d2dd7627a7011cc93297a3ebb2e860aa8a81809bb6e
[root@localhost ~]#


## 查看mynet网络,可以看到Containers下有配置的两个容器
[root@localhost ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "3d55e2ccfed08e00e34f112bdafcf307007441da8715da89c20e54afeea80af0",
        "Created": "2023-11-08T17:47:06.611839944+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "7875c3f572a65e76a53335ad01a359a009daf84fcc0e39e9015efd0daa7a9e28": {
                "Name": "tomcat01",
                "EndpointID": "687f42953a8d54ec73282898643cc1059ec6f5591f96deda7a2dea87e3ea9ba9",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "819006e49b256ca8c3437d2dd7627a7011cc93297a3ebb2e860aa8a81809bb6e": {
                "Name": "tomcat02",
                "EndpointID": "a23b2f3b961d796e7dcf8d7ebf7a94bb4fbc10df219d79ebd317d595eb9a8966",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

Docker搭建mysql主从

##下载镜像
docker pull mysql:5.7

##创建自定义网络
docker network create -d bridge --gateway 192.168.0.1 --subnet 192.168.0.0/16 mynet

##创建主从容器
docker run -it -d \
--name=mysql_master \
--network mynet \
-p 7001:3306 \
-v $PWD/master/conf:/etc/mysql/conf.d \
-v $PWD/master/logs:/logs \
-v $PWD/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
c20987f18b13

docker run -it -d \
--name=mysql_slave \
--network mynet \
-p 7002:3306 \
-v $PWD/slave/conf:/etc/mysql/conf.d \
-v $PWD/slave/logs:/logs \
-v $PWD/slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
c20987f18b13

##配置文件主
[mysqld]
# 数据库字符集
character_set_server=utf8
# mysql编号(只可以是数字) 每个节点不一样
server_id=1
# 开始binlog日志,规定日志文件名称
log-bin=mysql-bin
# 开启relaylog日志,规定日志文件名称
relay_log=relay_bin
# 从库的写操作是否写入binlog日志
log-slave-updates=1
# 采用严格的SQL语句模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

##配置文件从
[mysqld]
# 数据库字符集
character_set_server=utf8
# mysql编号(只可以是数字) 每个节点不一样
server_id=2
# 开始binlog日志,规定日志文件名称
log_bin=mysql_bin
# 开启relaylog日志,规定日志文件名称
relay_log=relay_bin
# 限制普通账户无法insert、delete、update语句,但是该配置对于管理员账号无效
read-only=1
# 采用严格的SQL语句模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

##进入主容器,创建同步账号
grant replication slave on *.* to 'slave'@'%' identified by '123456'; 
flush privileges;

##进入从容器
stop slave;
# 设置mysql_1数据库同步
change master to master_host="linux服务器ip",master_port=7001,master_user='slave',master_password='123456';
# 启动服务
start slave;
# 查看同步状态
show slave status\G;

Docker Swarm

查看swarm命令

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

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA 
  init        Initialize a swarm  ##初始化一个swarm
  join        Join a swarm as a node and/or manager ##作为节点或管理者加入swarm
  join-token  Manage join tokens ##管理者加入令牌
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

查看swarm初始化命令

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

Usage:  docker swarm init [OPTIONS]

Initialize a swarm

Options:
      --advertise-addr string                  Advertised address (format: <ip|interface>[:port])
      --autolock                               Enable manager autolocking (requiring an unlock key to start a stopped manager)
      --availability string                    Availability of the node ("active"|"pause"|"drain") (default "active")
      --cert-expiry duration                   Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
      --data-path-addr string                  Address or interface to use for data path traffic (format: <ip|interface>)
      --data-path-port uint32                  Port number to use for data path traffic (1024 - 49151). If no value is set or is set to 0, the default port (4789) is used.
      --default-addr-pool ipNetSlice           default address pool in CIDR format (default [])
      --default-addr-pool-mask-length uint32   default address pool subnet mask length (default 24)
      --dispatcher-heartbeat duration          Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
      --external-ca external-ca                Specifications of one or more certificate signing endpoints
      --force-new-cluster                      Force create a new cluster from current state
      --listen-addr node-addr                  Listen address (format: <ip|interface>[:port]) (default 0.0.0.0:2377)
      --max-snapshots uint                     Number of additional Raft snapshots to retain
      --snapshot-interval uint                 Number of log entries between Raft snapshots (default 10000)
      --task-history-limit int                 Task history retention limit (default 5)

创建swarm

[root@localhost ~]# docker swarm init --advertise-addr 192.168.64.128
Swarm initialized: current node (wntdtgdydv0700wc5ssldmusz) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3d72x6xpsg0a6iy4w72b7w76gb1ejeh5ztj0z55kvk0iv8ool8-ay3gvp548cjtg9jdykuxdujrt 192.168.64.128:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

查看如何加入一个manager或worker

docker swarm join-token manager
docker swarm join-token worker

查看所有swarm节点

[root@localhost ~]# docker node ls
ID                            HOSTNAME                STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
reyhky6v0iy2t806po8yrebhp     localhost.localdomain   Ready     Active                          20.10.0
wntdtgdydv0700wc5ssldmusz *   localhost.localdomain   Ready     Active         Leader           20.10.0

在swarm中部署服务

##创建docker网络
docker network create -d overlay mynet2

##部署服务
[root@localhost ~]# docker service create --network mynet2 --name mytomcat  tomcat
lffevfmu2q27slkask4oqfckv
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged

##查看所有服务
[root@localhost ~]# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
lffevfmu2q27   mynginx   replicated   1/1        nginx:latest
[root@localhost ~]#

##查看部署的节点,也可通过docker ps查看
[root@localhost ~]# docker service ps mynginx
ID             NAME        IMAGE          NODE                    DESIRED STATE   CURRENT STATE            ERROR     PORTS
yjt79bc5w5c7   mynginx.1   nginx:latest   localhost.localdomain   Running         Running 32 minutes ago

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值