这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操

时间:2022-07-25
本文章向大家介绍这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

文章目录

一、Compose简介

Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。它是一个定义和运行多容器的docker应用工具。使用compose,你能通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务。

Compose是一个定位“定义和运行多个Docker容器应用的工具”,其前身是Fig,目前使用的Compose仍然兼容Fig格式的模板文件。 Compose的代码主要使用Python编写,其开源地址为:https://github.com/docker/compose。

注意:Fig时代支持的配置文件名为fig.yml以及fig.yaml;为了兼容遗留的Fig化配置,目前Compose支持的配置文件类型非常丰富,主要有以下几种:fig.yaml、docker-compose.yml、docker-compose.yaml以及用户指定的配置文件路径。(可通过环境变量COMPOSE_FILE或-f参数自定义配置文件)

1、在Compose中有两个重要的概念

  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目(project):由一组关联的应用容器组成的一个完成业务单元,在docker-compose.yml中定义。

以上可以理解为: 服务(service)就是在它下面可以定义应用需要的一些服务,代表配置文件中的每一项服务。每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等,即以容器为粒度,用户需要Compose所完成的任务。 项目(project)代表用户需要完成的一个项目,即是Compose的一个配置文件可以解析为一个项目,即Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操作。

Compose的默认管理对象时项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

2、docker,dockerfile与docker-compose区别

docker 和操作系统无关的一个沙箱容器,宿主机安装的什么操作系统和其本身无关,在它基础上可以制作各种系统类型的基础服务 Dockerfile 是把我们手工安装docer镜像的过程变成一个配置文件的方式运行,这样每次不用一步步手敲命令去安装了,而只是需要一个配置文件运行既可生成一个镜像 docker-compos 提供了服务和项目的概念,这样一个服务可以配置多个项目,这个服务是多个项目的集合体,启动和关闭都相对一个一个项目的启动要方便很多

假如你不用 docker ,搭建 wordpress 怎么弄?

  • 1.买台服务器 server ,假设其 OS 为 Ubuntu ,然后按照文档一步步敲命令,写配置,对吧?
  • 2.用 docker 呢? 随便找台 server ,不管什么操作系统,只要支持 docker 就行, docker run ubuntu, docker 会从官方源里拉取最新的 Ubuntu 镜像,可以认为你开了个 Ubuntu 虚拟机,然后一步步安装,跟上面一样。 但是这样安装有个显著的缺点,一旦 container 被删,你做的工作就都没了。当然可以用 docker commit 来保存成镜像,这样就可以复用了。 但是镜像文件一般比较大,而且只分享镜像的话,别人也不知道你这镜像到底包含什么,这些问题都不利于分享和复用。 一个直观的解决方案就是,写个脚本把安装过程全部记录下来,这样再次安装的时候,执行脚本就行了。 Dockerfile 就是这样的脚本,它记录了一个镜像的制作过程。
  • 3.有了 Dockerfile, 只要执行 docker build . 就能制作镜像,而且 Dockerfile 就是文本文件,修改也很方便。 现在有了 wordpress 的镜像,只需要 docker run 就把 wordpress 启动起来了。 如果仅仅是 wordpress, 这也就够了。但是很多时候,需要多个镜像合作才能启动一个服务,比如前端要有 nginx , 数据库 mysql, 邮件服务等等,当然你可以把所有这些都弄到一个镜像里去,但这样做就无法复用了。 更常见的是, nginx, mysql, smtp 都分别是个镜像,然后这些镜像合作,共同服务一个项目。
  • 4.docker-compose 就是解决这个问题的。你的项目需要哪些镜像,每个镜像怎么配置,要挂载哪些 volume, 等等信息都包含在 docker-compose.yml 里。 要启动服务,只需要 docker-compose up 就行,停止也只需要 docker-compse stop/down

简而言之, Dockerfile 记录单个镜像的构建过程, docker-compse.yml 记录一个项目(project, 一般是多个镜像)的构建过程。

你说有些教程用了 dockerfile+docker-compose, 是因为 docker-compose.yml 本身没有镜像构建的信息, 如果镜像是从 docker registry 拉取下来的,那么 Dockerfile 就不需要; 如果镜像是需要 build 的,那就需要提供 Dockerfile.

二、Compose安装与卸载

1、Centos系统安装

Compose安装 Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker,对于Mac OS和Windows的安装比较容易,可以参考Install Docker for Mac和Install Docker for Windows,对于Linux的安装可以参考Ubuntu下docker安装及简单应用。

Linux平台的安装 这里是使用了官方编译好的二进制包,地址:https://github.com/docker/compose/releases。把这些二进制文件下载后直接放到执行路径下面,并添加权限即可。

curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

然后我们执行docker-compose -version可以查看到具体的信息

2、Compose卸载

如果是二进制包方式安装的,删除二进制文件即可:

sudo rm /usr/local/bin/docker-compose

三、Compose模板文件

模板文件是使用Compose的核心,涉及的指令关键字也比较多,大部分指令与docker run相关参数的含义都是类似的。 默认的模板文件迷城为docker-compose.yml,格式为YAML格式。 比如一个Compose模板文件:

version: "2"
services:
	web:
		images:	nginx
		ports:
			- "80:80"
		volumes:
			- "/data"
#volumes:

#networks:

Docker Compose的模板文件主要分为3个区域,为: services 服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等。

volumes 数据卷,在它下面可以定义的数据卷(名字等等),然后挂载到不同的服务下去使用。

networks 应用的网络,在它下面可以定义应用的名字、使用的网络类型等等。

注意:每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)等来自动构建生成镜像。如果使用build指令,在Dockefile中设置的选项(例如:CMD、EXPOSE、VOLUME、ENV等)将会自动被获取,无需在docker-compose.yml中再次设置。

1、Docker Compose配置常用字段

常用字段在上述的yml文件格式中有过一些解释,下面是详细解释

2、Docker Compose常用命令

基本的命令格式:docker-compose [选项] [命令] [参数]

docker-compose选项

–verbose:输出更多调试信息

–version:打印版本并退出

-f、–file FILE:使用特定的compose末班文件,默认为docker-compose.yml

-p、–project-name NAME:指定项目名称,默认使用目录名称

3、YAML文件介绍

YAML是一种标记语言很直观的数据序列化格式,非常适合用来表达或者编辑数据结构、各种配置文件、文件大纲等,例如:许多电子邮件标题格式和YAML非常接近

文件格式以及编写注意事项

1、不支持制表符tab键缩进,需要使用空格缩进,使用缩进表示层级关系 2、通常开头缩进2个空格,缩进的空格数不重要,只要相同层级的元素左对齐即可 3、字符后缩进一个空格,如冒号、逗号、横杆 4、用#号注释 5、如果包含特殊字符用单引号引起来 6、布尔值必须用引号括起来

四、实验:使用Docker-Compose创建nginx

1、部署Docker-Compose环境

'//Docker都是已经部署好了的,这里不再赘述'
[root@docker ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose	'//在Linux上我们可以从GitHub上下载它的二进制包来使用,此命令是下载Docker Compose的当前稳定版本'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   638  100   638    0     0    149      0  0:00:04  0:00:04 --:--:--   149
100 10.3M  100 10.3M    0     0  18758      0  0:09:39  0:09:39 --:--:-- 17256
[root@docker ~]# chmod +x /usr/local/bin/docker-compose
[root@docker ~]# docker-compose -v	'//查看版本'
docker-compose version 1.21.1, build 5a3f1a3

2、使用Dockerfile定义应用程序的环境

[root@docker ~]# mkdir -p /compose_nginx/nginx	'//创建目录'
[root@docker ~]# cd /compose_nginx/nginx
[root@docker nginx]# rz -E	'//上传nginx源码包'
rz waiting to receive.
[root@docker nginx]# ls
nginx-1.12.2.tar.gz
[root@docker nginx]# vim Dockerfile
FROM centos:7
MAINTAINER build image nginx <tang>
RUN yum -y update
RUN yum -y install gcc gcc-c++ pcre* make cmake zlib-devel openssh* net-tools lsof telnet passwd vim
ADD nginx-1.12.2.tar.gz /usr/local/src
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/src/nginx-1.12.2
RUN (./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module)
RUN make && make install
ENV PATH /usr/local/nginx/sbin/:$PATH
#RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf	'//指关闭守护进程启动'
CMD ["nginx"]

3、使用docker-compose.yml定义构成应用程序的服务

[root@docker nginx]# cd ..
[root@docker compose_nginx]# vim docker-compose.yml
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      - cluster
networks:
  cluster:
[root@docker compose_nginx]# tree ./
./
├── docker-compose.yml
└── nginx
    ├── Dockerfile
    └── nginx-1.12.2.tar.gz

4、执行docker-compose up命令来启动并运行整个应用程序

[root@docker compose_nginx]# docker-compose -f docker-compose.yml up -d	'//指定ocker-compose.yml文件来启动'
[root@docker compose_nginx]# docker-compose ps	'//compose编排工具成功创建容器'
        Name            Command   State                      Ports                   
-------------------------------------------------------------------------------------
compose_nginx_nginx_1   nginx     Up      0.0.0.0:1217->443/tcp, 0.0.0.0:1216->80/tcp
[root@docker compose_nginx]# docker ps -a	'//容器创建成功'
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                         NAMES
5ecd884db086        compose_nginx_nginx   "nginx"             34 seconds ago      Up 33 seconds       0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp   compose_nginx_nginx_1
[root@docker compose_nginx]# docker images	'//镜像创建成功'
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
compose_nginx_nginx          latest              fd1cfaa3fa13        38 seconds ago      726MB
[root@docker compose_nginx]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:68:b8:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.233.133/24 brd 192.168.233.255 scope global noprefixroute ens33	'//此虚拟机IP地址为192.168.233.133,稍后用此地址测试nginx服务'
       valid_lft forever preferred_lft forever
    inet6 fe80::35a9:b12:5e2b:c44d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever