Docker

一、Docker【虚拟容器技术】

系统平滑移植,容器虚拟化技术 基于GO语言实现的云开源项目

#镜像和容器 === 面向对象中的   类和对象,images[镜像]和创建容器,容器也可以提交成一个镜像
#Docker组成:镜像、容器、仓库【repository==镜像的仓库,我使用的阿里云镜像加速】

#镜像对是一层一层扩展的,比如java中的extend

以前开发和运维总是为了版本不同,环境不同等因素造成项目不成正常上线运行,而现在Docker出现了不可能存在这种问题了,Docker类似于一个centos 的镜像,比如我们电脑上用的vm ware中的linux镜像,将我们的软件【开发好的代码打成jar】和运行环境以及类似一些配置,连根拔起的全部打包到Docker中。就像搬家现在直接是把整栋楼移走

简述:
一次镜像处处运行,从搬家到搬楼
一句话概括:
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布容器技术

Docker的组成:

在这里插入图片描述

下载路径:

Docker: http://www.docker.com

docker 命令

$ sudo docker   # docker 命令帮助


Commands:
    attach    Attach to a running container                 # 当前 shell 下 attach 连接指定运行镜像
    build      Build an image from a Dockerfile              # 通过 Dockerfile 定制镜像
    commit    Create a new image from a container's changes   # 提交当前容器为新的镜像
    cp          Copy files/folders from the containers filesystem to the host path   # 从容器中拷贝指定文件或者目录到宿主机
    create    Create a new container                        # 创建一个新的容器,同 run,但不启动容器
    diff         Inspect changes on a container's filesystem   # 查看 docker 容器变化
    events    Get real time events from the server          # 从 docker 服务获取容器实时事件
    exec       Run a command in an existing container        # 在已存在的容器上运行命令
    export    Stream the contents of a container as a tar archive        # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
    history    Show the history of an image                  # 展示一个镜像形成历史
    images    List images                                   # 列出系统当前镜像
    import    Create a new filesystem image from the contents of a tarball    # 从tar包中的内容创建一个新的文件系统映像[对应 export] 
    info        Display system-wide information               # 显示系统相关信息
    inspect   Return low-level information on a container   # 查看容器详细信息
    kill         Kill a running container                      # kill 指定 docker 容器
    load       Load an image from a tar archive              # 从一个 tar 包中加载一个镜像[对应 save]
    login      Register or Login to the docker registry server     # 注册或者登陆一个 docker 源服务器
    logout    Log out from a Docker registry server         # 从当前 Docker registry 退出
    logs      Fetch the logs of a container                 # 输出当前容器日志信息
    port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT    # 查看映射端口对应的容器内部源端口
    pause     Pause all processes within a container        # 暂停容器
    ps         List containers                               # 列出容器列表
    pull       Pull an image or a repository from the docker registry server     # 从docker镜像源服务器拉取指定镜像或者库镜像
    push      Push an image or a repository to the docker registry server    # 推送指定镜像或者库镜像至docker源服务器
    restart   Restart a running container                   # 重启运行的容器
    rm        Remove one or more containers                 # 移除一个或者多个容器
    rmi       Remove one or more images       # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]          
    run       Run a command in a new container     # 创建一个新的容器并运行一个命令
    save      Save an image to a tar archive                # 保存一个镜像为一个 tar 包[对应 load]
    search   Search for an image on the Docker Hub         # 在 docker hub 中搜索镜像
    start     Start a stopped containers                    # 启动容器
    stop      Stop a running containers                     # 停止容器
    tag       Tag an image into a repository                # 给源中镜像打标签
    top       Lookup the running processes of a container   # 查看容器中运行的进程信息
    unpause   Unpause a paused container                    # 取消暂停容器
    version   Show the docker version information           # 查看 docker 版本号
    wait       Block until a container stops, then print its exit code      # 截取容器停止时的退出状态值

常用命令

文件拷贝

docker cp

docker cp /www/runoob 96f7f14e99ab:/www/    //将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下
docker cp /www/runoob 96f7f14e99ab:/www     //将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp  96f7f14e99ab:/www /tmp/      //将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中
例子:
docker cp tst-mongodb-qa:/data/db /data/db/mongodb   //将/data/db目录下的文件,拷贝到/data/db/mongodb下

创建容器
Docker run :创建一个新的容器并运行一个命令

语法
- docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
 -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
 -d: 后台运行容器,并返回容器ID;
 -i: 以交互模式运行容器,通常与 -t 同时使用;
 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
 -it 配置新终端使用,如:docker exec -it  nginx bash  
 --name="nginx-lb": 为容器指定一个名称;
 --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
 --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
 -h "mars": 指定容器的hostname;
 -e username="ritchie": 设置环境变量;
 --env-file=[]: 从指定文件读入环境变量;
 --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
 -m :设置容器使用内存最大值;
 --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/Container: 四种类型;
 --link=[]: 添加链接到另一个容器;
 --expose=[]: 开放一个端口或一组端口;
 -v:挂载目录“-v 宿主目录:容器目录"
--restart 字符串在容器退出时应用的重新启动策略(默认为“no”, 开机启动“always”)

docker实战经验

查看容器资源

docker stats   
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
36c37f2426c7        health-scanner      0.00%               3.051MiB / 7.801GiB   0.04%               304kB / 308kB       0B / 0B             8
e2e26a3c153a        dcar-scanner        0.00%               2.988MiB / 7.801GiB   0.04%               320kB / 319kB       0B / 0B             8
754ec8783005        uic-scanner          0.00%               73.5MiB / 7.801GiB    0.92%               881kB / 1.41MB      459kB / 0B          11
81f6b6aed6b8        uic                        0.01%               345.2MiB / 7.801GiB   4.32%               640MB / 3.92GB      0B / 1.52GB         11

查看docker占用的空间

docker system df   
root@iZwz954id2ypetyalkh65rZ:~# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              8                   1                   1.359GB             1.201GB (88%)
Containers          1                   1                   2.932GB             0B (0%)
Local Volumes       1                   0                   0B                  0B
Build Cache                                                 0B                  0B

清除所有容器

docker rm $(docker ps -a -q) 
docker image prune 清除所有镜像缓存(临时镜像)
docker rmi $(docker image ls -aq) 清除所有镜像

二、Docker 基础命令

启动docker

systemctl start docker

关闭docker

systemctl stop docker

重启docker

systemctl restart docker

docker设置随服务启动而自启动

systemctl enable docker

查看docker 运行状态

------如果是在运行中 输入命令后 会看到绿色的active

systemctl status docker

查看docker 版本号信息

docker version

docker info

docker 帮助命令

忘记了某些命令便可使用此进行查看与回顾

docker --help

比如 咱忘记了 拉取命令 不知道可以带哪些参数 咱可以这样使用

docker pull --help

三、Docker 镜像命令

查看自己服务器中docker 镜像列表

docker images

搜索镜像

docker search 镜像名
docker search --filter=STARS=9000 mysql 搜索 STARS >9000的 mysql 镜像

拉取镜像 不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本

docker pull 镜像名 
docker pull 镜像名:tag

查看阿里云镜像上的某个镜像:

docker search redis  #这样是查询 阿里云镜像上redis的所有版本  提示信息:Using default tag: latest

doker search --limit 5 redis  #这样只是查看指定的几个

拉取阿里云上的镜像

docker pull redis  #如果有默认下载最新版本,否则下载失败

docker pull redis:6.0.8  #下载指定的版本 6.0.8

在Docker上运行容器

docker run -it ubuntu /bin/bash
#OPTIONS说明(常用):有些是一个减号,有些是两个减号
#--name="容器新名字"       为容器指定一个名称;
#-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);

#-i:以交互模式运行容器,通常与 -t 同时使用;
#-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
#也即启动交互式容器(前台有伪终端,等待交互)

/bin/bash #这个意思是  进入控制台交互模式

exit #如果不想使用运行了,直接结果容器  

给予容器取名,再运行

docker run -it --name=my001 ubuntu /bin/bash  #运行方式一

docker run -it --name=my001 ubuntu bash  	 #运行方式二

容器运行之后查看 容器的记录

命令如下:

可以通过加-a这个参数进行所有运行过的容器查询

docker ps -a

或者是通过对docker容器中进行ls -a 查询其所有容器

docker container ls -a

这两个命令参数都是一样的意思

运行容器的两种方式:【后台守护适用于服务器、前台适用于ubuntu、centos等等】

【重点】

前台交互:

docker run -it ubuntu bash  

后台守护:

docker run -d redis:6.0.8  #这样创建容器适用于服务比如:redis、mysql等等
#如果使用前台交互式,启动了服务就无法交互了

查看某个容器的的日志:

docker logs 3005f24517d0

容器和镜像的概念:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GAiK6KN-1666281223912)(C:\Users\MI\AppData\Roaming\Typora\typora-user-images\1652429836436.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfbSSO2U-1666281223912)(C:\Users\MI\AppData\Roaming\Typora\typora-user-images\1652431929238.png)]

退出Docker容器的命令:

【重点】

Ctrl + q + p   #回到Linux交互界面,不会终止容器

Docker中容器退出后,想重新进去命令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z2xTcnnY-1666281223913)(C:\Users\MI\AppData\Roaming\Typora\typora-user-images\1652489066997.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kFxrwdk1-1666281223913)(C:\Users\MI\AppData\Roaming\Typora\typora-user-images\1652488596671.png)]

#attach 和 exec 的区别:前者是直接进入原有的进程退出就会停止进程导致停止容器,后者是重新开启一个线程退出不会停止容器     开发中选择第2种

docker attach dd98df9f8928 #这样重新进入容器,退出输入exit会导致容器停止 

docker exec -it dd98df9f8928 /bin/bash #这是重新进入docker的某个容器,按exit退出不会停止容器,与上面相反

Docker中 镜像【images】是只读,容器【redis/mysql…】是可操作的:

1、在docker容器的ubuntu中安装vim工具:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qByhCFYr-1666281223914)(D:\ATool\typora\image\1652493697873.png)]

2、镜像、容器、仓库的一套流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Az1mXxIZ-1666281223914)(D:\ATool\typora\image\docker-flow-.png)]

Docker容器的数据卷:【卷的目的就是将Docker运行的容器数据持久化到 Linux中的文件、实现数据备份】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xnnpq7VG-1666281223915)(D:\ATool\typora\image\1652535628834.png)]

1、通过容器的数据卷和实现 Linux主机和Docker中容器 备份数据 【数据共享】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qhvt2DkA-1666281223915)(C:\Users\MI\AppData\Roaming\Typora\typora-user-images\1652537210530.png)]

/2、通过查看Docker容器的数据卷是否在 Linux数据卷创建成功【官方话:是否挂载successful】

​ 卷就是目录或文件

docker inspect daf9068b119a #这条指令是查看容器所有内部信息,查看挂载只需要看:Mounts属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1XGCjFwF-1666281223916)(C:\Users\MI\AppData\Roaming\Typora\typora-user-images\1652537995109.png)]

实战操作:【在Docker中拉取运行Tomcat、redis等容器】

  • ​ i:交互
  • ​ t:终端
  • ​ d:后台
  • ​ p:端口号

一、Install tomcat in docker container【安装Tomcat】

1、拉取镜像:

docker search tomcat #查看镜像、或者去docker hub去查

docker pull tomcat #这里是拉取最新的、否则:docker pull tomcat:9.0.1  -->>> 指定版本的镜像

2、根据镜像运行成容器:

docker run -d -p 8080:8080 tomcat

· -p 小写,centos7主机端口:docker容器端口  映射【关联】

到Centos7火狐中输入运行时:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uuSddnKP-1666281223916)(C:\Users\MI\AppData\Roaming\Typora\typora-user-images\1652583637066.png)]

可能没有映射端口或者没有关闭防火墙【这不是重点===只是可能会发生】

#docker ps 查看端口
30a8404b4a2a tomcat "catalina.sh run" 7 seconds ago  Up 5 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tom1
#检查防火墙状态: firewall-cmd --state
#告诉linux系统以后开机不需要启动防火墙:systemctl disable firewalld
#开启指令:systemctl enable firewalld
为什么运行tomcat容器会报404?
因为pull下来的是  tomcat最新版 10.1.14 -- 10版本的webapps中没有项目,只有webapps.dist中有

#可以 cd webapps   ls -l 此时发现没有文件  那肯定404啊

#解决办法:  删除webapps
rm -r webapps  -r表示递归删除,该文件下的所有子文件
#然后将webapps.dist 改成 webapps
mv webapps.dist --->>> webapps
10版本的Tomcat太高了,使用别人已经搞好了的【包含JDK 8】可乐而不为呢?:免修改版

【重点】

·  docker pull billygoo/tomcat8-jdk8

·  docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

二、Install mysql in docker container【安装Mysql 5.7版本】

第一种创建Mysql容器【10分不安全】 ====>>>> 当容器被删除了mysql相当于被删库了,这样干犯法
docker search mysql:5.7  #查

docker pull mysql:5.7  #拉取

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7   #创建mysql运行容器

docker ps  #查看Docker运行的容器

docker exec -it 容器ID /bin/bash   #进入mysql容器前台交互式界面

mysql -uroot -p  #进入mysql,操作mysql
第二种使用数据卷备份:Docker容器中的数据卷 和 Linux中数据卷挂载关联,实现数据共享 【实战篇】

​ 注意事项:Docker拉取完mysql镜像,并run出容器马上修改mysql字符集为:utf8下面第二步

#1、创建容器并且使用容器数据卷
-----------------------------------------------------------------------------------------------------
docker run -d -p 3306:3306 --privileged=true  #给数据卷开权限 
-v /hhjuse/mysql/log:/var/log/mysql   #-v是挂载数据卷
-v /hhjuse/mysql/data:/var/lib/mysql 
-v /hhjuse/mysql/conf:/etc/mysql/conf.d 
-e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7

#复制这里即可运行
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
docker run -d -p 3306:3306 --privileged=true -v /hhjuse/mysql/log:/var/log/mysql -v /hhjuse/mysql/data:/var/lib/mysql -v /hhjuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----------------------------------------------------------------------------------------------------
#2、解决 mysql中文乱码  【修改mysql字符集】 
#·	在Linux这个路径下:/hhjuse/mysql/conf  新建my.cnf
#·	通过容器卷同步给mysql容器实例
SHOW VARIABLES LIKE 'character%'
-----------------------------------------------------------------------------------------------------
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
-----------------------------------------------------------------------------------------------------

以上第二种方式创建容器 安全 、 保证数据的恢复 【使用的数据卷,只要关于到数据的服务,都使用数据卷创建是最好的方式】:遇到一下请问 -------->>>>>>>>>>

docker rm -f mysql   #这时mysql容器被删除,或者容器被恶意删了!! 如果使用数据卷创建的可以恢复

#重新执行一个创建mysql容器:之前所有操作过的数据库全部 从Linux中共享到docker的mysql容器中来了!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
docker run -d -p 3306:3306 --privileged=true -v /hhjuse/mysql/log:/var/log/mysql -v /hhjuse/mysql/data:/var/lib/mysql -v /hhjuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

三、Install redis in docker container【安装redis 6.2.6版本】

​ 这里要注意:所有数据卷需要拷贝的配置文件【比如redis.conf】,镜像版本必须一致,防止启动不了

#·	在CentOS宿主机下新建目录/app/redis
mkdir -p /app/redis
-----------------------------------------------------------------------------------------------------
#·	将一个redis.conf文件模板拷贝进/app/redis目录下   修改配置文件   
cp /usr/local/src/sofeware/hhj-redis/redis-6.2.6/redis.conf  /app/redis/
-----------------------------------------------------------------------------------------------------
#需要修改很多配置,去看  D:\Study\Docker\docker.docx
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#运行
docker run  -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

修改了/app/redis/redis.conf,需要重启Docker中redis容器,才能同步:

docker restart redis:6.2.6  #这里一般使用的容器ID 重启

四、Docker高级

1、安装mysql主从复制
1·	新建主服务器容器实例3307
 
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7

2·	进入/mydata/mysql-master/conf目录下新建my.cnf

3·	vim my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

4·	修改完配置后重启master实例
·	docker restart mysql-master

5·	进入mysql-master容器
·	docker exec -it mysql-master /bin/bash
·	mysql -uroot -proot

5·	master容器实例内创建数据同步用户
·	CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
·	GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

6·	新建从服务器容器实例3308
docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7

7·	进入/mydata/mysql-slave/conf目录下新建my.cnf    ·	vim my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1

8·	修改完配置后重启slave实例
·	docker restart mysql-slave

9·	在主数据库中查看主从同步状态
·	show master status;

10·	进入mysql-slave容器
·	docker exec -it mysql-slave /bin/bash
·	mysql -uroot -proot

11·	在从数据库中配置主从复制
change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_p ort=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
{
	·	主从复制命令参数说明
        master_host:主数据库的IP地址;
        master_port:主数据库的运行端口;
        master_user:在主数据库创建的用于同步数据的用户账号;
        master_password:在主数据库创建的用于同步数据的用户密码;
        master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
        master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
        master_connect_retry:连接失败重试的时间间隔,单位为秒。
}

12·	在从数据库中查看主从同步状态
·	show slave status \G;

13·	在从数据库中开启主从同步
`   start slave;

14·  测试:	主机新建库-使用库-新建表-插入数据,ok
2、搭建Redis集群

· 面试题:1~2亿条数据需要缓存,请问如何设计这个存储案例

· 回答:单机单台100%不可能,肯定是分布式存储,用redis如何落地?

解决方案为:

1、取哈希分区:

优点:
  简单粗暴,直接有效,只需要预估好数据规划好节点,例如3台、8台、10台,就能保证一段时间的数据支撑。使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。
  
缺点:
  原来规划好的节点,进行扩容或者缩容就比较麻烦了额,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化:Hash(key)/3会变成Hash(key) /?。此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。
某个redis机器宕机了,由于台数数量变化,会导致hash取余全部数据重新洗牌。

2、一致性hash环算法:

·	算法构建一致性哈希环
·	服务器IP节点映射
·	key落到服务器的落键规则

优点:
·	一致性哈希算法的容错性
·	加入和删除节点只影响哈希环中顺时针方向的相邻的节点,对其他节点无影响。
缺点:
·	一致性哈希算法的数据倾斜问题
· 数据的分布和节点的位置有关,因为这些节点不是均匀的分布在哈希环上的,所以数据在进行存储时达不到均匀分布的效果。

3、哈希槽分区:

解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里放的是数据。

五、Docker File:【重点】

Dockerfile是用来构建Docker镜像的文本文件 ,由一条条构建镜像所需的指令和参数构成的脚本

一张图让你了如指掌

在这里插入图片描述

1.1.1. DockerFile常用保留字指令

· 参考tomcat8的dockerfile入门

· https://github.com/docker-library/tomcat

· FROM

· 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from

· MAINTAINER

· 镜像维护者的姓名和邮箱地址

· RUN

· 容器构建时需要运行的命令

· 两种格式

· shell格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mwww9oYE-1666281223916)(file:///C:/Users/MI/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]

RUN yum -y install vim

· exec格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AlRjxEiz-1666281223917)(file:///C:/Users/MI/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]

· RUN是在 docker build时运行

· EXPOSE

· 当前容器对外暴露出的端口

· WORKDIR

· 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

· USER

· 指定该镜像以什么样的用户去执行,如果都不指定,默认是root

· ENV

· 用来在构建镜像过程中设置环境变量

ENV MY_PATH /usr/mytest

这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;

也可以在其它指令中直接使用这些环境变量,

比如:WORKDIR $MY_PATH

· ADD

· 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

· COPY

· 类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

· COPY src dest

· COPY [“src”, “dest”]

· <src源路径>:源文件或者源目录

· <dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

· VOLUME

· 容器数据卷,用于数据保存和持久化工作

· CMD

· 指定容器启动后的要干的事情

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9eUKBxq1-1666281223917)(file:///C:/Users/MI/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif)]

· 注意

· Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

· 参考官网Tomcat的dockerfile演示讲解

· 官网最后一行命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ogyAyxn9-1666281224881)(file:///C:/Users/MI/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)]

· 我们演示自己的覆盖操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqmaZPPe-1666281224882)(file:///C:/Users/MI/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)]

· 它和前面RUN命令的区别

· CMD是在docker run 时运行。

· RUN是在 docker build时运行。

· ENTRYPOINT

· 也是用来指定一个容器启动时要运行的命令

· 类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序

· 命令格式和案例说明

命令格式:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2uJP8Vg9-1666281223918)(file:///C:/Users/MI/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg)]

ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kav265MY-1666281223918)(file:///C:/Users/MI/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg)]

案例如下:假设已通过 Dockerfile 构建了 nginx:test 镜像:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lrpS9AnA-1666281223918)(file:///C:/Users/MI/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg)]

是否传参按照dockerfile编写执行传参运行
Docker命令docker run nginx:testdocker run nginx:test -c /etc/nginx/new.conf
衍生出的实际命令nginx -c /etc/nginx/nginx.confnginx -c /etc/nginx/new.conf

· 优点

· 在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数。

1.1:编写Dockerfile文件

同Dockerfile来构建一个centos自带:ifconfig、java8、vim命令的镜像

FROM centos   #给予什么镜像构建,这里由centos
MAINTAINER mr.huang<jie88888822@163.com>  #表示作者联系方式
 
ENV MYPATH /usr/local   #镜像运行成功进入交互目录、镜像运行成功落脚点
WORKDIR $MYPATH
 
                                以下这段因为会报错自己百度搜索解决放在这里的
==========================================================================================
RUN cd /etc/yum.repos.d/

RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i  's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

RUN yum makecache
RUN yum update -y
==========================================================================================

#安装vim编辑器
RUN yum -y install vim      #RUN表示在构建镜像时,需要安装什么东西huoze执行什么命令,镜像是一层一层堆叠的 

#安装ifconfig命令查看网络IP
RUN yum -y install net-tools

#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java

#ADD 是相对路径jar,把jdk-8u341-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u341-linux-x64.tar.gz /usr/local/java/

#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_341
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
 
EXPOSE 80   #暴露端口号
 
CMD echo $MYPATH     #CMD 构建镜像成功后输出上面内容、或者执行什么操作
CMD echo "create docker images successfully..."
CMD /bin/bash
1.2:执行build构建镜像
docker build -t 新镜像名字:TAG .
===================================
docker build -t centosjava8:1.5 .
1.3:自定义镜像===>>>Dockerfile
FROM ubuntu
MAINTAINER mr.huang<jie88888822@163.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN apt-get update
RUN apt-get install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo 'hhj create custom image successfully...'
CMD /bin/bash

六、虚悬镜像

· 是什么

· 仓库名、标签都是的镜像,俗称dangling image

· Dockerfile写一个

1 vim Dockerfile

from ubuntu  CMD echo 'action  is success'  

2 docker build .

3 docker images 查看镜像

4 docker image ls -f dangling=true 查看所有虚悬镜像

5 docker image prune 删除所有虚悬镜像 -------虚悬镜像已经失去存在价值,可以删除

七、Docker网络

1.1、是什么

在这里插入图片描述
docker不启动,默认网络情况

· ens33

· lo

· virbr0

在CentOS7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr0网卡:它还有一个固定的默认IP地址192.168.122.1),是做虚拟机网桥的使用的,其作用是为连接其上的虚机网卡提供 NAT访问外网的功能。

· docker启动后,网络情况

**会产生一个名为docker0**的虚拟网桥

在这里插入图片描述

1.2、Docker常用命令
docker network --help  #查看docker的帮助文档

docker network ls  #查看有哪些网络模式

docker network inspect  XXX网络名字
比如:docker network inspect  #可以查看到docker的网络信息

docker network create hhj_network  #创建自定义网络

docker network rm hhj_network  #删除网路

Docker网络命令实战

1.1.2-1:查看Docker网络帮助文档

在这里插入图片描述

1.1.2-2:查看Docker有哪些网络

在这里插入图片描述

1.1.2-3:操作Docker网路

在这里插入图片描述

1.3、网络模式阐述

在这里插入图片描述

· bridge模式:使用–network bridge指定,默认使用docker0

· host模式:使用–network host指定

· none模式:使用–network none指定

· container模式:使用–network container:NAME或者容器ID指定

容器实例内默认网络IP生产规则

说明:每个容器都有自己网络模式、如果是bridge模式的,都会给容器分配一个IPAddress的属性作为容器的默认网络网关用于容器间通信…

注意事项: 常用的网络模式(bridge模式和自定义网络)

bridge模式只能通过IPAddress来容器间通信,如果容器实列挂掉了就访问不到了

自定义网络(docker network create hhj_network)   有着特殊功能就是可以通过容器name来访问实列,只要容器名是一样的就一直可以访问

1 先启动两个ubuntu容器实例

在这里插入图片描述

2 docker inspect 容器ID or 容器名字
在这里插入图片描述

3 关闭u2实例,新建u3,查看ip变化

在这里插入图片描述

· 结论

· docker容器内部的ip是有可能会发生改变的

· 案例说明

bridge 模式

· 是什么

Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

# 查看 bridge 网络的详细信息,并通过 grep 获取名称项

docker network inspect bridge | grep name

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o1NkL1eg-1666281223922)(file:///C:/Users/MI/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]

ifconfig

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WAMytFfA-1666281223922)(file:///C:/Users/MI/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]

· 案例

· 说明

1 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

2 docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network(后面讲)eth0,eth1,eth2……代表网卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址

3 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。

3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);

3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;

3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

在这里插入图片描述

host模式

直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。

· 说明

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口

在这里插入图片描述

实操:

docker run -d                          --network host --name tomcat83 hhj_docker:1.6

· 无之前的配对显示了,看容器实例内部

在这里插入图片描述

none模式:
  • 是什么
在none模式下,并不为Docker容器进行任何网络配置。 

也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo需要我们自己为Docker容器添加网卡、配置IP等。

· 禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)

container模式:
  • 是什么

container⽹络模式

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

自定义网络模式:

在这里插入图片描述

· 新建容器加入上一步新建的自定义网络

· docker run -d -p 8081:8080 –network zzyy_network --name tomcat81 billygoo/tomcat8-jdk8

· docker run -d -p 8082:8080 –network zzyy_network --name tomcat82 billygoo/tomcat8-jdk8

· 互相ping测试

在这里插入图片描述

问题结论

· 自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

· 自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

· 自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

八、Docker-compose容器编排

1.1.1. 是什么

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器

Docker-Compose是Docker官方的开源项目, 负责实现对Docker容器集群的快速编排

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

1.1.2. 去哪下

· 官网

· 官网下载

· 安装步骤

1、进入Docker安装界面

在这里插入图片描述

2、点击安装Docker compose

在这里插入图片描述

在这里插入图片描述

3、从这里开始:执行安装命令

在这里插入图片描述

执行安装 Docker Compose

注意: 下面是官网拷贝的命令,可以直接百度。或者自己去官网找安装 docker-compose的教程

# 1、To download and install the Compose CLI plugin, run:

DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
 mkdir -p $DOCKER_CONFIG/cli-plugins
 curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
 
# 2、Apply executable permissions to the binary:
 chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
 
# 3、Test the installation.
 docker compose version

1.1.3、Compose核心概念

· 一文件

​ docker-compose.yml

· 两要素

· 服务: 一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器

· 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

1.1.4、Compose使用的三个步骤

· 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件

· 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。

· 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线

1.1.5、Compose常用命令

docker-compose -h              # 查看帮助

docker-compose up              # 启动所有docker-compose服务

docker-compose up -d           # 启动所有docker-compose服务并后台运行

docker-compose down            # 停止并删除容器、网络、卷、镜像。

docker-compose exec  yml里面的服务id         # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash

docker-compose ps           # 展示当前docker-compose编排过的运行的所有容器

docker-compose top          # 展示当前docker-compose编排过的容器进程

 

docker-compose logs  		yml里面的服务id   # 查看容器输出日志

docker-compose config   	# 检查配置

docker-compose config -q 	# 检查配置,有问题才有输出

docker-compose restart  	# 重启服务
	
docker-compose start   		# 启动服务

docker-compose stop    		# 停止服务

Docker-Compose实战:

1、传jar包

2、编写docker-compose.yml文件

version: "3"
 
services:
  microService:
    image: hhj_docker2:1.6
    container_name: ms01
    ports:
      - "6001:6001"
    volumes:
      - /app/microService:/data   #数据卷挂载
    networks: 
      - hhj_net #自定义网路  随便取:这个文件在放目录下,docker-compose在运行时创network会加 该文件父目录名作为前缀
    depends_on:  #依赖于谁   先启动redis和mysql在启动该容器服务
      - redis
      - mysql
 
  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks: 
      - hhj_net    #指定自定义网络
    command: redis-server /etc/redis/redis.conf
 
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'root'		 #root用户的密码为:root	
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'   #不允许空密码
      MYSQL_DATABASE: 'db2022'
      MYSQL_USER: 'hhj'                  #自定义用户和密码
      MYSQL_PASSWORD: 'hhj123' 
    ports:
       - "3306:3306"
    volumes:		
       - /app/mysql/db:/var/lib/mysql
       - /app/mysql/conf/my.cnf:/etc/my.cnf
       - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - hhj_net	  		#指定自定义网络
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
 
networks: 
   hhj_net: #创建网路命名  上面指定网络,下面声明创建网络

Protainer 方便管理Docker容器

Docker轻量级可视化工具Portainer

Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境

1、进官网

在这里插入图片描述

2、找到Protainer容器服务
在这里插入图片描述

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

3、访问Portainer容器实例

https://localhost:9443   #这里必须是https访问,否则访问不到容器服务

4、访问之后创建自己的密码:账号admin自带,密码8位就OK
在这里插入图片描述

5、进去dashbord后点local管理本机docker

6、docker system df
在这里插入图片描述

系统日志监控

注意事项:重点
  • influxdb、cadvisor、grafana。实现日志监控
  • dozzle 日志监控
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值