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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务之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创建容器并运行
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
Java Docker 微服务
如何使用Docker和Docker Compose部署微服务
【2月更文挑战第12天】
246 0
|
1月前
|
Kubernetes API Docker
Docker+K8s基础(重要知识点总结)
Docker+K8s基础(重要知识点总结)
64 0
|
1月前
|
监控 持续交付 Docker
深入浅出:基于Docker的微服务部署实践
【2月更文挑战第26天】在当前软件开发领域,微服务架构与容器化技术成为提升应用可伸缩性、可靠性和开发效率的关键手段。本文将深入探讨如何利用Docker容器技术实现微服务的快速部署与管理,涵盖环境搭建、服务打包、网络配置及持续集成等核心话题。通过实例演示,旨在为开发者提供一套行之有效的微服务部署解决方案。
|
2月前
|
开发者 Docker 微服务
深入浅出:使用Docker容器化部署微服务架构
在当今快速迭代的软件开发环境中,微服务架构因其高度解耦和独立性而成为企业首选。然而,微服务的管理和部署可能会变得复杂和繁琐。本文将探讨如何利用Docker,一个轻量级的容器化技术,来简化和加速微服务的部署。我们将从Docker的基础概念入手,详细介绍如何创建、配置和运行微服务容器,最后讨论Docker在微服务架构中的优势和挑战。本文旨在为开发者提供一条清晰的路径,通过容器化技术实现微服务架构的高效部署和管理。
87 0
|
2月前
|
Kubernetes 开发者 Docker
深入浅出:使用Docker容器化部署微服务架构
在当今快速演进的软件开发领域,微服务架构因其高度的模块化和可伸缩性而受到广泛欢迎。然而,微服务的部署和管理也带来了新的挑战。本文旨在通过深入浅出的方式,探讨如何利用Docker容器技术有效地部署和管理微服务架构。我们将从Docker的基本概念出发,逐步深入到如何构建、部署微服务,并讨论在此过程中可能遇到的常见问题及其解决策略。本文不仅适合刚接触Docker和微服务的新手,也为有经验的开发者提供了实用的参考。
56 1
|
2月前
|
JSON JavaScript Docker
深入浅出:使用Docker容器化部署微服务架构
本文旨在向读者展示如何利用Docker技术高效地构建和部署微服务架构。通过深入浅出的方式,我们将探索Docker的基本概念、容器化的优势以及如何将其应用于微服务架构中。此外,文章还将提供一个简单的示例,指导读者实践如何使用Docker将一个现有的后端应用容器化,并部署到本地开发环境中。不同于传统的摘要,这里我们强调实践操作的重要性,鼓励读者通过实际操作来加深对Docker和微服务架构的理解。
52 1
|
2月前
|
Kubernetes 负载均衡 Docker
深入浅出:使用Docker容器化部署微服务
在当今快速变化的软件开发领域,微服务架构因其高度的模块化和可伸缩性而受到广泛欢迎。然而,微服务的部署和管理带来了新的挑战。本文将探讨如何利用Docker容器技术,简化和加速微服务应用的部署过程。我们将从Docker的基础知识入手,逐步深入到如何构建、部署和管理微服务容器。通过本文,读者将获得一套实用的工具和方法论,以便在自己的项目中高效地应用Docker和微服务技术。
|
2月前
|
Java 开发者 Docker
深入浅出:使用Docker容器化部署微服务架构
在本文中,我们将探索Docker容器技术如何革新微服务架构的部署方式,提高开发效率和应用的可扩展性。不同于传统摘要的概述风格,我们将通过一个实际案例,步骤明晰地展示如何将一个简单的微服务应用容器化,并在Docker环境中部署运行。本文旨在为开发者提供一个清晰、易懂的指南,帮助他们理解容器化技术的基本原理和操作流程,无论是初学者还是有经验的开发人员都能从中获益。
|
4天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
17天前
|
API 数据库 开发者
构建高效可靠的微服务架构:后端开发的新范式
【4月更文挑战第8天】 随着现代软件开发的复杂性日益增加,传统的单体应用架构面临着可扩展性、维护性和敏捷性的挑战。为了解决这些问题,微服务架构应运而生,并迅速成为后端开发领域的一股清流。本文将深入探讨微服务架构的设计原则、实施策略及其带来的优势与挑战,为后端开发者提供一种全新视角,以实现更加灵活、高效和稳定的系统构建。
23 0