Docker最全教程——从理论到实战(四)

往期内容连接

http://www.javashuo.com/article/p-zwsmmmid-bm.htmlhtml

http://www.javashuo.com/article/p-ewonxmgb-eq.html前端

http://www.javashuo.com/article/p-cyahnits-ep.htmlnode

 

在笔者参加腾讯容器服务技术交流会时,咱们了解到了藏区牧民的目前的生活艰辛情况,所以除了在同事朋友之间推荐其土特产以外,咱们也在此进行初步分享,但愿略尽绵薄之力,可以帮助到他们:linux

货真价实、确保都是3700米海拔以上的超风干牦牛肉,115元一斤包邮(货真价实、低于淘宝京东、咱们不赚差价),有香辣、五香两种口味,三斤牦牛肉才能作出一斤超风干牛肉!但愿这个冬天,咱们可以给他们一点点温暖!有购买意向的朋友能够联系博主。git

 

 

建立自定义 Docker 镜像

 

建立了Dockerfile以后,需为应用程序中的每项服务建立一个相关镜像。若是应用程序由单个服务或 Web 应用程序组成,则只需建立一个镜像。github

咱们可使用docker build命令来建立镜像,例如:web

docker build ./ -t {镜像名称}redis

镜像打包好后,咱们使用docker image ls命令便可查看当前镜像:sql

注意:Docker镜像使用分层存储的架构,也就是说镜像实际是由多层文件系统联合组成。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在本身这一层。由于分层存储的特征,使得镜像的复用、定制变的更为容易。甚至能够用以前构建好的镜像做为基础层,而后进一步添加新的层,以定制本身所需的内容,构建新的镜像。因此,当咱们使用Docker images命令,会列出这么多的镜像,咱们能够按期清理那些无用的镜像。docker

若是使用 Visual Studio 建立带 Docker 支持的项目时,不会显式建立镜像。咱们按下 F5 并运行时,VS就会自动建立镜像,不会出现明显的过程(在输出面板能够了解整个过程,以下图所示),但咱们须要了解其原理,不然出现问题将无从下手。

 

在 docker-compose.yml中定义服务

 

关于Compose

Compose是一个用于定义和运行多Docker应用程序的工具。使用Compose,咱们可使用YAML文件来配置应用程序的服务。而后,使用单个命令,咱们就能够从配置中建立并启动全部服务。

Compose适用于全部环境:生产环境、模拟(演示)环境、开发环境和测试环境以及CI工做流程。

主要功能和特性:

  • 单个主机上的多个隔离环境

    Compose使用项目名称来隔离环境,所以能够根据不一样的环境要求来进行定义。

  • 建立容器时保留卷数据

    Compose会保留服务使用的全部卷和数据。当使用docker-compose up命令运行时,若是发现该服务以前运行过,它会将进行增量操做,可确保在卷中建立的数据都不会丢失。

  • 仅从新建立已更改的容器

    Compose存在缓存,可用于建立容器。当从新启动未更改的服务时,Compose将重用现有容器。

  • 能够定义变量,并且能够根据不一样环境不一样用户之间进行组合使用

    Compose支持Compose文件的变量定义,咱们可使用这些变量为不一样环境或不一样用户进行自定义组合。

另外,Compose可以经过命令管理应用程序的整个生命周期,经过命令能够:

  • 启动,中止和重建服务等

  • 查看正在运行的服务的状态

  • 经过流输出正在运行的服务的日志

  • 对某个服务执行命令

注意:Docker for Windows安装包括:安装提供 Docker Engine,Docker CLI客户端,Docker Compose,Docker Machine和 Kitematic。也就是若是是使用Docker for Windows的用户,无需再独立安装Docker Compose。

咱们能够经过运行如下命令来确认咱们本地的环境:

docker-compose -v

 

常见场景

  • 开发或本地环境运行多个服务

    在开发过程时,在隔离环境中运行应用程序并与之交互的能力相当重要。Compose命令行工具可用于建立环境并与之交互。好比经过Compose文件,配置全部应用程序的服务依赖(数据库,消息队列,高速缓存,Web服务的API,等等),而后使用单个命令(docker-compose up)为每一个依赖项建立和启动一个或多个容器,使整个程序可以正常运行起来。

  • 自动化测试环境

    任何持续部署或持续集成过程的一个重要部分是自动化测试套件。自动化端到端测试须要一个运行测试的环境。Compose提供了一种方便的方法来建立和销毁隔离的测试环境。咱们只须要经过在Compose文件,便可定义完整环境,而且能够在几个命令中建立和销毁这些环境,以下所示:

  • 单主机部署

 

使用Compose

使用Compose有如下三个步骤:

  1. 使用Dockerfile定义应用环境,以便在任意地方进行复制

  2. 在 docker-compose.yml 中定义组合应用,以便它们能够在隔离的环境中一块儿运行

  3. 最后,执行docker-compose up命令,Compose 将启动并运行整个应用程序。

因而可知,第二步决定了Compose的执行,一个简单的docker-compose.yml文件以下所示:

其定义了web和redis两个应用。接下来,咱们一块儿来了解docker-compose.yml 文件。

 

了解docker-compose.yml

借助 docker-compose.yml 文件,咱们能够定义一组相关服务,经过部署命令将其部署为组合应用程序。简单的说,咱们能够经过docker-compose.yml来定义多个服务,以便一次执行。

这里笔者以Magicodes.Admin为例,基础框架提供了后台接口服务以及后台前端应用两个,那么咱们能够定义docker-compose.yml 文件以便部署为组合应用程序,也就是说,一个命令托管和运行多个服务:

以上是一个简化的配置,定义了两个服务以及环境变量和端口。值得说明的是,在docker中咱们没法访问localDb,这时咱们建议访问独立的数据库服务或者使用数据库镜像,例如:

sql.data:

image: mssql-server-linux:latest

environment:

- SA_PASSWORD=Pass@word

- ACCEPT_EULA=Y

ports:

- "5433:1433"

注意:SQL Server也提供了Docker镜像,而且支持Linux容器。在上面的配置中,经过环境变量设置了sa帐号的密码。值得注意的是,咱们并不推荐在生产环境中使用数据库的容器镜像来托管数据,这点咱们后续再来详聊。

 

了解YAML语言

不少教程并不会讲述这点,可是笔者认为这点也很是重要,由于了解YAML的语法和规范,能够在开发调测的过程当中避免不少错误,也便于咱们更好的配置基于YAML语法的文件——好比docker-compose.yml文件。

 

什么是YAML?

YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。

这里提供一个YAML语法验证网站:http://nodeca.github.io/js-yaml/

基本规则

  1. 大小写敏感

  2. 使用缩进表示层级关系

  3. 禁止使用tab缩进,只能使用空格键

  4. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级

  5. 使用#表示注释

  6. 字符串能够不用引号标注

YAML中容许表示三种格式,分别是常量值,对象和数组,以下所示:

对于YAML的讲解,咱们就说到这里,咱们继续本篇内容。

 

docker-compose.yml文件配置项

docker-compose.yml 文件不只指定正在使用的容器,还指定如何单独配置各容器。经常使用的配置项以下所示:

  • build:定义镜像生成,能够指定Dockerfile文件所在的目录路径,支持绝对路径和相对路径;

  • image:从指定的镜像中启动容器,能够是存储仓库、标签以及镜像 ID,若是镜像不存在,Compose 会自动拉去镜像;

  • environment:定义环境变量和配置;

  • ports:定义端口映射,好比上面配置中将容器上的公开端口 80 转接到主机上的外部端口 9901和9902;

  • depends_on,定义依赖关系。此定义会让当前服务处于等待状态,直到这些依赖服务启动。好比某个服务依赖数据库服务,那么经过此配置解决了服务的启动顺序的问题;

  • volumes,挂载一个目录或者一个已存在的数据卷容器,能够直接使用 HOST:CONTAINER 这样的格式,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来讲,数据卷是只读的,这样能够有效保护宿主机的文件系统;

  • context,指定Dockerfile 的文件路径,也能够是到连接到 git 仓库的 url;

  • args,指定构建参数,这些参数只能在构建过程当中访问;

  • target,定义构建指定的阶段Dockerfile,好比针对不一样阶段使用不一样的dockerfile,开发阶段使用支持编译调试的dockerfile,而生产环境,则使用轻量级的dockerfile;command,覆盖默认命令;

  • container_name,指定自定义容器名称,而不是生成的默认名称。

因为篇幅有限,咱们就不提供过多介绍和示例了。不过咱们建议你们访问此地址,来作一个全面的了解:

https://docs.docker.com/compose/compose-file/#reference-and-guidelines

最后,分享几个小技巧:

  • 能够经过配置项depends_on来定义依赖关系,这点对于控制服务的执行顺序尤其重要,好比先启动数据库而后再启动web服务。

  • 如何使用JSON文件进行配置?能够指定文件名称,以下所示:

    docker-compose -f docker-compose.json up

  • 如何分阶段构建?推荐使用target配置项。

 

Visual Studio和docker-compose

咱们定义完docker-compose.yml以后,若是是使用Visual Studio进行开发,经过其Docker tool会让开发调测变得很是简单和易用。对于未启用docker支持的项目,咱们能够经过右键菜单进行启用:

启用以后,会自动添加相关支持(包括生成dockerfile、docker-compose.yml以及.dockerignore等),而后经过其docker工具能够直接启动运行而且支持调试,以下图所示:

点击工具栏的【Docker】按钮或者按下【F5】都可直接运行并调试,启动后以下图所示:

运行完成后,VS还会自动打开相关服务的默认页。

若是不依赖Visual Studio进行运行,咱们在下节进行讲述。

相关文章
相关标签/搜索