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入门

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

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

相关文章

【React】入门Day01 —— 从基础概念到实战应用

目录 一、React 概述 二、开发环境创建 三、JSX 基础 四、React 的事件绑定 五、React 组件基础使用 六、组件状态管理 - useState 七、组件的基础样式处理 快速入门 – React 中文文档 一、React 概述 React 是什么 由 Meta 公司开发,是用于构建 Web 和原生…

XFTP-8下载安装教程

下载地址 https://www.xshell.com/zh/free-for-home-school/ 新建XFTP文件夹 安装过程 选择新建的文件夹 此处默认即可 填写信息提交注册 点击生成的链接 点击后来,完成安装

WebRTC Connection Negotiate解决

最近有个项目 ,部署之后一直显示,查了一些资料还是没有解决,无奈只有自己研究解决? 什么是内网穿透? 我们访问我们自己的官网产品页面,我们的服务器是一个单独的个体,有独立的公网ip&#xf…

Redis实现每日签到(大数据量)

PHP语言使用Redis NoSQL服务器二进制数据类型实现大数据情况下签到功能 目录 问题 解决方式 封装签到类 功能调用 总结 问题 实现用户每日签到功能不难,但随着用户量上升之后,不论是存储还是判断对数据量来说都很麻烦;假如每天有100万用…

文心一言 VS 讯飞星火 VS chatgpt (359)-- 算法导论24.3 1题

一、在图 24-2上运行Dijkstra算法,第一次使用结点 s s s作为源结点,第二次使用结点 z z z作为源结点。以类似于图 24-6 的风格,给出每次while循环后的 d d d值和 π π π值,以及集合 S S S中的所有结点。如果要写代码&#xff0c…

使用容器启动的zk无法暴露3888问题解决

1. 问题描述 zk配置如下: 我通过容器启动了一个zk,通过-p 参数暴露了2181和3888端口,容器启动脚本如下: #!/bin/shdocker rm -f myzookeeper1docker run -p 12181:2181 -p 13888:3888 --name myzookeeper1 --restart always …

利士策分享,国庆日,共筑梦想,同庆辉煌

利士策分享,国庆日,共筑梦想,同庆辉煌 今天是我们的祖国成立的第75个国庆日,在这个举国同庆的日子里,我感受到了浓厚的节日氛围。 此刻的你,是否也在和家人朋友一起享受这份难得的宁静与快乐呢&#xff1f…

AI产品经理PRD文档与传统产品经理PRD有什么不同呢?

目录 模型输出:说白了,就是你的AI要干啥数据接入:你的AI要吃啥“粮食”验收标准:怎么判断你的AI干得好不好经验总结 你好,我是三桥君 在工作中,当我作为传统产品经理时,通常只需提供产品需求文…

SigmaStudio控件Cross Mixer\Signal Merger算法效果分析

衰减与叠加混音算法验证分析一 CH2:输入源为-20dB正弦波1khz CH1叠加混音:参考混音算法https://blog.csdn.net/weixin_48408892/article/details/129878036?spm1001.2014.3001.5502 Ch0衰减混音:外部多个输入源做混音时,建议参考该算法控件&…

宝塔的软件商店打不开怎么办?

宝塔的软件商店打不开怎么办? 请从下面这个按钮进入: 或者尝试直接打开链接:https://127.0.0.1:1234/soft

自定义注解加 AOP 实现服务接口鉴权以及内部认证

注解 何谓注解? 在Java中,注解(Annotation)是一种特殊的语法,用符号开头,是 Java5 开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类、方法或者变量,提供某些信…

Redis: Sentinel哨兵监控架构及环境搭建

概述 在主从模式下,我们通过从节点只读模式提高了系统的并发能力并发不断增加,只需要扩展从节点即可,只要主从服务器之间,网络连接正常主服务器就会将写入自己的数据同步更新给从服务器,从而保证主从服务器的数据相同…

推送k8s镜像到阿里云服务器

1、服务打包 2、打包后进入Dockerfile的同级目录 运行 docker build -t 镜像名:镜像版本 . (这个点是当前目录的意思,不能忽略)例如 docker build -t trac:v1.0.4 .3、上传镜像到阿里云镜像服务 注意选择区域 例如: docker tag 70743d9bdba3 registr…

jni动态库“%1 不是有效的win32应用程序”问题的解决以及一些windows下dll有关命令的记录

一、前因 在windows下用cmakeVS编译了一个jni动态库,再使用java测试程序调用这个动态库的时候报错:“%1 不是有效的win32应用程序” 对于这类问题,一般从以下几个方面考虑: 动态库文件损坏动态库或者其依赖库文件路径错误导致找…

计算机网络:计算机网络概述:网络、互联网与因特网的区别

文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络,若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…

十二、磁盘的调度算法

1.先来先服务(FCFS) 思想 优点 缺点 按访问请求到达的先后顺序进行处理 公平; 如果请求访问的磁道比较集中的话,算法性能还算过的去 如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则FCFS在性能上很差,寻道时间长。 2.最…

STM32新建工程-基于库函数

一、创建一个新工程 我这里选择STM32F103C8的型号,然后点击OK。 keil5里面的小助手,暂时不用,叉掉 二、为工程添加文件和路径 在工程模板中还需要添加启动文件、系统头文件、系统时钟文件,创建一个文件夹start,将下面…

wenyan:markdown 一键转换文章排版

介绍 今天给大家介绍一个markdown排版成自媒体文章的工具。 markdown 的重要性和便捷性不用再多说,但是从markdown 转换到文章排版,我换了很多个也都很不满意,尤其在不支持markdown的平台,更是一言难尽。 本次介绍的wenyan的核心…

C++语言学习(1): std::endl 在做什么?

std::endl 是一个函数(而不是变量): std::endl 会向控制台写入 \n 字符,并且刷新缓冲。 刷新缓冲肯定比不刷新缓冲慢。 这就是为什么有些 guide 里提到,少用 std::endl, 多用 \n.

HarmonyOS NEXT:实现电影列表功能展示界面

时至今日HarmonyOS NEXT早已发布运行了,等其正式推出并大规模商用后,HarmonyOS的历史使命就完成并将退出历史舞台,为用户提供丰富的应用选择。但是Harmony NEXT是在HarmonyOS基础上剔除安卓(AOSP)后的产品,…