为了学习提升
概念理解
镜像:即模版,例如创建虚拟机使用的centos7.5镜像
仓库:拉取镜像的地方
更改镜像存放目录
vi /etc/docker/daemon.json 添加如下内容
{ "data-root": "/data/var/lib/docker", "registry-mirrors": ["https://ooe7wn09.mirror.aliyuncs.com"] }
一、安装docker
1、准备工作:
yum -y install gcc
yum -y install gcc-c++
2、卸载旧有的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3、需要的安装包
yum install -y yum-utils
4、设置中央仓库
国外的
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
国内的阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
具体安装步骤
#4、安装docker相关的内容,最新的:
#更新yum软件包索引
yum makecache fast
#5、docker-ce 社区版本(一般使用),docker-ee 企业版
yum install -y docker-ce docker-ce-cli containerd.io
# 6、启动docker
systemctl start docker # 第一步:启动docker服务端
docker version # 第二步:启动docker服务端后,查看docker版本。不然只能看到docker-client的版本
# 7、运行hello-world
docker run hello-world
# 8、查看下载的hello-world镜像:(每个服务打包成镜像进行发布)
docker images
#了解:卸载docker
yum remove docker-ce docker-ce-cli containerd.io # 卸载安装的docker软件
rm -rf /var/lib/docker #删除docker在系统的数据文件,docker默认的工作路径
# 9、开机启动
sudo systemctl enable docker
5、阿里云镜像加速
1.登录阿里云,找到【容器镜像服务】 2.找到镜像加速地址(每个人地址不一样): 3.在系统中配置docker加速器,如上图代码
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dk3u1mig.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
二、docker 原理
1、docker run原理
docker run的执行流程:
2、docker 底层原理
docker到底是怎么工作的? docker是一个client-server结构的系统,docker的守护进程运行在宿主机上。通过socket与客户端访问! docker server接受client指令,就会执行容器命令
三、docker基本命令
1、基础命令
docker version #查看docker版本
docker info #显示docker的系统信息,包括镜像和容器
docker 命令 --help # 帮助命令;如docker images --help
2、镜像命令
docker images # 列出所有镜像
# 可选项
-a, --all # 列出所有镜像
-q, --quiet # 只显示镜像的id
docker search mysql # 搜索镜像 -f 过滤 # --filter=STARS=3000 例子:docker search mysql --filter=STARS=3000 docker search mysql -f=STARS=3000
3、拉取镜像
拉取镜像时,不加版本号默认拉取最新版本
docker pull mysql 或 docker pull mysql[:tag] # tag版本,一般都会加上版本 (通过分层下载,联合文件系统) # 两个命令等价 docker pull mysql = docker pull mysql:5.7
4、删除镜像
docker rmi -f 镜像名/镜像ID # -f 强制,多个删除用空格区分 docker rmi -f $(docker images -qa) # 删除所有本地镜像
5、docker run
docker run [可选参数] image #参数说明 --name="name" 容器名字,用来区分容器 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 -p 8080:8080 -p ip:主机端口:容器端口 # ip是主机ip吗? -p 主机端口:容器端口(常用) -p 容器端口 容器端口 -P 随机指定端口 # 测试:启动并进入容器 [root@localhost ~]# docker run -it centos /bin/bash [root@1e973315dad7 /]# # 启动已经进入了容器,是一个最初版的centos [root@1e973315dad7 /]# exit; # 停止并退出容器
6、docker ps
docker ps # 正在运行的 docker ps -a # 曾经运行的+正在运行的容器 docker ps -n=? # 最近创建的容器,显示数量-n。 docker ps -q # 只显示容器的id #eg: docker ps -a -n=2 # 显示最近的两个容器
7、退出容器
exit # 停止并退出容器 ctrl+P+Q
8、容器启动-重启-关闭
无法操作镜像,只能操作容器
docker start 容器ID #启动容器 docker restart 容器ID #重启容器 docker stop 容器ID #关闭容器 docker kill 容器ID #强制关闭容器
9、docker run -d
# 命令 docker run -d 镜像名 docker run -d centos #存在问题:docker ps时发现centos停止了 #常见的坑:docker容器后台运行,必须要有一个前台进程,如果docker发现没有cli,那么后台应用就会自动停止 #启动nginx,容器启动后,发现自己没有提供服务,就会立即停止。
10、日志命令
docker logs
docker logs -f -t --tail n 容器ID # n日志条数,t 时间戳;f 规范显示format # 自己写一段shell脚本 "while true;do echo biebiebie;sleep 1;done" docker run -d centos /bin/sh -c "while true;do echo biebie;sleep 1;done"
11、查看容器中进程信息
docker top 容器ID
12、查看容器内部元数据
docker inspect 容器ID
13、docker exec
# 方式一:docker exec docker exec -it 容器ID /bin/bash # /bin/bash:通过哪个命令行进入容器,还有/bin/sh # 方式二:docker attach docker attach 容器ID 正在运行的代码..... #docker exec #开启新的终端进入正在运行的容器,可以操作命令(常用) #docker attach #进入容器正在执行的终端,不会启动新的终端
14、 容器内拷贝文件到主机
docker cp 容器ID:容器内路径 目的主机路径
15、 主机拷贝文件到容器
通过磁盘挂载的方式
16、docker各模块命令交互图
四、练习
1、安装nginx
#1.启动docker服务,并搜索镜像;建议先看hub.docker.com上进行搜索 docker search nginx #2.远程下载镜像 docker pull nginx:[版本号] #3.启动nginx docker run -d --name nginx01 -p 3344:80 nginx #4.测试是否启动成功:成功 curl localhost:3344 #安装curl包 #1.下载 wget --no-check-certificate https://curl.haxx.se/download/curl-7.80.0.tar.gz #2.解压 tar zxvf curl-7.80.0.tar.gz #3.执行配置文件 cd curl-7.80.0 ./configure #4.make编译 make # 进入容器查看容器ip:cat /etc/hosts # 外部查看:docker inspect 容器ID/名称
docker端口暴露的概念:
思考:我们每次改动nginx配置文件,都需要进入容器内部,很麻烦,可以通过容器外部修改直接映射到内部文件吗? -v(数据卷技术)
2、安装tomcat
# 官网使用 docker run -it --rm tomcat:9.0 # --rm:容器运行停止后即删除,一般用于测试 # 下载启动 docker pull tomcat # 启动运行 docker run -d -p 3355:8080 --name tomcat01 tomcat:[TAG] #测试,启动成功 #进入容器 docker exec -it tomcat01 /bin/bash # 发现问题:1.linux命令少了很多 2.在tomcat的webapps里面没内容 # 原因:阿里云的镜像的原因:阿里云镜像默认是最小镜像,所有不必要的内容都会剔除
3、部署 es + kibana
3.1、部署es
# es 暴露的端口很多 # es 十分耗内存 # es 的数据一般需要存放到安全目录! 即挂载 # 1.下载镜像与启动: docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 #其中:--net somenetwork是docker的网络配置 # 2.启动完之后,linux卡死了 docker stats # 查看docker CPU的状态 # 3.测试es是否启动成功 docker ps # 4. 赶紧关闭,增加内存的限制。修改es的配置文件 -e 环境修改 docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
docker ps # 查看docker进程
3.2、部署kibana
略
五、可视化-管理镜像的工具
1 、portainer (不是最佳)
什么是portainer? dokcer图像化界面管理工具。提供一个后台面板供我们操作
# 1.拉取镜像安装并启动 docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer # 2.测试是否启动成功 在宿主机上执行:curl localhost:8088 # 3.通过浏览器访问:如下图 宿主机ip:8088 -> 192.168.229.131:8088
# 4.一般连接选择本地,如下图
# 5.进入之后的面板
2 、Rancher (CI/CD再用)
略
六、Docker镜像(核心)
1、commit构建镜像
命令:docker commit 解释:提交一个容器成为新的镜像副本 # 命令和git命令类似 docker commit -m="提交描述信息" -a="作者" 容器ID 目标镜像名:[TAG]
以tomcat为例子提交新镜像
# 1、启动一个默认的tomcat # 2、发现这个默认的tomcat是没有webapps应用,是因为镜像纯净的原因。官方的镜像默认webapps文件夹下是没有文件的 # 3、自己拷贝进去了基本文件 # 4、讲文明操作过的容器通过commit提交为一个镜像(提交的镜像会保存在docker本地,与git也类似),我们以后就使用这个新提交的镜像即可 [root@localhost ~]# docker commit -a="bie" -m="add webapps app" 70b6e29900d3 tomcat02:1.1 # 5、如下图 复制
2、通过dockerfile构建镜像
略
学过dockfile以后才能构建
七、数据卷(核心)
数据?如果数据都在容器中,那么我们删除容器,数据就会丢失! 需求:数据可用持久化 mysql安装在docker容器中,容器删除 = 删库跑路! 需求:mysql数据可以存储在本地
容器之间可以有一个数据共享的技术! 卷技术,容器挂载(容器内的目录,挂载到宿主机) 总结:容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷: 1.volumns挂载 2.mounts挂载
docker run -it -v 主机目录:容器目录 # 1.执行命令进行挂载 docker run -it -v /home/ceshi:/home centos /bin/bash # 2.测试,在容器home目录下创建test.txt 结果:宿主机目录下 /home/cesh 有test.txt文件 # 3.docker inspect 容器id/容器名
1、安装mysql
思考:mysql的持久化问题?data目录挂载
会占用两倍存储空间
# 1.远程下载mysql镜像 docker pull mysql:5.7 # 2.启动mysql docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 # 注意:conf.d文件为空,正常,需要人为配置 # 3.测试:启动成功后用sqlyog或navicat连接 telnet 192.168.229.131 3310 # 允许登录
2、具名挂载和匿名挂载
匿名挂载使用的主机目录为具体目录
具名挂载使用的主机目录为下图中的卷组
# 1.匿名挂载 -v 容器内路径! -P 随机映射端口 -p指定映射端口 docker run -d -P --name nginx01 -v /etc/nginx nginx #查看所有挂载映射 docker volume ls 如下显示: DRIVER VOLUME NAME local 8a5ae8e2f309a8619fdfb873ce561883498cc1a04572899f0e174548137f45fb #匿名挂载,是真实存在的目录 local 9ba4a4c682727d7584f9143788d66491d9bb267c23b659e002b8b9987379c487 #匿名挂载,是真实存在的目录 # 2.具名挂载 docker run -d -P -v juming-nginx:/etc/nginx --name nginx02 nginx docker volumn ls 如下显示: DRIVER VOLUME NAME local 8a5ae8e2f309a8619fdfb873ce561883498cc1a04572899f0e174548137f45fb local 9ba4a4c682727d7584f9143788d66491d9bb267c23b659e002b8b9987379c487 local juming-nginx # 具名挂载
3、几种挂载语法
# 3.几种挂载-v的写法: 匿名写法: -v /宿主机路径:容器内路径 # 带/绝对路径,没有名字,例子:-v /home/nginx:/etc/nginx -v 容器内路径 # 例子:-v /etc/nginx 具名写法: -v 卷名:容器内路径 # 例子:-v juming-nginx:/etc/nginx # 4.总结 所有docker容器内的卷,没有指定目录的情况下都是在"/var/lib/docker/volumes/xxxxx(卷名)/_data" docker工作目录:"/var/lib/docke"
# 5.拓展 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx # ro:只读,只能宿主机改变内容,容器内无法改变此目录及数据 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx # rw:可读写,默认情况
八、dockerfile
Dockerfile就是用来构建docker镜像的文件!实际上就是命令脚本,通过脚本生成镜像 之前有commit构建docker镜像
# 1.编写dokcerfile文件,脚本如下: FROM centos #基于centos镜像 VOLUME ["volume1","volume2"] # 这里的写法就是匿名挂载,只写了容器内的目录 CMD echo "---------------end----------------" CMD /bin/bash # 2.运行脚本 docker build -f /home/docker-test-volume/dockerfile1 -t kuangshen-centos:1.0 . #-f 脚本路径; -t 打包版本 ;.标示存放位置 # 3.查看镜像是否构建成功 docker images; # 4.启动自己构建的镜像 docker run -it kuangshen-centos /bin/bash
发现挂载目录如下图:
数据卷容器(是一个容器)
多个dokcer容器共享一份数据(备份机制)
被挂载的容器:就是数据卷容器 启动3个容器进行测试:
#启动数据卷容器: docker run -it --name docker01 kuangshen-centos:1.1 #启动第2个容器: docker run -it --name dokcer02 --volumes-from docker01 kuangshen-centos:1.1 #启动第3个容器: docker run -it --name dokcer03 --volumes-from docker01 kuangshen-centos:1.1 #启动第4个容器:挂载docker02上 docker run -it --name dokcer04 --volumes-from docker02 kuangshen-centos:1.1 命令:--volumes-from 类似于java的继承 #测试,删除docker01之后,其他容器中的挂载目录还是有数据 #总结:只要有一个容器还在运行,那么数据就不会丢失
使用docker进行mysql数据同步:
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 docker run -d -p 3311:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumns-from mysql01 mysql:5.7
(测试时:数据挂载成功了。通过ssh链接时,哪台先开启,就可以连接上哪台。调换先后顺序后,发现创建的数据库test成功,没过3分钟,后启动的mysql自动挂了,很奇怪的现象)
小结: 容器之间配置的信息传递,数据卷容器的生命周期一直持续到没有容器使用为止。 但一旦持久化到宿主机,这个时候宿主机的数据是不会删除的。
1、dockerfile基础
1.每个保留关键字(指令)都必须是大写字母 2.执行顺序从上到下 3.#标示注释 4.每一更的指令都会创建提交一个新的镜像层,并提交 dockerfile是面向开发的,我们以后要发布项目,做镜像就需要编写dockerfile文件,这个文件十分简单。 docker镜像已经成为开发交付的一个趋势,逐步取代jar,war包
步骤:开发,部署,运维,缺一不可 Dockerfile:构建文件,定义了一切的步骤,原代码 DockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品 Docker容器:容器就是镜像运行起来提供服务器
2、dockerfile详解
FROM #基础镜像,一切从这里开始构建 MAINTAINER #镜像作者,姓名+日期 RUN #镜像构建的时候需要运行的命令 ADD #添加文件,如步骤:tomcat镜像,添加tomcat的压缩包 WORKDIR #镜像的工作目录 VOLUMES #挂载的目录 EXPOSE #暴露端口 CMD #指定这个容器启动时需要运行的命令,只有最后一个会生效。有覆盖动作 ENTRYPOINT #指定这个容器启动时需要运行的命令,是追加,无覆盖动作 ONBUILD #当构建一个被继承Dockfile这个时候就会运行ONBUILD命令 COPY #类似ADD,将我们文件拷贝到镜像中 ENV #构建的时候设置环境变量
3、练习
构建自己的centos
DockerHub中99%的镜像都是从这个基础镜像构建而来的(FROM scratch)
在原有的centos上,添加vim包和ipconfig包
# 1.编写自己的dockerfile文件 FROM centos # FROM cenos1 MAINTAINER biejiahao<729941382@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "------end-------------" CMD /bin/bash #2.通过这个文件构建镜像 # 命令:docker build -f dockerfile文件路径 -t 镜像名:[TAG] . 本地测试时,这里有问题: 需要将原始centos upstream后发布新版的cenos1,然后再进行build操作 地址:https://blog.csdn.net/weixin_43252521/article/details/124409151 构建成功输出的信息: Successfully built bf40fedf541b Successfully tagged mycentos:0.1 # 3.测试运行 docker run -it mycentos:0.1 /bin/bash vim test.java # 成功 ifconfig # 成功 # 4.查看镜像构建历史 docker history 镜像id
4、CMD 与ENTRYPOINT的区别
CMD #指定这个容器启动时需要运行的命令,只有最后一个会生效。有覆盖动作 ENTRYPOINT #指定这个容器启动时需要运行的命令,是追加,无覆盖动作
cmd进行dockfile测试
#1 编写dockerfile-cmd的dockerfile文件 FROM centos CMD ["ls","-a"] #2 build成为新镜像 docker build -f dockerfile-cmd -t centos-cmd:1.0 . #3 测试启动centos-cmd:1.0镜像 docker run centos-cmd:1.0 # 成功 #4.测试加参数,本意想表达 ls -al命令 docker run centos-cmd:1.0 -l # 控制台报错
ENTRYPOINT进行dockerfile测试
#1 编写dockerfile-entrypoint的dockerfile文件 FROM centos ENTRYPOINT ["ls","-a"] #2 build成为新镜像 docker build -f dockerfile-entrypoint -t centos-entrypoint:1.0 . #3 测试启动centos-cmd:1.0镜像 docker run centos-entrypoint:1.0 # 成功 #4.测试加参数,本意想表达 ls -al命令 docker run centos-entrypoint:1.0 -l # 成功
5、练习
构建tomcat镜像
1.准备镜像文件tomcat压缩包,jdk压缩包 2.编写dockerfile文件,官方命名Dockerfile,build时会自动寻找这个文件并执行,就不需要 -f 指定文件了。
FROM cenos1 MAINTAINER biejihao<729941382@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u301-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.5.81.tar.gz /usr/local RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_301 ENV CLASSPATH $JAVAHOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.81 ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.81 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-8.5.81/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.81/bin/logs/catalina.out
3.构建镜像
#1.进入到dockerfile文件目录 #2.执行构建命令 docker build -t diytomcat:1.0 .
4.启动镜像
docker run -d -p 9090:8080 --name kuangshentomcat -v /home/build/tomcat/test:/usr/local/apache-tomcat-8.5.81/webapps/test -v /home/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-8.5.81/logs diytomcat:1.0
5.访问测试
curl localhost:9090 # 如果访问不到,就是tomcat没有启动成功 # 1.先排除启动命令是否有误 2.再排除dockerfile脚本是否有误(第一次多半是脚本问题)
6.发布项目(由于做了卷挂载,那么直接在宿主机进行发布项目即可)
在宿主机挂载的test目录进行操作: mkdir WEB-INF cd WEB-INF vim web.xml
web.xml内容
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> </web-app>
将index.jsp文件存放到项目test目录下
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <h2>Hello World!</h2> <% System.out.println("--------------test---------------------"); %> </body> </html>
启动新的tomcat容器
结果:通过浏览器可以访问成功,并且后台日志可以记录访问信息
九、Docker网络原理
1.理解dokcer0
理解docker网络,就是理解dokcer0的网络:docker0=路由器 网络请求中转 清空所有的镜像与容器,方便学习docker网络时的理解
# 启动一个tomcat docker run -d -P --name tomcat01 tomcat # 查看容器的内部网络地址 ip addr,发现容器启动的时候会得到一个eth0@if262 ip地址是docker分配的 docker exec -it tomcat01 ip addr # 异常请参考文章:https://blog.csdn.net/User_bie/article/details/125642454
# 思考:linux宿主机能不能ping通容器内部? 答案:可以 > ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.077 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.037 ms .....
2.网络原理
1、每启动一个docker容器,docker就会给容器分配一个ip,完美只要安装了docker就会有一个dokcer0网卡 利用的是桥接模式,使用的是evth-pair技术 宿主机再次测试ip addr 2、再次启动一个新的容器,发现又多了一对网卡
# 我们发现这个容器带来网卡,都是一对一对 # evth-pair就是一对虚拟设备接口,都是成对出现,一端连着协议,一端彼此相连 # 正因为有了这个特性,一般用evth-pair充当一个桥梁,专门连接各种虚拟网络设备 # Openstac,docker容器之间的连接,OVS的连接,都是使用的是evth-pair技术
3、测试tomcat01是否可以ping同tomcat02 答:可以
结论:tomcat01与tomcat02是公用一个路由器,dokcer0 所有容器在不指定网络的情况下,都是通过docker0进行路由,docker0会给容器分配一个默认可用的IP。可用ip数为254个 如:17.18.0.1/16 则可以分配 255*255 - 2(0.0.0.0 与255.255.255.255)个ip 如:17.18.0.1/24 则可以分配 255-1(17.18.0.1)=254 个ip
小结
Docker使用的是linux的桥接: dokcer中所有的网络接口都是虚拟的。虚拟的转发效率高!
3、- - link
思考:
场景,编写一个微服务,database url=ip,项目不重启,数据库ip换了,能否根据名称访问容器而不根据ip访问。因为docker容器每次启动ip都是会变化的 探究:docker network inspect
docker --link 本质:hosts配置
–link后,会在/etc/hosts配置文件中添加一份映射 目前已经不推荐使用docker0,需要自定义网络:docker0不支持 容器名连接访问
4、自定义网络:容器互联
查看所有的docker网络 网络模式: bridge:桥接docker(默认) none:不配置网络,不建议 host:和宿主机共享网络 container:容器网络连通(用的少,局限性很大,不建议)
测试:
#1.直接启动的命令 --net bridge 这个参数是默认使用的,即代表dokcer0 docker run -d -P --name tomcat01 --net bridge tomcat # docker0 特点: 默认网络,域名不能访问, --link可以打通进行连接 #2.我们可以自己定义一个网络,以后启动的容器就在自己定义的网络内运行 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mybet --driver 网络连接方式 --subnet 子网 --gateway 子网网关 #家用所有的路由器都是这个网络配置 #3.查看当前docker网络 docker networkd ls #成功 f5aae4c0d555 bridge bridge local 66ad3244c031 host host local c54074b0a393 mybet bridge local 044d666dd3d7 none null local #4.使用自定义网络启动tomcat docker run -d -P --name tomcat-net-01 --net mybet tomcat docker run -d -P --name tomcat-net-02 --net mybet tomcat #5.再次两个容器进行ping docker exec -it tomcat-net-01 ping 192.168.0.3 #192.168.0.3为tomcat-net-02的ip #成功 docker exec -it tomcat-net-01 ping tomcat-net-02 #成功
自定义的网络docker已经帮我们维护好了对应的网络关系,推荐平时使用自定义网络 好处: mysql/redis:不同的集群使用不同的网络,保证集群是安全和健康的
5、docker网络连通
如mysql集群需要访问不同网段的redis集群
A网络容器需要与B网卡连通,才能访问B网段下的服务
# 测试tomcat01连通mybet网络 docker network connect mybet tomcat01 # 如下图:连通之后,直接会把这个容器加入到这个网络中 # 这种情况再docker中称为一个容器两个ip,比如阿里云服务器,公网ip与私网ip
结论:假设要跨网络操作,需要使用docker network connect进行连通
6、练习
部署redis集群
redis cluster 多主从集群
# 1.创建redis集群网络 docker network create redis --subnet 172.38.0.0/16 # 2.通过脚本创建6个redis配置 for port in $(seq 1 6); \ do \ mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/node-${port}/conf/redis.conf cat << EOF >/mydata/redis/node-${port}/conf/redis.conf port 6379 bind 0.0.0.0 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 172.38.0.1${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 appendonly yes EOF docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \ -v /mydata/redis/node-${port}/data:/data \ -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \ done #3.创建redis集群 #3.1进入到某个redis # 以3-master为例 docker exex -it 82a74538a215 /bin/sh #3.2执行创建集群 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 #3.3中途执行yes # 注意redis-cli操作集群时,登录需要加参数-c,如:redis-cli -c
小结:使用了docker之后,所有的技术使用的更简单
十、扩展
##
docker system prune:自动清理空间
-
该指令默认会清除所有如下资源:
-
已停止的容器(container)
-
未被任何容器所使用的卷(volume)
-
未被任何容器所关联的网络(network)
-
所有悬空镜像(image)。
-
docker info | grep 'Docker Root Dir'
查看docker的数据存储目录
修改数据目录:/etc/docker/daemon.json文件中加入:
删除容器
docker rm命令删除容器,例如docker rm container_id或docker rm container_name
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类