docker
Docker
概述
docker官网:https://www.docker.com/
docker官方文档:https://docs.docker.com/
仓库地址:https://hub.docker.com/
隔离性:docker每个容器都是相互隔离的,当一个容器出现问题,并不会影响到其他容器。
轻量级:docker基于半解耦 ,有namespace(名称空间)六项隔离。并不是完全型解耦。
部署方便:使用docker部署服务 直接是秒级别的。
快速回滚:docker支持回滚版本。
简介
镜像image
docker镜像就好比一个模板,可以通过模板来创建容器服务,tomcat>run>tomcat01容器,通过这个镜像可以创建多个容器
容器container
docker利用容器技术独立运行一个或者一组应用,通过镜像来创建的。
启动,停止,删除,基本命令
可以把容器理解成一个简易的linux系统
仓库repostory
放镜像的地方
仓库分为公有仓库和私有仓库
官方库
docker hub
国内库
阿里云华为云等
国内下载慢。配置镜像加速
安装docker
https://docs.docker.com/engine/install/centos/
卸载旧版本
旧版本的 Docker 被称为docker
或docker-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/
设置密码登录
选择本地的
这个可视化面板平时不用,测试玩玩即可
Rancher(CI/CD再用)
docker镜像加载原理
UnionFS(联合文件系统)
分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
内核共用,共同环境复用
pull下载的是基本层,不会变。run运行起来后就会在镜像上加一层容器层,自己所有操作都是基于容器层
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",
构建镜像时没有挂载卷,需要手动镜像挂载,-v 卷名:容器内路径
数据卷容器
多个容器同步数据
--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、每一个指令都会创建提交一个新的镜像层,并提交
dickerfile的指令
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
发布镜像到阿里云
登录阿里云,找到容器镜像服务-个人实例-命名空间-创建命名空间
镜像仓库-创建镜像仓库-本地仓库
点击创建的仓库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
3. 从Registry中拉取镜像
$ docker pull registry.cn-shenzhen.aliyuncs.com/13534114217/镜像名:[镜像版本号]
这里有镜像版本
小结
小结图
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将容器连接到网络
两个隔离的网络连接
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要全