天天看点

一文快速入门Docker

Docker提供一种安全、可重复的环境中自动部署软件的方式,拉开了基于与计算平台发展方式的变革序幕。如今Docker在互联网公司使用已经非常普遍。本文用十分钟时间,带你快速入门Docker。

Docker是什么?

官网首页的介绍:

Enterprise Container Platform for High-Velocity Innovation. Securely build, share and run any application, anywhere

百度百科告诉我们:

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

《第一本DOCKER书》的简介:

Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。由Docker公司(www.docker.com,前dotCloud公司,PaaS市场中的老牌供应商)的团队编写,基于Apache 2.0开源协议发行。

Docker的特别之处:

Docker是轻量级的虚拟化技术,启动速度快(大多数Docker容器只需不到1s即可完成启动),单台硬件上可以同时跑成百上千个容器,使得快速扩展,弹性伸缩变得简单。据说,在2016年,京东使用15万Docker集群来保证618高并发场景下的系统稳定。

Docker是跨平台的,支持Windows、Macos、Linux,可以做到“构建一次,到处运行”,解决开发环境和生产环境不一致带来的一系列问题,让开发人员和运维人员可以更加和谐相处。

Docker是开源的,托管于GitHub。

从docker的logo联想docker核心思想

一文快速入门Docker

Docker的logo是一个载着集装箱的大鲸鱼,这绝对是对Docker最形象的描述和解释。

对比运输业,在集装箱出现之前,货物无法用统一的标准方式进行搬运,比如有些货物易碎,需要轻拿轻放,有些则不需要。于是铁路、公路、海洋等各种运输之间,需要大量的人力作为货物中转,效率极低,而且成本很高。集装箱出现之后,解决了这个难题,任何货物货物都可以放到这个神奇的箱子里,然后在公路、铁路、海洋等所有运输场景下,这个箱子在运输过程中都是密封的,而且中间的中转工作,都可以通过大型机械搞定,效率大大提升。

Docker正式借鉴了标准集装箱的思想,将集装箱思想运用到了软件领域。Docker为代码提供了一个基于容器的标准化运输系统,可以将任何应用及其依赖的环境(如代码、配置文件、JDK、Tomcat等)打包成一个容器,这个容器可以在几乎所有的操作系统运行。

镜像是docker的基石,用户可以基于镜像来运行自己的容器。

镜像的基础是Docker的联合文件系统,该文件系统是分层的,每个镜像是一个层。由于每个层上面还以有其他层,也就是说,镜像可以在其他镜像(基础镜像)上面进行创建。借用一幅图来帮助理解。图片来源于网络,侵删。

一文快速入门Docker

仓库是保存用户镜像的地方,docker官方仓库地址为 https://hub.docker.com。在Docker Hub上面有许多镜像,包括最简单的hello-world,MySQL等等。当然我们也可以有自己私有的仓库。

容器为应用程序提供了隔离的运行空间。每个容器内都包含一个独享的完整的用户环境,并且一个容器内的运行环境变动不会影响其他容器的运行环境,可以使应用程序在几乎任何地方以相同的方式运行。

容器是基于镜像启动的,容器中可以运行一个或多个进程。在创建容器进程时,指定了这个进程所需要的Namespace参数,使得容器就只能「看」到当前 Namespace 所限定的资源、文件、设备、状态,或者配置。所以说,容器是一种特殊的进程而已,容器的本质就是进程。

以CentOS 7为例,进行安装Docker。

Docker运行在 CentOS 7上,要求操作系统为 64 位,内核版本为 3.10 及以上。

确认本机已经安装了满足要求的Linux内核。使用命令<code>uname -r</code>来检查内核版本信息。

使用命令<code>yum install -y docker</code>安装Docker,“-y”表示不询问,使用默认配置进行安装。

使用下列命令:

输入<code>docker version</code>,返回版本信息表明Docker安装成功。

入门实战怎么能少得了经典的“Hello World”?

其实DockerHub上已经有了这个镜像,名字叫“hello-world”。直接从DockerHub拉取镜像,命令和Git有些相似:<code>docker pull hello-world</code>

查看拉取到的Docker镜像:<code>docker images</code>

运行镜像:<code>docker run hello-world</code>。看到打印出如下的内容,代表运行成功。

docker images : 列出本地的镜像

docker pull image_name:拉取镜像。如果没有指定具体的镜像标签,会自动拉取latest标签的镜像。

docker search image_name:在Docker Hub上查找镜像

docker start container:启动和运行容器

docker run [OPTIONS] image_name:基于镜像创建并启动一个容器

常用选项:

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的高端口

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

docker logs container:获取容器的日志信息

docker attach container:进入容器

exit:退出容器

docker exec container command:在运行的容器中执行命令

docker stop container:停止容器

docker rm container:删除容器

docker save -o image_name.tar image_name:导出镜像

docker ps:查看正在运行的容器

docker ps -a:查看系统中容器列表

docker top container:查看容器内的进程

docker stop daemon_dave:停止守护容器

构建一个自己的镜像需要两步:

编写Dockerfile。Dockerfile 告诉Docker如何制作镜像以及每一步是怎样的。

Docker执行Dockerfile中的指令的流程是这样的:

Docker从基础镜像运行一个容器

执行一条指令,对容器进行修改

提交到一个新的镜像层

Docker再基于刚才提交的镜像运行一个新容器

执行Dockerfile中的下一条指令,知道所有指令执行完毕。

使用docker build命令构建。

每个Dockerfile的第一条命令必须是FROM。FROM指令指定一个已经存在的镜像,告诉Docker后续的指令都是在这个基础上进行的。例如:<code>FROM java:8</code>

MAINTAINER 指令用来标志该镜像所有者和联系方式。例如:<code>MAINTAINER James "×××@example.com"</code>

VOLUME 指令用来向基于镜像创建的容器添加卷。一个卷可以是存在一个或者多个容器内的特定的目录,这个目录可以绕过联合文件系统,并提供共享数据和数据持久化的功能。

CMD 指令用来指定一个容器启动时要运行的命令。

ENTRYPOINT指令与CMD指令很相似。

WORKDIR 指令用来从镜像创建一个新容器的时候,在容器内部设置一个工作命令,ENTRYPOINT或CMD指令指定的程序会在这个目录下执行。

ENV 指令用来在在镜像构建过程中设置环境变量。例如:<code>ENV TEST_PATH /home/test</code>

RUN 指令用来在当前镜像中运行指定的命令。例如:<code>RUN apt-get install -y nginx</code>

EXPOSE 指令用来告诉Docker该容器内的应用程序将使用容器的指定端口。例如:<code>EXPOSE 80</code>

ADD 指令用来将构建环境下的文件和目录复制到镜像中。 例如:<code>ADD docker-0.0.1-SNAPSHOT.jar app.jar</code>

COPY 指令与ADD 类似,不同点在与COPY只关心在构建上下文中复制本地文件,而不会提取和解压。

LABEL 指令用于为Docker镜像添加元数据。例如:<code>LABEL name=test description="a container is used to test"</code>

Dockerfile实例:

执行<code>docker build</code>命令后看到“BUILD SUCCESS”表明构建成功,可以使用<code>docker run</code>命令来运行了。

本文介绍了Docker是什么、Docker思想、Docker核心概念、Docker安装等内容,看完本文,Docker算是入门了,但是万里长征只走完了第一步,学无止境,共勉。

由于博主也是在攀登的路上,文中可能存在不当之处,欢迎各位多指教! 如果文章对您有用,那么请点个”推荐“,以资鼓励!