SpringCloud学习路线(8)—— Docker

news2024/11/23 0:20:51

一、Docker的开始

(一)项目部署问题:

  • 依赖关系复杂,容易出现兼容性问题
  • 开发、测试、生产环境有差异

(二)Docker如何解决问题?

1、依赖兼容问题

  • (1)将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
  • (2)将每个应用放到隔离容器运行,避免相互干扰

2、系统环境问题

  • (1)将用户程序与所需要调用的系统函数库共同打包。
  • (2)Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行。

(三)Docker与虚拟机

1、应用部署实现原理差异

  • Docker通过容器隔离应用并通过Linux内核运行应用,可以任意迁移操作系统。
  • 虚拟机通过Hypervisor技术,模拟出计算机硬件,再安装任意适合的环境与应用。(性能较差)

2、Docker与虚拟机性能差异

特性Docker虚拟机
性能接近原生性能较差
硬盘占用一般为 MB一般为 GB
启动秒级分钟级

(四)镜像和容器

1、镜像与容器的概念

  • 镜像(Image): Docker将应用程序及其依赖、函数库、环境、配置等文件打包在一起,成为镜像。
  • 容器(Container): 镜像中的应用程序运行后形成的进程就是容器,只是Docker对容器做隔离,对外不可见。

2、Docker和DockerHub

  • DockerHub: DockerHub是一个Docker镜像托管平台(跟github一样)。这样的平台称为Docker Registy(Docker 服务器)。 官方地址:

(五)Docker架构

Docker是一个CS架构程序,由两部分组成:

  • 服务端(server): Docker Daemon守护进程,负责处理Docker指令,管理镜像、容器等。
  • 客户端(client):通过命令(本地)或RestAPI(远程)向Docker服务端发送指令。

Client常用命令

命令作用
docker build为client指定的服务做一个镜像
docker pull从DockerHub官方库拉取需要的镜像
docker run启动镜像

二、Docker的基础操作

(一)Docker的安装

1、了解Docker版本的不同

Docker分为 CE 和 EE 两大版本。CE 即社区版(免费,支持7个月),EE 即企业版(强调安全,付费使用,支持周期 24 个月)

2、官方关于安装Linux版Docker的说明

  • 要求: Docker CE 支持 64 位版本CentOS 7,并且要求内核版本不低于 3.10,CentOS 7 恰好满足这个要求。
  • 官方地址: https://docs.docker.com/desktop/install/linux-install/

3、在CentOS 7 中安装 Docker

新装CentOS系统的朋友们,注意先检查网络畅通状态。

(1)查看网络适配器的VMware Network,看到启用状态就没问题。

在这里插入图片描述

(2)查看VMware的客户端的网络连接状态
在这里插入图片描述

(3)查看VMware服务,主要是NAT服务,它是虚拟机与主机IP共享的服务,要开起来。

在这里插入图片描述

(4)VMware默认不开启网卡服务,所以我们要到/etc/sysconfig/network-scripts/ifcfg-ens33,把ONBOOT=yes
在这里插入图片描述

(5)重启网络服务

service network restart

在这里插入图片描述
(6)安装Docker

卸载旧版Docker(如果安装过Docker,避免版本冲突)

yum remove docker \
								docker-client \
								docker-client-latest \
								docker-common \
								docker-latest \
								docker-latest-logrotate \
								docker-logrotate \
								docker-selinux \
								docker-engine-selinux \
								docker-engine \
								docker-ce

安装yum-utils

yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken

设置本地镜像源

查看阿里云官方的docker镜像设置:阿里云官方镜像地址

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
sudo yum makecache fast
sudo yum -y install docker-ce
sudo service docker start

配置镜像加速器

官方地址:Docker镜像加速器

#创建文件夹
sudo mkdir -p /etc/docker
#创建并写入阿里云镜像地址地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://zv9ol6pc.mirror.aliyuncs.com"]
}
EOF
#重新加载文件
sudo systemctl daemon-reload
#重启docker服务
sudo systemctl restart docker

(二)镜像操作

1、镜像名称: [respository]:[tag] (例如mysql:8.0,当tag没有指定时,默认是latest,代表最新版本镜像)

2、镜像操作:

操作说明
docker build构建镜像
docker pull拉取镜像
docker push推送镜像
docker images查看docker里的镜像列表
docker rmi删除某个镜像
docker save压缩某个镜像
docker load加载某个镜像

在这里插入图片描述

3、拉取最新版本Nginx镜像操作

docker pull nginx 

在这里插入图片描述
4、压缩一个镜像操作

docker save -o nginx.tar nginx:latest

在这里插入图片描述

5、删除已有的镜像

docker rmi nginx:latest

在这里插入图片描述
6、加载镜像

docker load nginx.tar

在这里插入图片描述

(三)容器操作

操作说明
docker run运行docker容器
docker pause暂停运行
docker unpause解除暂停,开始运行
docker stop停止运行
docker start开始运行
docker rm删除容器
dcoker exec进入容器执行命令
docker logs查看运行日志
docker ps查看所有运行的容器及状态

在这里插入图片描述

容器操作实例

(1)运行一个Nginx容器

# docker run => 创建并运行一个容器
#  --name => 给容器命名
# -p => 将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
# -d => 后台运行容器
# nginx => Nginx镜像
docker run --name containerName -p 80:80 -d nginx

在这里插入图片描述
启动nginx容器后,可以在浏览器访问 虚拟机ip:80

在这里插入图片描述

(2)查看nginx 运行日志

docker logs [-f] 容器名

在这里插入图片描述

(3)进入容器执行命令

# docker exec:进入容器内部,执行一个命令
# -it:给当前进入的容器创建一个IO终端,允许与容器交互
# bash:进入容器后执行的命令,bash是linux的交互命令
docker exec -it 容器名 bash

在这里插入图片描述
修改nginx首页内容

#先找到nginx的index文件位置
cd /usr/share/nginx/html

#修改index.html文件,退出并保存
# sed -i : 编辑命令
# ' ' :表示修改的内容
# s# xxx #g:表示开头与结尾
# Welcome to ngnix#Nginx容器已启动!:左侧为原内容,右侧为替换内容
# index.html:表示修改文件
sed -i 's#Welcome to nginx!#Nginx容器已启动!#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html

重新访问浏览器

在这里插入图片描述

(4)停止docker容器

docker stop 容器名

在这里插入图片描述

(5)重启docker容器

docker start 容器名

在这里插入图片描述

(6)删除docker

docker rm 容器名

在这里插入图片描述

(四)数据卷操作(文件操作)

由于容器与数据高度耦合,有着不便于修改数据不可复用升级维护困难的问题。

1、数据卷是什么?

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

2、操作数据卷

docker volume [COMMAND]

Commond列表

  • create:创建一个volume
  • inspect:显示volume的信息
  • ls:列出所有volume
  • prune:删除未使用的volume
  • rm:删除volume

3、示例

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

#创建名为 nginxHTML 的数据卷
docker volume create nginxHTML

#查看已有的数据卷
docker volume ls 

#查看nginxHTML数据卷存储位置
docker volume inspect nginxHTML

在这里插入图片描述

4、数据卷映射容器文件(也称挂载)

通常是在创建容器时挂载数据卷

#docker run:创建并启动容器
#--name:nginxContain:命名容器
#-v nginxHTML:/root/html:将容器中的 /root/html/ 目录与 nginxHTML数据卷映射
#-p 8080:80:宿主机8080端口映射到容器的80端口
#-d nginx:镜像名称

docker run --name nginxContain -v nginxHTML:/usr/share/nginx/html -p 8080:80 -d nginx

在这里插入图片描述
查看数据卷位置

docker inspect nginxHTML

命令执行

[
    {
        "CreatedAt": "2023-07-20T06:27:45-07:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginxHTML/_data",  #在这里
        "Name": "nginxHTML",
        "Options": null,
        "Scope": "local"
    }
]

修改数据卷的内容,查看是否能影响到容器

vim /var/lib/docker/volumes/nginxHTML/_data/index.html

访问浏览器的ip:8080
在这里插入图片描述


三、Dockerfile自定义镜像

(一)镜像结构

镜像是一种分层结构,每一层称为一个 Layer

  • BaseImage层:包含基本的系统函数库、环境变量、文件系统
  • 其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
  • Entrypoint:入口,是镜像中应用启动的命令

(二)Dockerfile 语法

1、DockerFile的概念

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

指令表

指令说明示例
FROM指定基础镜像FROM centos:6
ENV设置环境变量ENV key value
COPY拷贝本地文件都镜像的指定目录COPY ./mysql-5.7.rpm /tmp
RUN指定Linux的shell命令,一般是安装过程的命令RUN yum install gcc
EXPOSE指定监听端口EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar

可参考官方文档:https://docs.docker.com/engine/reference/builder

(三)构建Java项目

Dockerfile

#指定基础镜像
FROM centos:7.0
#配置环境变量——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

使用docker build 构建一个镜像

#docker build :创建镜像
# -t :镜像
# javaweb:1.0 :镜像名为javaweb,版本号为1.0
# . : 表示镜像存储在docker所在目录
docker build -t javaweb:1.0 .

运行javaweb:1.0 镜像

docker run --name web -p 8090:8090 -d javaweb:1.0

(四)简化镜像构建

1、提取公共部分的镜像内容制作成镜像。
2、引用公共镜像

FROM 公共镜像:TAG

四、集群部署Docker-Compose

(一)什么是DockerCompose?

  • Docker Compose:基于Compose 文件快速部署分布式应用。

  • Compose文件:是一个文本文件,通过指令定义集群的每个容器的运行。

version: "3.8"

services:
	#mysql配置
	mysql:
		image: mysql:5.7.25
		environment:
			MYSQL_ROOT_PASSWORD: 123
		volumes:
			- /tmp/mysql/data:/var/lib/mysql
			- /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf
	#javaweb配置
	web:
		build: .
		ports:
			- 8090: 8090

参考官方文档:https://docs.docker.com/compose/compose-file/

(二)安装docker-compose

#安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.29.1/docker-compose-`uname -s `-`uname -m` > /usr/local/bin/docker-compose

#修改文件权限
chmod +x /usr/local/bin/docker-compose

#Base自动补全命令
curl -L https://raw.githubsercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

##如果出现错误,则需要修改自己的hosts文件
# echo "199.232.68.133 raw.githubsercontent.com" >> /etc/hosts

五、Docker镜像库

(一)Docker镜像库分为两种:

  • 公用库——DockerHub
  • 私用库——阿里云镜像库,网易镜像库…

(二)如何搭建自己的镜像库

Docker官方的Docker Registry是一个基础Docker镜像库,具备仓库管理的完整功能,但没有IU界面。

方法一:搭建简易版镜像库

通过以下命令:

docker run -d --restart=always --name registry -p 5000:5000 -v registry -data:/var/lib/registry -d registry

通过访问 http://虚拟机IP:5000/v2/catalog 查看镜像。

方法二:UI版镜像库

它使用的是DockerCompose部署带有界面的DockerRegistry,命令如下

DockerCompose文件

version: '3.0'
services:
	registry:
		image: registry
		volumes:
			- ./registry-data:/var/lib/registry
	ui:
		image: joxit/docker-registry-ui:static
		ports:
			- 8080:80
		environment:
			- REGISTRY_TITLE=私有仓库名
			- REGISTRY_URL=http://registry:5000
		depends_on:
			- registry

配置Docker信任地址

#打开文件
vi /etc/docker/daemon.json

#添加内容
"insecure-registries":["http://虚拟机IP:8080"]

#加载
systemctl daemon-reload

#重启docker
systemctl docker

(三)推送自己的镜像到私有仓库

1、重命名本地镜像

docker tag nginx:latest 私有仓库访问地址/nginx:1.0

2、推送镜像

docker push 私有仓库访问地址/nginx:1.0

3、拉取镜像

docker pull 私有仓库访问地址/nginx:1.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

垃圾回收之三色标记法(Tri-color Marking)

关于垃圾回收算法&#xff0c;基本就是那么几种&#xff1a;标记-清除、标记-复制、标记-整理。在此基础上可以增加分代&#xff08;新生代/老年代&#xff09;&#xff0c;每代采取不同的回收算法&#xff0c;以提高整体的分配和回收效率。 无论使用哪种算法&#xff0c;标记…

(已解决)RuntimeError: Java gateway process exited before sending its port number

今天用Pycharm远程使用pysaprk解释器时&#xff0c;跑代码出现了这个错误&#xff1a; RuntimeError: Java gateway process exited before sending its port number 找了好多博客都没解决问题&#xff0c;有说重装spark的&#xff0c;有说本地配Java_home的&#xff0c;后面我…

[C语言刷题]杨氏矩阵、返回型参数

本文包含知识点 杨氏矩阵极其解法函数return多个值的四种方法 题目&#xff1a; 杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于…

js 在浏览器窗口关闭后还可以不中断网络请求

有个需求&#xff0c;我们需要在用户发送数据过程中&#xff0c;如果用户关闭了网页(包括整个浏览器关闭)&#xff0c;不要中断数据传递 目前XMLHttpRequest对象是不支持的 http服务器 为了测试效果我们用nodejs写了个http服务器代码 文件名为httpServer.js如下&#xff0c;…

获取大疆无人机的飞控记录数据并绘制曲线

机型M350RTK&#xff0c;其飞行记录文件为加密的&#xff0c;我的完善代码如下 gitgithub.com:huashu996/DJFlightRecordParsing2TXT.git 一、下载安装官方的DJIFlightRecord git clone gitgithub.com:dji-sdk/FlightRecordParsingLib.git飞行记录文件在打开【我的电脑】&am…

Windows nvm 安装后webstrom vue项目编译报错,无法识别node

1 nvm安装流程 卸载原先nodejs用管理员权限打开exe安装nvmnvm文件夹和nodejs文件夹 都授权Authenticated Users 完全控制nvm list availablenvm install 16.20.1nvm use 16.20.1输入node和npm检查版本命令&#xff0c;正常显示确认系统变量和用户变量都有nvm 和nodejs 2 bug情…

数学建模-聚类算法 系统(层次)聚类

绝对值距离:网状道路 一般用组间和组内距离 聚类的距离计算如何选取&#xff1a;看结果是否解释的通&#xff0c;选择一种结果解释的通的方法。

【数据挖掘】将NLP技术引入到股市分析

一、说明 在交易中实施的机器学习模型通常根据历史股票价格和其他定量数据进行训练&#xff0c;以预测未来的股票价格。但是&#xff0c;自然语言处理&#xff08;NLP&#xff09;使我们能够分析财务文档&#xff0c;例如10-k表格&#xff0c;以预测股票走势。 二、对自然语言处…

【转载+修改】pytorch中backward求梯度方法的具体解析

原则上&#xff0c;pytorch不支持张量对张量的求导&#xff0c;它只支持标量对张量的求导 我们先看标量对张量求导的情况 import torch xtorch.ones(2,2,requires_gradTrue) print(x) print(x.grad_fn)输出&#xff0c;由于x是被直接创建的&#xff0c;也就是说它是一个叶子节…

Vue.js uni-app 混合模式原生App webview与H5的交互

在现代移动应用开发中&#xff0c;原生App与H5页面之间的交互已经成为一个常见的需求。本文将介绍如何在Vue.js框架中实现原生App与H5页面之间的数据传递和方法调用。我们将通过一个简单的示例来展示如何实现这一功能。附完整源码下载地址:https://ext.dcloud.net.cn/plugin?i…

Java集成openAi的ChatGPT实战

效果图&#xff1a; 免费体验地址&#xff1a;AI智能助手 具体实现 public class OpenAiUtils {private static final Log LOG LogFactory.getLog(OpenAiUtils.class);private static OpenAiProxyService openAiProxyService;public OpenAiUtils(OpenAiProxyService openAiP…

【C++】入门 --- 命名空间

文章目录 &#x1f36a;一、前言&#x1f369;1、C简介&#x1f369;2、C关键字 &#x1f36a;二、命名冲突&#x1f36a;三、命名空间&#x1f369;1、命名空间定义&#x1f369;2、命名空间的使用 &#x1f36a;四、C输入&输出 &#x1f36a;一、前言 本篇文章是《C 初阶…

Data Transfer Object-DTO,数据传输对象,前端参数设计多个数据表对象

涉及两张表的两个实体对象 用于在业务逻辑层和持久层&#xff08;数据库访问层&#xff09;之间传输数据。 DTO的主要目的是将多个实体&#xff08;Entity&#xff09;的部分属性或多个实体关联属性封装成一个对象&#xff0c;以便在业务层进行数据传输和处理&#xff0c;从而…

八、HAL_UART(串口)的接收和发送

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407ZGT6 2、UART和USART的区别 2.1、UART (1)通用异步收发收发器&#xff1a;Universal Asynchronous Receiver/Transmitter)。 2.2、USART (1)通用同步异步收发器&#xff1a;Universal Syn…

【《R4编程入门与数据科学实战》——一本“能在日常生活中使用统计学”的书】

《R 4编程入门与数据科学实战》的两名作者均为从事编程以及教育方面的专家&#xff0c;他们用详尽的语言&#xff0c;以初学者的角度进行知识点的讲解&#xff0c;每个细节都手把手教学,以让读者悉数掌握所有知识点&#xff0c;在每章的结尾都安排理论与实操相结合的习题。与同…

banner轮播图实现、激活状态显示和分类列表渲染、解决路由缓存问题、使用逻辑函数拆分业务(一级分类)【Vue3】

一级分类 - banner轮播图实现 分类轮播图实现 分类轮播图和首页轮播图的区别只有一个&#xff0c;接口参数不同&#xff0c;其余逻辑完成一致 适配接口 export function getBannerAPI (params {}) {// 默认为1 商品为2const { distributionSite 1 } paramsreturn httpIn…

VTK是如何显示一个三维立体图像的

VTK是如何显示一个三维立体图像的 1、文字描述2、图像演示 1、文字描述 2、图像演示

MySQL-事务-介绍与操作

思考 假设在一个场景中&#xff0c;学工部解散了&#xff0c;需要删除该部门及该部门下的员工对应的SQL语句涉及的数据表信息如下 员工表 部门表 实现的SQL语句 -- todo 事务 -- 删除学工部 -- 删除1号部门 delete from tb_dept where id 1; -- 删除学工部下的员工 delete …

SPEC CPU 2006 docker gcc:4 静态编译版本 Ubuntu 22.04 LTS 测试报错Invalid Run

runspec.sh #!/bin/bash source shrc ulimit -s unlimited runspec -c gcc41.cfg -T all -n 1 int fp > runspec.log 2>&1 & tail -f runspec.log runspec.log 由于指定了-T all&#xff0c;导致-n 1 失效&#xff0c;用例运行了三次&#xff08;后续验证&…

【LeetCode 75】 第十题(283)移动零

目录 题目: 示例: 分析: 代码运行结果: 题目: 示例: 分析: 给一个数组,要求将数组中的零都移动到数组的末尾. 首先我们可以遍历一边数组,遇到0的时候就在数组中把0删除,并且统计0的数量. 遍历完成以后数组中就没有0了,这时我们再在数组的后面添上之前统计的0的数量个0. …