docker入门_docker入门详解 - CSDN
精华内容
参与话题
  • Docker入门到熟练使用(详解,第一篇,共五篇)

    千次阅读 多人点赞 2018-11-14 17:05:25
    Docker docker的出现 Docker是诞生于2013年,是dotCloud的一个开源项目,基于Google推出的GO语言实现。遵从Apache2.0协议。 docker的介绍 Docker的目标是实现轻量级的操作系统虚拟化的解决方案。 Docker的基础是...

    Docker

    1. docker的出现

    Docker是诞生于2013年,是dotCloud的一个开源项目,基于Google推出的GO语言实现。遵从Apache2.0协议。

    1. docker的介绍

    Docker的目标是实现轻量级的操作系统虚拟化的解决方案。

    Docker的基础是Linux容器(LXC)等技术,(LXC系统提供工具来管理容器,具有先进的网络和存储支持,还有最小容器操作系统模版的广泛选择)。

    在LXC的基础上Docker进行了进一步的封装,用户不需要去关心容器的管理,操作更简单。就像操作一个快速轻量的虚拟机一样简单。

    1. docker的优势
    1. 更快速的交付和部署。

    Docker可以在整个开发周期辅助实现快速交付,允许开发者在装有应用和服务器本地容器做开发。可以直接集成到可持续的开发流程中。

    Docker可以快速创建容器,快速迭代应用程序,过程全程可见,可以节约开发测试部署的时间。

    例如:用一个标准的镜像,构建一套开发容器,开发完成后,运维可以直接使用容器这个容器部署代码。

    1. 高效的部署和扩容。

    Docker容器几乎可以在任意平台运行,包括物理机,虚拟机,公有云,私有云,个人电脑,服务器等。用户可以把一个应用程序从一个平台直接迁移到另一个平台上。

    Docker的兼容性和轻量特性可以轻松的实现负载的动态管理

    1. 更高的资源利用率。

    Docker对系统的利用率很高,一台主机可以同时运行上千个Docker容器,容器除了运行其中的应用,不会消耗额外的系统资源,使应用性能很高。开销减少。

    例如:传统的虚机方式运行10个不同的应用,需要起十个虚机.

             而Docker只需要启动10个隔离的应用即可。

          4,更简单的管理。

                  Docker只需要小小的修改,就可以代替大量的更新工作,所有的改动都

    增量的方式被分发和更新,实现自动化高效的管理。

     

     

    Docker引擎

          Docker引擎是C/S结构的应用,主要组件如下。

    1. Server是一个常驻进程
    2. RESET API 实现了client(客户端)和server(服务器)的交互协议
    3. CLI实现了容器和镜像的管理,提供统一的操作界面。

    Docker架构

           Docker使用C/S架构,Cilent(客户端)通过接口与Server(服务器)进行通信实现容器的构建,运行和发布。Cilent和Server可以运行在同一台集群,也可以跨主机实现远程通讯。

     

    1. Client(客户端)
    2. Registry(注册表)
    3. Images(镜像)
    4. Containers(容器)
    5. Docker deamon 是docker的守护进程,Client通过命令与Docker deamon进行通讯,完成Docker相关操作。
    6. Docker host是docker的网络模式,网络模式共四种。

    核心概念:      

          镜像(image)

          Docker image只是一个只读的模版。

    镜像(Image)是(read-only layer)的统一视角

    Union File System将不同的层整合成一个文件系统,提供了 一个统一的视角,可以隐藏多层的存在,对用户来说,只是有一个文件系统而已。

         例如:一个镜像可以包含一个完整的操作系统环境,里面仅仅安装了Apache或者用户需要的其他的应用程序。镜像可以用来创建Docker容器,一个镜像中可以创建很多容器。Docker提供了一个简单的机制来创建,更新现有的镜像,用户也可以下载一个做好的镜像直接使用。

         仓库(repository)

         Repository是一个存放镜像文件的场所。

         仓库注册服务器上往往存在多个仓库,每个仓库中又包含多个镜像,每个镜像有不同的标签(tag)

         仓库分为public和private两种形式。最大的公开仓库是 Docker Hub存放了数量庞大的镜像供用户下载。国内有时速云,网易云等。用户也可以在本地网络创建一个私有仓库。

         Docker仓库跟Git类似,注册服务可以理解为GitHub这种托管服务。

    容器(Container)

    Docker利用容器来运行应用,容器是从镜像创建出来的运行实例,容器可以,被启动,开始,停止,删除。每个容器都可以相互隔离,保证平台安全。

    容器和镜像的区别是镜像是只读的,容器最上面的一层是可读可写的。

    运行时的容器被定义为一个可读可写的统一的文件系统。加上隔离进程空间和包含其中的进程。

         文件隔离技术使Docker成为了一个很有潜力的虚拟化技术,一个容器中的进程可能会对文件进行修改,删除,创建,这些改变作用于可读写层。  

    第二篇文章地址https://blog.csdn.net/qq_40001362/article/details/81905044

    展开全文
  • Docker(一):Docker入门教程

    千次阅读 多人点赞 2018-03-07 08:23:08
    如今Docker的使用已经非常普遍,特别在一线互联网公司。使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署...本文详细解释介绍Docker入门相关内容,后期重点关注Docker在微服务体系中的使用。在了解Do...

    如今Docker的使用已经非常普遍,特别在一线互联网公司。使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地。

    本文详细解释介绍Docker入门相关内容,后期重点关注Docker在微服务体系中的使用。在了解Docker之前我们先考虑几个问题:1、Docker是什么?2、为什么要使用Docker,它有什么优势?带着这些问题我们来看看下面的内容。

    什么是Docker?

    Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。

    Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

    总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。

    Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。

    为什么要使用Docker

    容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

    具体说来,Docker 在如下几个方面具有较大的优势。

    1、更快速的交付和部署

    对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

    开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

    2、更高效的虚拟化

    Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

    3、更轻松的迁移和扩展

    Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

    4、更简单的管理

    使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

    Docker vs VM

    从下图可以看出,VM是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。但Docker目前还不够完善,比如隔离效果不如VM,共享宿主机操作系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。

    Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

    作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

    相关概念

    Docker是CS架构,主要有两个概念:

    • Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互
    • Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon

    了解了Docker的组成,再来了解一下Docker的三个主要概念:

    • Docker image:镜像是只读的,镜像中包含有需要运行的文件。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。
    • Docker container:容器是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
    • Docker hub/registry: 共享和管理Docker镜像,用户可以上传或者下载上面的镜像,官方地址为https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry。

    镜像就相当于打包好的版本,镜像启动之后运行在容器中,仓库就是装存储镜像的地方。

    Docker安装

    建议在linux环境下安装Docker,window环境搭建比较复杂且容易出错,使用Centos7+yum来安装Docker环境很方便。

    Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令:

    yum install docker

    安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动:

    service docker start
    chkconfig docker on

    LCTT 译注:此处采用了旧式的 sysv 语法,如采用CentOS 7中支持的新式 systemd 语法,如下:

    systemctl start docker.service
    systemctl enable docker.service

    测试

    docker version

    输入上述命令,返回docker的版本相关信息,证明docker安装成功。

    Hello World

    下面,我们通过最简单的 image 文件”hello world”,感受一下 Docker。

    因为国内连接 Docker 的官方仓库很慢,因此我们在日常使用中会使用Docker 中国加速器。通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像。该镜像托管于中国大陆,本地用户现在将会享受到更快的下载速度和更强的稳定性,从而能够更敏捷地开发和交付 Docker 化应用。

    Docker 中国官方镜像加速可通过registry.docker-cn.com访问。该镜像库只包含流行的公有镜像,私有镜像仍需要从美国镜像库中拉取。

    修改系统中docker对应的配置文件即可,如下:

    vi  /etc/docker/daemon.json
    #添加后
    {
        "registry-mirrors": ["https://registry.docker-cn.com"],
        "live-restore": true
    }

    运行下面的命令,将 image 文件从仓库抓取到本地。

    docker pull library/hello-world

    上面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。

    抓取成功以后,就可以在本机看到这个 image 文件了。

    docker images
    #显示结果
    REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
    docker.io/hello-world           latest              f2a91732366c        3 months ago        1.848 kB

    现在,运行这个 image 文件。

    docker run hello-world
    
    #显示结果
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    ...

    输出这段提示以后,hello world就会停止运行,容器自动终止。有些容器不会自动终止,因为提供的是服务,比如Mysql镜像等。

    常用命令

    除过以上我们使用的Docker命令外,Docker还有一些其它常用的命令

    拉取docker镜像

    docker pull image_name

    查看宿主机上的镜像,Docker镜像保存在/var/lib/docker目录下:

    docker images

    删除镜像

    docker rmi  docker.io/tomcat:7.0.77-jre7   或者  docker rmi b39c68b7af30

    查看当前有哪些容器正在运行

    docker ps

    查看所有容器

    docker ps -a

    启动、停止、重启容器命令:

    docker start container_name/container_id
    docker stop container_name/container_id
    docker restart container_name/container_id

    后台启动一个容器后,如果想进入到这个容器,可以使用attach命令:

    docker attach container_name/container_id

    删除容器的命令:

    docker rm container_name/container_id

    查看当前系统Docker信息

    docker info

    从Docker hub上下载某个镜像:

    docker pull centos:latest
    docker pull centos:latest

    执行docker pull centos会将Centos这个仓库下面的所有镜像下载到本地repository。

    参考

    Docker — 从入门到实践
    Docker系列之一:入门介绍
    Docker 入门教程

    展开全文
  • Docker 零基础从入门到使用

    万次阅读 多人点赞 2019-11-09 10:13:13
    诺!这只可爱的小鲸鱼就是docker了! Docker 是什么? Docker 是一个开源的应用容器引擎,让开发者...在讲 Docker 能干什么之前,我们不妨先看看没有 Docker 和有Docker分别是个什么样子的? 场景一 某公司需要开发...

    诺!这只可爱的小鲸鱼就是docker了!
    #

    Docker 是什么?

    Docker 是一个引擎
    Docker 是一个应用容器引擎
    Docker 是一个开源的应用容器引擎
    他可以将开发的应用生成镜像,然后发布到任何系统上运行。

    Docker 能干什么?

    在讲 Docker 能干什么之前,我们不妨先看看没有 Docker 和有Docker分别是个什么样子的?

    先来个需求

    某公司需要开发一个管理系统,由于业务数据量庞大,需要对每个模块进行独立化。

    比如:将订单管理抽出为一个单独的系统,支付管理抽出为一个单独的系统,会员管理也抽为一个单独的系统,以此类推等等。

    那么,要实现用户下单支付这个逻辑,那么首先需要调用会员管理的相关接口进行登录,调用订单管理的相关借口进行下单,调用支付管理进行支付。这几个模块共同工作才构成了我们一个下单支付的功能。这就是我们常说的分布式微服务系统。

    在这里插入图片描述

    他和传统的单一模式的区别就是:将整个项目进行了模块划分,以前老一辈项目都是将会员,订单,支付等系统都集合在一个项目中,这样十分不利于后期项目的扩展。

    有Docker组 VS 无Dokcer组

    为了方便叙述,我们将有无使用Docker分为 有Docker组和无Docker组,让他们开始PK。

    • 第 1 回合:比服务器资源占用量( 资源就是金钱,没啥好说的 )
      无 Docker 组:购买了3台服务器,将开发好的三套系统分别往一台服务器上进行部署。
      有 Docker 组:购买了1台服务器,将开发好的三套系统分别进行 Docker 封装,都部署到这台服务器上。
      砖家点评:无Docker组多买了2台服务器,造成了金钱浪费,有Docker组胜出。

    • 第 2 回合:比项目启动速度( 时间就是金钱,也没啥好说的 )
      无 Docker 组:启动1个服务前前后后花了10秒,则3个启动完毕则花了30秒。
      有 Docker 组:启动1个服务只靠一个命令,花费1秒,那么3个就只需要3秒。
      砖家点评:无Docker组花了30秒,有Docker 组只花了3秒,有Docker组再次胜出。

    • 第3个回合:比项目迁移( 服务器升级啊,机房变更啊,反正就是需要换服务器了 )
      无Docker组:嗒嗒嗒,又重新在新服务器上安装了一大波软件,然后测试,总算迁移成功了,耗时大半天。
      无Docker组:把每个服务的Docker镜像拷贝过去,不用安装任何软件,又一个命令在新服务器上启动成功,耗时2分钟。
      砖家点评:这么显而易见的结果,还要我来点评?我太难了!

    经过上面几个回合的较量,Docker 的优点相信你或多或少已经知道一些了,我也就不总结了,当然Docker的优点远远不止这些,等你们日后学会了,自己去看相关文档摸索,本文只带萌新入门Docker。

    Docker 入门

    下面以实际的例子,把我个人网站(http://www.sunnyzyq.cn)改造为 Docker 项目。下面所有操作都是在 Linux 上操作的,请各位同学注意,要是没有Linux, 要么自己花钱买个服务器,要么自己安个虚拟机,个人建议搞我们这行的,还是有必要买个服务器,1年也就几百块,买来想怎么玩儿就怎么玩儿,主要是能学到技术,多好。

    (1)Docker 安装

    yum -y install docker

    输入语句执行后,就可以看到 Docker 它正在下载了,下面 19% 是下载进度。
    在这里插入图片描述
    当你看到下图的这个Complete,就表示 Docker 已经下载安装好了。
    在这里插入图片描述
    (2) 查看Docker版本
    是否真的已经安装好了呢?我们可以通过以下命令查看Docker的版本。

    docker version

    在这里插入图片描述
    此时,我们可以看到 Docker 的版本号为 1.13.1,表示真的已经安装上了。

    (3) 启动Docker

    service docker start

    在这里插入图片描述
    (4) 打包项目到服务器

    现在 Docker 已经启动成功了,我们来实战一下,我们先将Eclipse中的项目打成jar包放到Linux上。
    在这里插入图片描述
    (5) 创建Dockerfile

    在我们刚刚的项目jar包下同级目录下,创建Dockerfile文件,这个文件是玩转Docker的核心文件哦。

    touch Dockerfile

    在这里插入图片描述
    现在这个Dockerfile还是一纸空文,我们需要将我们的项目 jar 包写进去。
    编辑Dockerfile文件,内容如下(注意第3行第一个是你的jar包名):

    FROM java:8
    VOLUME /tmp
    ADD com.sunnyzyq-0.1.jar app.jar
    RUN bash -c ‘touch /app.jar’
    EXPOSE 80
    ENTRYPOINT [“java”,"-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

    不想在Linux上打字的可以把文件拿出来编辑,然后放回去。
    在这里插入图片描述
    内容解释:
    这里他有个镜像名词,不懂没关系,看完后面就懂了,先记住这个名词就是。

    • FROM :表示用哪个基础镜像去构建新的镜像,上面的java:8, 也就是jdk1.8。
    • ADD :表示叠加什么镜像到上面的基础镜像中。我们现在就叠加当前目录下的 com.sunnyzyq-0.1.jar 到基础镜像中。
    • EXPOSE:表示对外暴露的端口,我使用的是80。
    • RUN bash -c ‘touch /app.jar’ :使用 shell编程,执行一个 touch 命令,更新文件的访问和修改时间 -c 如果文件不存在,则不要进行创建。具体参考liunx 的 touch 命令和shell编程。
    • ENTRYPOINT :入口点, 表示容器运行后默认执行的命令。

    (6) 拉取基础镜像 java8

    docker pull java:8

    上面Dockerfile说得很清楚,我们的程序需要一个基础镜像Java8,我这里由于昨天已经下载好了,所以他会提示更新,你们如果没有下载 java8 的镜像,请静等下载。
    在这里插入图片描述
    (7) 构建程序镜像
    现在 java8 的基础镜像有了,就可以创建我们的程序镜像了,就是执行刚刚那个Dockerfile文件。

    docker build -t xxx .
    注意:xxx 为新镜像名字,随便取,别忘了最后有个点。

    在这里插入图片描述
    可以我们程序的镜像已经构建成功了,并生成了一个930858c62738的镜像ID。

    (8) 查看镜像

    docker images

    可以看到刚刚的创建的镜像,以及我们之前下载的jave8镜像(这里还可以看到,由于我刚刚创建的镜像和昨天创建的镜像虽然名字不一样,但其他数据都一样,这说明两个镜像底层都是指的同一个)。
    在这里插入图片描述
    (9) 停止网站项目
    为了给大家有个明显的感受,我用自己的网站做实验,这一步你们看下就好,不用做什么。

    下面这个是我项目的网址界面,现在还在运行。
    在这里插入图片描述
    现在我要停止他,准备并改为 docker 的方式启动。
    在这里插入图片描述
    可以看到,我的网址已经成功的被停掉了,OK,我们继续下一步,继续走完我们未完成的路。
    在这里插入图片描述
    (10) 创建容器并运行

    镜像我们已经有了,但最后能让项目运行起来的是容器。如何理解容器与镜像的关系呢?
    镜像可以理解为一个Java类,而容器可以理解为Java类的实例。
    类只有一个,但可以new出千千万万个实例对象。
    所以,镜像只是一个可以生成容器的东西,而容器才能让程序运行起来。

    那么,现在我们就让我们用刚创建的镜像创建一个容器,并让他运行起来。

    docker run --name 容器名 -d -p 内部端口:外部端口 镜像名
    如: docker run --name sunnyzyq -d -p 80:80 sunnzyq-docker-test

    命令解释:

    • 容器名:我这里取的名字为 sunnyzyq
    • -d: 后台运行容器,并且返回容器完整ID
    • -p: 是用于指定端口的。
    • 内部端口:项目程序的端口
    • 外部端口:网站域名的端口

    在这里插入图片描述
    (11) 查看运行的容器

    docker ps

    这样可以看到我们刚运行容器的详细信息。
    在这里插入图片描述

    docker ps -a

    这样可以看到所有的docker下的相关容器,其他几个是我昨天创建的容器。
    在这里插入图片描述

    (12) 再次访问网站

    再次访问网站,可以看到网站又可以访问了,这次是docker方式启动的。
    在这里插入图片描述
    (13)Docker 仓库
    我们的 Docker镜像,还可以上传到Docker仓库 Docker Hub 里,只要注册一个账号密码,就能上传上去。
    到时,如果你想要在其他服务器上运行你的项目,只需要从Docker hub里下载下来,重新生成容器,不用安装任何软件就可以运行了,因为需要的相关环境,你都整合到Docker镜像里了。

    结尾语

    非常感谢这位兄弟的博客帮助:https://blog.csdn.net/sumlyl/article/details/80553796
    好了!Docker的相关介绍和初步使用就到这里了!
    祝各位自己私下继续深入学习,以后都是Docker大神!

    展开全文
  • 这可能是最为详细的Docker入门吐血总结

    万次阅读 多人点赞 2019-01-15 15:21:55
    Docker是什么? 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项,不信的话看看下面这张图。 这是我在某...

    Docker是什么?

    在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项,不信的话看看下面这张图。

    这是我在某招聘网站上看到的招聘 Java开发工程师 的招聘要求,其中有一条熟悉 docker 成为了你快速入职的加分项,由此可见熟悉 docker 在互联网公司的地位之重要。

    当然对于我们 CTF选手 而言,熟悉 docker 可以快速搭建 CTF环境 ,完美地还原比赛真实漏洞的场景,帮助我们快速提升自己。

    市面上已经有很多优秀的教程,但是很多原理性的东西,笔者认为那些教程对初学者而言还是很难理解,感觉没有说清楚(笔者自己都觉得挺懵逼的),为了让初学者少走弯路,我将以我的学习经历以及作为一个 CTF选手 的角度,编写此套教程,来带大家去了解并熟练运用 docker ,祝愿各位读者朋友们学完此套教程后,在未来企业面试中能够多一项加分的筹码,能够帮助到大家,我觉得就很值了。

    既然说了这么多, docker 到底是个什么东西呢?

    我们在理解 docker 之前,首先我们得先区分清楚两个概念,容器虚拟机

    可能很多读者朋友都用过虚拟机,而对容器这个概念比较的陌生。

    我们用的传统虚拟机如 VMware , VisualBox 之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。

    而容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。

    容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。通过下面这幅图我们可以很直观的反映出这两者的区别所在。

    Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

    而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

    Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。

    总体来说, Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

    Docker的优势

    Docker相比于传统虚拟化方式具有更多的优势:

    • docker 启动快速属于秒级别。虚拟机通常需要几分钟去启动
    • docker 需要的资源更少, docker 在操作系统级别进行虚拟化, docker 容器和内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化
    • docker 更轻量, docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境, Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高
    • 与虚拟机相比, docker 隔离性更弱, docker 属于进程之间的隔离,虚拟机可实现系统级别隔离
    • 安全性: docker 的安全性也更弱。 Docker 的租户 root 和宿主机 root 等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作。虚拟机租户 root 权限和宿主机的 root 虚拟机权限是分离的,并且虚拟机利用如 Intel 的 VT-d 和 VT-x 的 ring-1 硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击
    • 可管理性: docker 的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如 VMware vCenter 提供完备的虚拟机管理能力
    • 高可用和可恢复性: docker 对业务的高可用支持是通过快速重新部署实现的。虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制, VMware 可承诺虚拟机 99.999% 高可用,保证业务连续性
    • 快速创建、删除:虚拟化创建是分钟级别的, Docker 容器创建是秒级别的, Docker 的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间
    • 交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化。 Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署

    我们可以从下面这张表格很清楚地看到容器相比于传统虚拟机的特性的优势所在:

    特性 容器 虚拟机
    启动 秒级 分钟级
    硬盘使用 一般为MB 一般为GB
    性能 接近原生 弱于
    系统支持量 单机支持上千个容器 一般是几十个

    Docker的三个基本概念

    从上图我们可以看到,Docker 中包括三个基本的概念:

    • Image(镜像)
    • Container(容器)
    • Repository(仓库)

    镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。

    Image (镜像)

    那么镜像到底是什么呢?

    Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

    镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,下面的这张图能够帮助读者理解镜像的定义。

    从左边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker 内部的实现细节,并且能够在主机的文件系统上访问到。统一文件系统 (union file system) 技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。我们可以在图片的右边看到这个视角的形式。

    Container (容器)

    容器 (container) 的定义和镜像 (image) 几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

    由于容器的定义并没有提及是否要运行容器,所以实际上,容器 = 镜像 + 读写层。

    Repository (仓库)

    Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。实际上,一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

    通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签.。

    仓库又可以分为两种形式:

    • public(公有仓库)
    • private(私有仓库)

    Docker Registry 公有仓库是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

    除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry镜像,可以直接使用做为私有 Registry 服务。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

    我们主要把 Docker 的一些常见概念如 Image , Container , Repository 做了详细的阐述,也从传统虚拟化方式的角度阐述了 docker 的优势,我们从下图可以直观地看到 Docker 的架构:

    framework

    Docker 使用 C/S 结构,即客户端/服务器体系结构。 Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像。 Docker 客户端和服务端可以运行在一台机器上,也可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信。

    docker-framework

    这张图展示了 Docker 客户端、服务端和 Docker 仓库(即 Docker Hub 和 Docker Cloud ),默认情况下Docker 会在 Docker 中央仓库寻找镜像文件,这种利用仓库管理镜像的设计理念类似于 Git ,当然这个仓库是可以通过修改配置来指定的,甚至我们可以创建我们自己的私有仓库。

    Docker的安装和使用

    Docker 的安装和使用有一些前提条件,主要体现在体系架构和内核的支持上。对于体系架构,除了 Docker 一开始就支持的 X86-64 ,其他体系架构的支持则一直在不断地完善和推进中。

    Docker 分为 CE 和 EE 两大版本。 CE 即社区版(免费,支持周期 7 个月), EE 即企业版,强调安全,付费使用,支持周期 24 个月。

    我们在安装前可以参看官方文档获取最新的 Docker 支持情况,官方文档在这里:

    https://docs.docker.com/install/

    Docker 对于内核支持的功能,即内核的配置选项也有一定的要求(比如必须开启 Cgroup 和 Namespace 相关选项,以及其他的网络和存储驱动等), Docker 源码中提供了一个检测脚本来检测和指导内核的配置,脚本链接在这里:

    https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh

    在满足前提条件后,安装就变得非常的简单了。

    Docker CE 的安装请参考官方文档:

    • MacOS:https://docs.docker.com/docker-for-mac/install/
    • Windows:https://docs.docker.com/docker-for-windows/install/
    • Ubuntu:https://docs.docker.com/install/linux/docker-ce/ubuntu/
    • Debian:https://docs.docker.com/install/linux/docker-ce/debian/
    • CentOS:https://docs.docker.com/install/linux/docker-ce/centos/
    • Fedora:https://docs.docker.com/install/linux/docker-ce/fedora/
    • 其他 Linux 发行版:https://docs.docker.com/install/linux/docker-ce/binaries/

    这里我们以 CentOS7 作为本文的演示。

    环境准备

    • 阿里云服务器(1核2G,1M带宽)
    • CentOS 7.4 64位

    由于 Docker-CE 支持 64 位版本的 CentOS7 ,并且要求内核版本不低于 3.10

    首先我们需要卸载掉旧版本的 Docker

    $ sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-selinux \
                      docker-engine-selinux \
                      docker-engine

    我们执行以下安装命令去安装依赖包:

    $ sudo yum install -y yum-utils \
               device-mapper-persistent-data \
               lvm2

    这里我事先已经安装过了,所以提示我已经安装了最新版本

    安装Docker

    Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令

    $ sudo yum install docker

    当然在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装:

    curl -fsSL get.docker.com -o get-docker.sh
    sh get-docker.sh

    具体可以参看 docker-install 的脚本:

    https://github.com/docker/docker-install

    执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。

    安装完成后,运行下面的命令,验证是否安装成功:

    docker version
    or
    docker info

    返回docker的版本相关信息,证明 docker 安装成功

    启动Docker-CE

    $ sudo systemctl enable docker
    $ sudo systemctl start docker

    Docker的简单运用---Hello World

    由于服务器日常崩溃了, docker 出了点问题,所以以下案例的演示是基于 Kali Linux 环境下进行的。

    我们通过最简单的 image 文件 hello world,感受一下 Docker 的魅力吧!

    我们直接运行下面的命令,将名为 hello-world 的 image 文件从仓库抓取到本地。

    docker pull library/hello-world

    docker pull images 是抓取 image 文件, library/hello-world 是 image 文件在仓库里面的位置,其中 library 是 image 文件所在的组, hello-world 是 image 文件的名字。

    抓取成功以后,就可以在本机看到这个 image 文件了。

    docker images

    我们可以看到如下结果:

    现在,我们可以运行 hello-world 这个 image 文件

    docker run hello-world

    我们可以看到如下结果:

    输出这段提示以后,hello world 就会停止运行,容器自动终止。有些容器不会自动终止,因为提供的是服务,比如Mysql镜像等。

    是不是很 easy 呢?我们从上面可以看出, docker 的功能是十分强大的,除此之外,我们还可以拉去一些 Ubuntu , Apache 等镜像,在未来的教程中我们将会一一提到。

    Docker 提供了一套简单实用的命令来创建和更新镜像,我们可以通过网络直接下载一个已经创建好了的应用镜像,并通过 Docker RUN 命令就可以直接使用。当镜像通过 RUN 命令运行成功后,这个运行的镜像就是一个 Docker 容器啦,容器可以理解为一个轻量级的沙箱, Docker 利用容器来运行和隔离应用,容器是可以被启动、停止、删除的,这并不会影响 Docker 镜像。

    我们可以看看下面这幅图:

    Docker 客户端是 Docker 用户与 Docker 交互的主要方式。当您使用 docker 命令行运行命令时, Docker 客户端将这些命令发送给服务器端,服务端将执行这些命令。 docker 命令使用 docker API 。 Docker 客户端可以与多个服务端进行通信。

    我们将剖析一下 Docker 容器是如何工作的,学习好Docker容器工作的原理,我们就可以自己去管理我们的容器了。

    Docker架构

    在上面的学习中,我们简单地讲解了Docker的基本架构。了解到了Docker 使用的是 C/S 结构,即客户端/服务器体系结构。明白了 Docker 客户端与 Docker 服务器进行交互时, Docker 服务端负责构建、运行和分发 Docker 镜像。 也知道了Docker 客户端和服务端可以运行在一台机器上,可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信。

    我们从下图可以很直观的了解到Docker的架构:

    Docker 的核心组件包括:

    1. Docker Client
    2. Docker daemon
    3. Docker Image
    4. Docker Registry
    5. Docker Container

    Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。可能很多朋友暂时不太理解一些东西,比如 REST API 是什么东西等,不过没关系,在后面的文章中会一一给大家讲解清楚。

    Docker Client

    Docker Client ,也称 Docker 客户端。它其实就是 Docker 提供命令行界面 (CLI) 工具,是许多 Docker 用户与 Docker 进行交互的主要方式。客户端可以构建,运行和停止应用程序,还可以远程与Docker_Host进行交互。最常用的 Docker 客户端就是 docker 命令,我们可以通过 docker 命令很方便地在 host 上构建和运行 docker 容器。

    Docker daemon

    Docker daemon 是服务器组件,以 Linux 后台服务的方式运行,是 Docker 最核心的后台进程,我们也把它称为守护进程。它负责响应来自 Docker Client 的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个 API Server ,负责接收由 Docker Client 发送的请求,接收到的请求将通过Docker daemon 内部的一个路由分发调度,由具体的函数来执行请求。

    我们大致可以将其分为以下三部分:

    • Docker Server
    • Engine
    • Job

    Docker Daemon的架构如下所示:

    Docker Daemon 可以认为是通过 Docker Server 模块接受 Docker Client 的请求,并在 Engine 中处理请求,然后根据请求类型,创建出指定的 Job 并运行。 Docker Daemon 运行在 Docker host 上,负责创建、运行、监控容器,构建、存储镜像。

    运行过程的作用有以下几种可能:

    • 向 Docker Registry 获取镜像
    • 通过 graphdriver 执行容器镜像的本地化操作
    • 通过 networkdriver 执行容器网络环境的配置
    • 通过 execdriver 执行容器内部运行的执行工作

    由于 Docker Daemon 和 Docker Client 的启动都是通过可执行文件 docker 来完成的,因此两者的启动流程非常相似。 Docker 可执行文件运行时,运行代码通过不同的命令行 flag 参数,区分两者,并最终运行两者各自相应的部分。

    启动 Docker Daemon 时,一般可以使用以下命令来完成

    docker --daemon = true
    docker –d
    docker –d = true

    再由 docker 的 main() 函数来解析以上命令的相应 flag 参数,并最终完成 Docker Daemon 的启动。

    下图可以很直观地看到 Docker Daemon 的启动流程:

    默认配置下, Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听。我们可以照着如下步骤进行配置:

    1、编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service ,在环境变量 ExecStart后面添加 -H tcp://0.0.0.0,允许来自任意 IP 的客户端连接。

    2、重启 Docker daemon

    systemctl daemon-reload
    systemctl restart docker.service

    3、我们通过以下命令即可实现与远程服务器通信

    docker -H 服务器IP地址 info

    -H 是用来指定服务器主机, info 子命令用于查看 Docker 服务器的信息

    Docker Image

    Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将 Docker 镜像看成只读模板,通过它可以创建 Docker 容器。

    镜像有多种生成方法:

    1. 从无到有开始创建镜像
    2. 下载并使用别人创建好的现成的镜像
    3. 在现有镜像上创建新的镜像

    我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile ,通过执行 docker build <docker-file> 命令可以构建出 Docker 镜像,在后续的教程中,我们会用一篇专门讨论这个问题。

    Docker Registry

    Docker registry 是存储 docker image 的仓库,它在 docker 生态环境中的位置如下图所示:

    运行docker pushdocker pulldocker search时,实际上是通过 docker daemon 与 docker registry 通信。

    Docker Container

    Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。 Docker Container 提供了系统硬件环境,我们可以使用 Docker Images 这些制作好的系统盘,再加上我们所编写好的项目代码, run 一下就可以提供服务啦。

    Docker组件是如何协作运行容器

    看到这里,我相信各位读者朋友们应该已经对Docker基础架构已经熟悉的差不多了,我们还记得运行的第一个容器吗?现在我们再通过hello-world这个例子来体会一下 Docker 各个组件是如何协作的。

    容器启动过程如下:

    • Docker 客户端执行 docker run 命令
    • Docker daemon 发现本地没有 hello-world 镜像
    • daemon 从 Docker Hub 下载镜像
    • 下载完成,镜像 hello-world 被保存到本地
    • Docker daemon 启动容器

    具体过程可以看如下这幅演示图:

    我们可以通过docker images 可以查看到 hello-world 已经下载到本地

    我们可以通过docker ps 或者 docker container ls 显示正在运行的容器,我们可以看到, hello-world 在输出提示信息以后就会停止运行,容器自动终止,所以我们在查看的时候没有发现有容器在运行。

    我们把 Docker 容器的工作流程剖析的十分清楚了,我们大体可以知道 Docker 组件协作运行容器可以分为以下几个过程:

    1. Docker 客户端执行 docker run 命令
    2. Docker daemon 发现本地没有我们需要的镜像
    3. daemon 从 Docker Hub 下载镜像
    4. 下载完成后,镜像被保存到本地
    5. Docker daemon 启动容器

    了解了这些过程以后,我们再来理解这些命令就不会觉得很突兀了,下面我来给大家讲讲 Docker 常用的一些命令操作吧。

    Docker常用命令

    我们可以通过 docker -h 去查看命令的详细的帮助文档。在这里我只会讲一些平常日常比赛或者生活中我们可能会用的比较多的一些命令。

    例如,我们需要拉取一个 docker 镜像,我们可以用如下命令:

    docker pull image_name

    image_name 为镜像的名称,而如果我们想从 Docker Hub 上去下载某个镜像,我们可以使用以下命令:

    docker pull centos:latest

    centos:lastest 是镜像的名称, Docker daemon 发现本地没有我们需要的镜像,会自动去 Docker Hub 上去下载镜像,下载完成后,该镜像被默认保存到 /var/lib/docker 目录下。

    接着我们如果想查看下主机下存在多少镜像,我们可以用如下命令:

    docker images

    我们要想知道当前有哪些容器在运行,我们可以用如下命令:

    docker ps -a

    -a 是查看当前所有的容器,包括未运行的

    我们该如何去对一个容器进行启动,重启和停止呢?我们可以用如下命令:

    docker start container_name/container_id
    docker restart container_name/container_id
    docker stop container_name/container_id

    这个时候我们如果想进入到这个容器中,我们可以使用 attach 命令:

    docker attach container_name/container_id

    那如果我们想运行这个容器中的镜像的话,并且调用镜像里面的 bash ,我们可以使用如下命令:

    docker run -t -i container_name/container_id /bin/bash

    那如果这个时候,我们想删除指定镜像的话,由于 image 被某个 container 引用(拿来运行),如果不将这个引用的 container 销毁(删除),那 image 肯定是不能被删除。我们首先得先去停止这个容器:

    docker ps
    docker stop container_name/container_id

    然后我们用如下命令去删除这个容器:

    docker rm container_name/container_id

    然后这个时候我们再去删除这个镜像:

    docker rmi image_name

    此时,常用的 Docker 相关的命令就讲到这里为止了,我们在后续的文章中还会反复地提到这些命令。

    Dockerfile是什么

    前面我们已经提到了 Docker 的一些基本概念。以 CTF 选手的角度来看,我们可以去使用 Dockerfile 定义镜像,依赖镜像来运行容器,可以去模拟出一个真实的漏洞场景。因此毫无疑问的说, Dockerfile 是镜像和容器的关键,并且 Dockerfile 还可以很轻易的去定义镜像内容,说了这么多,那么 Dockerfile 到底是个什么东西呢?

    Dockerfile 是自动构建 docker 镜像的配置文件, 用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 linux 下的 shell 命令。

    我们可以通过下面这幅图来直观地感受下 Docker 镜像、容器和 Dockerfile 三者之间的关系。

    我们从上图中可以看到, Dockerfile 可以自定义镜像,通过 Docker 命令去运行镜像,从而达到启动容器的目的。

    Dockerfile 是由一行行命令语句组成,并且支持已 # 开头的注释行。

    一般来说,我们可以将 Dockerfile 分为四个部分:

    • 基础镜像(父镜像)信息指令 FROM
    • 维护者信息指令 MAINTAINER
    • 镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等
    • 容器启动指令 CMD 、 ENTRYPOINT 和 USER 等

    下面是一段简单的Dockerfile的例子:

    FROM python:2.7
    MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>
    COPY . /app
    WORKDIR /app
    RUN pip install -r requirements.txt
    EXPOSE 5000
    ENTRYPOINT ["python"]
    CMD ["app.py"]

    我们可以分析一下上面这个过程:

    • 1、从 Docker Hub 上 pull 下 python 2.7 的基础镜像
    • 2、显示维护者的信息
    • 3、copy 当前目录到容器中的 /app 目录下 复制本地主机的 <src> ( Dockerfile 所在目录的相对路径)到容器里 <dest>
    • 4、指定工作路径为 /app
    • 5、安装依赖包
    • 6、暴露 5000 端口
    • 7、启动 app

    这个例子是启动一个 python flask app 的 Dockerfile ( flask 是 python 的一个轻量的 web 框架),相信大家从这个例子中能够稍微理解了Dockfile的组成以及指令的编写过程。

    Dockerfile常用的指令

    根据上面的例子,我们已经差不多知道了Dockerfile的组成以及指令的编写过程,我们再来理解一下这些常用命令就会得心应手了。

    由于 Dockerfile 中所有的命令都是以下格式:INSTRUCTION argument ,指令 (INSTRUCTION) 不分大小写,但是推荐大写,和sql语句是不是很相似呢?下面我们正式来讲解一下这些指令集吧。

    FROM

    FROM 是用于指定基础的 images ,一般格式为 FROM <image> or FORM <image>:<tag> ,所有的 Dockerfile 都用该以 FROM 开头,FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像。可以在同一个 Dockerfile 中多次使用 FROM 命令用于创建多个镜像。比如我们要指定 python 2.7 的基础镜像,我们可以像如下写法一样:

    FROM python:2.7

    MAINTAINER

    MAINTAINER 是用于指定镜像创建者和联系方式,一般格式为 MAINTAINER <name> 。这里我设置成我的 ID 和邮箱:

    MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>

    COPY

    COPY 是用于复制本地主机的 <src> (为 Dockerfile 所在目录的相对路径)到容器中的 <dest>

    当使用本地目录为源目录时,推荐使用 COPY 。一般格式为 COPY <src><dest> 。例如我们要拷贝当前目录到容器中的 /app 目录下,我们可以这样操作:

    COPY . /app

    WORKDIR

    WORKDIR 用于配合 RUNCMDENTRYPOINT 命令设置当前工作路径。可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令。默认路径为/。一般格式为 WORKDIR /path/to/work/dir 。例如我们设置/app 路径,我们可以进行如下操作:

    WORKDIR /app

    RUN

    RUN 用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。一般格式为 RUN <command> 。例如我们要安装 python 依赖包,我们做法如下:

    RUN pip install -r requirements.txt

    EXPOSE

    EXPOSE 命令用来指定对外开放的端口。一般格式为 EXPOSE <port> [<port>...]

    例如上面那个例子,开放5000端口:

    EXPOSE 5000

    ENTRYPOINT

    ENTRYPOINT 可以让你的容器表现得像一个可执行程序一样。一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。

    ENTRYPOINT 命令也有两种格式:

    • ENTRYPOINT ["executable", "param1", "param2"] :推荐使用的 exec形式
    • ENTRYPOINT command param1 param2 :shell 形式

    例如下面这个,我们要将 python 镜像变成可执行的程序,我们可以这样去做:

    ENTRYPOINT ["python"]

    CMD

    CMD 命令用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件。不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就会作为ENTRYPOINT的参数。

    CMD 命令有三种格式:

    • CMD ["executable","param1","param2"]:推荐使用的 exec 形式。
    • CMD ["param1","param2"]:无可执行程序形式
    • CMD command param1 param2:shell 形式。

    一个 Dockerfile 中只能有一个CMD,如果有多个,则最后一个生效。而 CMD 的 shell 形式默认调用 /bin/sh -c 执行命令。

    CMD 命令会被 Docker 命令行传入的参数覆盖:docker run busybox /bin/echo Hello Docker 会把 CMD 里的命令覆盖。

    例如我们要启动 /app ,我们可以用如下命令实现:

    CMD ["app.py"]

    当然还有一些其他的命令,我们在用到的时候再去一一讲解一下。

    构建Dockerfile

    我们大体已经把Dockerfile的写法讲述完毕,我们可以自己动手写一个例子:

    mkdir static_web
    cd static_web
    touch Dockerfile
    然后 vi Dockerfile  开始编辑该文件
    输入 i 开始编辑
    
    以下是我们构建的Dockerfile内容
    ``````````
    FROM nginx
    MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>
    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    ``````````
    
    编辑完后 按 esc 退出编辑
    然后  :wq    写入 退出

    我们在 Dockerfile 文件所在目录执行:

    docker build -t angelkitty/nginx_web:v1 .

    我们解释一下, -t 是为新镜像设置仓库和名称,其中 angelkitty 为仓库名, nginx_web 为镜像名, :v1为标签(不添加为默认 latest )

    我们构建完成之后,使用 docker images 命令查看所有镜像,如果存在 REPOSITORY 为 nginx 和 TAG 是 v1 的信息,就表示构建成功。

    接下来使用 docker run 命令来启动容器

    docker run --name nginx_web -d -p 8080:80   angelkitty/nginx_web:v1

    这条命令会用 nginx 镜像启动一个容器,命名为 nginx_web ,并且映射了 8080 端口,这样我们可以用浏览器去访问这个 nginx 服务器:http://localhost:8080/ 或者 http://本机的IP地址:8080/,页面返回信息:

    hello-docker

    这样一个简单使用 Dockerfile 构建镜像,运行容器的示例就完成了!

    参考文献


    作  者:Angel_Kitty 
    出  处:https://www.cnblogs.com/ECJTUACM-873284962/ 
    关于作者:阿里云ACE,目前主要研究方向是Web安全漏洞以及反序列化。如有问题或建议,请多多赐教!  

    展开全文
  • Docker——入门实战

    万次阅读 多人点赞 2018-07-18 09:09:35
    I. Docker 简介 Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。...其他的Docker简介也不需要过多介绍,可以参考很流行的《Docker — 从入门到实践》。关于博客,文末列出了最近在掘金上看到...
  • Docker新手入门:基本用法

    万次阅读 2015-09-04 09:29:21
    Docker新手入门:基本用法1.Docker简介1.1 第一本Docker书工作中不断碰到Docker,今天终于算是正式开始学习了。在挑选系统学习Docker以及虚拟化技术的书籍时还碰到了不少麻烦,主要就是没有特别经典的书!Docker的...
  • 史上最简单的Docker入门教程

    万次阅读 多人点赞 2018-05-08 21:25:05
    Ubuntu Docker 安装 CentOS Docker 安装 Windows Docker 安装 MacOS Docker 安装 这里我的电脑是mac,采用brew安装,安装完毕记得更换国内的docker镜像源哦. 安装完毕,就开始使用,一探docker的神秘了. 开始之前...
  • docker入门(利用docker部署web应用)

    万次阅读 多人点赞 2020-10-09 11:31:08
    前言:本课程是在慕课网上学习 第一个docker化的java应用 课程时所做的笔记,供本人复习之用 目录 第一章 什么是docker 1.1 docker的发展史 1.2 docker国内应用史 1.3 什么是Docker 第二章 了解docker 2.1 ...
  • Docker 快速入门(一文上手 Docker

    千次阅读 2019-10-15 16:11:03
    通过本篇文章,就可以达到在 Window 或 Linux 上手 Docker(有点长,可以根据目录选择你需要的内容看) 什么是容器 1.1 用大白话介绍下什么是容器 1.2 再看下稍微正式些的说法 1.3 物理机、虚拟机、容器的区别...
  • Docker技术入门与实战》 http://pan.baidu.com/s/1kTxgrzx 更多运维学习资料 http://dou.bz/35ODPo
  • 与sgy一起开启你的Docker之路 关键词: Docker; mac; Docker中使用gdb无法进入断点,无法调试; 写在前面 这篇博客适合谁? 对于Docker并不了解,只是有一点模糊的感觉,觉得Docker可以当成虚拟机用之类的 只是...
  • 书籍推荐-docker入门书籍

    万次阅读 2018-10-15 20:00:38
    最近用到了docker,发现还真的是不错,学习用的参考资料是《第一本docker书》。建议想学的人从这本书入门,其中的代码片段敲一敲就会了。下面是书籍的名人推荐:   Docker 中文社区和 docker.cn 项目创始人,...
  • Docker入门到实践 | PDF书

    千次阅读 2019-08-11 14:55:56
    Docker入门到实践 | PDF书 可以先看再实践 链接:https://pan.baidu.com/s/1fJTsbE8K3oRhDY_Sb_zjcA 提取码:lmca
  • Docker系列

    万次阅读 2020-05-08 00:25:15
    记性也越来越差了,最近准备推进知识体系的梳理和整理 Docker断断续续使用过,但一直没有整理过,这里完成相关...Docker系列(4) docker 入门 Docker系列(5) docker 容器使用 Docker系列(6) docker镜像使用 D...
  • Docker入门到实践

    万人学习 2019-06-26 11:44:23
     《Docker技术入门到实战》分为三大部分:Docker入门、实战Dockerfile和话题。第一部分 介绍Docker与虚拟化技术的基本概念,包括安装、镜像、容器、仓库、数据管理等;第二部分 通过案例介绍Docker的应用方法,包括...
  • 关于Docker如何安装,请参阅上一篇文章:Docker入门之 - 如何安装Docker CE 1、Docker官方国内源 https://www.docker-cn.com/registry-mirror 2、DaoCloud国内源 在DaoCloud注册后,系统会为你分配一个Docker ...
  • Docker入门到精通

    万次阅读 2019-01-10 14:39:29
    1. Docker简介 Docker官方网址: https://docs.docker.com/ 英文地址 Docker中文网址: http://www.docker.org.cn/ 中文地址 Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotClouw公司。...
  • Docker官方教程中文版(MAC版)

    万次阅读 2016-02-24 16:07:16
    在学习Docker的过程中仔细的阅读了官方的入门教程, 为加深学习的印象, 翻译此教程, 也同时方便他人学习使用.目录 开始使用Docker 在OS X安装Docker 理解镜像(images)和容器(containers) 搜索&运行whalesay镜像 构建...
  • docker-入门

    万次阅读 2020-09-27 09:11:56
    以下文章了解之后你可以在服务器上部署项目,本地不需要安装 tomcat,jdk,mysql等服务器,通过docker可以一键解决 快速入门 安装docker $ apt install docker.io -y 若找不到资源,需要更新资源库,命令为: $ ...
  • 开始使用Docker

    千次阅读 2016-02-18 11:27:27
    这篇入门教程是写给Mac OS X用户的, 如果你没有使用Mac OS X, 请看Linux 和 Windows 版本的教程这篇入门教程是面向没有技术基础的, 同时又对Docker感兴趣并愿意学习的用户. 跟着这篇教程, 通过做一些简单的任务, 你...
1 2 3 4 5 ... 20
收藏数 29,753
精华内容 11,901
关键字:

docker入门