第一次使用Docker的完整过程
友情提醒:这篇文章,完全是以小白的身份来写Docker的使用,用来和Docker的初用者、以及还未使用过Docker的朋友探讨Docker的技术和知识,不感兴趣的Docker熟手、高手可以飘过。
这两年,一直听大家讲Docker,可我不仅没有碰过Docker,甚至头脑中连Docker的基本概念都没有,终于,在这个凉爽的周末,无所事事的我决定尝试一下Docker。
1、Docker的起源
Docker的英文含义是“码头工人”,但如果看Docker的标志,会发现这个“码头工人”是一条体型庞大的鲸鱼,这条鲸鱼搬运着巨大的集装箱,每个集装箱中又运行着各种各样的软件,可以是Nginx、Hadoop等:
Docker的起源和一家名为dotCloud的公司相关。
从名字来看,dotCloud的业务应该和互联网、云相关,事实也确实如此。dotCloud于2010年在美国旧金山,由几个程序员成立,公司的发展方向是PaaS,开发LXC相关的容器技术。
dotCloud公司虽然不大,但技术强悍,尤其是公司的Docker项目做得非常好。
不过和公司的技术能力相比,公司的运营能力却非常一般,公司成立以来,一直步履艰难。2013年,公司实在撑不下去,快倒闭了,Docker的开发者,也是公司的创始人之一的Solomon Hykes,为了不让自己的辛勤成果烟消云散,决定将Docker开源。
Solomon Hykes的无奈之举,不仅挽救了Docker,也挽救了dotCloud公司。
Docker取得了极大的成功,成为了十年来最火爆的开源技术之一,得到了广大程序员和大型IT公司的热烈支持,dotCloud公司甚至直接将自己的名字改为Docker公司。
2、Docker的作用
Docker是一个应用容器引擎,使用Docker,我们可以把我们要运行的应用、以及应用依赖的软件包,打包到一个容器中运行。
Docker的容器,对于应用来说,就像一个虚拟的操作系统,应用完全意识不到Docker容器的存在。
Docker的底层技术是LXC,LXC是Linux Container的缩写。
大家看Docker和LXC技术,肯定觉得有点眼熟,是不是有点像大家熟悉的Virtual Box、VMWare和OpenStack?
对于应用程序本身来说,使用Docker、Virtual Box、VMWare还是OpenStack,甚至使用实际的操作系统确实没感觉到什么差异。
Docker、Virtual Box、VMWare、OpenStack对于应用程序来说,都可以看作是运行的平台,这几个平台之间的差异,主要是轻重量级不同。
OpenStack可以看作是一个重量级的虚拟化技术,它是位于一堆硬件资源和一堆操作系统之间的虚拟化系统,为一堆操作系统分配资源。
Virtual Box、VMWare是我们大家在PC机上使用过的虚拟机软件,可以认为是中等量级的虚拟化技术,它位于底层操作系统和一堆操作系统之间的虚拟化系统,我们常常用它在Windows上再安装一个完整的Windows或Linux操作系统。
Docker则是轻量级的虚拟化技术,我们建立的Docker容器时,并不需要每次真正安装完整的操作系统,一般可以在几十秒甚至几秒内完成(除第一次执行Docker命令之外),而我们如果使用Virtual Box则会完整安装一套操作系统,需要数十分钟甚至数小时。
3、Docker的理念
Docker通过两句口号,向使用者传递了Docker的理念:
(1)Build, Ship and Run。直译就是“构建、运送、运行”,这句口号说出了Docker的使用方式,我们可以将构建的系统,送到另外一个地方运行;
(2)Run any App,anywhere。直译就是“在任何地方运行任何应用程序”,这句口号我们当年见过的Java语言广告很像,Java的广告是:“Build once,run anywhere”。
4、Docker的核心概念
Docker的核心概念有三个:镜像,容器,仓库。
镜像(Image):一套系统,包含容器运行需要的程序、库、资源和配置等。镜像是个静态概念,是容器的模板,有点类似于文件系统,不包含动态数据,构建后不会改变。
容器(Container):容器是镜像的运行实例。
仓库(Repository):集中存储和分发镜像的服务器。
5、Docker的安装
我的操作系统是Ubuntu Server18.04,安装Docker很简单,root用户下执行这三条命令即可:
apt update
apt upgrade
apt install docker.io
Docker安装完成后,docker就成为Ubuntu的一个服务,我们可以使用下面的命令进行服务器的启动、停止、重启、查看状态:
启动docker:service docker start
停止docker:service docker stop
重启docker:service docker restart
查看docker状态:service docker status
在命令行下,启动、停止、重启都没有任何信息在控制台输出,但执行查看状态命令可以看到docker的状态:
我们也可以使用docker version命令,查询已安装Docker的版本信息:
6、docker的简单使用
现在,我尝试使用Docker,下面是详细步骤。
第1步:编写一个C程序welcome.c:
#include <unistd.h>
#include <stdio.h>
int main()
{
while (1)
{
printf("Welcome to the world of Docker!\n");
sleep(5);
}
return 0;
}
第2步:使用gcc对程序进行编译,得到可执行的welcome文件:
第3步:编辑/etc/docker/daemon.json文件,加上下面的信息:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
这里是修改镜像仓库的地址,改为国内的镜像仓库,提升下载速度。
第4步:执行下面的命令,重启Docker,使得上面的配置信息生效:
#service docker restart
第5步:在当前路径下建立Dockerfile文件,内容如下:
FROM ubuntu:18.04
COPY ./welcome /
WORKDIR /
CMD ./welcome
解释:基础镜像为Ubuntu18.04版本,将welcome程序拷贝到镜像的/目录,镜像的工作目录是/,在镜像中执行./welcome命令。
第6步:在当前路径下执行docker image build -t welcome .命令,建立镜像:
第一次执行超级慢,以后就会快很多:
这是执行结束时的截图:
第7步:执行docker image ls,可以看到,已经成功制作了welcome镜像:
第8步:执行docker container run welcome命令,启动welcome容器。
执行后,由于welcome是死循环程序,不会退出,所以不会停止:
换一个Linux控制台登录,执行docker container ls命令,可以看到welcome容器正在运行中:
此时,我们会发现welcome容器的ID是42e7472e910b,执行docker container stop 42e7472e910b命令,可以停止容器的执行:
第9步:如果我们希望welcome容器执行时,能够在控制台显示标准输出,在执行命令时,带上-it参数即可:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2020-05-08 安装CentOS7