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的logo是一个载着集装箱的大鲸鱼,这绝对是对Docker最形象的描述和解释。
对比运输业,在集装箱出现之前,货物无法用统一的标准方式进行搬运,比如有些货物易碎,需要轻拿轻放,有些则不需要。于是铁路、公路、海洋等各种运输之间,需要大量的人力作为货物中转,效率极低,而且成本很高。集装箱出现之后,解决了这个难题,任何货物货物都可以放到这个神奇的箱子里,然后在公路、铁路、海洋等所有运输场景下,这个箱子在运输过程中都是密封的,而且中间的中转工作,都可以通过大型机械搞定,效率大大提升。
Docker正式借鉴了标准集装箱的思想,将集装箱思想运用到了软件领域。Docker为代码提供了一个基于容器的标准化运输系统,可以将任何应用及其依赖的环境(如代码、配置文件、JDK、Tomcat等)打包成一个容器,这个容器可以在几乎所有的操作系统运行。
镜像是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算是入门了,但是万里长征只走完了第一步,学无止境,共勉。
由于博主也是在攀登的路上,文中可能存在不当之处,欢迎各位多指教! 如果文章对您有用,那么请点个”推荐“,以资鼓励!