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
进入安装界面,勾选所有配置,然后直接点击Ok,等待其安装完成。
然后打开软件,点击Accept:
直接无账号使用即可,如果后续你需要发布自己打包的镜像,就需要自己去注册一个账号登录了:
然后下一步是选择身份,直接跳过即可:
然后我们就进入到docker的主页面了:
虽然初次看起来你可能感觉有点懵,但事实上大多数时候我们都只用的上图中的三个页面。
- Contailers:我们此时运行中的容器
- Images:我们下载、打包的所有镜像
- Volumes:持久化卷
其中第一个容器很好理解,就是我们前面介绍的,它不仅仅包含了程序本身,还包含了需要运行程序的所有依赖环境。
而镜像,就是容器的基础,如果你安装过Windows系统就知道,Windows系统实际上是在一个以.ios结尾的镜像文件中的,通过下载、安装、运行该镜像才形成了我们所看到的各种各样的定制化的Windows系统。
而这里的镜像也是类似的含义:作者将所有需要的东西全部打包为一个镜像,并暴露出一些可以由使用者自定义的选项,使用者只需要填写这些选项运行镜像,就形成了一个自己的容器!
一个最简单的实例就是,一个包含了web服务器的docker镜像需要暴露出端口访问,虽然业界都使用80与443作为端口使用,但这并不能满足所有人的需求,有的人可能自己电脑上这两个端口已经有其它服务占了,想要使用其它端口启动该web服务。
此时打镜像的作者就可以将这个选项预留出来打成镜像,然后使用者就可以自行定义端口、启动镜像,将其作为一个容器进行运行。
3.docker基本使用
docker使用起来是非常简单的,如果我们不需要自己打镜像、只是使用别人提供的镜像。
其官方网站为:Docker Hub。
里面拥有大量别人已经打好的镜像,我们可以直接拉取下来使用。
比如我们现在想要用docker启动一个web服务器,那么我们可以直接进入docker hub搜索httpd:
可以看到,它是docker官方提供的http服务器镜像,下方的页面就是使用它的教程示例。
不过其介绍的是另外一种自己打镜像的方式,这个后面再介绍,现在我们先来试一试最简单的方式。
首先看到该镜像的各种版本,一般其放在了最前面:
但大多数时候为了简单,我们一般是直接选择latest,也就是最新的一个版本。
然后打开我们的命令行,运行下面这句命令拉取镜像: