96SEO 2026-02-23 14:04 22
是一种容器化平台用于帮助开发者打包、发布和管理应用程序及其依赖关系。

当我们利用Docker安装应用时Docker会自动搜索并下载应用镜像image。
镜像不仅包含应用本身还包含应用运行所需要的环境、配置、系统函数库。
Docker会在运行镜像时创建一个隔离环境称为容器container。
镜像仓库存储和管理镜像的平台Docker官方维护了一个公共仓库Docker
deamon守护进程会在后台运行和监听事假当客户端发送命令该命令会被守护进程监听并且解析比如客户端的命令是启动mysql服务的话守护进程解析完会去镜像仓库寻找应用镜像。
第二次运行的时候就不需要再次下载。
容器是隔离环境外界不可访问。
但是可以将宿主机端口映射容器内到端口当访问宿主机指定端口时就是在访问容器内的端口了。
容器内端口往往是由容器内的进程决定例如MySQL进程默认端口是3306因此容器内端口一定是3306而宿主机端口则可以任意指定一般与容器内保持一致。
宿主机端口:容器内端口示例中就是将宿主机的3306映射到容器内的3306端口
案例中TZAsia/Shanghai是设置时区MYSQL_ROOT_PASSWORD123是设置MySQL默认密码
格式REPOSITORY:TAG例如mysql:8.0其中REPOSITORY可以理解为镜像名TAG是版本号
在未指定TAG的情况下默认是最新版本也就是mysql:latest
{{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}#
{{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}#
{{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}#
{{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}
Docker最常见的命令就是操作镜像、容器的命令详见官方文档https://docs.docker.com/
相当于一条龙服务它会帮你需要的镜像从镜像仓库拉取到本地仓库并且创建和运行容器。
run一个镜像只需要创建一次后续无论是虚拟机重启你也只需要启动或者停止相应的容器。
容器是隔离环境容器内程序的文件、配置、运行时产生的日志都在容器内部我们要读写容器内的文件非常不方便。
大家思考几个问题
如果要升级MySQL版本需要销毁旧容器那么数据岂不是跟着被销毁了
MySQL、Nginx容器运行后如果我要修改其中的某些配置该怎么办
因此容器提供程序的运行环境但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。
而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data
这样以来容器内的conf和html关联起来我们称为挂载。
此时我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data就可以被Nginx代理了。
注意事项容器与数据卷的挂载要在创建容器时配置对于创建好的容器是不能设置数据卷的。
而且创建容器的过程中数据卷会自动创建。
29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459f
2024-05-17T19:57:0808:00,Driver:
/var/lib/docker/volumes/html/_data,Name:
4.查看/var/lib/docker/volumes/html/_data目录
/var/lib/docker/volumes/html/_data
/var/lib/docker/volumes/html/_data
7.进入容器内部查看/usr/share/nginx/html目录内的文件是否变化
挂载本地挂载完方便后续mysql的容器如果被删除可以恢复相应的数据。
可以发现数据卷的会不太方便。
在很多情况下我们会直接将容器挂载。
挂载语法与数据卷类似
默认系统会为mysql进行数据的挂载但是是匿名数据卷不方便数据的复原因此需要手动来指定数据卷。
挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d
挂载/root/mysql/conf到容器内的/etc/mysql/conf.d
其中hm.cnf主要是配置了MySQL的默认编码改为utf8mb4
./mysql/init:/docker-entrypoint-initdb.d
查看data目录会发现里面有大量数据库数据说明数据库完成了初始化
----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------#
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
data会保存当前mysql的数据信息。
如果mysql重构可以进行恢复数据。
mysql:latest那么可以使用类似的命令重新启动容器确保mysql:latest标签对应的
-p命令输入正确的密码然后执行一些查询操作来验证数据是否正确恢复。
例如查询数据库中的表结构和数据记录检查是否与删除容器之前的数据一致。
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。
上述步骤中的每一次操作其实都是在生产一些文件系统运行环境、函数库、配置最终都是磁盘文件所以镜像就是一堆文件的集合。
但需要注意的是镜像文件不是随意堆放的而是按照操作的步骤分层叠加而成每一层形成的文件都会单独打包并标记一个唯一id称为Layer层。
这样如果我们构建时用到的某些层其他人已经制作过就可以直接拷贝使用这些层而不用重复制作。
Dockerfile就是一个文本文件其中包含一个个的指令(Instruction)用指令来说明要执行什么操作来构建镜像。
2、有了Dockerfile只需要告诉docker镜像包含的一些列东西然后它会帮我们执行相关的操作。
将来Docker可以根据Dockerfile帮我们构建镜像。
常见指令如下
JDK基础镜像包含了Ubuntu镜像的JDK的应用下载以及环境变量等配置。
所以就有人提供了基础的系统加JDK环境我们在此基础上制作java镜像就可以省去JDK的配置了
将课前资料提供的docker-demo.jar包以及Dockerfile拷贝到虚拟机的/root/demo目录
默认情况下所有容器都是以bridge方式连接到Docker的一个虚拟网桥上
1.用基本命令寻找Networks.bridge.IPAddress属性
.NetworkSettings.Networks}}{{println
但是容器的网络IP其实是一个虚拟的IP其值并不固定与某一个容器绑定如果我们在开发时写死某个IP而在部署时很可能MySQL容器的IP会发生变化连接会失败。
官方文档https://docs.docker.com/engine/reference/commandline/network/
1、只有在同一个网桥上的容器才能相互访问如果在不同网桥上的容器你发现会ping不通。
2、对应的网卡是系统分配的如果该应用关闭启动其他应用可能该应用就会占用之前应用的网卡。
加入自定义网络实质就是创建自定义的网桥让容器加入进来的容器可以实现容器名互相访问Docker网络命令如下
3.让dd和mysql都加入该网络注意在加入网络时可以通过--alias给容器起别名
3.1.mysql容器指定别名为db另外每一个容器都有一个别名是容器名
然后让mysql容器加进来其他容器加进来实现同一个网桥可以实现互通
hmall项目是一个maven聚合项目使用IDEA打开hmall项目查看项目结构如图
我们要部署的就是其中的hm-service其中的配置文件采用了多环境的方式
注意事项其中的application-dev.yaml是部署到开发环境的配置application-local.yaml是本地运行时的配置。
查看application.yaml你会发现其中的JDBC地址并未写死而是读取变量
这两个变量在application-dev.yaml和application-local.yaml中并不相同
在dev开发环境也就是Docker部署时采用了mysql作为地址刚好是我们的mysql容器名只要两者在一个网络就一定能互相访问。
地址的解析这样应用就能方便地找到数据库容器就好像它们在同一个局域网里通过主机名访问彼此一样。
访问http://192.168.85.144:8080/search/list?pageNo1pageSize5
hmall-portal(前台页面)和hmall-admin(后台页面)是前端代码需要基于nginx部署。
把/root/nginx/nginx.conf挂载到/etc/nginx/nginx.conf
把/root/nginx/html挂载到/usr/share/nginx/html
由于需要让nginx同时代理hmall-portal和hmall-admin两套前端资源因此我们需要暴露两个端口
/root/nginx/html:/usr/share/nginx/html
/root/nginx/nginx.conf:/etc/nginx/nginx.conf
修改配置文件如有需要确保项目中的配置文件如数据库连接配置等与生产环境相匹配。
在容器化部署时可能需要将配置中的主机名、端口等信息调整为与容器环境相适应的内容例如使用容器名作为数据库主机名等情况。
而稍微复杂的项目其中还会有各种各样的其它中间件需要部署的东西远不止3个。
如果还像之前那样手动的逐一部署就太麻烦了。
Compose通过一个单独的docker-compose.yml
格式来定义一组相关联的应用容器帮助我们实现多个相互关联的Docker容器的快速部署。
其实DockerCompose就是可以进行多个容器同时进行docker
如果把前端、后端以及mysql的相关信息写到DockerCompose就可以实现一键开启一键结束这样避免我们一个一个容器开启的过程中遇到的错误。
Asia/ShanghaiMYSQL_ROOT_PASSWORD:
./mysql/conf:/etc/mysql/conf.d-
./mysql/init:/docker-entrypoint-initdb.dnetworks:-
./nginx/nginx.conf:/etc/nginx/nginx.conf-
./nginx/html:/usr/share/nginx/htmldepends_on:-
指定project名称。
project就是当前compose文件中设置的多个service的集合是逻辑概念
注意事项up所创建的容器以及网络但执行down就会把创建的所有东西删除。
不会残留任何东西。
docker.io/library/openjdk:11.0-jre-buster
docker.io/library/openjdk:11.0-jre-bustersha256:3546a17e6fb4ff4fa681c3
/usr/share/zoneinfo/Asia/Shanghai
sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71
0.0.0.0:18080-18081-18080-18081/tcp,
打开浏览器访问http://192.168.85.144:18080/
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback