当前位置: 首页 > news >正文

docker零基础入门教程

注意

本系列文章已升级、转移至我的自建站点中,本章原文为:Docker入门

目录

  • 注意
    • 1.前言
    • 2.docker安装
    • 3.docker基本使用
    • 4.打包docker镜像
    • 5.docker进阶

1.前言

如果你长期写C/C++代码,那你应该很容易发现C/C++开源项目存在的一个严重问题:只要作者没有将源码编译为可执行文件、现成的动静态库,需要我们自己去编译,就会有极大概率编译不出来、报各种错。

究其根本在于C/C++过于复杂,尤其是其代码的编译环境往往需要各种依赖,并且在各个操作系统上的环境依赖还有很大可能是不一致的。

而本文要介绍的docker便能很好的解决这个问题,但其解决的也不仅仅只是这一个问题。

事实上并不只是C/C++语言,各种项目交付都会由于各种各样的环境原因,导致其在作者电脑上可以跑起来,可一旦将其交给客户,就会有相当大的概率跑不起来。

比如如今大火的各种大语言模型,如果你尝试过自己去本地部署大模型,就会知道其过程的艰辛了,其对新手是相当不友好的。

而docker就是这样的一个容器技术:它不仅仅只发布项目本身,它还会发布想要让项目运行起来所需要的一切环境。

甚至你可以简单的将其理解为,docker容器就是一个非常小型的系统,你可以在该系统中安装所有需要的依赖环境、以及告诉它如何启动我们的程序。

此时它就带来了一个惊人的好处:只要你能本地将其跑起来,那么你将其打包后发给别人,别人就一定能跑起来!

原因就在于,所有依赖环境此时都已经在docker容器内部了!

但要注意,docker容器内的系统是linux/unix环境,并不支持运行windows软件。

2.docker安装

不同系统安装docker环境的方式并不完全相同,相比之下Windows系统安装docker环境更加简单,只需要下载安装Docker Desktop即可:Docker Desktop

image.png

进入安装界面,勾选所有配置,然后直接点击Ok,等待其安装完成。

然后打开软件,点击Accept:

image.png

直接无账号使用即可,如果后续你需要发布自己打包的镜像,就需要自己去注册一个账号登录了:

image.png

然后下一步是选择身份,直接跳过即可:

image.png

然后我们就进入到docker的主页面了:

image.png

虽然初次看起来你可能感觉有点懵,但事实上大多数时候我们都只用的上图中的三个页面。

  • Contailers:我们此时运行中的容器
  • Images:我们下载、打包的所有镜像
  • Volumes:持久化卷

其中第一个容器很好理解,就是我们前面介绍的,它不仅仅包含了程序本身,还包含了需要运行程序的所有依赖环境。

而镜像,就是容器的基础,如果你安装过Windows系统就知道,Windows系统实际上是在一个以.ios结尾的镜像文件中的,通过下载、安装、运行该镜像才形成了我们所看到的各种各样的定制化的Windows系统。

而这里的镜像也是类似的含义:作者将所有需要的东西全部打包为一个镜像,并暴露出一些可以由使用者自定义的选项,使用者只需要填写这些选项运行镜像,就形成了一个自己的容器!

一个最简单的实例就是,一个包含了web服务器的docker镜像需要暴露出端口访问,虽然业界都使用80与443作为端口使用,但这并不能满足所有人的需求,有的人可能自己电脑上这两个端口已经有其它服务占了,想要使用其它端口启动该web服务。

此时打镜像的作者就可以将这个选项预留出来打成镜像,然后使用者就可以自行定义端口、启动镜像,将其作为一个容器进行运行。

3.docker基本使用

docker使用起来是非常简单的,如果我们不需要自己打镜像、只是使用别人提供的镜像。

其官方网站为:Docker Hub。

里面拥有大量别人已经打好的镜像,我们可以直接拉取下来使用。

比如我们现在想要用docker启动一个web服务器,那么我们可以直接进入docker hub搜索httpd:

image.png

可以看到,它是docker官方提供的http服务器镜像,下方的页面就是使用它的教程示例。

不过其介绍的是另外一种自己打镜像的方式,这个后面再介绍,现在我们先来试一试最简单的方式。

首先看到该镜像的各种版本,一般其放在了最前面:

image.png

但大多数时候为了简单,我们一般是直接选择latest,也就是最新的一个版本。

然后打开我们的命令行,运行下面这句命令拉取镜像:

docker pull httpd:latest

事实上这条命令就在页面的右边:

image.png

只不过我这里还手动给它加了一个版本,意思是让其拉取我们指定的版本,也就是latest,名字与版本之间用冒号分割。

image.png

拉取完成后,我们就可以在docker desktop软件中看到它了,可以直接点击运行:

image.png

然后就会让我们选择各种选项,也就是前面所说的,要基于该镜像创建一个容器:

image.png

最开始的容器名就不多说了,自己随便填即可。

而第二个就是要我们填端口了,容器本身你可以将其看作是一个独立的系统,而右边的80/tcp含义就是容器内使用的tcp协议80端口暴露web服务,左边需要填写的是我们自己真实机器要使用的端口。

比如我这里填写的8080端口,含义就是所有访问本机8080端口的tcp流量都转发到容器中的80端口,此时就等价于,我在本机的8080端口启动了一个web服务。

然后就是下面的Volumes了,也就是卷,因为打包镜像的作者只负载web服务本身,而这个web服务要向外展现的内容还是需要使用者自己提供的。

而这个卷的含义就是,将左边的本地路径映射到容器内部的指定路径中去。

我这里的含义就是,将本机路径D:\Desktop映射到到容器内的/usr/local/apache2/htdocs/目录下,后面的这个目录是容器内web服务启动时找文件的路径。

这个目录可以从其官方文档中看到:

image.png

除此之外,你还可以设置环境变量,但这里不需要。

然后直接点击Run启动容器:

image.png

可以看到,容器已经成功启动了,并且还能看到容器的日志信息。

此时我们直接在浏览器中访问8080端口:

image.png

可以看到,一个web服务就这样非常容易的搭建起来了,期间我们仅仅只是运行了一条命令,填写了一些参数,没有遇到任何与依赖环境有关的问题,就让项目跑起来了,是不是非常爽!

此时容器的运行逻辑如下:

  • 浏览器访问8080端口,所有到达8080端口的请求都会被docker转发到容器内的80端口
  • 容器内的80端口实际上才是真正运行web服务器的端口,它会将指定目录/usr/local/apache2/htdocs/内的文件数据作为网页返回。
  • 由于/usr/local/apache2/htdocs/此时与本机的D:\Desktop相互映射,所以此时该目录下的文件数据就等价于在访问本机D:\Desktop目录下的所有文件。
  • 最后将数据通过容器内80端口转发到主机8080端口返回给浏览器。

使用容器的一个关键点在于,你需要将容器作为一个完全独立的系统看待。它内部有自己的一套文件系统、网络系统,主机想要与其互通,就需要进行文件映射、网络转发。

4.打包docker镜像

上面使用的是别人写好的镜像,使用起来需要填写很多东西,会比较麻烦。

为了简化使用步骤,我们常常就会做这样一件事:在别人的镜像之上添加一些自己的东西打包成为一个新的镜像,然后下次使用的时候直接运行使用即可。

比如上面这个httpd是一个非常通用的镜像,我们想要写一个web服务交给客户使用,肯定不会去让其自己手动填写路径映射、将网页文件映射进容器的吧,那样太麻烦了。

所以此时我们就可以在原本镜像之上,添加一个步骤,将我们写好的网页文件直接拷进容器的指定目录,并将其打包为一个新的镜像,此后别人使用时直接填写端口就可以运行了!

而打包Docker镜像,我们就需要在项目的目录中创建一个叫做Dockerfile的文件:

image.png

然后直接复制官方文档的代码即可。

注意Dockerfile没有任何后缀名,其名字也是固定的,一般不要更改。

这个文件有固定的一些命令,比如这里用到的两个命令:

  • FROM:拉取指定镜像
  • COPY:复制文件

拉取镜像前面我们也通过docker pull命令试过了,两者效果是一样的,只不过FROM被用于拉取指定镜像构建我们自己的镜像。

在FROM拉取的基础镜像之后,使用了COPY命令,将主机的public-html目录复制到容器内指定目录下。

COPY命令有两个参数,第一个参数是主机路径,第二个是容器路径,作用就是将主机路径文件复制到容器内。

但要注意,我这里没有这个public-html目录,所以得自己先创建一个:

image.png

然后我们就可以在这个目录下运行下面这个命令编译我们自己的镜像了:

docker build -t docker_web .

build用于构建命令,-t参数用于指定镜像的名字,最后的点,代表Dockerfile文件所在的目录,也就是当前目录下:

image.png

当构建成功,就可以看到上图中第二点所在就是我们自己的docker镜像名称。

然后你可以直接运行命令、传入相关参数启动我们的镜像:

 docker run -dit --name http_name -p 8080:80 docker_web

其中run代表运行容器,-dit代表后台运行,–name用于指定容器的名字,-p用于指定映射端口,这里依旧是本机的8080与容器内的80端口进行映射,最后的docker_web指定容器的镜像名称。

更简单的,我们可以直接在Docker Desktop内运行:

image.png

方法与前面所述一致,只不过此时由于我们已经将网页文件复制到镜像中了,所以不再需要添加卷来映射。

5.docker进阶

以上便是docker常用的方式与流程,非常简单。

大多数时候,我们可能都是直接使用别人打好的镜像,直接拉取、填写参数、运行即可。

而如果想要自己打镜像让别人使用,那么就需要自己编写Dockerfille文件,里面有大量的命令,需要你自己去搜索研究。

更进一步,当构造多个容器一起工作的项目时,你还需要了解Docker Compose工作原理,它可以将多个容器组织到同一个内部局域网中互相访问、使用,让你可以同时构建多个容器、并保护各个容器之间的依赖关系。

再进一步,你可能还会对k8s、微服务、云原生感兴趣,后续有空我再对其做更多的介绍

本系列文章已升级、转移至我的自建站点中,本章原文为:Docker入门

相关文章:

docker零基础入门教程

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:Docker入门 目录 注意1.前言2.docker安装3.docker基本使用4.打包docker镜像5.docker进阶 1.前言 如果你长期写C/C代码,那你应该很容易发现C/C开源项目存在的一个严重问题&#xff…...

【Java SE 题库】移除元素(暴力解法)--力扣

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 解法(快慢“指针”) 3. 源码 4. 小结 1. 题目 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。元素的顺…...

linux文件编程_进程

1. 进程相关概念 面试中关于进程,应该会问的的几个问题: 1.1. 什么是程序,什么是进程,有什么区别? 程序是静态的概念,比如: 磁盘中生成的a.out文件,就叫做:程序进程是…...

java NIO实现UDP通讯

NIO Udp通讯工具类 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.util.Iterator;impo…...

ffmpeg如何实现视频推流?

FFmpeg是一个强大的多媒体框架,用于处理视频和音频数据。它包括了libavcodec(用于解码和编码)、libavformat(用于格式转换)、libavutil(提供一些辅助工具和函数)、libavfilter(用于音视频过滤)等多个库。 以下这些都是FFmpeg的特性 FFmpeg支持大量的音视频编解码器&…...

【HTML5】html5开篇基础(3)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...

echarts实现3D柱状图(视觉层面)根据博主改编

https://blog.csdn.net/weixin_57798646/article/details/131067725 这是原贴 在这个基础上我需要实现 一根柱子 代码如下 <!DOCTYPE html> <html lang"en" style"height: 100%"><head><meta charset"utf8"> </hea…...

【一篇文章理解Java中多级缓存的设计与实现】

文章目录 一.什么是多级缓存&#xff1f;1.本地缓存2.远程缓存3.缓存层级4.加载策略 二.适合/不适合的业务场景1.适合的业务场景2.不适合的业务场景 三.Redis与Caffine的对比1. 序列化2. 进程关系 四.各本地缓存性能测试对比报告(官方)五.本地缓存Caffine如何使用1. 引入maven依…...

OpenSource - 开源WAF_SamWaf

文章目录 PreSafeLine VS SamWaf开发初衷软件介绍架构界面主要功能 使用说明下载最新版本快速启动WindowsLinuxDocker 启动访问升级指南自动升级手动升级 在线文档 代码相关代码托管介绍和编译已测试支持的平台测试效果 安全策略问题反馈许可证书贡献代码 Pre Nginx - 集成Mod…...

旅游避坑指南

1.火车站旁白的小摊贩&#xff0c;还有周边的小饭店百分之百是黑店&#xff0c;不仅难吃要死而且巨黑&#xff01;&#xff01;&#xff01; 可以地图上搜索附近的大型商超&#xff0c;例如泰安市的银座商超&#xff0c;里面的东西不仅好吃而且价格透明&#xff0c;还有很多当…...

矩阵系统源码搭建的具体步骤,支持oem,源码搭建

一、前期准备 明确需求 确定矩阵系统的具体用途&#xff0c;例如是用于社交媒体管理、电商营销还是其他领域。梳理所需的功能模块&#xff0c;如多账号管理、内容发布、数据分析等。 技术选型 选择适合的编程语言&#xff0c;如 Python、Java、Node.js 等。确定数据库类型&…...

正则表达式调试工具实战

正则表达式调试工具实战 1、新建工程QWidget工程工程名RegexTool 如果QT不会配置,请参考我的博客,QT配置 Widget.cpp 默认内容如下 2、主界面设计 三行两列,每行采用HBoxLayout作为行布局控件,内部一个Lable控件和一个TextEdit控件,采用VBoxLayout 控件包裹三个HBoxLa…...

SQL:函数以及约束

目录 介绍 函数 字符串函数 数值函数 日期函数 流程函数 约束 总结 介绍 说到函数我们都不陌生,在C,C,java等语言中都有库函数,我们在平时也是经常使用,函数就是一段代码,我们既可以自定义实现,又可以使用库里内置的函数;从来更加简洁方便的完成业务;同样的在SQL中也有…...

在Linux中将设备驱动的地址映射到用户空间

本期主题&#xff1a; MMU的简单介绍&#xff0c;以及如何实现设备地址映射到用户空间 往期链接&#xff1a; Linux内核链表零长度数组的使用inline的作用嵌入式C基础——ARRAY_SIZE使用以及踩坑分析Linux下如何操作寄存器&#xff08;用户空间、内核空间方法讲解&#xff09;…...

电脑自带dll修复在哪里,dll丢失的6种解决方法总结

在现代科技日新月异的时代&#xff0c;电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些常见的问题&#xff0c;其中之一就是dll文件丢失或损坏。当这些dll文件丢失或损坏时&#xff0c;可能会导致某些应用程序无法…...

k8s基于nfs创建storageClass

首先安装nfs #服务端安装 yum install -y nfs-utils rpcbind #客户端安装 yum install -y nfs-utils #启动服务 并设置开启启动 systemctl start rpcbind && systemctl enable rpcbind systemctl start nfs && systemctl enable nfs #创建共享目录 mkdir -p /…...

Chrome无法拖入加载.crx扩展文件(以IDM为例)

问题原因&#xff1a;新版本的Chrome浏览器已不支持加载.crx文件 解决办法&#xff1a;将.crx文件压缩为.zip文件&#xff0c;解压缩后再加载到Chrome中 以IDM的.crx文件作为示例&#xff1b; IDM的.crx文件位于C:\Program Files (x86)\Internet Download Manager; 将IDMGCE…...

数字教学时代:构建高效在线帮助中心的重要性

在数字化教学日益普及的今天&#xff0c;教育领域正经历着前所未有的变革。随着在线课程、虚拟教室、智能学习平台等数字化工具的广泛应用&#xff0c;教育资源的获取方式和学习模式发生了深刻变化。然而&#xff0c;这种变革也带来了新的挑战&#xff0c;其中之一便是如何确保…...

828华为云征文|华为云弹性云服务器FlexusX实例下的Nginx性能测试

本文写的是华为云弹性云服务器FlexusX实例下的Nginx性能测试 目录 一、华为云弹性云服务器FlexusX实例简介二、测试环境三、测试工具四、测试方法五、测试结果 下面是华为云弹性云服务器FlexusX实例下的Nginx性能测试。 一、华为云弹性云服务器FlexusX实例简介 华为云弹性云服…...

知识图谱入门——2:技术体系基本概念:知识表示与建模、知识抽取与挖掘、知识存储与融合、知识推理与检索

知识图谱是通过构建“实体”和“关系”来描述世界的信息网络&#xff0c;它不仅是数据的存储方式&#xff0c;还可以支持推理与查询&#xff0c;帮助系统更好地理解、整合和利用数据。 文章目录 1. 知识表示与建模2. 知识抽取与挖掘3. 知识存储与融合4. 知识推理与检索总结 1.…...

【不看会后悔系列】排序之——文件归并【史上最全详解】~

文章目录 前言一、何为文件归并&#xff1f;二、文件归并思路分析三、创造多数据文件四、前置准备——堆排序五、两个文件写入到第三个文件六、读 N 个数据返回给文件,并返回读到数据的个数七、文件归并八、文件归并完整代码总结1. 运行代码2. 运行截图 总结 前言 学习了归并排…...

安全点的应用场景及其原理详解

引言 在Java虚拟机&#xff08;JVM&#xff09;运行的过程中&#xff0c;有些时刻&#xff0c;系统需要暂停所有正在运行的线程&#xff0c;以执行某些全局操作或确保数据的一致性。这些暂停线程的时刻被称为**“安全点”**&#xff08;Safepoint&#xff09;。尽管安全点最广…...

计算机各专业2025毕业设计选题推荐【各专业 | 最新】

计算机各专业2025毕业设计选题推荐 Java、Python、Vue、PHP、小程序、安卓、大数据、爬虫、可视化、机器学习、深度学习 文末有联系方式~~~ 1.Java 基于Java的在线购物系统设计与实现Java开发的图书管理系统基于Spring Boot的社交媒体平台Java实现的移动健康应用在线学习平…...

【Python报错已解决】IndexError: index 0 is out of bounds for axis 1 with size 0

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

SpringGateway(网关)微服务

一.启动nacos 1.查看linux的nacos是否启动 docker ps2.查看是否安装了nacos 前面是你的版本&#xff0c;后面的names是你自己的&#xff0c;我们下面要启动的就是这里的名字。 docker ps -a3.启动nacos并查看是否启动成功 二.创建网关项目 1.创建idea的maven项目 2.向pom.x…...

jQuery面试题:(第三天)

8.你在jQuery中使用过哪些插入节点的方法&#xff0c;它们的区别是什么&#xff1f; 答:append(),appendTo(),prepend(),prependTo(),after(),insertAfter() before(),insertBefore() 内添加 1.append()在文档内添加元素 2.appendTo()把匹配的元素添加到对象里 3.prepend()…...

聊聊国内首台重大技术装备(2)

上次&#xff0c;介绍了《首台&#xff08;套&#xff09;重大技术装备推广应用指导目录&#xff08;2024年版&#xff09;》中介绍的硅外延炉&#xff0c;湿法清洗机&#xff0c;氧化炉&#xff0c;见文章&#xff1a; 《聊聊国内首台重大技术装备&#xff08;1&#xff09;》…...

python 实现rayleigh quotient瑞利商算法

rayleigh quotient瑞利商算法介绍 瑞利商&#xff08;Rayleigh Quotient&#xff09;算法在多个领域&#xff0c;如线性代数、计算机视觉和机器学习等&#xff0c;都有重要的应用。瑞利商定义为函数 R ( A , x ) ( x H A x ) / ( x H x ) R(A, x) (x^H Ax) / (x^H x) R(A,x)…...

Java Web应用升级故障案例解析

在一次Java Web应用程序的优化升级过程中&#xff0c;从Tomcat 7.0.109版本升级至8.5.93版本后&#xff0c;尽管在预发布环境中验证无误&#xff0c;但在灰度环境中却发现了一个令人困惑的问题&#xff1a;新日志记录神秘“失踪”。本文深入探讨了这一问题的排查与解决过程&…...

Java类和对象、自定义包、static、代码块、方法重写

目录 1.类和对象 2.this指针 3.对象的构造和初始化 3.1默认初始化 3.2就地初始化 3.3构造初始化 3.4IDEA快速填充 3.5使用this简化 3.6初始化的总结 4.包的引入 4.1包的概念 4.2导入包中的类 4.3自定义包 5.static修饰 6.代码块的划分 7.方法重写 1.类和对象 使…...

企业网站升级/国外免费网站建设

题目描述: (1)数组中占比超过一半的元素称之为主要元素。给定一个整数数组&#xff0c;找到它的主要元素。若没有&#xff0c;返回-1。 示例 1&#xff1a; 输入&#xff1a;[1,2,5,9,5,9,5,5,5] 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;[3,2] 输出&#xff1a;-…...

宁皓 wordpress/seo是什么

不知道大家有没有遇到过这样的问题&#xff0c;有时候电脑网络正常连接&#xff0c;QQ微信都能正常登陆和聊天&#xff0c;就是打不开网页&#xff0c;有些小伙伴就会以为电脑系统问题甚至去重装系统。其实不用那么麻烦&#xff0c;正常联网却上不去网站很可能是DNS出了问题&am…...

化妆品网站建设平台的分析/余姚网站制作公司

...

网站面试通知表格怎么做/360建站和凡科哪个好

Percona Server 刚在 2013 DeveloperWeek Best of Tech award 中赢得最具创新的 SQL 技术奖。 我们很骄傲的接受了这个奖项&#xff0c;该奖项的评选是由独立的评审小组选出&#xff0c;非常感谢你们对 Percona Server 的投票。 Percona 为 MySQL 数据库服务器进行了改进&#…...

做网站卖东西赚钱么/百度导航怎么下载

PHP的网站主要攻击方式&#xff1a; 1、命令注入(Command Injection)2、eval注入(Eval Injection)3、客户端脚本攻击(Script Insertion)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)…...

网站的版面布局/什么是核心关键词

在这篇由两部分组成的文章中&#xff0c;Elliotte Rusty Harold 与您一起探讨经典java.lang.Math 类中的“新”功能。第 1 部分主要讨论比较单调的数学函数。第 2 部分将探讨专为操作浮点数而设计的函数。有时候您会对一个类熟悉到忘记了它的存在。如果您能够写出 java.lang.Fo…...