docker

Docker

概述

docker官网:https://www.docker.com/
docker官方文档:https://docs.docker.com/
仓库地址:https://hub.docker.com/
隔离性:docker每个容器都是相互隔离的,当一个容器出现问题,并不会影响到其他容器。
轻量级:docker基于半解耦 ,有namespace(名称空间)六项隔离。并不是完全型解耦。
部署方便:使用docker部署服务 直接是秒级别的。
快速回滚:docker支持回滚版本。

简介

image-20230903152444281

镜像image

docker镜像就好比一个模板,可以通过模板来创建容器服务,tomcat>run>tomcat01容器,通过这个镜像可以创建多个容器

容器container

docker利用容器技术独立运行一个或者一组应用,通过镜像来创建的。
启动,停止,删除,基本命令
可以把容器理解成一个简易的linux系统

仓库repostory

​ 放镜像的地方
​ 仓库分为公有仓库和私有仓库

官方库

​ docker hub

国内库

​ 阿里云华为云等
​ 国内下载慢。配置镜像加速

安装docker

https://docs.docker.com/engine/install/centos/

卸载旧版本

旧版本的 Docker 被称为dockerdocker-engine. 如果安装了这些,请卸载它们以及相关的依赖项。

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

安装基本环境

yum install -y yum-utils
#设置镜像仓库,默认国外的,用国内的
阿里云:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#安装 Docker 引擎
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

systemctl enable --now docker

卸载docker

yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

阿里云镜像加速

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://hf293614.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

拉取一个测试

docker run -d --restart=always --name nextcloud -p 8080:80 nextcloud

常用命令

官方帮助文档https://docs.docker.com/reference/

docekr version#看版本
docker info#看docker信息
docker --help#万能帮助查看

镜像命令

docker images       #查看docker上所有镜像
docker search 镜像名 #搜索镜像,一般在https://hub.docker.com/网页上看,网页上看得清楚
docker pull 镜像名      #下载镜像,默认下载最新版
docker pull 镜像名:版本号#下载指定版本
docker rmi -f 镜像id #删除镜像,删除多个rmi -f 镜像id 镜像id 镜像id 镜像id
docker rmi -f $(docker images -aq) #全部删除

容器命令

docker run -d --name 名 -p 暴露端口:镜像内端口 镜像名 #后台运行镜像
docker run -d 镜像名 #后台启动
docker run -d centos /bin/bash -c "while true;do echo tanhong;sleep 1;done"#后台启动并执行命令
docker top 容器id #查看容器中进程信息
docker inspect 容器id #查看容器详细信息,原数据
docker docker exec -it 容器id /bin/bash #进入正在运行的容器

新建容器并启动

docker pull centos:centos7.9.2009 #下载一个centos7镜像
docker run 可选参数 image
#参数说明
 --restart=always : #开机启动,失败也会一直重启;
 --restart=on-failure:10 : #表示最多重启10次
 --name=“name” #容器名字,如果centos01,centos02用来区分容器
 -d            #后台运行
 -it           #使用交互方式运行,进入容器
 -p            #指定容器端口
 -P            #大P是随机指定端口
 -v            #容器内目录
 docker run -it centos:centos7.9.2009 /bin/bash #启动并进入容器
 docker run -d centos /bin/bash -c "while true;do echo tanhong;sleep 1;done"#后台启动并执行命令

列出正在运行的容器

docker ps
#docker ps 命令
           -a #查看历史容器运行记录
           -n=? #显示个数,例:docker ps -a -n=1
           -q #只显示容器编号

退出容器

exit     #停止容器退出
Ctrl+P+Q #容器不停止退出

删除容器

docker rm 容器id   #删除指定容器,不能删除正在运行的容器,强制删除rm -f
docker rm -f $(docker ps -aq) #全部删除

启动和停止容器的操作

docker start 容器id #启动
docker stop  容器id #停止
docker restart 容器id #重启
docker kill 容器id  #强制停止

查看日志

#docker logs 容器id  查看全部日志
            -tf  容器id #加上时间查看全部日志
            -tf  --tail 10 容器id #看10条日志

进入正在运行的容器

docker docker exec -it 容器id /bin/bash
#方式二
docker attach 容器id #进入正在运行的窗口

从容器内拷贝文件到主机上

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

测试tomcat

docker run -d -p 2233:8080 --name tomcat01 tomcat

访问发现404
因为tomcat是不完整的,默认是最小包,保证最小可运行环境

docker exec -it tomcat01 /bin/bash
ls webapps/   #tomcat文件在这里,可以看到这里面是空的,所以是404
cp -r webapps.dist/* webapps  #拷贝webapps的输出界面到webapps,再次查看网页,就可以看到

作业:部署es+kibana

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

#启动elasticsearch
docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#启动后变卡了
docker stats #查看资源状态
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET 
ab21a496b668   elasticsearch   1.21%     1.271GiB / 7.741GiB   15.9%     1.02kB
#比较耗资源,可以做一下限制,关闭elasticsearch
# -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
#再次查看资源
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET 
ab21a496b668   elasticsearch   1.21%     387.6MiB / 7.741GiB   4.89%     1.02kB 

kibana

docker network create  --subnet 192.167.0.0/16
docker run -d --name kibana -p 5601:5601 --net elasticsearch kibana: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
 #--restart=always #开机启动
 #-v /var/run/docker.sock:/var/run/docker.sock #挂载
 #privileged=true  #授权

访问测试http://192.168.1.88:8088/
设置密码登录

image-20221109113704347

选择本地的

image-20221109113808226

image-20221109113939413

image-20221109113950500

这个可视化面板平时不用,测试玩玩即可

Rancher(CI/CD再用)

docker镜像加载原理

UnionFS(联合文件系统)
分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
内核共用,共同环境复用
pull下载的是基本层,不会变。run运行起来后就会在镜像上加一层容器层,自己所有操作都是基于容器层

image-20221109114338014

commit镜像

提交容器称为一个新的副本

docker commit 提交容器称为一个新的副本
docker commit -m="提交描述的信息" -a="作者" 容器id 目标镜像名:tag(标签)
docker commit -a="tanhong" -m="add webapps app" 470a369223af tomcat:1.0

容器数据卷

什么是容器卷

​ 如果数据在容器里,那么我们删除容器,数据就会丢失!需求:数据可持久化
​ MySQL,容器删了,数据没了!需求:MySQL数据可以存储在本地!
​ 容器之间可以有一个数据共享的技术,dockers容器中产生的数据,同步到本地
​ 这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面
​ 总结:容器的持久化和同步操作!容器间也是可以数据共享的!

挂载 -v

dockers -it -v 主机目录:容器内目录
docker run -it -v /home/ceshi:/home centos /bin/bash

具名和匿名挂载

在没有指定目录的情况下,所有的挂载都在/var/lib/docker/volumes/

匿名挂载

-v 容器内目录
docker run -d -P --name nginx01 -v /etc/nginx nginx
docker volume ls #查看所有卷
local     78229ff80a2c4b41e499801ae4213397032ee986d4a68fc96d9292b570f838f2
local     ec9923429ac898446847eca2ac582422c6fd11a0e428947f05871258b813df5f

具名挂载

-v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     78229ff80a2c4b41e499801ae4213397032ee986d4a68fc96d9292b570f838f2
local     ec9923429ac898446847eca2ac582422c6fd11a0e428947f05871258b813df5f
local     juming-nginx  #具名挂载就是多了一个名字

查看挂载卷位置

docker volume inspect juming-nginx
#通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的‘具名挂载’

如何确定是具名挂载还是匿名挂载,还是指定路径挂载

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

扩展:

# 通过-v 容器内路径:ro rw 改变读写权限
ro   readonly #只读 ro说明这个路径只能通过宿主机来操作,容器内部是无法操作的
rw  readwrite  #读写
# 一旦设定了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

初识别dockerfile

dockerfile就是用来构建docker镜像的构建文件!命令脚本

mkdir /home/docker-test-volume
cd /home/docker-test-volume/

vim dockerfile1  #通过脚本生成镜像
FROM centos
VOLUME ["volume01","volume02"]      #
CMD echo "----end----"
CMD /bin/bash

docker build -f docekrfiel1  -t tanhong/centos .
build  #构建
-f  dockerfile1 地址(这里是当前地址)
-t 生成一个tanhong版的centos:1.0版 生成到当前目录

启动创建的镜像

docker run -it tanhong/centos
ls -l #在根目录下可以看到刚刚挂载的两个卷
drwxr-xr-x   2 root root     6 Nov  9 08:14 volume01
drwxr-xr-x   2 root root     6 Nov  9 08:14 volume02

docker inspect 825ee71e7f88 #查看容器信息可以看到volume01和volume02挂载的位置
"Mounts":
"Type": "volume",
"/var/lib/docker/volumes/0e298d0d743ecc65097c6119e89d5cb131af8b34127c27077c60313f3bae2b6e/_data",
"Destination": "volume02",

image-20221109162829932

构建镜像时没有挂载卷,需要手动镜像挂载,-v 卷名:容器内路径

数据卷容器

多个容器同步数据

image-20221109163120626

--volumes-from docker01  #卷继承docker01的
启动1:docker run -it --name docker01 tanhong/centos
启动2:docker run -it --name docker02 --volumes-from docker01 tanhong/centos
启动3:docker run -it --name docker03 --volumes-from docker01 tanhong/centos
#docker01写的内容会同步到docker02和03
#删除docker01后数据是否还在
docker rm -f docker01
docker attach docker02
[root@3acd10728190 volume01]# ls
woshi01
docker attach docker03
[root@3acd10728190 volume01]# ls
woshi01
#依旧可以访问,只要还有一个在,就有。
#三个容器中是双向拷贝

多个mysql实现数据共享

启动1:docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
启动:docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
启动:docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql03 --volumes-from mysql01 mysql:5.7

总结:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用位置。
但是一旦你持久化到了本地,这个时候,本地的数据是不会被删除的!

DockerFile

dockerfile是用来构建docker镜像的文件!命令参数脚本
很多官方镜像都是基础的包,很多功能都没有,我们通常会自己搭建自己的镜像。

构建步骤:

1、编写一个dockerfile文件
2、docker build 构建称为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(可以发布到DockerHub、阿里云镜像仓库)

dockerfile构建过程

基础知识:
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到下顺序执行
3、#标识注释
4、每一个指令都会创建提交一个新的镜像层,并提交

image-20221109174037538

dickerfile的指令

image-20221109174515999

image-20221109175511006

FROM            #基础镜像,一切从这里开始构建
MAINTAINER      #镜像谁写的,姓名+邮箱
RUN             #docker镜像构建时需要运行的命令
ADD             #步骤,tomcat镜像,这个tomcat压缩包,添加内容
COPY            #类似ADD,将我们文件拷贝到镜像中
WORKDIR         #镜像工作目录
VOLUME          #挂载的目录
EXPOSE          #指定对外端口
ENV             #构建的时候设置环境变量
CMD             #指定这个容器启动时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT      #指定这个容器启动时要运行的命令,可以追加命令
ONBUILD         #当构建一个被继承dockerfile这个时候就会运行ONBUILD的指令。触发指令。

实战测试

Docker Hub中99%镜像都是从这个基础镜像过来的FROM scratch。然后配置需要的软件和配置来进行的构建

1、编写一个dockerfile文件

vim dockerfile1

FROM centos:centos7.9.2009           #这个版本是我机器里的,直接用
MAINTAINER tanhong<593669703@qq.com> #作者信息

ENV MYPATH /usr/local                #环境变量路径
WORKDIR $MYPATH                      #工作目录
RUN yum -y install vim net-tools     #安装命令

EXPOSE 80                            #对外端口

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

2、通过这个文件构建镜像

docker biuld -f dockerfile1 -t mycentos:0.1

3、测试镜像

docker run -it mycentos:0.1

#[root@de47a608cdeb local]# pwd
/usr/local      #默认的工作目录
#vim 和 ifconfig都能用

列出镜像变更

docker history mycentos:0.1

/bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
/bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
/bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
/bin/sh -c #(nop)  EXPOSE 80                    0B        
/bin/sh -c yum -y install vim net-tools         239MB     
/bin/sh -c #(nop) WORKDIR /usr/local            0B        
/bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
/bin/sh -c #(nop)  MAINTAINER tanhong<593669…   0B        
/bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
/bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B    
/bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB

CMD

vim dockerfiel-cmd

FROM mycentos:0.1
CMD ["ls","-a"]   #CMD启动时要运行的命令ls -a
#构建docker build -f dockerfile-cmd -t mycentos-cmd .
[root@master1 dockerfiel]# docker run mycentos-cmd #运行发现ls -a生效了
.
..
bin
etc
games
include
lib
lib64
libexec
sbin
share
src

[root@master1 dockerfiel]# docker run mycentos-cmd ls -l #此时ls -a失效,ls -l生效
total 0
drwxr-xr-x 2 root root  6 Apr 11  2018 bin
drwxr-xr-x 2 root root  6 Apr 11  2018 etc
drwxr-xr-x 2 root root  6 Apr 11  2018 games
drwxr-xr-x 2 root root  6 Apr 11  2018 include
drwxr-xr-x 2 root root  6 Apr 11  2018 lib
drwxr-xr-x 2 root root  6 Apr 11  2018 lib64
drwxr-xr-x 2 root root  6 Apr 11  2018 libexec
drwxr-xr-x 2 root root  6 Apr 11  2018 sbin
drwxr-xr-x 5 root root 49 Nov 13  2020 share
drwxr-xr-x 2 root root  6 Apr 11  2018 src

ENTRYPOINT

vim dockerfile-entrypoint

FROM mycentos:0.1
ENTRYPOINT ["ls","-a"]

#构建docker build -f dockerfile-entrypoint -t entrypoint .
[root@master1 dockerfiel]# docker run entrypoint  #运行发现ls -a生效
.
..
bin
etc
games
include
lib
lib64
libexec
sbin
share
src
[root@master1 dockerfiel]# docker run entrypoint -l #ls -a也生效,-l也生效
total 0
drwxr-xr-x 12 root root 131 Nov 13  2020 .
drwxr-xr-x  1 root root  66 Nov 13  2020 ..
drwxr-xr-x  2 root root   6 Apr 11  2018 bin
drwxr-xr-x  2 root root   6 Apr 11  2018 etc
drwxr-xr-x  2 root root   6 Apr 11  2018 games
drwxr-xr-x  2 root root   6 Apr 11  2018 include
drwxr-xr-x  2 root root   6 Apr 11  2018 lib
drwxr-xr-x  2 root root   6 Apr 11  2018 lib64
drwxr-xr-x  2 root root   6 Apr 11  2018 libexec
drwxr-xr-x  2 root root   6 Apr 11  2018 sbin
drwxr-xr-x  5 root root  49 Nov 13  2020 share
drwxr-xr-x  2 root root   6 Apr 11  2018 src

ENTRYPOINT不会替换,直接追加,这就是与CMD的区别

实战:tomcat

准备镜像文件tomcat压缩包,jdk压缩包
apache-tomcat-7.0.42.tar.gz
jdk-8u341-linux-x64.tar.gz
编写tomcat镜像文件

touch readme.txt      #自述
vim Dockerfile       #官方名命名法,build会自动寻找这个文件,就不需要-f指定了

FROM mycentos:0.1
MAINTAINER tanhong<593669703@qq.com>

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

ADD jdk-8u341-linux-x64.tar.gz  /usr/local/
ADD apache-tomcat-7.0.42.tar.gz /usr/local/

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 8080

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

构建镜像

docker build -t diytomcat .

运行

docker run -d -p 8080:8080 --name tanhongtomcat -v /home/tomcat:/usr/local/apache-tomcat-7.0.42/webapps/test -v /home/tomcatlog:/usr/local/apache-tomcat-7.0.42/logs diytomcat

http://192.168.1.88:8080/
发布测试

vim /home/tomcat/index.html
1234567
http://192.168.1.88:8080/test   #test是挂载目录
#如要直接http://192.168.1.88:8080/打开。就挂载到/usr/local/apache-tomcat-7.0.42/webapps/ROOT

成功

发布镜像

官网:https://hub.docker.com/
确定账号可以登录
在我们的服务器上提交自己的镜像(登录)

docker login -u zx593669703   #我账号
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded          #登录成功

将要提交的镜像加标签
格式:用户名/镜像名:版本

docker tag 3360871e611c zx593669703/mycentos:0.1  #tag:标签
#给镜像改个名字,格式 镜像id或镜像名 路径/镜像名:版本

提交镜像

docker push zx593669703/mycentos:0.1

The push refers to repository [docker.io/zx593669703/mycentos]
c93c1ecfbd88: Pushed 
174f56854903: Pushed 
0.1: digest: sha256:a509dd28e3321e2e2766b8e935434320dadd0a1506bc7f8bdb9621ed1cf516e5 size: 741

发布镜像到阿里云

登录阿里云,找到容器镜像服务-个人实例-命名空间-创建命名空间

image-20221110161836811

镜像仓库-创建镜像仓库-本地仓库

image-20221110161847628

点击创建的仓库tanhong-test

1. 登录阿里云Docker Registry  #注:需设置仓库密码,个人实例-访问凭证
docker login --username=th13534114217 registry.cn-shenzhen.aliyuncs.com
2. 将镜像推送到Registry
docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/13534114217/tanhong-test:[镜像版本号]
docker push registry.cn-shenzhen.aliyuncs.com/13534114217/tanhong-test:[镜像版本号]

没有创建镜像仓库的情况

1. 登录阿里云Docker Registry  #注:需设置仓库密码,个人实例-访问凭证
$ docker login --username=th13534114217 registry.cn-shenzhen.aliyuncs.com
2. 将镜像推送到Registry
docker tag mycentos:0.1 registry.cn-shenzhen.aliyuncs.com/13534114217/mycentos:0.1
docker push registry.cn-shenzhen.aliyuncs.com/13534114217/mycentos:0.1

image-20221110163145919

3. 从Registry中拉取镜像
$ docker pull registry.cn-shenzhen.aliyuncs.com/13534114217/镜像名:[镜像版本号]

image-20221110163605418这里有镜像版本

小结

image-20221110163450222

小结图

image-20221108162429282

docker网络(容器互联)

简介
清空环境,方便测试
理解docker0

ip a #可以看到docker0,docker生成的网卡
docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP>

实例

docker run -d -P --name tomcat01 tomcat
docker exec -it tomcat01 ip a #查看容器内ip地址172.17.0.2
ping 172.17.0.2  可以ping通

每启动一个docker容器,docker就会docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0
桥接模式,使用的技术是evth-pair(wē死配尔)一对
容器网卡是成对出现

evth-pair就是一对虚拟设备接口,他们都是成对出现,一段连着协议,一段彼此相连
evth-pair充当一个桥梁,连接各种虚拟网络

运行tomcat02,测试ping tomcat01的ip

docker exec -it tomcat02 ping 172.17.0.2 #可以ping通

结论:

tomcat01和tomcat02是公用的一个路由,docker0
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip
docker中所有的网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)
只要容器删除,对应网桥一段就没了

--link

思考一个场景,我们的微服务,database url=ip,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以名字来进行访问容器

[root@localhost ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known    #无法ping通
#如何解决
#通过--link可以解决网络连接问题
docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping tomcat02 #此时03和02可以ping通了,原理:03的hosts被做了域名解析

[root@localhost ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known #反向ping不通,因为02没有做域名解析

docker exec -it tomcat03 cat /etc/hosts
127.0.0.1	localhost
172.17.0.3	tomcat02 573e7e20f453     #可以看到tomcat02被写入了hosts文件
172.17.0.4	b153f75c07f7

--link已经不推荐使用了

自定义网络

[root@master1 ~]# docker network ls       #查看所有的docker网络
NETWORK ID     NAME      DRIVER    SCOPE
e0b54254e417   bridge    bridge    local   #bridge:桥接 docker(默认)
d5d4c0822ffd   host      host      local   #host:和主机共享网络
428ac7c6f102   none      null      local   #none:不配置网络
#container:容器内网络连通(了解即可,局限很大)

测试(清空容器环境)

docker run -d -P --name tomcat01 --net bridge tomcat # --net bridge这是默认的,加到这里是方便知道怎么自定义网络

我们可以自定义网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet  #网络 创建 (--driver bridge写不写读可以,默认就是桥接) --子网 --网关 网卡名称
docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
e0b54254e417   bridge    bridge    local
d5d4c0822ffd   host      host      local
419bfa5335f7   mynet     bridge    local   #刚刚自建的桥接网
428ac7c6f102   none      null      local
docker network inspect mynet
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
#可以看到自己创建的网络配置

测试

docker run -d -P --name tomcat-net01 --net mynet tomcat
docker run -d -P --name tomcat-net02 --net mynet tomcat
docker network inspect mynet #再次查看可以发现这个网络下有两个容器

自建网络可以互相

docker exec -it tomcat-net01 ping tomcat-net02   #可以ping通
docker exec -it tomcat-net02 ping tomcat-net01   #可以ping通

网络连通

connect将容器连接到网络
两个隔离的网络连接

image-20221111142825165

docker exec -it tomcat-net03 ping tomcat-net01
ping: tomcat-net01: Name or service not known #不通

测试:tomcat-net03连通mynet

#语法:docker network connect 网络 容器
docker network connect mynet tomcat-net03  #连接到mynet网络
docker network inspect mynet               #可以看到网络里多了tomcat-net03
#现在03可以ping01和02
#04无法ping01和02,要连直接加入即可
docker exec -it tomcat-net03 ip a #可以看到里面有两个ip

docker redis集群实战

docker network create redis --subnet 172.38.0.0/16 #网卡创建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

cd /mydata/redis/   #可以看到里面已经创建好了6个配置文件

启动redis1-6

#!/bin/bash
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

进入redis-1

docker exec -it redis-1 /bin/sh  #redis默认的是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

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: bcfa6673de26af01f8bf223b1d68ce4c62e2f1c7 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: b333c10466ffea91d4edb4b852ebefcea38a76d4 172.38.0.14:6379
   slots: (0 slots) slave
   replicates db469f44542491d13684ca516dbcbb28b7249eb7
M: db469f44542491d13684ca516dbcbb28b7249eb7 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: f372b8d9c7d66aed006962670da1fb59f3b8cd89 172.38.0.15:6379
   slots: (0 slots) slave
   replicates bcfa6673de26af01f8bf223b1d68ce4c62e2f1c7
M: 3e5db9e822a64179d29af7faf4e28d9bc9e90676 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 6df1366f4598fc591c6aaf248ce13a8e20f018ea 172.38.0.16:6379
   slots: (0 slots) slave
   replicates 3e5db9e822a64179d29af7faf4e28d9bc9e90676
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#集群创建完成
redis-cli -c  #-c是集群,一定要-c,没有c是单机
127.0.0.1:6379> cluster info    #集群信息
127.0.0.1:6379> cluster nodes   #查看集群主从
#测试
127.0.0.1:6379> set name tanhong
-> Redirected to slot [5798] located at 172.38.0.12:6379  #信息被储存在12:6379
OK
172.38.0.12:6379> get name
"tanhong"
#关掉12主机 ,重新进入集群
/data # redis-cli -c
127.0.0.1:6379> get name
-> Redirected to slot [5798] located at 172.38.0.16:6379 #16主机调出信息
"tanhong"
#docker部署集群成功,高可用

已启动容器修改端口

1.先将容器提交为镜像,创建新的容器并运行

2.修改hostconfig.json配置文件
关闭docker服务

vim /var/lib/docker/containers/容器ID/hostconfig.json#这里的id要全
#修改config.v2.json
vim /var/lib/docker/containers/容器ID/config.v2.json#这里的id要全
posted @ 2023-10-21 12:26  落笔画秋枫乀  阅读(25)  评论(0编辑  收藏  举报