Docker总结笔记

文章目录

    • 1.docker概述
    • 2.虚拟化技术和容器化技术
    • 3.Docker基本组成
    • 4.Docker安装
    • 5.Docker容器运行流程
    • 6.底层原理
    • 7.Docker常用命令
      • 7.1 基础命令
      • 7.2 镜像命令
      • 7.3 容器命令
      • 7.4 其他命令
    • 8.Docker镜像详解
      • 8.1 什么是镜像
      • 8.2 Docker镜像加载原理
      • 8.3 镜像中的分层
      • 8.4 提交镜像
    • 9.容器数据卷
      • 9.1 数据卷使用方式
      • 9.2 安装Mysql 挂载数据
      • 9.3 具名和匿名挂载
      • 9.4 数据卷容器
    • 10.DockerFile
      • 10.1 Dockerfile构建过程
      • 10.2 Dockerfile指令
      • 10.3 发布镜像
    • 11.Docker网络
      • 11.1 Docker0默认网关
      • 11.2 link指令链接容器
      • 11.3 自定义网络
      • 11.4 网络连通
    • 12 搭建Redis集群

1.docker概述

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。官网:https://docs.docker.com/

2.虚拟化技术和容器化技术

虚拟化技术特点:1.资源占用多 2.冗余步骤多 3.启动很慢

容器化技术:容器化技术不是模拟的一个完整的操作系统

比较Docker和虚拟机的不同:

  1. 传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
  2. Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。
  3. 每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。

容器化带来的好处:
Docker总结笔记_第1张图片

3.Docker基本组成

Docker总结笔记_第2张图片解释:
Docker总结笔记_第3张图片

4.Docker安装

  1. 卸载旧版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

  1. 下载需要的安装包
yum install -y yum-utils
  1. 设置镜像仓库
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  #国外的地址
    
# 设置阿里云的Docker镜像仓库
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #国外的地址
  1. 更新yum软件包索引
yum makecache fast
  1. 安装Docker相关配置
#docker-ce 是社区版,docker-ee 企业版
 yum install docker-ce docker-ce-cli containerd.io
  1. 启动Docker
systemctl start docker
# 查看当前版本号,是否启动成功
docker version
# 设置开机自启动
systemctl enable docker
  1. 配置阿里云镜像加速
    (1)进入阿里云官网,搜索容器镜像服务
    Docker总结笔记_第4张图片(2)依次执行官方的这四条命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

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

5.Docker容器运行流程

启动一个容器,Docker的运行流程如下图:
Docker总结笔记_第5张图片

6.底层原理

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问!Docker Server接收到Docker-Client的指令,就会执行这个指令!
Docker总结笔记_第6张图片Docker为什么比VM Ware快?

1、Docker比虚拟机更少的抽象层

2、docker利用宿主机的内核,VM需要的是Guest OS
Docker总结笔记_第7张图片 Docker新建一个容器的时候,不需要像虚拟机一样重新加载一个操作系统内核,直接利用宿主机的操作系统,而虚拟机是需要加载Guest OS。Docker和VM的对比如下:
Docker总结笔记_第8张图片

7.Docker常用命令

7.1 基础命令

#命令的帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/
docker version          #查看docker的版本信息
docker info             #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help       #帮助命令(可查看可选的参数)
docker COMMAND --help

7.2 镜像命令

1.docker images 查看本地主机的所有镜像

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   11 months ago   13.3kB

#解释:
1.REPOSITORY  镜像的仓库源

2.TAG  镜像的标签

3.IMAGE ID 镜像的id

4.CREATED 镜像的创建时间

5.SIZE 镜像的大小


# 可选参数

-a/--all 列出所有镜像

-q/--quiet 只显示镜像的id

2.docker search 搜索镜像

[root@iZwz99sm8v95sckz8bd2c4Z ~]# 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]


#可选参数

Search the Docker Hub for images

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@iZwz99sm8v95sckz8bd2c4Z ~]# 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]

3.docker pull 镜像名[:tag] 下载镜像

#[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql:5.7
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql
Using default tag: latest            #如果不写tag默认就是latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete          #分层下载,docker image的核心-联合文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #下载来源的真实地址  #docker pull mysql等价于docker pull docker.io/library/mysql:latest

4.docker rmi 删除镜像

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

7.3 容器命令

拉取运行镜像

#取centos镜像
docker pull centos

#运行容器的命令说明:
docker run [可选参数] image
#参数说明
--name="名字"           指定容器名字
-d                     后台方式运行
-it                    使用交互方式运行,进入容器查看内容
-p                     指定容器的端口
(
-p ip:主机端口:容器端口  配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
)
-P                     随机指定端口(大写的P)

进入/退出容器

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

#exit 停止并退出容器(后台方式运行则仅退出)
#Ctrl+P+Q  不停止容器退出
[root@bd1b8900c547 /]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]#

列出运行过的容器命令

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


[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
bca129320bb5   centos         "/bin/bash"   4 minutes ago   Exited (0) 3 minutes ago             optimistic_shtern
bd1b8900c547   centos         "/bin/bash"   6 minutes ago   Exited (0) 5 minutes ago             cool_tesla
cf6adbf1b506   bf756fb1ae65   "/hello"      5 hours ago     Exited (0) 5 hours ago               optimistic_darwin

删除容器命令:

docker rm 容器id                 #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq)   #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器

启动和停止容器命令

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

7.4 其他命令

查看容器中进程信息

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker top c703b5b1911f
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                11156               11135               0                   11:31               ?                   00:00:00            /bin/sh -c while true;do echo hi;sleep 5;done
root                11886               11156               0                   11:43               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5

查看容器的元数据

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker inspect 容器id

进入正在运行的容器
方式一:

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it c703b5b1911f /bin/bash
[root@c703b5b1911f /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@c703b5b1911f /]# ps -ef      
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 03:31 ?        00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done
root       279     0  0 03:54 pts/0    00:00:00 /bin/bash
root       315     1  0 03:56 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
root       316   279  0 03:56 pts/0    00:00:00 ps -ef

方式二:

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker attach c703b5b1911f

docker exec 进入容器后开启一个新的终端,可以在里面操作

docker attach 进入容器正在执行的终端,不会启动新的进程

拷贝操作

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

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

命令小结图解:
Docker总结笔记_第9张图片

8.Docker镜像详解

8.1 什么是镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。

8.2 Docker镜像加载原理

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS联合文件系统。
Docker总结笔记_第10张图片

8.3 镜像中的分层

Docker总结笔记_第11张图片
Docker总结笔记_第12张图片Docker总结笔记_第13张图片Docker总结笔记_第14张图片特点
Docker镜像都是可读的,当容器启动时,一个新的可写层被加载到镜像顶部!
这一层就是我们通常说的容器层,容器层之下都是镜像层!

8.4 提交镜像

使用docker commit 命令提交容器成为一个新的版本

docker commit -m=“提交的描述信息”  -a="作者" 容器id 目标镜像名:[TAG] 

9.容器数据卷

容器数据卷就是容器之间的数据共享技术,即卷技术。可以将容器内的目录挂载到宿主机上。
容器中的配置和数据通过数据卷挂载到宿主机上,保证数据不会随容器销毁儿丢失

9.1 数据卷使用方式

方式一:

#docker run -it -v 主机内目录:容器目录
[root@localhost ~]# docker run -it -v /home/ceshi:/home centos /bin/bash

Docker总结笔记_第15张图片方式二:
通过DockerFile构建镜像时指定目录挂载

#创建一个dockerfile
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "--------end-------"
CMD /bin/bash
#通过dockerfile构建镜像
[root@localhost docker-test-volume]# docker build -f dockerfile01 -t jzqcentos:0.1 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 067ba2304e74
Removing intermediate container 067ba2304e74
 ---> aef623cdfe83
Step 3/4 : CMD echo "--------end-------"
 ---> Running in 1c5c8b3876b8
Removing intermediate container 1c5c8b3876b8
 ---> 16e27549fc39
Step 4/4 : CMD /bin/bash
 ---> Running in ce74dfbf90f1
Removing intermediate container ce74dfbf90f1
 ---> f6eb7fd632d9
Successfully built f6eb7fd632d9
Successfully tagged jzqcentos:0.1
#启动容器
[root@localhost docker-test-volume]# docker run -it jzqcentos:0.1 /bin/bash

dockerfile中指定的两个容器内目录被挂载出来
Docker总结笔记_第16张图片Docker总结笔记_第17张图片

9.2 安装Mysql 挂载数据

mysql数据持久化问题

#获取镜像
[root@localhost ~]# docker pull mysql:5.7

#运行容器,挂载数据,启动时配置mysql用户密码
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名
[root@localhost ~]# docker run -it -p 3310: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

容器中的数据被挂载到本地
在这里插入图片描述

9.3 具名和匿名挂载

匿名挂载
通过-v参数指定容器内路径,不指定容器外具体挂载路径

#匿名挂载
-v 容器内路径
[root@localhost ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有的volume情况
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     8220a55ff7545e64e1f5fe20838be652592382777ded8949ee33f85aef4b80ec

Docker总结笔记_第18张图片具名挂载
通过-v指定 卷名:容器内路径

[root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
3983cd57c1d5ce85ff77e8cfa7d8aa2c2f49ba0db6ec8b42bf1505d3cc6af29a
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     8220a55ff7545e64e1f5fe20838be652592382777ded8949ee33f85aef4b80ec
local     juming-nginx

Docker总结笔记_第19张图片所有docker容器内的卷,没有指定目录的情况下都存放在 /var/lib/docker/vlumes/xxx/-data中
通过具名挂载可以方便的找到对应的卷,大多数情况都使用具名挂载

#具名挂载、匿名挂载和指定路径挂载的区别
-v 容器内路径	#匿名挂载
-v 卷名:容器内路径	#具名挂载
-v /宿主机路径:容器内路径	#指定路径挂载

拓展:

#通过 -v 容器内路径:ro/rw 改变读写权限
#ro 只读
#rw 可读可写
#默认是rw,如果设置了ro权限,容器就不能修改文件的内容了,只能通过外部宿主机修改
[root@localhost ~]# docker -d -P --name nginx03 -v juming-nginx:ro nginx
[root@localhost ~]# docker -d -P --name nginx03 -v juming-nginx:rw nginx

9.4 数据卷容器

多个容器同步数据
Docker总结笔记_第20张图片

10.DockerFile

dockerfile是用来构建docker镜像的文件!即一个参数脚本!
构建步骤:
1、编写一个dockerfile文件
2、docker build构建一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)

10.1 Dockerfile构建过程

基础知识:
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到下顺序执行
3、#表示注解
4、每个指令都会创建一个新的镜像层,并提交
Docker总结笔记_第21张图片

10.2 Dockerfile指令

FROM	#基础镜像,构建的基础
MAINTAINER	#镜像作者,名字+邮箱
RUN	#镜像构建时需要运行的命令
ADD	#添加内容,添加对应压缩包
WORKDIR	#镜像的工作目录
VOLUME	#挂载目录
EXPOSE	#指定保留端口
CMD	#指定容器启动时运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	#指定容器启动时运行的命令,可追加命令
ONBUILD	#当构建一个被继承Dockerfile,运行ONBUILD的指令
COPY	#类似ADD,将文件拷贝到镜像中
ENV	#构建时设置环境变量

1、编写dockerfile文件

FROM centos:7
MAINTAINER jzq<4561032864@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

ADD jdk-8u11-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.22.tar.gz /usr/local

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

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

EXPOSE 8080

CMD echo $MYPATH
CMD echo "------end------"
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

2、通过dockerfile构建镜像

-f dockerfile文件路径
-t 镜像名:[tag]
[root@localhost docker-test-volume]# docker build -f dockerfile -t mytomcat:0.1 .
Successfully built e57b9ac707f3
Successfully tagged mytomcat:0.1

3、启动容器

[root@localhost docker-test-volume]# docker run -d -p 9090:8080 --name jzqtomcat -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs mytomcat:0.1

10.3 发布镜像

Docker总结笔记_第22张图片

11.Docker网络

11.1 Docker0默认网关

Docker使用的是Linux的桥接模式,宿主机中有一个Docker容器的网桥,默认是Docker0。容器和宿主机、容器和容器之间通过网桥通信。
每启动一个容器都会生成一个默认IP,容器在没有指定网络的情况下,都通过宿主机的docker0路由。容器和docker0通过Veth-pair桥接,容器之间通行通过Veth-pair进行转发。
Docker总结笔记_第23张图片Docker中的所有网络接口都是虚拟接口,以提高效率!
Docker总结笔记_第24张图片

Docker总结笔记_第25张图片

11.2 link指令链接容器

通过–link命令链接对应容器,通过服务名链接对方容器

[root@localhost ~]# docker run -d -P --link tomcat01 --name tomcat03 mytomcat:0.1
0fd71d0f9ca4a6fc66d9781a54471e992858f70c393b4ebde3c9d9711b82e8da

[root@localhost ~]# docker exec -it tomcat03 ping tomcat01
PING tomcat01 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from tomcat01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.130 ms

–link 将容器的hosts文件中添加了对应容器的映射

[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.2	tomcat01 8d817446bc33
172.17.0.3	0fd71d0f9ca4

实际开发中不建议使用–link。
实际开发中使用自定义网络,docker0不支持容器名链接!

11.3 自定义网络

docker中的默认网络

# 网络模式
bridge:桥接	docker0(默认)
host:和宿主机共享网络
none:不配置网络
container:容器之间网络直连(用的少,局限大!)
[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
c6264498cf24   bridge    bridge    local
9e3b2d4c1ebf   host      host      local
2bc8819b213d   none      null      local

启动容器时默认会加–net bridge参数(指定使用docker0网络)

[root@localhost ~]# docker run -d -P --name tomcat01 --net bridge mytomcat:0.1
[root@localhost ~]# docker run -d -P --name tomcat01 mytomcat:0.1

自定义网络

# --driver 指定网络模式(bridge)
# --subnet	指定子网(192.167.0.0/16   子网分配范围:192.167.0.2~192.167.255.255)
# --gateway	指定网关(192.167.0.1 子网通过网关转发)
[root@localhost ~]# docker network create --driver bridge --subnet 192.167.0.0/16 --gateway 192.167.0.1 mynet
[root@localhost ~]# docker network list
NETWORK ID     NAME      DRIVER    SCOPE
c6264498cf24   bridge    bridge    local
9e3b2d4c1ebf   host      host      local
d192466a3824   mynet     bridge    local
2bc8819b213d   none      null      local

Docker总结笔记_第26张图片
自定义网络可以直接通过服务名ping通

[root@localhost ~]# docker run -d -P --name tomcat01 --net mynet mytomcat:0.1
6fd71c3425b4f203f8a0a10ad39d862ce62a6001a7d1d0f9e82fc56b902dffd9
[root@localhost ~]# docker run -d -P --name tomcat02 --net mynet mytomcat:0.1
a4418aed46e1af6b5bd1eab92b82cc2beb6826198ea6bcfe9ec93e248b53293c
[root@localhost ~]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.167.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.167.0.3): icmp_seq=1 ttl=64 time=0.201 ms
64 bytes from tomcat02.mynet (192.167.0.3): icmp_seq=2 ttl=64 time=0.139 ms

11.4 网络连通

不同网络之间的容器需要连通之后才可以通信
Docker总结笔记_第27张图片
将tomcat-net-0容器连通到mynet网络中,即可和mynet网络中的容器进行通信

[root@localhost ~]# docker network connect mynet tomcat-net-0

Docker总结笔记_第28张图片
Docker总结笔记_第29张图片

12 搭建Redis集群

Docker总结笔记_第30张图片
1、创建网卡

[root@localhost ~]# docker network create redis --subnet 172.38.0.0/16 --gateway 172.38.0.1

2、脚本创建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

2、脚本启动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 --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done

3、创建集群

[root@localhost redis-cluster]# docker exec -it redis-1 /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown
[root@localhost redis-cluster]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof  nodes.conf
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.3
8.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-r
eplicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: b05fe96e65a02f7e95874caf5ee1dada05e409ce 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: b861d4b0bca2678655faea2fe97b978e32b69d8e 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: c96ccff79ee7aff3c8b96fb96b202f5a15101f2f 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: dc87525aac267aeee25a458983c0c5d0631c89a0 172.38.0.14:6379
   replicates c96ccff79ee7aff3c8b96fb96b202f5a15101f2f
S: 02f9c3cd665530a3b1b6c7a1f486530266a6654b 172.38.0.15:6379
   replicates b05fe96e65a02f7e95874caf5ee1dada05e409ce
S: 7dfb45a1f04b59f0c89b33f3e0b291df67c96bc6 172.38.0.16:6379
   replicates b861d4b0bca2678655faea2fe97b978e32b69d8e
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: b05fe96e65a02f7e95874caf5ee1dada05e409ce 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: c96ccff79ee7aff3c8b96fb96b202f5a15101f2f 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: b861d4b0bca2678655faea2fe97b978e32b69d8e 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: dc87525aac267aeee25a458983c0c5d0631c89a0 172.38.0.14:6379
   slots: (0 slots) slave
   replicates c96ccff79ee7aff3c8b96fb96b202f5a15101f2f
S: 02f9c3cd665530a3b1b6c7a1f486530266a6654b 172.38.0.15:6379
   slots: (0 slots) slave
   replicates b05fe96e65a02f7e95874caf5ee1dada05e409ce
S: 7dfb45a1f04b59f0c89b33f3e0b291df67c96bc6 172.38.0.16:6379
   slots: (0 slots) slave
   replicates b861d4b0bca2678655faea2fe97b978e32b69d8e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

4、链接集群

/data # redis-cli -c
127.0.0.1:6379> cluster nodes
b861d4b0bca2678655faea2fe97b978e32b69d8e 172.38.0.12:6379@16379 master - 0 1649301865000 2 connected 5461-10922
02f9c3cd665530a3b1b6c7a1f486530266a6654b 172.38.0.15:6379@16379 master - 0 1649301865000 9 connected 0-5460
7dfb45a1f04b59f0c89b33f3e0b291df67c96bc6 172.38.0.16:6379@16379 slave b861d4b0bca2678655faea2fe97b978e32b69d8e 0 1649301865512 6 connected
b05fe96e65a02f7e95874caf5ee1dada05e409ce 172.38.0.11:6379@16379 myself,slave 02f9c3cd665530a3b1b6c7a1f486530266a6654b 0 1649301864000 1 connected
c96ccff79ee7aff3c8b96fb96b202f5a15101f2f 172.38.0.13:6379@16379 slave dc87525aac267aeee25a458983c0c5d0631c89a0 0 1649301866052 7 connected
dc87525aac267aeee25a458983c0c5d0631c89a0 172.38.0.14:6379@16379 master - 0 1649301865728 7 connected 10923-16383
172.38.0.12:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"

你可能感兴趣的:(网络,docker)