狂神Docker学习笔记

Docker简介

出现原因:解决项目发布时的环境部署问题。

  • vm:linux centos原生镜像,几个G,几分钟。

  • docker:隔离,镜像(核心环境4m+jdk+mysql)十分小巧,运行镜像就可以了,秒级启动。

  • 官网

  • Docker Hub

每一个容器就是一个app和lib的集合,不同容器相互隔离,不同容器共用的只有内核。

Docker的好处

  • 应用更快速的交付和部署
  • 更便捷的升级和扩缩容
  • 更简单的系统运维
  • 更高效的计算资源应用

Docker架构

狂神Docker学习笔记_第1张图片

  • 镜像(image):类似模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器。最终服务的运行或者项目的运行就是在容器中的
  • 容器(container):Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。可以理解为一个简易的linux系统。
  • 仓库(repository):仓库就是存放镜像的地方,分为公有仓库和私有仓库。

Docker安装

  • 安装文档
  1. 卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  1. 安装工具包
sudo yum install -y yum-utils
  1. 设置镜像仓库
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //自己找一个快的

4.安装docker

//可以先更新下yum软件包索引
yum makecache fast

sudo yum install docker-ce docker-ce-cli containerd.io
  1. 启动docker
sudo systemctl start docker
//使用查看version命令判断是否安装成功
docker version
  1. 运行hello-world
sudo docker run hello-world

狂神Docker学习笔记_第2张图片
7. 查看已经下载的docker镜像

docker images

在这里插入图片描述
8.卸载docker

//删除软件
sudo yum remove docker-ce docker-ce-cli containerd.io
//删除文件
sudo rm -rf /var/lib/docker

Docker原理

  • Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问
  • DockerServer接收Docket-Client的指令,就会执行这个命令

Docker为啥比vm快

  • Docker有着比虚拟机更少的抽象层
  • Docker利用宿主机的内核,vm需要是GuestOS
  • 新建容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载GuestOS,分钟级别。docker是利用宿主机的操作系统省略这个复杂的过程,秒级。

Docker常用命令

  • 命令文档

帮助命令

docker version                  #显示docker版本信息
docker info                     #显示docker的系统信息,包括镜像和容器数量
docker 命令 --help              #帮助命令

镜像命令

  • docker images
- docker images

REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   13 months ago   13.3kB

#解释
REPOSITORY              镜像的仓库源
TAG                     镜像的标签
IMAGE ID                镜像的id
CREATED                 镜像的创建时间
SIZE                    镜像的大小

#可选项
-a, --all               Show all images (default hides intermediate images)
    --digests           Show digests
-f, --filter filter     Filter output based on conditions provided
    --format string     Pretty-print images using a Go template
    --no-trunc          Don't truncate output
-q, --quiet             Only show image IDs
  • docker search
- docker search mysql             查找某镜像
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10428     [OK]       
mariadb                           MariaDB is a community-developed fork of MyS…   3870      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   763                  [OK]
  • docker pull
docker pull mysql
Using default tag: latest                    如果不指定版本会使用最新版
latest: Pulling from library/mysql
a076a628af6f: Pull complete                  分层下载,docker image的核心 联合文件系统
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
406c9b8427c6: Pull complete 
7c88599c0b25: Pull complete 
25b5c6debdaf: Pull complete 
43a5816f1617: Pull complete 
1a8c919e89bf: Pull complete 
9f3cf4bd1a07: Pull complete 
80539cea118d: Pull complete 
201b3cad54ce: Pull complete 
944ba37e1c06: Pull complete 
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest                真实的下载地址

#以下两个命令等价
docker pull mysql
docker pull docker.io/library/mysql:latest

#指定版本下载
- docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists 					已经存在的不会再次下载
f6c208f3f991: Already exists 
88a9455a9165: Already exists 
406c9b8427c6: Already exists 
7c88599c0b25: Already exists 
25b5c6debdaf: Already exists 
43a5816f1617: Already exists 
1831ac1245f4: Pull complete 
37677b8c1f79: Pull complete 
27e4ac3b0f6e: Pull complete 
7227baa8c445: Pull complete 
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7 
  • docker rmi
docker rmi -f 镜像id                    #删除指定的容器
docker rmi -f $(docker images -aq)      #删除所有容器

容器命令

docker pull centos #下载一个centos镜像来完

  • docker run
docker run [可选参数] image

#参数说明
--name="xxx"    容器名字
-d              后台方式运行
-it             使用交互方式运行,进入容器查看内容
-p              指定容器端口 -p     8080:8080
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口(常用)
	-p 容器端口
	容器端口
-P              随机指定端口


#测试并进入容器
[root@192 docker]# docker run -it centos /bin/bash
[root@d0d6f15130b2 /]# 

#退出
exit      直接退出
Ctrl+P+Q  容器不停止退出
  • docker ps
docker ps        列出当前正在运行的容器
-a               列出当前正在运行的容器+历史运行过的容器
-n=num           限定显示数量
-q               只显示imageid 
  • docker rm
docker rm 容器id                    删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq)      删除所有容器
  • docker start 容器id
  • docker restart 容器id
  • docker stop 容器id
  • docker kill 容器id

其他命令

  • docker run -d
#后台启动容器
docker run -d 容器名

此时调用docker ps 发现centos 停止了 

docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
  • docker logs
docker logs --help

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
  -n, --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)


#举个例子
docker logs -tf --tail 10 容器id
  • docker top
docker top 容器id               查看进程信息
  • docker inspect
docker inspect 容器id           查看容器的信息

进入当前正在运行的容器

通常容器都是后台执行的,需要进入容器,修改一些配置

#方式一
docker exec -it 容器id
#方式二
docker attach 容器id


这两个区别:
docker exec        相当于打开了一个新的终端,可以在里面操作
docker attach      进入容器正在执行的终端

从容器内拷贝文件到主机

docker cp 容器id:容器内路径 目的地路径

常用命令总结

  • attach 当前shell下attach连接指定运行镜像
  • build 通过Dockerfile定制镜像
  • commit 提交当前容器为新的镜像
  • cp 从容器中拷贝指定文件或者目录到宿主机中
  • create 创建一个容器,同run但是不启动容器
  • diff 查看docker容器变化
  • events 从docker服务获取容器实时事件
  • exec 在已存在的容器上运行命令
  • export 导出容器的内容流作为一个tar归档文件【对应import】
  • history 展示一个镜像形成历史
  • images 列出系统当前镜像
  • import 从tar包中的内容创建一个新的文件系统映像【对应export】
  • info 显示系统相关信息
  • inspect 查看容器详情信息
  • kill kill指定的容器
  • load 从一个tar包中加载一个镜像【对应save】
  • login 注册或者登录一个docker源服务器
  • logout 从当前Docker registry退出
  • logs 输出当前容器日志信息
  • port 查看映射端口对应容器内部源端口
  • pause 暂停容器
  • ps 列出容器列表
  • pull 从docker镜像源服务器拉取指定镜像或者库镜像
  • push 推送指定镜像或者库镜像至docker源服务器
  • restart 重启运行的容器
  • rm 移除容器
  • rmi 移除镜像,无容器使用才可以删除,否则加-f
  • run 创建一个新的容器并运行一个命令
  • save 保存一个镜像为一个tar包
  • search 在docker hub中搜索镜像
  • start 启动容器
  • stop 停止容器
  • tag 给源中镜像打标签
  • top 查看容器中运行的进程信息
  • unpause 取消暂停容器
  • version 查看docker版本号
  • wait 截取容器停止时退出状态值

Docker安装Nginx

  • docker search
  • docker pull nginx
  • docker run -d --name nginxtest -p 3344:80 nginx
    • -d 后台启动
    • 3344外部暴露的端口号,80容器中暴露的端口号

狂神Docker学习笔记_第3张图片
问题: 每次改动nginx配置文件,都需要进入容器内部,十分麻烦若是可以在容器外提供一个映射路径,直接修改容器内部的文件多好。 -v 数据卷?

Docker安装tomcat

#官方文档的使用
docker run -it --rm tomcat:9.0

#我们之前启动都是后台,停止了容器之后,容器还是可以查到 上边的命令一般用于测试,用完即删除。

#可以先下载再启动
docker pull tomcat

#启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat

#访问发现404,那就进入tomcat看一哈怎么回事
docker exec -it tomcat01 /bin/bash

root@429a860a7d70:/usr/local/tomcat# cd webapps
root@429a860a7d70:/usr/local/tomcat/webapps# ls   
root@429a860a7d70:/usr/local/tomcat/webapps#                     呵,啥玩意都没有!

思考:每次出问题都要进入容器内改,真麻烦啊,要有文件映射就好了

部署es+kibana

#es暴露的端口很多
#es十分耗费内存
#es的数据一般需要放置到安全目录挂载
#  --net somenetwork ?是网络配置

#启动es
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

#发现他妈的卡死了
docker stats         查看cpu状态

在这里插入图片描述

#关闭,增加内存限制,修改配置文件, -e 环境配置修改
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"  -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

思考:如果两个不同容器的服务要互相调用,如何处理

可视化

  • portainer(先用这个)
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

狂神Docker学习笔记_第4张图片

  • Rancher(CI/CD再用)

Docker镜像原理

镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时库、环境变量和配置文件。

得到镜像的方式

  • 远程仓库
  • 别处拷贝
  • 自己制作DockerFile

Docker镜像加载原理

UnionFS(联合文件系统):UnionFS是一种分层,轻量级且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,联合文件系统是Docker的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作出具体应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,最终的文件系统会包含所有底层的文件和目录。

bootfs主要包含bootloader和kernal,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,再Docker镜像的最底层时bootfs,这一层与我们典型的Linux/Unix系统一样,包含boot加载器和内核。当boot加载完成之后整个内核都再内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs,再bootfs之上。包含典型的Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统的发行版,比如Ubuntu,Centos等等。

我们平时安装进虚拟机的系统很大,但是docker中却很小,是因为rootfs小,只需要包含最基本的命令,工具和程序库就行了。不同的系统bootfs基本一致,rootfs有差别,不同发行版可以共用bootfs。

分层的好处
共用资源!所有的Docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。

一个概念

Docker镜像都是只读的,当容器启动的时候,一个新的可写层被加载到镜像的顶部,这一层就是我们通常说的容器层,容器之下的都叫镜像层!

commit镜像

docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

完成容器–>镜像,类似虚拟机中的快照

容器数据卷

dcoker理念回顾

  • 将应用和环境一起打包成镜像
  • 此时若数据都在容器中,那么我们删除容器时,数据就会丢失

暴露需求:数据持久化的问题!

  • 容器之间可以有数据共享技术,Docker容器中产生的数据,同步到本地,这就是卷技术!目录的挂载,挂载到Linux上面。
  • 为了容器的持久化和同步操作!容器间也可以数据共享的

使用方式一、直接使用命令来挂载 -v

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

狂神Docker学习笔记_第5张图片
狂神Docker学习笔记_第6张图片
使用docker inspect 容器id,显示如下

狂神Docker学习笔记_第7张图片
具名挂载和匿名挂载

#匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx

#查看所有volume的情况
[root@192 ~]# docker volume ls
DRIVER    VOLUME NAME
local     31c5216d46a8b09cf0c597cf69238c22fe44e716c073d2f0f1048207be972a20

#31c5216d46a8b09cf0c597cf69238c22fe44e716c073d2f0f1048207be972a20这就是匿名挂载

#具名挂载
docker run -d -P --name nginx02 -v juming:/etc/nginx nginx  

#查看所有volume的情况
[root@192 ~]# docker volume ls
DRIVER    VOLUME NAME
local     juming

#注意如果不指定外部路径都挂载到哪里呢?用docker inspect 容器id 查看一下:/var/lib/docker/volumes/XX
 "Mounts": [
            {
                "Type": "volume",
                "Name": "juming",
                "Source": "/var/lib/docker/volumes/juming/_data",
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
#ro 只读
#rw 读写

#一旦设置了容器权限,容器对我们挂载出来的内容就会有限定,如果是ro,那么只能通过宿主机来写操作,容器内只读。
docker run -d -P --name nginx02 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming:/etc/nginx:rw nginx

使用方式二、使用DockerFile

啥是DockerFile

  • 就是用来构建docker镜像的构建文件!命令脚本
  • 通过这个脚本可以生成一个镜像,镜像是一层层的,脚本命令也是一层层的
#创建一个脚本文件
vim dockerfile1

#文件内容
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "------end-------"
CMD /bin/bash

#构建自己的镜像
docker build -f dockerfile1 -t mycentos:1.0 .
#过程
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 176268be25b8
Removing intermediate container 176268be25b8
 ---> 6d09cf53fd1a
Step 3/4 : CMD echo "------end-------"
 ---> Running in 9f2d7a3e0151
Removing intermediate container 9f2d7a3e0151
 ---> c79da7db25f6
Step 4/4 : CMD /bin/bash
 ---> Running in 43c82072a96e
Removing intermediate container 43c82072a96e
 ---> da093e0150d7
Successfully built da093e0150d7
Successfully tagged mycentos:1.0

#启动自己的镜像
[root@192 ceshi]# docker run -it da093e0150d7 /bin/bash
[root@42b66e4c9555 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01  volume02

#发现存在volume01和volume02,这是匿名挂载,使用docker inspect 查看一下
"Mounts": [
            {
                "Type": "volume",
                "Name": "a08e9c150598aec159c5c946d1831cd33e44b9a5a2891d463c2f8b179fde48ea",
                "Source": "/var/lib/docker/volumes/a08e9c150598aec159c5c946d1831cd33e44b9a5a2891d463c2f8b179fde48ea/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "e4a1a9abb52583f42303036f9e7ad9ca0afe391d6dd03177a109bfd05231f176",
                "Source": "/var/lib/docker/volumes/e4a1a9abb52583f42303036f9e7ad9ca0afe391d6dd03177a109bfd05231f176/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

数据卷容器

  • 多个容器实现数据同步时需要–volume-from
  • 父容器就叫数据卷容器
#启动两个自制的centos
docker run -it --name docker01 da093e0150d7
docker run -it --name docker02 --volumes-from docker01 da093e0150d7
#发现在某个volume01或volume02中新建文件,另一个容器内也可以访问到

结论

  • 容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有人使用为止。
  • 但是一旦父容器持久化到了本地,数据就可以持久化保存

DockerFile

  • dockerfile就是用来构建docker镜像的文件
  • 是一个命令参数脚本

构建步骤

  • 编写一个dockerfile
  • docker build构建成一个镜像
  • docker run 运行镜像
  • docker push 发布镜像(各种仓库)

很多官方镜像都是基础包,我们需要定制化自己的镜像

基础知识

  • 每个保留关键字都必须大写
  • 执行顺序从上到下
  • #表示为注释
  • 每个指令都会创建提交一个新的镜像层,并提交
  • dockerfile面向开发的,以前发布war包,现在可以提交镜像,不难的

DockerFile的命令

FORM               基础镜像,一切从这开始
MAINTAINER         镜像的编写者,姓名+邮箱
RUN                镜像构建需要运行的环境
ADD                添加内容,比如tomcat压缩包
WORKDIR            镜像的工作目录(RUN,CMD,ENTRYPOINT,COPY,ADD设置工作目录)
VOLUME             挂载卷,挂载主机目录
EXPOSE             指定暴露端口
RUN                构建镜像时运行的shell命令
CMD                运行容器时执行的命令,只有最后一个会生效
ENTRYPOINT         运行容器时执行的命令,可以追加命令
ONBUILD            当构建一个被继承的DockerFile的时候就会运行ONBUILD的指令,是一个触发指令
COPY               类似ADD,将文件拷贝到镜像中
ENV                构建的时候设置环境变量

构建一个试一哈

#1.编写DockerFile文件
FORM centos
MAINTAINER hsw<xxx@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH              

RUN yum -y install vim

EXPOSE 80

CMD /bin/bash

#2.构建镜像
docker build -f dockerfile文件路径 -t 镜像名:tag .

#3.测试运行
执行这个centos时候 pwd会发现在 /usr/local目录下 

使用docker history 镜像id,就可以查看镜像的构建步骤

CMD和ENTRYPOINT的区别

  • CMD是替换,ENTRYPOINT是追加

发布镜像

百度一下:你就知道

狂神Docker学习笔记_第8张图片

Docker网络

什么是docker0
狂神Docker学习笔记_第9张图片
用一个tomcat试一哈嘛

docker run -d -P --name tomcat01 tomcat
#查看容器内部网络ip
docker exec -it tomcat01 ip addr
#在主机上ping这个地址发现可以ping通
#在主机上使用ip addr 查看发现每启动一个容器就会多一个网卡 

原理

  • 每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装docker,就会存在一个网卡docker0桥接技术,使用的技术是evth-pair技术
  • 每启动一个容器,容器都会带来网卡,都是一对对出现的。evth-pair就是一对虚拟的设备接口,都是成对出现的,一段连着协议,一段彼此相连。因为这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备
  • 容器和容器之间可以通信,都是借助docker0路由

–Link

  • 各个微服务,希望用名字来访问,不考虑ip地址的变化
#docker中提供了--link 来解决这个问题

docker run -d -P --name tomcat03 --link tomcat02 tomcat

#此时直接用tomcat03 ping tomcat02就可以ping通
docker exec -it tomcat03 ping tomcat02

#但是tomcat02 不能直接 ping 通 tomcat03

#--link就是在hosts文件中增加了一个地址映射,太笨了不推荐

自定义网络实现容器互联

#查看所有的docker网络
[root@192 tomcatdockerfile]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f6f3d8ff1701   bridge    bridge    local
5aa0a84471a1   host      host      local
806862b61a55   none      null      local

网络模式

  • 桥接,docker默认
  • none,不配置网络
  • host,和宿主机共享网络
  • container,容器网络联通
#之前直接启动的默认就是 --net bridge
docker run -d -P --name tomcat01 --net bridge tomcat

#可以自定义一个网络
[root@192 tomcatdockerfile]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
91ad28c5515db4d60fd0b5f6956ee7a6f75a9c643061537bd576deca9537cb51
[root@192 tomcatdockerfile]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f6f3d8ff1701   bridge    bridge    local
5aa0a84471a1   host      host      local
91ad28c5515d   mynet     bridge    local
806862b61a55   none      null      local


#把服务放在自定义网络中
docker run -d -P --name tomcat01 --net mynet tomcat

[root@192 tomcatdockerfile]# docker run -d -P --name tomcat01 --net mynet tomcat
13fbe1f00dc9c452d8a72e19d631a2feaedb9a215168d0266188a1a06509882c
[root@192 tomcatdockerfile]# docker run -d -P --name tomcat02 --net mynet tomcat 
64d21d6c251811e39275e8b20a2652fd966e587613c17ad58b36dafc97122b41
[root@192 tomcatdockerfile]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "91ad28c5515db4d60fd0b5f6956ee7a6f75a9c643061537bd576deca9537cb51",
        "Created": "2021-01-30T10:51:48.978637737+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": {
            "13fbe1f00dc9c452d8a72e19d631a2feaedb9a215168d0266188a1a06509882c": {
                "Name": "tomcat01",
                "EndpointID": "fbdf209fc180f71fd278baf3eb3d10a236b60bcaed9cb59f9f1ee04d14c8b180",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "64d21d6c251811e39275e8b20a2652fd966e587613c17ad58b36dafc97122b41": {
                "Name": "tomcat02",
                "EndpointID": "d3bda84e06339c5d53f52244175066c3701f8a528bf2aeeb808b4edcc88664ff",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

自定义网络的好处

  • 直接利用容器名可以ping通
  • 不同服务集群可以隔离
[root@192 tomcatdockerfile]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.103 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.109 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.114 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.060 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.098 ms

网络联通
狂神Docker学习笔记_第10张图片
狂神Docker学习笔记_第11张图片

  • 这个命令就是让容器拥有两个ip地址

Redis集群部署

  • 创建一个redis网络
[root@192 tomcatdockerfile]# docker network create redis --subnet 172.38.0.0/16
9af68e838b7437859c23b32f97dd1b025bc7a7c62346dc560dc79bc1ef69891c

[root@192 tomcatdockerfile]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f6f3d8ff1701   bridge    bridge    local
5aa0a84471a1   host      host      local
91ad28c5515d   mynet     bridge    local
806862b61a55   none      null      local
9af68e838b74   redis     bridge    local

[root@192 tomcatdockerfile]# docker network inspect redis
[
    {
        "Name": "redis",
        "Id": "9af68e838b7437859c23b32f97dd1b025bc7a7c62346dc560dc79bc1ef69891c",
        "Created": "2021-01-30T12:26:35.27387273+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.38.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
  • 使用脚本创建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
  • 启动6个reids容器
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
 -v /mydata/redis/node-1/data:/data \
 -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server  /etc/redis/redis.conf
 
  docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
 -v /mydata/redis/node-2/data:/data \
 -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server  /etc/redis/redis.conf
 
 docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
 -v /mydata/redis/node-3/data:/data \
 -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server  /etc/redis/redis.conf
 
 docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
 -v /mydata/redis/node-4/data:/data \
 -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server  /etc/redis/redis.conf
 
 docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
 -v /mydata/redis/node-5/data:/data \
 -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server  /etc/redis/redis.conf
 
 docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
 -v /mydata/redis/node-6/data:/data \
 -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server  /etc/redis/redis.conf
  • 创建集群
#随便进入一个redis
docker exec -it redis-1  /bin/sh

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

#进入集群
 redis-cli  -c
#查看节点
127.0.0.1:6379> cluster nodes
044329821e386106e1375b483705fe4e653032f2 172.38.0.11:6379@16379 myself,master - 0 1611982214000 1 connected 0-5460
092e120cbb5e5bc2d07f74e42e7825c5ed9b3c05 172.38.0.15:6379@16379 slave 044329821e386106e1375b483705fe4e653032f2 0 1611982215000 5 connected
0d7f5cab6f86ce24e07985035f8e15ebe7a91c25 172.38.0.14:6379@16379 slave e8568020c79eeb8fbfff115974103f6e2d42bcce 0 1611982215517 4 connected
6da03576e6b11fee84a59bb7a49a851c766cff0b 172.38.0.16:6379@16379 slave f30d39b45a32e6ec0187fa1e88d12d1c44a56386 0 1611982215115 6 connected
f30d39b45a32e6ec0187fa1e88d12d1c44a56386 172.38.0.12:6379@16379 master - 0 1611982215115 2 connected 5461-10922
e8568020c79eeb8fbfff115974103f6e2d42bcce 172.38.0.13:6379@16379 master - 0 1611982216122 3 connected 10923-16383


#存放数据测试
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK

#13存放数据把此容器停掉
[root@192 tomcatdockerfile]# docker stop 9cfb2d666fe8
9cfb2d666fe8

#再次获取数据,依然可以获取到
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"

SpringBoot微服务打包Docker镜像

  • 构建微服务项目
  • 打包应用
  • 编写dockerfile
  • 构建镜像
  • 发布运行

未完。。。转去学Spring Cloud

你可能感兴趣的:(Docker)