一文快速了解Docker和命令详解

本文让你快速了解Docker是什么的东西,在我们程序开发的时候到底有什么作用,为什么需要去学习它。本文章只是做一个简单的概述配套黑马课程让你快速了解、使用Docker。

一、什么是Docker?

Docker是一个开源的容器化平台,允许开发者把应用和其所有的依赖项打包成一个单独的标准化单元(即容器),并且可以在任何支持Docker环境下运行,相当于一次部署,终生运行。通过Docker部署,开发者就可以避免由电脑环境不一致导致——编写的程序自己电脑可以运行,部署到别人的电脑就不可以运行。它使得应用在不同的计算环境中具有更高的一致性,减少了环境配置和依赖管理的问题。

如何理解这段话呢?就是相当于,一个容器就是一台电脑,每个电脑可以安装相应的依赖项。所以说他是一个独立的环境,那么为什么说可以在任何支持Docker环境下运行,因为所有依赖都在Docker部署容器里面,只要支持Docker环境,Docker容器技术就可以根据程序所需要依赖自动实现部署。但是有个问题每个容器都需自己下载依赖吗?有没有一个统一的像Maven库一样,只需要一次下载,后续其他容器无需下载直接安装?

二、Docker 的主要组成部

  1. Docker 引擎(Docker Engine):Docker 引擎是 Docker 的核心组件,负责构建、运行和管理容器。它分为两部分:
    • Docker Daemon:后台服务,管理容器的生命周期。
    • Docker CLI(命令行界面):用户与 Docker 交互的命令行工具。
  2. 镜像(Image):镜像是构建 Docker 容器的模板,包含运行应用所需的操作系统、库、依赖和应用本身。镜像是不可变的,一旦创建便不会改变。
  3. 容器(Container):容器是镜像的一个实例,它运行在 Docker 引擎上。容器具有轻量性、可移植性和隔离性。
  4. Docker Hub:一个公共的 Docker 镜像仓库,提供了大量的公共镜像(例如:nginx、mysql 等),用户也可以将自己创建的镜像上传到这里。
  5. Dockerfile:是一个文本文件,包含了一系列指令,用来描述如何构建 Docker 镜像。通过 Dockerfile,开发者可以自动化地构建镜像。

镜像就是容器的一个运行环境,不仅仅包括依赖和应用本身,还包括可以自己设置容器的操作系统等,其中Docker Hub,就是我之前第一段提出的问题——有没有一个统一的像Maven库一样,只需要一次下载,后续其他容器无需下载直接安装?Docker Hub就是解决这个问题的,提供了大量的公共镜像(例如:nginx、mysql 等),用户也可以将自己创建的镜像上传到这里。

三、Docker的基础

3.1.1 常见的命令

命令说明文档地址
docker pull拉取镜像docker pull
docker push推送镜像到 Docker Registrydocker push
docker images查看本地镜像docker images
docker rmi删除本地镜像docker rmi
docker run创建并运行容器(不能重复创建)docker run
docker stop停止指定容器docker stop
docker start启动指定容器docker start
docker restart重新启动容器docker restart
docker rm删除指定容器docker rm
docker ps查看容器docker ps
docker logs查看容器运行日志docker logs
docker exec进入容器docker exec
docker save保存镜像到本地压缩文件docker save
docker load加载本地压缩文件到镜像docker load
docker inspect查看容器详细信息docker inspect

详细的说明可以去命令文档

3.1.2 图解Docker命令

在这里插入图片描述

  • docker pulldocker push 表明可以从官方的镜像仓库中拉取和上传镜像到本地
  • docker savedocker load 表明也可以从自己虚拟机中加载虚拟机内的镜像。(Docker一般是部署到虚拟机内)
  • DOCKERFILE ,是定义镜像构建过程的脚本文件,里面描述了基础镜像、安装软件、拷贝代码、暴露端口等操作。这块后面和提及到,其命令 docker build 是 然后按照文件里的指令,一步步生成一个新的 Docker 镜像
  • docker images 表示可以查看自己的镜像,docker rmi 表示删除自己的镜像
  • docker run 表示运行一个容器,配置镜像相关的配置文件挂载
  • 其中命令在上面已经很详细的介绍了
示例命令流程(以Nginx为例)
# 第1步,查看Nginx镜像
https://hub.docker.com/_/nginx# 第2步,拉取镜像
docker pull nginx# 第3步,查看镜像
docker images# 第4步,运行容器
docker run -d --name nginx -p 80:80 nginx# 第5步,查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第6步,访问网页
http://<虚拟机地址># 第7步,停止容器
docker stop nginx# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第9步,重新启动容器
docker start nginx# 第10步,查看详情
docker inspect nginx# 第11步,进入容器
docker exec -it nginx bash# 第12步,删除容器
docker rm -f nginx

3.2.1 数据卷

数据卷是Docker提供的一种持久数据化的机制,当容器被删除的时候,里面数据文件(日志、数据库数据)也全部删除,而且一般想打开容器中的文件,都是需要命令行,这样操作起来很不方便,数据卷就是解决这些问题的,它可以实现将容器中的文件与部署的虚拟机的文件建立映射关系,也被称做挂载。

举一个Nginx的例子,挂载Nginx配置和HTML目录
docker run -d \--name nginx \-p 80:80 \-v /host/html:/usr/share/nginx/html \-v /host/nginx.conf:/etc/nginx/nginx.conf \nginx
  • html:放置一些静态资源
  • conf:放置配置文件

如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:

相当于把Nginx容器中的目录文件和宿主机(虚拟机)建立联系,这样我修改宿主机的文件就相当于修改Nginx容器中的文件。

注意:/var/lib/docker/volumes这个目录就是默认的存放所有容器数据卷的目录,也再根据数据卷名称创建新目录,格式为/数据卷名/_data

其实不建议指定宿主机的自定义目录,这样就和宿主机建立强耦合,换一台宿主机就需要保证有这个自定义目录

在这里插入图片描述

数据卷常用命令
命令说明文档地址
docker volume create创建数据卷docker volume create
docker volume ls查看所有数据卷docs.docker.com
docker volume rm删除指定数据卷docs.docker.com
docker volume inspect查看某个数据卷的详情docs.docker.com
docker volume prune清除数据卷docker volume prune

3.3 镜像

镜像这里我们之前也说了,这里主要是讲一下,我们该怎么把我写好的程序或者项目打包成镜像上传到Docker

3.3.1 镜像结构

Docker镜像是由多层结构组成的,每一层代表镜像构建过程中的一个步骤。它使用的是一种叫UnionFS(联合文件系统)的技术。

镜像是一堆文件的集合,但是这些文件不是随便放的,而是需要根据操作步骤进行叠放起来,形成一个逻辑上的文件系统。通常是通过Dockerfile文件创建的,而Dockerfile文件每一条命令(如RUN、COPY、ADD)都会创建一层。

在这里插入图片描述

为什么要采用分层结构,其实这样是为了共享公共层,**例如:**当我们需要构建一个 Java 应用的镜像时,第一步通常是基于某个 Linux 系统镜像(比如 Ubuntu、Alpine)作为基础层。如果我们已经有这个 Linux 层,那么在构建 Java 镜像时,就可以直接在这个公共基础层上“叠加” Java 运行环境和应用层。

3.3.2 Dockerfile

Dockerfile 是用于构建镜像的脚本文件,里面定义了如何一步步构建镜像,每一条指令都会生成镜像的一层。

Dockerfile 示例:SpringBoot项目
# 使用官方 Java 运行时基础镜像
FROM openjdk:17-jdk-slim# 设置工作目录
WORKDIR /app# 将打包后的 jar 文件复制到容器中
COPY target/springboot-docker-demo-0.0.1-SNAPSHOT.jar app.jar# 容器启动时运行 Spring Boot 应用
ENTRYPOINT ["java", "-jar", "app.jar"]# 可选:声明端口(不代表实际映射)
EXPOSE 8080

3.4 网络

前面说了,Docker容器相当于一个计算机,那么如何实现容器之间的通信,这里就需要借助Docker网络,用于管理容器之间的通信,大致流程:

  • Docker 启动时会创建一个虚拟网桥(docker0);
  • 每个容器都会分配一个虚拟网卡(veth pair);
  • Docker 通过 NAT(iptables)转发容器网络请求;
  • 内部使用 libnetwork 管理网络驱动、端点等资源。
常见的命令
命令说明文档地址
docker network create创建一个网络docker network create
docker network ls查看所有网络docs.docker.com
docker network rm删除指定网络docs.docker.com
docker network prune清除未使用的网络docs.docker.com
docker network connect使指定容器连接加入某网络docs.docker.com
docker network disconnect使指定容器连接离开某网络docker network disconnect
docker network inspect查看网络详细信息docker network inspect

在一个集成了 Spring Boot、MySQL、Redis、Nginx 等组件的项目中,如果将每个服务都分别封装为独立的容器,那么为了确保它们之间能够正常通信,我们通常会为该项目创建一个自定义 Docker 网络。这样一来,所有相关服务容器都可以在该网络中通过容器名互相访问,同时也实现了与其他项目或容器的网络隔离,提高了系统的安全性和可维护性。

四、项目部署例子

当我们需要部署一个 Spring Boot、MySQL、Redis、Nginx项目,我们可以借助docker-compose.yml(这个创建每个容器的命令和加入相同的网络)

version: '3.8'services:mysql:image: mysql:8.0container_name: mysqlenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: mydbMYSQL_USER: userMYSQL_PASSWORD: passports:- "3306:3306"volumes:- mysql_data:/var/lib/mysqlnetworks:- backendredis:image: redis:7container_name: redisports:- "6379:6379"networks:- backendspringboot:build:context: ./appdockerfile: Dockerfilecontainer_name: springbootdepends_on:- mysql- redisports:- "8080:8080"environment:SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydbSPRING_DATASOURCE_USERNAME: userSPRING_DATASOURCE_PASSWORD: passSPRING_REDIS_HOST: redisnetworks:- backendnginx:image: nginx:latestcontainer_name: nginxports:- "80:80"volumes:- ./nginx/default.conf:/etc/nginx/conf.d/default.confdepends_on:- springbootnetworks:- backendvolumes:mysql_data:networks:backend:driver: bridge

五、小结

  • Docker 解决了应用跨平台部署问题
  • 容器技术让环境隔离、安全、可复制
  • 使用 Docker Compose 可轻松构建多服务架构
  • 镜像构建、数据卷管理、网络配置是核心技能

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

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

相关文章

【GaussDB】如何从GaussDB发布包中提取出内核二进制文件

【GaussDB】如何从GaussDB发布包中提取出内核二进制文件 背景 GaussDB 从505和506版本起&#xff08;前面的版本不清楚&#xff09;&#xff0c;华为官方不再提供用脚本安装GaussDB的方式&#xff08;应该是基于运维交付标准化的角度考虑&#xff09;&#xff0c;仅支持使用T…

ETH 交易流程深度技术详解

概述在前面对 PolkaVM 和 Revive 的文章中&#xff0c;我们介绍了很多技术细节&#xff0c;开发工具。还对比 EVM&#xff0c;知道了 PolkaVM 的优势。很多同学还是对 Polkadot SDK 为什么可以运行 EVM 兼容的智能合约&#xff0c;以及交易处理的整个流程不太清楚。这篇文章将会…

【算法训练营Day17】二叉树part7

文章目录二叉树的最近公共祖先二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点二叉树的最近公共祖先 题目链接&#xff1a;236. 二叉树的最近公共祖先 解题逻辑&#xff1a; 最近公共祖先的定义为&#xff1a;对于有根树 T 的两个节点 p、q&#xff0c…

Vue插件与组件核心区别详解

在 Vue 中&#xff0c;插件&#xff08;Plugin&#xff09; 和 组件&#xff08;Component&#xff09; 是两种不同层次的概念&#xff0c;它们的主要区别如下&#xff1a;1. 组件 (Component) 定义&#xff1a; Vue 应用的基本构建单元&#xff0c;是可复用的 Vue 实例&#x…

基础NLP | 02 深度学习基本原理

文章目录 深度学习基本原理 数学基础 线代 numpy 常用操作 导数, 梯度 梯度下降法 梯度下降代码 GradientDescent.py 反向传播 完整的反向传播过程 权重更新方式 pytorch 网络结构 全连接层 (线性层) 例子 - 手动实现模拟一个线性层 DNNforward.py 激活函数 激活函数-Sigmoid…

MySQL面试题及详细答案 155道(001-020)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Ansible安装与入门

目录 Ansible ansible任务执行模式 ansible执行流程 ansible命令执行过程&#xff08;背会&#xff09; ansible的安装方式 ansible的程序结构&#xff08;yum安装为例&#xff09; ansible的配置文件查找顺序&#xff08;背会&#xff09; 核心配置文件 ansible的配置…

【Spring】Spring Boot启动过程源码解析

目录 一、启动入口 二、SpringApplication的构造过程 2.1 设置应用类型 2.2 设置初始化器&#xff08;Initializer&#xff09; 2.2.1 获取BootstrapRegistryInitializer对象 2.2.2 获取ApplicationContextInitializer对象 2.3 设置监听器&#xff08;Listener&#xff…

CDN架构全景图

CDN架构全景图 CDN&#xff08;内容分发网络&#xff09;是一种通过在全球范围内部署边缘节点服务器&#xff0c;将内容缓存至离用户最近的位置&#xff0c;从而加速内容分发、降低延迟并减轻源站压力的分布式网络架构。其核心设计目标是优化互联网内容传输效率&#xff0c;提升…

【pytest高阶】源码的走读方法及插件hook

一、pytest源码走读方法 依赖库认知篇 &#x1f4e6;这是理解 pytest 源码的 “前菜”&#xff0c;先认识 3 个超重要的小伙伴&#xff1a;iniconfig &#x1f4c4;&#xff1a;像个 “文件小管家”&#xff0c;专门负责读取 ini 配置文件&#xff08;比如 pytest 的配置&#…

算法训练营day32 动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

今天开始动态规划的部分&#xff01; 其实说白了&#xff0c;动态规划我感觉就是找类似递归的规律&#xff0c; 动态规划理论基础 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规…

基于神经网络的手写数字识别系统

基于神经网络的手写数字识别系统 结合模板匹配和神经网络两种方法进行手写数字识别。这个系统包括图像预处理、特征提取、神经网络训练和可视化分析。 %% 基于神经网络的手写数字识别系统%% 清理工作区 clear; clc; close all;%% 加载手写数字数据集 % 使用MATLAB自带的手写数字…

机器学习?一文看懂这门热门技术

&#x1f31f; 什么是机器学习&#xff1f;一文看懂这门热门技术在人工智能&#xff08;AI&#xff09;的大潮中&#xff0c;机器学习&#xff08;Machine Learning, ML&#xff09; 无疑是最耀眼的明星之一。它让计算机具备了 “自我学习” 的能力&#xff0c;让自动驾驶、智能…

Spring的初始化钩子

1. PostConstruct JSR-250 标准注解&#xff08;不是 Spring 独有&#xff09;&#xff0c;用来标记 Bean 初始化完成后要执行的方法。会在 Bean 的构造方法执行完、依赖注入完成后执行。 使用实例&#xff1a; Component public class Demo {PostConstructpublic void init() …

【AI】Java生态对接大语言模型:主流框架深度解析

文章目录1. Deep Java Library (DJL)2. LangChain4j&#xff08;LLM&#xff09;3. HuggingFace Inference API4. OpenAI Java Client技术对比矩阵架构设计建议在人工智能浪潮下&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为技术核心。Java生态通过以下框架实现高效…

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

文章目录1 单个 .cs文件2 创建 多个 .cs文件2.1 添加Hero类2.1 添加ShowInfo类2.3 关于命名空间的引用2.4 所有.cs文件代码3 test3项目文件下载1 单个 .cs文件 上一讲中 描述游戏中英雄的角色 所有代码在一个.cs文件中&#xff0c; 如果代码很多&#xff0c;类很多&#xff0…

【MySQL基础篇】:MySQL常用数据类型的选择逻辑与正确使用

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;MySQL篇–CSDN博客 文章目录数据类型1.数据类型分类2.数值类型int整形类型bit位类型float小…

三、搭建springCloudAlibaba2021.1版本分布式微服务-springcloud loadbalancer负载均衡

什么是负责均衡 Spring Cloud LoadBalancer是一个客户端负载均衡器&#xff0c;类似于Ribbon&#xff0c;但是由于Ribbon已经进入维护模式&#xff0c;并且Ribbon 2并不与Ribbon 1相互兼容&#xff0c;所以Spring Cloud全家桶在Spring Cloud Commons项目中&#xff0c;添加了Sp…

Oracle不完全恢复实战指南:从原理到操作详解

核心提示&#xff1a;当误删表、日志损坏或控制文件丢失时&#xff0c;Oracle的不完全恢复是DBA最后的救命稻草。掌握关键恢复技术&#xff0c;可在数据灾难中力挽狂澜。一、不完全恢复核心概念 1. 核心特点 必须关闭数据库&#xff1a;在MOUNT状态下执行重做日志恢复权限要求&…

Linux之shell脚本篇(二)

一、shell编程之if语句引言Linux在shell编程中&#xff0c;通常都是以自上而下运行&#xff0c;但是为了提高其代码严谨性&#xff0c;我们即引入了多条件 控制语句例如&#xff1a;if、for、while、case等语句&#xff0c;有时候针对条件我们还会结合正则表达式去运用。将这些…