微服务之Docker知识点总结(三)

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 微服务之Docker知识点总结()

四. 数据卷(容器数据管理)


在之前的nginx案例中,修改nginx的html页面时,需要进入nginx内部。并且因为没有编辑器,修改文件也很麻烦。


这就是因为容器与数据(容器内文件)耦合带来的后果。


af410497b91d430ebaa95e4b797e01b7.png


要解决这个问题,必须将数据与容器解耦,这就要用到数据卷了。


1. 什么是数据卷


数据卷(volume) 是一个虚拟目录,指向宿主机文件系统中的某个目录。


06cb6bcfb95a4f04a4e4831bf5776300.png


一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。


这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了


2.数据集操作命令


数据卷操作的基本语法如下:


docker volume [COMMAND]


docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:


create 创建一个volume

inspect 显示一个或多个volume的信息

ls 列出所有的volume

prune 删除未使用的volume

rm 删除一个或多个指定的volume


3.创建和查看数据卷


需求:创建一个数据卷,并查看数据卷在宿主机的目录位置

① 创建数据卷


docker volume create html


② 查看所有数据


docker volume ls


③ 查看数据卷详细信息


docker volume inspect html


结果:


b77c6990e4354cffad897efda55ee758.png


可以看到,我们创建的html这个数据卷关联的宿主机目录为/var/lib/docker/volumes/html/_data目录。


4.挂载数据卷


我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:


docker run \
  --name nginx \
  -v html:/usr/share/nginx/html \
  -p 80:80
  nginx \


这里的-v就是挂载数据卷的命令:


-v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中.


5. 案例一 :给nginx挂载数据卷


需求:创建一个nginx容器,修改容器内的html目录内的index.html内容


分析:上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置/usr/share/nginx/html ,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。


提示:运行容器时使用 -v 参数挂载数据卷


步骤:


① 创建容器并挂载数据卷到容器内的HTML目录


docker run --name nginx -v html:/usr/share/nginx/html -p 80:80 -d daocloud.io/library/n


② 进入html数据卷所在位置,并修改HTML内容


# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vim index.html


6f23f802014b44749ed90332ff09e38a.png


修改成:


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Welcome to haiexijun</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>害恶细菌欢迎您!</h1>
<img style="display:block;width:200px;height:140px" src="https://ucc.alicdn.com/images/user-upload-01/cc569661c7334c9cb0eebdfe2df6d445.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5a6z5oG257uG5ZCb,size_20,color_FFFFFF,t_70,g_se,x_16"/>
</body>
</html>


刷新网页:


d98d8d8e44f244d4bfb7f5648d0529c1.png


6. 案例一 :给MySQL挂载本地宿主机目录


容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:


带数据卷模式:宿主机目录 --> 数据卷 —> 容器内目录

直接挂载模式:宿主机目录 —> 容器内目录

如图:


7bd5c288620345deb1bdccd36338efe1.png


语法:


目录挂载与数据卷挂载的语法是类似的:


-v [宿主机目录]:[容器内目录]

-v [宿主机文件]:[容器内文件]

需求:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器


实现思路如下:


1)获取MySQL的镜像


docker pull mysql:8.0.25


99503177d86144eba95adda2dd9506ad.png

40a0c601af0d4fa48e08cdcd18000bf3.png


2)创建目录/tmp/mysql/data


mkdir -p /tmp/mysql/data



3)创建目录/tmp/mysql/conf,将课前资料提供的hmy.cnf文件上传到/tmp/mysql/conf


mkdir -p /tmp/mysql/conf


cd /tmp/mysql/conf


在该目录下用vim创建一个hmy.cnf的配置文件


vim ./hmy.cnf


编写如下内容:


[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000


4)去DockerHub查阅资料,创建并运行MySQL容器,要求:

① 挂载/tmp/mysql/data到mysql容器内数据存储目录

② 挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件

③ 设置MySQL密码


docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=zc20020106 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:8.0.25


然后我们在其他电脑上连接数据库测试:


046553dc77ad42b8a9bfce43e7ebdbed.png


五. Dockerfile自定义镜像


常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。


而要自定义镜像,就必须先了解镜像的结构才行。


1.镜像结构


镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。


我们以MySQL为例,来看看镜像的组成结构:


c8ec5bd968fc4fe4ae74900855437406.png


简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。


我们要构建镜像,其实就是实现上述打包的过程。


2.Dockerfile语法


构建自定义的镜像时,并不需要一个个文件去拷贝,打包。


我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。


而描述上述信息的文件就是Dockerfile文件。


Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。


下面是Docker的一些常用指令:


38cc99580bd64caf9182ce86c12ab096.png


更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder


六.构建Java项目


下面以一个案例来学习把java项目构建成一个docker镜像,并运行。


1.基于Ubuntu构建Java项目


需求:基于Ubuntu镜像构建一个新镜像,运行一个java项目


步骤1:新建一个空文件夹docker-demo

步骤2:把资料中的docker-demo.jar文件到docker-demo这个目录(资料已经上传到csdn上供免费下载了)

步骤3:拷贝资料中的jdk8.tar.gz文件到docker-demo这个目录

步骤4:拷贝资料提供的Dockerfile到docker-demo这个目录

Dockerfile文件的具体内容为:


# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar


  • 步骤5:进入docker-demo
    将准备好的docker-demo上传到虚拟机任意目录,然后进入docker-demo目录下
  • 步骤6:运行命令:


docker build -t javaweb:1.0 .


最后访问 http://http://192.168.172.130/:8090/hello/count,其中的ip改成你的虚拟机ip。


2.基于java8构建Java项目


虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。


例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。


需求:基于java:8-alpine镜像,将一个Java项目构建为镜像


实现思路如下:


① 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile


② 拷贝课前资料提供的docker-demo.jar到这个目录中


③ 编写Dockerfile文件:


a )基于java:8-alpine作为基础镜像


b )将app.jar拷贝到镜像中


c )暴露端口


d )编写入口ENTRYPOINT


内容如下:


FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar


  • ④ 使用docker build命令构建镜像
  • ⑤ 使用docker run创建容器并运行
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
14天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
14天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
14天前
|
安全 持续交付 Docker
微服务架构和 Docker 容器化部署的优点是什么?
微服务架构和 Docker 容器化部署的优点是什么?
|
16天前
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
34 1
|
22天前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
55 1
|
30天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
83 7
|
29天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
60 6
|
1月前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
85 2
|
1月前
|
Java Docker 微服务
SpringBoot微服务打包Docker镜像
SpringBoot微服务打包Docker镜像
下一篇
无影云桌面