Docker 基础实战教程:入门

前言

Docker是一个操作系统级的虚拟化技术,是基于LXC技术构建的轻量级容器引擎。与传统的虚拟化技术相比,Docker具有更高效的系统资源利用率、更快速的启动时间、提供一致的运行环境、更轻松的迁移等众多优势。自2013年0.1版本发布以来,围绕Docker逐渐形成了繁荣的生态,迅速的成为国内外各大云计算厂商和开发者手中的利器,并得到大规模的实践应用。

在这里插入图片描述
“没有集装箱,就不会有全球化”,集装箱的出现改变了全球化的现代生产与运输体系。Docker是一套以容器技术为核心的思想和一套标准化的体系,是IT领域的“集装箱”。只是,这个“集装箱”会改变整个IT世界吗?

Hello Docker !

镜像

镜像可以理解为一个打包了运行环境的特殊文件系统,它包含了容器启动运行所需的所有信息,包括运行程序和配置数据等。镜像不包含任何动态数据,其内容在构建之后也不会改变。

例如,一个官方的Ubuntu14.04镜像,就包含了一套完整的Ubuntu14.04最小系统的root文件系统。

容器

镜像容器的关系,类似于面向对象程序设计中的实例一样,镜像是静态的定义,而容器是镜像运行时的实体,可以看成是一个具备某个运行环境的非常轻量的虚拟机。容器可以被创建、启动、停止和删除等。在创建容器时,需要显示地为容器指定镜像。指定镜像之后,容器就具备了镜像中保存的运行环境了。

例如,可以为容器指定Ubuntu14.04的镜像,然后该容器就具备Ubuntu14.04的运行环境了。

Docker使用的基本过程

容器需要基于一个镜像来创建和使用。因此,Docker容器的使用一般有以下三个步骤:

1.获取一个镜像;  
2.基于该镜像创建并启动一个容器;  
3.进入该容器,执行“程序”。  
  • 第一步:获取镜像;
    上面我们提到了“镜像”可以理解为一个打包了运行环境的文件系统。然而在安装完Docker服务之后,本地是没有任何镜像的,所以首先需要获取所需要的镜像。

  • 第二步:创建并启动容器;
    在获取到所需的镜像之后,就可以基于该镜像创建并启动一个容器,该容器就具备了镜像包含的运行环境了。同时,在创建容器时也可以设置容器的启动命令,该命令会在容器启动时执行。

  • 第三步:进入容器并执行程序;
    在容器成功创建并启动之后,该容器就具备了ubuntu的运行环境。我们可以进入该容器内部,并在其内部执行任何在ubuntu系统上的程序了。这里的“程序”可以是“Linux命令”、“shell脚本”、“C++程序”等。

Docker使用基本实例

启动一个容器并输出“Hello Docker”的基本语句如下:

docker pull busybox:latest  
docker run --name first_docker_container busybox:latest echo "Hello Docker"  
  • 第一条命令:获取一个名为busybox:latest的镜像。这条命令会从Docker Hub官方镜像仓库获取一个名为busybox:latest的镜像(busybox的最新版),并把它下载到宿主机。其中busybox是最小的Linux系统。
  • 第二条命令: 创建并启动一个容器,并执行相应命令。首先,--name设置容器的名字为first_docker_container,然后为容器指定了busybox:latest作为启动镜像,最后设置了该容器的启动命令为echo "Hello Docker"。容器启动并输出 “Hello Docker”后,将其停止。
  • 其实我们也可以去掉第一条命令,直接使用第二条命令即可完成同样的功能。后台在执行命令时,发现本地没有busybox:latest镜像,会首先自动执行docker pull busybox:latest,将busybox:latest镜像下载到宿主机,然后再以busybox镜像作为基础,创建一个名为first_docker_container的镜像,并执行echo “Hello Docker”命令。

生命是自然的赏赐,但幸福的生活,则是智慧的赏赐。

拉取镜像

在没有使用Docker之前,如果我们要准备一个ubuntu的运行环境,那么首先我们得安装一个ubuntu的系统,多么麻烦,多么耗时啊!!而使用Docker之后,只需要从Docker Hub中拉取一个ubuntu镜像,基于该ubuntu镜像启动一个容器,就可以在容器中做任何在ubuntu系统中做的事情,整个过程大约2-3分钟,而且主要的时间是用于下载镜像!是不是非常方便呢?

在这里插入图片描述
在Docker的官方镜像仓库Docker Hub中保存了各种各样的镜像,这些镜像中保存了各种各样的运行环境。例如包含Linux运行环境的“ubuntu”镜像、“centos”镜像、“busybox”镜像等。

获取镜像

默认情况下,使用docker pull命令,会从官方的Docker Hub库中将镜像拉取到本地。

docker pull [OPTIONS] <仓库名><标签>  

其中,

  • docker pull:Docker拉取镜像的命令关键词;
  • [OPTIONS]:命令选项;
  • 仓库名:仓库名的格式一般为<用户名>/<软件名>。对于Docker Hub,如果不指定用户名,则默认为library,即官方镜像;
  • 标签:标签是区分镜像不同版本的一个重要参数,<仓库名>:<标签>会唯一确定一个镜像。默认为latest

例如,我们要从Docker Hub官方仓库拉取一个Ubuntu 14.04的官方镜像,其语句如下:

docker pull ubuntu:14.04  

docker pull命令背后的工作

首先,如果tag值为空,即没有指定标签,就会使用默认tag,也就是latest,如果tag值不为空,就使用指定的tag。

然后,默认情况下,会在Docker Hub中寻找名为“repoName”的仓库,如果仓库不存在,返回错误信息。如果仓库存在,就从仓库中拉取对应tag的镜像。

例如:如果执行docker pull ubuntu:14.04,那么将从“ubuntu”仓库中拉取tag为14.04的镜像,而如果执行docker pull ubuntu,会从“ubuntu”仓库中拉取tag为latest的镜像。
(在Docker Hub中有很多个镜像仓库,一般情况下会将同一类型的镜像放在同一个仓库中,例如在一个ubuntu仓库中由很多个ubuntu镜像组成,包括ubuntu:14.04、ubuntu:16.04、ubuntu:latest等等镜像)。

最后,将拉取的镜像存储到本地的指定位置。

docker pull的两个基本实例

执行docker pull ubuntu之后,会有下面的执行结果。(执行命令之前,本地并不存在ubuntu:latest镜像)。

如下图所示,因为没有显示地指定tag,所以就使用默认tag,也就是latest。于是会在Docker Hub中从ubuntu仓库中拉取ubuntu:latest镜像,当将镜像一层层下载完成后,存储到本地。

[root@localhost Desktop]# docker pull ubuntu  
Using default tag: latest  
latest: Pulling from library/ubuntu  
e0a742c2abfd: Pull complete   
486cb8339a27: Pull complete   
dc6f0d824617: Pull complete   
4f7a5649a30e: Pull complete   
672363445ad2: Pull complete   
Digest: sha256:84c334414e2bfdcae99509a6add166bbb4fa4041dc3fa6af08046a66fed3005f  
Status: Downloaded newer image for ubuntu:latest  
[root@localhost Desktop]#   

那从Docker Hub中拉取一个不存在的镜像会怎么样呢?如下所示,执行docker pull aaa后,会在Docker Hub中查找aaa仓库,由于不存在aaa仓库,所以没有找到,返回了错误信息。

[root@localhost Desktop]# docker pull aaa  
Using default tag: latest  
Error response from daemon: repository aaa not found: does not exist or no pull access  

设置镜像加速器

由于“伟大的墙”的原因,在国内从Docker Hub中拉取镜像的速度可能会比较慢,国内很多云服务商都提供了镜像加速器服务,例如阿里、网易等等。

Linux系统配置阿里云加速器为例,只需要将下面的命令复制到Linux的终端,以root用户的身份执行之后,就成功的配置了阿里云加速器了!

#以root用户执行以下操作  
mkdir -p /etc/docker  
tee /etc/docker/daemon.json <<-'EOF'  
{#下面的URL可以替换为你自己的阿里云加速地址  
"registry-mirrors": ["https://jxus37ad.mirror.aliyuncs.com "]  
}  
EOF  
systemctl daemon-reload  
systemctl restart docker  

导入导出容器

#以busybox为镜像创建一个容器,容器名为busyboxContainer
#拉取busybox 最新镜像,实际生产中,docker pull 这一步可以省略,docker run的时候会自己去拉取。
docker pull busybox

docker run --name busyboxContainer busybox echo "hello"
#1.然后将busyboxContainer导出为容器快照:busybox.tar
#********** Begin *********#
docker export busyboxContainer > busybox.tar
#********** End **********#

#2.最后使用该容器快照导入镜像,镜像名为busybox:v1.0。
#********** Begin *********#
cat busybox.tar | docker import - busybox:v1.0
#********** End **********#

docker export和docker save的区别

首先,两者的操作对象不同。docker save是将一个镜像保存为一个tar包,而docker export是将一个容器快照保存为一个tar包。

然后,docker export导出的容器快照文件将丢弃所有的历史记录和元数据信息,即仅保存容器当时的快照状态;而docker save保存的镜像存储文件将保存完整记录,体积也要大。下图就能够很好的说明,ubuntu:test仅仅占97.8MB而ubuntu:latest却占了120MB。

[root@localhost step2]# docker images ubuntu  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  
ubuntu              test                34be0173049d        5 seconds ago       97.8 MB  
ubuntu              latest              14f60031763d        2 weeks ago         120 MB  
[root@localhost tempdir]# docker run ubuntu:test ls /dir1  
1.txt  
2.txt  

加油!

感谢!

努力!

猜你喜欢

转载自blog.csdn.net/qq_46092061/article/details/124909864