一、Docker概述

1.1、虚拟化技术发展史

    在虚拟化技术出现之前,如果我们想搭建一台服务器,我们需要做如下的工作:

→ 购买一台硬件服务器。
→ 在硬件服务器上安装配置操作系统系统。
→ 在操作系统之上配置应用运行环境。
→ 部署并运行应用。

    这种方式的缺点就是:

  1. 部署应用非常慢。
  2. 需要花费的成本非常高(时间成本、服务器成本)。
  3. 应用迁移麻烦;要将应用迁移,又得重复部署应用。

    所以,为了解决这个问题,后续出现了虚拟化技术。

1.2、虚拟化技术

    虚拟化(英语:Virtualization)是一种计算机资源管理技术,是将计算机的各种硬件资源,比如服务器、网络、CPU、内存及存储等,予以抽象和转换后呈现出一套新的硬件资源环境,在这一套新的硬件环境下可以安装我们的操作系统,部署我们的应用运行环境等,它打破计算机硬件资源不可切割的障碍,使我们可以比原本的计算机硬件资源结构更好的方式来组合应用这些资源。

1.3、虚拟化技术的优缺点

1.3.1、虚拟化技术的优点

    一台物理服务器可以虚拟化出多个虚拟的服务器,让计算机资源得以充分利用。

1.3.2、虚拟化技术的缺点

  1. 每创建一个虚拟机的时候,都会创建一个操作系统,这个操作系统会占用很多资源,这样无疑大大的增加了资源的消耗,当安装的虚拟机越多,资源消耗就越多。
  2. 环境兼容性问题,开发时的环境运行正常,部署到虚拟机环境测试则有可能发生错误。

1.4、虚拟化分类

        虚拟化一般分为:

  1. 硬件级虚拟化(hardware-level-virtualization)
  2. 操作系统级虚拟化(os-level-virtualization)

1.4.1、硬件级虚拟化

    硬件级虚拟化 是运行在硬件之上的虚拟化技术,它的核心技术是Hypervisor 发音 [haipə’vaizə],Hypervisor 是一种运行在基础物理服务器硬件之上的软件层,可以虚拟化硬件资源,例如 cpu、硬盘、内存资源等。然后我们可以通过在虚拟化出来的资源之上安装操作系统,这也就是所谓的虚拟机。像 VMWare, VirtualBox 等都是使用该技术,我们经常使用的桌面版的虚拟机 VMWare 就是采用这种虚拟化技术。

image-20210525113850636

    通过 Hypervisor 层,我们可以创建不同的虚拟机,并且每个虚拟机都是分离、独立的,这样一来,我们就可以在一台硬件服务器和本地操作系统之上虚拟化出多个服务器,用来部署我们的应用

1.4.2、操作系统级虚拟化

    操作系统级虚拟化,也被称作容器化,是操作系统自身的一个特性,它允许多个相互隔离的用户空间实例的存在。这些用户空间实例也被称作为容器。普通的进程可以看到计算机的所有资源而容器中的进程只能看到分配给该容器的资源。

    通俗来讲,操作系统级虚拟化将操作系统所管理的计算机资源,包括进程、文件、设备、网络等分组,然后交给不同的容器使用。容器中运行的进程只能看到分配给该容器的资源。从而达到隔离与虚拟化的目的。

1.5、容器技术的发展

    基于硬件级虚拟化技术的缺点和不足,后续又发展出来了另一种虚拟化技术,即操作系统级虚拟化技术。

    操作系统级虚拟化 是运行在操作系统之上的虚拟化技术,它模拟的是运行在一个操作系统上的多个不同进程,并将其封装在一个密闭的容器里面,该技术也称为容器化技术。

    在容器化技术领域,Docker 是目前最流行的一种实现。Docker 发布于 2013 年,Docker 基于 LXC 技术,LXC 是 Linux 平台上的容器化技术实现。

    LXC 是 Linux Container 的简写,它是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,它与宿主机使用同一个内核,性能损耗小,这种技术是 Linux 提供的,但是直到 Docker出世,该技术才被发挥出来。

1.6、Docker的发展史

image-20210525114439924

    2010年,几个年轻人在旧金山成立了一家做PaaS(Platform as a Service,平台及服务)平台的创业公司,起名为 dotCloud,并且还获得了创业孵化器 Y Combinator 的支持,虽然 dotCloud 期间获得过一些融资,但随着 IT 巨头(微软、谷歌、亚马逊等)也杀入 PaaS 平台,dotCloud举步维艰。

    2013 年,dotCloud 的创始人,28 岁的 Solomon Hykes 做了一个艰难的决定:将 dotCloud 的核心引擎开源,这项核心引擎技术能够将 Linux容器中的应用代码打包,轻松的在服务器之间迁移。

    然而这个基于 LXC(Linux Container)技术的核心管理引擎开源后,让全世界的技术人员感到惊艳,感叹这一切太方便了!也正是dotCloud 的创始人这个艰难的孤注一掷的决定让所有的 IT 巨头们也为之一颤。

    从 2013 年 Docker 开源开始,Docker 技术风靡全球,于是 dotCloud公司决定将 Docker 作为主要业务进行发展,并把公司改名为 DockerInc,全身心投入到 Docker 的开发中,并于 2014 年 8 月,Docker 宣布把 PaaS(Platform as a Service,平台及服务)业务 dotCloud 出售给位于德国柏林的同样专注于平台即服务业务的提供商 cloudControl,从此 Docker 可以轻装上阵,专注于 Docker 的研发。

    从 2013 年 2 月决定开源,到 2013 年 3 月 20 日发布 Docker 0.1,只用了一个月时间。当前 Docker 的最新版本是 18.03。

    Docker 迅速成长,在 2014 年 6 月 9 日,Docke 团队宣布发布 Docker1.0,1.0 版本标志着 Docker 平台已经足够成熟,并可以被应用到生产产品中(还提供了一些需要付费的支持选项)。

    一年的时间,使一个围绕着 Docker 的小型初创企业生态体系逐渐形成。Docker 先后赢得了 Google、 微软、Amazon、VMware 等 IT 巨头的青睐,他们纷纷表示将保证自己平台与 Docker 容器技术的兼容性。

    2016 年 2 月 29 日,CloudControl 公司在其官方博客中宣告即将破产,隶属于cloudControl公司的dotCloud也宣布将于2月29日关闭服务。作为 Docker 的前身,DotCloud 目睹 Docker 的成长,成为云平台的一颗新星,而自己却力不从心,Docker 的繁荣间接地导致 Docker 的前身 dotCloud 在 PaaS 平台的衰败,兴衰成败,令人唏嘘不已,这也许是颠覆式创新的经典案例。

1.7、Docker是什么

    Docker 是一个开源的应用容器引擎,它基于 Google 公司推出的Go 语言实现,项目代码托管在 GitHub 上进行维护;

    Docker 技术让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,打包好的容器可以发布到任何流行的 Linux 服务器上运行,这样就可以解决开发环境与运维环境不一致的问题了,所以容器技术解决了开发和运维之间的矛盾,让开发专注于开发,运维专注于运维,不要被环境问题所打扰。

    Docker 彻底释放了虚拟化的威力,极大降低了计算机资源供应的成本,Docker 重新定义了程序开发测试、交付和部署过程,Docker 提出了“构建一次,到处运行”的理念,让应用的开发、测试、部署和分发都变得前所未有的高效和轻松!

    Docker 是一种轻量级的操作系统虚拟化解决方案,Docker 的基础是 Linux 容器(LXC)技术,在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单;Docker 自开源后受到广泛的关注,Docker最早是基于Ubuntu开发的,但后续 CentOS、Debian、Fedora 等主流的 Linux 操作系统都支持 Docker。

    简单地说,Docker 是对软件和其依赖环境的标准化打包,应用之间相互隔离,共享一个 OS Kernel(解决了资源浪费的问题),可以运行在很多主流操作系统上,Docker 本身不是容器,Docker 只是管理容器的引擎。

1.8、容器和虚拟机器的区别

  1. 容器是将代码和环境的关系打包在一起的一个集合,而虚拟机是在物理层面上,分出来的一个操作系统。
  2. 多个容器可以运行在同一台物理服务器上,并共享一个操作系统的内核资源。多个虚拟机也可以运行在同一台机器上,但每个虚拟机都需要一个完整的操作系统。
  3. 容器是在本地操作系统层面上实现虚拟化,直接复用本地主机的操作系统,不需要单独安装操作系统,而传统的虚拟化技术方式则需要单独安装每个虚拟机的操作系统。
比较项容器虚拟机
启动时间秒级分钟级
硬盘空间一般为几十 MB一般为 10GB
性能接近原生接近原生
系统支持量单机支持上千个容器一般几十个
操作系统与宿主机共享OS宿主机上允许虚拟机的OS

1.9、为什么使用 Docker

    作为一种新兴的虚拟化技术,Docker 跟传统的虚拟化方式相比具有众多的优势。

  1. Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。
  2. Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
  3. 容器除了运行其中的应用外,基本不消耗额外的系统资源,使得应用的性能很高。传统虚拟机方式运行 10 个完全不同的应用可能我们会起 10 个虚拟机来部署,而 Docker 只需要启动 10 个隔离的应用即可。
  4. Docker 可以更快速的交付和部署,大量地节约开发、测试、部署的时间,对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
  5. 更高效的虚拟化,Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
  6. 更轻松的迁移和扩展,Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性可以让用户轻松地把一个应用程序从一个平台直接迁移到另一个平台。

二、Docker环境搭建

2.1、Docker版本

    Docker 从 2013 年 3 月 20 日发布 Docker 0.1,到现在已经发布了多个版本,从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。

  1. Docker CE:社区免费版,可永久免费使用。
  2. Docker EE:企业版,功能更全,更强调安全,但需付费使用。

2.2、Docker的安装

    CentOS7 系统可以直接通过 yum 进行安装。

查看是否已经安装了Docker

yum list installed | grep docker
# 如果有的话则删除对应的包
 yum remove docker...... 

使用yum进行安装

yum install docker -y

设置Decker开机自启

# 启动 docker 服务端
systemctl start docker

# 启用 docker 服务开机自启
systemctl enable docker

查看Docker版本检测是否安装成功

docker -v

image-20210525115800974

卸载Docker

yum remove docker.x86_64 -y
yum remove docker-client.x86_64 -y
yum remove docker-common.x86_64 -y

2.3、启动Docker

启动

systemctl start docker 
# 或者使用这一条也可以
service docker start

停止

systemctl stop docker
# 或者使用这一条
service docker stop

重启

systemctl restart docker 
# 或者使用这一条也可以
service docker restart

检查 docker 进程的运行状态

systemctl status docker
# 或者是这一条也可以
service docker status

查看 docker 进程

ps -ef | grep docker

三、Docker的初体验

3.1、Docker的运行机制

    Docker 并不是容器,而只是一个管理容器的引擎,Docker 的底层运行原理:Docker 服务启动→下载镜像→启动该镜像得到一个容器→容器里运行着我们想要的程序。

image-20210525123818483

3.2、运行Docker容器

    我们在启动Docker容器的时候,需要去下载一个镜像,Docker 运行一个容器前需要本地存在有对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库 )。

    从 docker hub 官网搜索要使用的镜像,也可以在命令行使用命令搜索要使用的镜像,比如 docker search tomcat 进行搜索,然后下载所需要的镜像。

# 下载Tomncat镜像
docker pull tomcat

# 运行镜像,他默认是前台运行,如果是后台运行的话需要加一个参数 -d
docker run tomcat

# 检查 tomcat 镜像是否启动容器成功
ps -ef | grep tomcat 

我们可以使用命令查看本地已有的镜像。

docker images

image-20210525124852357

    在列出信息中,可以看到几个字段信息:

  1. REPOSITORY:来自于哪个仓库。
  2. TAG:镜像的标记。
  3. IMAGE ID:镜像的 ID 号(唯一)。
  4. CREATED:创建时间。
  5. SIZE:镜像大小。

3.3、进入Docker容器

# 命令格式
docker exec -it 容器id bash

# 退出容器
exit

    其中 i 表示交互式的,也就是保持标准输入流打开。t 表示虚拟控制台,分配到一个虚拟控制台

3.4、客户机访问容器

    从客户机上访问容器,需要有端口映射,docker 容器默认采用桥接模式与宿主机通信,需要将宿主机的 ip 端口映射到容器的 ip 端口上。

# 启动容器
docker run -d -p 宿主机端口:容器端口 容器名称或者容器ID

# 停止容器
docker stop 容器 ID/名称

四、Docker 核心组件

4.1、Docker架构

    Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。

image-20210525130127521

    Docker 容器通过 Docker 镜像来创建,镜像与容器的关系类似于面向对象编程中的类与对象的关系。

Docker面向对象
镜像
容器对象

4.2、Docker 核心要素

image-20210525130657991

    Docker 包括三个核心要素:

  1. 镜像(Image)
  2. 容器(Container)
  3. 仓库(Repository)

4.3、镜像

4.3.1、镜像的概述

    Docker 镜像就是一个只读的模板,可以用来创建 Docker 容器。

    例如:一个镜像可以包含一个完整的 centos 操作系统环境,里面仅安装了 mysql 或用户需要的其它应用程序。Docker 提供了一个非常简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

4.3.2、镜像的构成

    镜像是由许多层的文件系统叠加构成的,最下面是一个引导文件系统bootfs,第二层是一个 root 文件系统 rootfs,root 文件系统通常是某种操作系统,比如 centos、Ubuntu,在 root 文件系统之上又有很多层文件系统,这些文件系统叠加在一起,构成 docker 中的镜像。

4.3.3、镜像的操作

下载镜像

# 下载一个1redis镜像
docker pull redis:latest

    reids 是查询到的镜像名称,latest 是镜像的标签 tag,获取一个镜像有两种方式:

  1. 一种是从官方镜像仓库下载。
  2. 另一种是自己通过 Dockerfile 文件构建。

    如果有官方镜像,我们就不必自己用 Dockerfile 文件构建了,除非官方没有才会自己去 Dockerfile 文件构建。

列出已经下载的镜像

# 语法格式为:docker images [OPTIONS] [REPOSITORY]
# -a :表示列举出所有的镜像,默认并不显示中间层的镜像1
# -q :表示只显示出镜像的1唯一id
docker images
# 或者是
docker images redis

运行镜像

# 其中-d 表示在后台运行
docker run -d redis

查看redis进程

 ps -ef | grep redis 

查看容器镜像状态

docker ps

进入容器

docker exec -it 镜像ID bash

删除镜像

docker rmi redis:latest 

4.3.4、构建镜像

    构建镜像可以让我们保存对容器的修改,并再次使用。提供了自定义镜像的能力,以软件的形式打包并方法服务及其运行环境。Docker中提供了两种方式来构建镜像:

  1. docker commit的方式,通过容器构建镜像。
  2. docker build方式,通过DockerFile文件构建。
4.3.4.1、使用commit方式构建镜像

使用commit构建镜像的语法格式为:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

    他有几个参数:

  1. -a:指定镜像的作者。
  2. -m:指定镜像提交的消息。
  3. -p:默认情况下使用commit构建镜像的时候会暂停服务器1,使用这个参数可以不暂停服务器。

    构建镜像的步骤:

创建一个容器

 # 创建一个端口为80名为commit_test的容器,并且指定基础镜像为centos
 docker run -itd --name commit_test -p 80 centos /bin/bash

在容器内部安装nginx

yum install -y epel-release
yum install -y nginx

提交镜像

# 语法格式:docker commit -a '作者信息' -m '镜像名称'  需要构建的镜像的名字 构建出来的镜像名称:版本
docker commit -a 'xiaolin' -m 'nginx_mirror' commit_test nginx_mirror:v1

查看

docker images

image-20210525192146437

启动容器

 # 这里的容器id要根据实际情况进行替换
 docker run -itd --name nginx_test2 -p 80 36210c82236d

进入容器

# 这里的容器id要根据实际情况进行替换
docker exec -it e231f1dfea62 bash
4.3.4.2、通过DockerFile文件

    后面进行详细介绍

4.4、容器

4.4.1、容器的概述

    容器是从镜像创建的运行实例。它可以被启动、停止、删除。每个容器都是相互隔离的、保证安全平台。可以把看做一个简易版的 Linux环境,包括 root 用户权限、进程空间、用户空间和网络空间和运行在其中的应用程序。

Docker 利用容器来运行应用,镜像是只读的。

4.4.2、容器的操作

通过镜像启动容器

    命令会检测当前要运行的镜像在本地存不存在,若不存在他会自动 pull 下来再运行运行后会启动一个容器,,并且开启一个文件系统,。

    你可以直接在容器内创建文件夹,运行一个指定的程序, 当程序退出后, 容器也就退出了。

    运行时的容器无法删除, 只能停止后删除, 或者加上 -f 参数强制删除

# 语法格式为 docker run 容器名字
docker run -d redis

启动守护式容器

# i --interactive=true|false 默认是false:允许你对容器内的标准输入 (STDIN) 进行交互
# t --tty=true|false 默认是false:在新容器内指定一个伪终端或终端
docker run -i -t 容器名 /bin/bash

# 示范
docker run -i -t centos /bin/bash

退出守护容器

exit

查看运行中的容器

# -a 表示列举所有容器
# -i 表示列举最近创建的容器
docker ps [-a] [-l]

查看所有的容器

docker ps -a

查看所有容器id

docker ps -aq

停止容器

docker stop 容器id或容器名称

重启容器

docker start 容器id或容器名称

删除容器

# 删除容器时,容器必须是停止状态,否则会报错
docker rm 容器id或容器名称

进入容器

docker exec -it 容器 id 或容器名称 bash

查看容器更多信息

docker inspect  容器id或容器名称

停用全部运行中的容器

docker stop $(docker ps -q)

删除全部容器

docker rm $(docker ps -aq)

停用并删除容器

docker stop $(docker ps -q) & docker rm -f $(docker ps -aq)

4.4.3、守护式容器

    守护式容器就是一个可以长期运行的容器,我们之前创建的容器大多数都是刚刚创建完就关闭了。守护式容器的优点:

  1. 能长期运行。
  2. 适合运行运用1程序和服务。

以守护形式运行容器

docker run -i -t 容器名 /bin/bash
# 例子(创建一个容器并且指定基础镜像)
docker run -i -t centos /bin/bash

退出但不关闭容器

Ctrl+P 和 Ctrl+Q

附加到运行中的容器

docker attach 容器名

启动守护式容器

docker run -d 镜像名

查看容器运行日志

# -f 一致跟踪日志的变化,并返回结果
# -t 默认为false 在返回的结果上加上时间戳
# --tail = “all” 返回后几行的日志数据
docker logs [-f] [-t] [--tail] 容器名

查看容器内1进程

docker top 容器名

停止守护式进程

# 发送一个信号给容器,等待容器的关闭
docker stop 容器名
# 直接停止容器
docker kill 容器名

4.5、仓库

4.5.1、仓库的概述

    仓库是集中存放镜像文件的场所,有时候会把仓库和仓库注册服务(Registry)看做同一事物,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

    仓库分为公开仓库(Public)和私有仓库(Private)两种形式,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。用户也可以在本地网络内创建一个私有仓库,当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公
有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来即可。

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。

4.5.2、仓库的操作

搜索镜像

docker search redis

image-20210525165751669

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
从左往右的参数依次是:镜像名字、镜像描述、镜像星数、是否官方创建、是否自动创建。

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
官方的镜像说明是官方项目组创建和维护的,AUTOMATED资源允许用户验证镜像的来源和内容。

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
根据是否是官方提供,可将镜像资源分为两类:

  1. 类似Centos这样的基础镜像,这些基础镜像是由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。
  2. 另一种是类似bitnami/redis镜像,它是由Docker用户创建1并且1维护的,往往带有用户名前缀。

下载镜像

docker pull redis # 后面可接版本号
docker pull redis4.x

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
我们发现,镜像的下载速度是出奇的慢,所以我们需要配置阿里的镜像加速器进行下载。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://175i7vum.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

五、Docker安装软件

5.1、Docker安装MySQL

拉取镜像

# 安装的是 mysql 8.0
docker pull mysql:latest

启动容器

# -e是指定环境变量
docker run -p 3306:3306 -e MYSQL_DATABASE=workdb -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

进入容器

# 这里的容器id要根据实际情况替换
docker exec -it 3e8bf7392b4e bash

登录 MySQL

mysql -u root -p

修改密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

授权远程登录访问

CREATE USER 'wkcto'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; 
GRANT ALL PRIVILEGES ON *.* TO ' wkcto'@'%';

5.2、Docker安装Nginx

拉取镜像

docker pull nginx

启动容器

docker run -d -p 80:80 nginx

进入容器

# 这里的容器id要根据实际情况替换
docker exec -it 3e8bf7392b4e bash

5.3、 Dokcer安装Zookeeper

拉取镜像

docker pull zookeeper

启动容器

docker run -p 2181:2181 -d zookeeper

进入容器

# 这里的容器id要根据实际情况替换
docker exec -it 3e8bf7392b4e bash

六、Docker 自定义镜像

6.1、认识 Dockerfile文件

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
Dockerfile 用于构建 Docker 镜像,Dockerfile 文件是由一行行命令语句组成,基于这些命令即可以构建一个镜像。

6.2、Dockerfile的基本结构

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
我们一般把Dockerfile文件分为四部分:

  1. 基础镜像信息。
  2. 维护者信息
  3. 镜像操作指令。
  4. 容器启动时执行指令。

6.3、Dockerfile指令

6.3.1、FROM

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。Dockerfile 文件的第一条指令必须为 FROM 指令。并且,如果在同一个 Dockerfile 中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次),他所指定的镜像比如是已经存在的镜像,我们称为基础镜像,语法格式:

FROM 镜像名称
# 或者是
FROM 镜像名称:版本号

6.3.2、MAINTAINER

用于指定作者信息,语法格式为:

MAINTAINER 作者名称

6.3.3、RUN

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像,当命令较长时可以使用 \ 来换行。每个RUN命令都会在当前镜像的上层创建一个新的镜像来运行指令,语法格式为:

RUN 需要执行的命令
# 示范
RUN echo xiaolin

6.3.4、EXPOSE

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
指定运行该镜像的容器使用的端口,虽然我们在构建镜像的时候暴露了端口号,但是我们在运行容器的时候依然需要指定端口的映射。
我们使用EXPOSE只是告诉Docker运行该镜像的容器会使用80端口,出于安全的考虑,Docker并不会打开该端口,所以我们需要在使用该镜像运行容器的时候指定端口的映射。语法格式为:

EXPOSE 端口号

6.3.5、CMD

    Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
CMD指令提供容器默认运行的命令,RUN指令类似.都是执行一个命令。但是RUN命令指定的命令是在镜像构建的过程运行的,CMD的命令是在容器运行的时候运行的。
    如果我们在docker run命令中指定运行的命令的时候,CMD的指令会被覆盖,默认命令就不会执行。

6.3.6、ENTRYPOINT

    这个命令和1CMD指令十分相似,他和RUN指令不同的是,他不会被docker run的启动命令给覆盖。

6.3.7、ADD

    将文件和目录复制到使用dockerfile构建的镜像中,目标的来源可以本地的地址也可以是远程地址.。

    如果是本地地址,本地地址必须是构建目录中的相对地址。对于远程URL,docker并不推荐使用,更建议使用的是curl或者wget的命令来获取,目标路径需要指定镜像中的绝对路径。

6.3.8、VOLUME

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

6.3.9、WORKDIR

    这个指令是从指令创建一个容器,在容器内部设置工作目录。ENTRYPOINT和CMD的命令都会在这个目录下执行,我们也可以使用这个命令给后续的构建中指定工作目录。通常会使用绝对路径,如果使用了相对路径,那这个路径会一致传递下去。

6.3.10、USER

        指定镜像会以什么样的用户去运行,如果没有指定USER,容器会使用root用户来运行。语法格式:

USER xiaolin

6.3.11、ONBUILD

    镜像触发器,当一个镜像被其他镜像作为基础镜像时执行,会在构建过程中插入指令。

6.3.12、ENV

    这个指令主要是来设置环境变量,这个环境变量在构建过程中和运行过程中都有效。比如配置JDK环境:

ENV JAVA_HOME /usr/local/jdk1.8.0_121
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin

6.4、使用DockerFile自定义镜像

我们创建存放Dockerfile文件的目录和Dockerfile文件

编写Dockerfile文件

from centos:latest
maintainer xiaolin
RUN yum install -y epel-release
RUN yum install -y nginx
EXPOSE 80

使用build命令构建镜像

docker build -t 'nginx_mirror' .

通过镜像构建容器

# -p 80后面接的是你build的时候指定的名字
docker run -itd --name nginx_env1 -p 80 nginx_mirror
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐