Docker相关知识

embedded/2025/3/4 18:59:40/

Docker 如今已经应用到软件开发中很多地方,有必要了解一下其相关知识,

什么是dockerdocker是一款可以将我们目标应用程序和该程序运行所需的配置和依赖库等环境信息打包成镜像并运行的软件工具;

什么是基础镜像?它只需要利用操作系统用户空间部分,就能构建出应用所需的环境,将选中的操作系统文件系统和依赖库等,打包成一个类似 “压缩包”的文件,这就是所谓的基础镜像,base image ;

Java项目构建镜像需要 Dockerfile 文件它只是描述了要做哪些事情,即构建镜像的具体步骤,但并没有执行,该文件没有后缀名固定为该名称,一般位于Java项目的根目录下;当执行 docker build 命令
(例如:docker build -f /path/to/Dockerfile -t myimage:latest . 
这将从 /path/to/ 目录读取 Dockerfile 并构建一个名为 myimage:latest 的镜像)时,docker软件会根据 Dockerfile 文件中说明逐行执行,最终把应用程序和程序运行需要的依赖库和配置等环境信息一起打包成一个 docker 容器镜像,即container image,使用 docker images 命令可查看本地所有镜像,参考的 Dockerfile 文件参见附录1和2;

再使用 docker push 命令
(例如:docker push myimage:v1  这将推送名为myimage、标签为v1的镜像到远程仓库)
把构建出来的容器镜像推送到docker官方dockerHub或公司内部的远程镜像仓库中;

再在其它已安装docker软件的机器上使用 docker pull 命令
(例如:docker pull python:latest  或 docker pull python 这将拉取最新版本的 python 镜像到本地)在远程容器镜像仓库中拉取指定名称指定标签的镜像到本地机器上;

然后使用 docker 软件命令 docker run
(例如:docker run -p 8080:80 myJavaApp
这将运行 myJavaApp 镜像,并把本地主机的 8080 端口映射到容器内的 80 端口)
运行指定的容器镜像,即产生镜像实列,也即容器,然后即可对外提供应用服务;

Docker软件架构,是C/S软件架构,client软件对应 docker-cli, server软件对应 docker-daemondocker-cli对用户输入的命令解析,然后调用服务端的守护进程 docker-daemon 提供的restful api接口,守护进程收到命令后执行 docker 相关操作,创建和管理 docker 各个容器docker-daemon 内部包含 docker server 和 engine 两部分,docker server 本质就是个 http 服务器,负责对外提供操作容器和镜像的API接口,接口收到API请求后,会分发任务给 engine 层,engine 层会创建各种 job ,由 job 执行具体的工作(如:docker push/pull,docker images,docker build,docker run等等)

docker compose就是按yaml文件中指定顺序和信息部署各个容器,该配置yaml文件(一般名称为 docker-compose.yml )中写清楚要部署哪些容器,要按什么顺序启动容器,各个容器占用的CPU和内存比例和数量多少等信息,然后通过 docker-compose up 命令解析yaml文件,一键按顺序部署各个容器,即处理多个有顺序部署容器组成的一整套服务的部署,这就是docker compose的主要功能;
为什么各个容器启动有顺序要求?其实主要还是应用启动逻辑有要求,如一个应用必须先启动数据库所在容器,后再启动应用服务所在容器,参考yaml文件例子附录3;

docker swarm 是处理多个有顺序部署容器组成的一整套服务在多个服务器上的集群部署问题,是做K8S软件做的事,也是K8S的竞品;

Docker 和 K8S 的关系docker compose是基于多个Container容器创建一整套服务,这其实就是K8S里面的Pod功能; K8S可在多个Node节点部署Pod每个节点可部署多个Pod每个Pod中可以部署多个一般有关联的Container容器docker swarm 作用本质上就是在调度Pod
K8S官方定义为容器编排引擎,即以API编程的方式管理安排多个容器的引擎;

Docker的下载和安装
官方rpm包下载地址为:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

阿里镜像下载地址为:
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

附录1:Java项目中参考的Dockerfile文件如下:

# 基础镜像使用 Java
FROM openjdk:8-jdk-alpine# 指定维护者信息
LABEL maintainer="yourname@example.com"# 在镜像中创建一个目录存放我们的应用
VOLUME /tmp# 将打包好的 jar 文件添加到镜像中并更名为 app.jar
ADD target/your-app.jar app.jar# 暴露容器内的端口给外部访问
EXPOSE 8080# 定义环境变量
ENV JAVA_OPTS=""# 在容器启动时运行 jar 包
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar

附录2:构建一个运行python的容器镜像

#指定基础镜像
FROM python:3.9
WORKDIR /app
#复制所有文件到容器的 /app 目录下
COPY /app
#安装所需的依赖
RUN yum install gcc
RUN pip install --no-cache-dir -r requirements.txt 
#设置容器启动时执行的命令
CMD ["python","app.py"]

附录3:docker compose的配置yaml文件参考例子:

version:"3.8"
services:A:image:"my-image-a"deploy:resources:limits:cpus:"0.50" #限制cpu使用率为50%memory:256M #限制内存使用量为256mbB:image:"my-image-b"depends_on:-AC:image:"my-image-c"depends_on:-B

总结记录一下,欢迎拍砖讨论...


http://www.ppmy.cn/embedded/169992.html

相关文章

C++核心编程之文件操作

C核心编程之文件操作 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放。因此&#xff0c;我们需要通过文件来将数据持久化&#xff0c;能够有效地将数据保存到本地电脑某个地方。 C中对文件操作需要包含头文件#include<fstream> 文件类型分为…

SpringBoot集成Elasticsearch 7.x spring-boot-starter-data-elasticsearch 方式

SpringBoot集成Elasticsearch 7.x | spring-boot-starter-data-elasticsearch 方式 前言添加maven依赖配置application.properties测试实体类 方式一&#xff1a;继承 ElasticsearchRepository&#xff08;适合简单查询&#xff09; 直接使用想自定义自己的Repository接口 方式…

React Native从入门到进阶详解

React Native知识框架从入门到进阶的问题。首先需要结合我搜索到的资料来整理出结构化的内容。证据中有多本书籍和文章&#xff0c;可能会涉及不同的章节和重点&#xff0c;需要仔细梳理。 首先&#xff0c;根据邱鹏源的《React Native精解与实战》将知识分为入门和进阶两大部分…

Rust语言基础知识详解【五】

继上一篇对rust所有权的讲解之后&#xff0c;本节主要对接下来的引用与借用的知识做详细的介绍。 上节中提到&#xff0c;如果仅仅支持通过转移所有权的方式获取一个值&#xff0c;那会让程序变得复杂。 Rust 能否像其它编程语言一样&#xff0c;使用某个变量的指针或者引用呢…

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…

Spring MVC 返回数据

目录 1、什么是 SpringMVC2、返回数据2.1、返回 JSON 对象2.2、请求转发2.3、请求重定向2.4、自定义返回的内容 1、什么是 SpringMVC 1、Tomcat 和 Servlet 分别是什么&#xff1f;有什么关系&#xff1f; Servlet 是 java 官方定义的 web 开发的标准规范&#xff1b;Tomcat 是…

jenkins集成docker发布java项目

1、创建pipeline流水线任务 2、进入配置选项 选择参数化构建 3、添加2个字符参数&#xff0c;用于传递变量 4、编写pipeline脚本 //所有脚本命令都放在pipeline中 pipeline{//指定任务再哪个集群节点中执行agent any//声明全局变量&#xff0c;方便后面使用environment {harbor…

爬虫:一文掌握WebSocket爬虫案例实战

文章目录 1. WebSocket 简介1.1 什么是 WebSocket?1.2 WebSocket 的特点2. WebSocket 爬虫的基本原理3. 使用 Python 实现 WebSocket 爬虫3.1 安装依赖3.2 使用 websocket-client 实现爬虫3.3 使用 websockets 实现爬虫3.4 重连机制3.5 解析和处理消息4. 实战案例:爬取实时股…