Docker从入门到DevOps,看完这个系列就够了(五)

为君一笑 提交于 2019-12-08 17:17:36

文章索引

Docker从入门到DevOps系列目录

前言

  1. 本系列适合想了解Docker和DevOps的同学,学完你将可以熟练使用Docker,熟练使用DevOps思想部署你的项目
  2. 本系列的每一行代码和命令都是确保可用的,请放心使用。
  3. 学习本系列需要搭建CentOS7环境,所有用到的软件将免费提供下载。戳此进入下载指引页面
  4. 学习本系列,最快的方法是先动手将软件安装好,并简单使用一下,然后再回头来看这篇文章,效果更佳。
  5. 帮你总结了Docker常用命令哦,戳此进入Docker命令大全。

本文所需脚本文件下载

学习本文需要docker-compose.yml文件以及env文件,请戳此下载。

docker-compose简介

在学习了上一章后,我们也大致学会了如何使用docker部署项目。但是我们会发现,使用docker部署一个项目还是比较麻烦的,尤其是docker的启动命令,动不动就会变得非常冗长。所以,为了解决docker部署的各种困难,实现一键部署,docker-compose就出现了。

docker-compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。这是比较官方的解释,实际上docker-compose将容器的启动参数,包括容器镜像、容器启动命令、容器挂载、容器环境变量等都写在一个配置文件中,可以说docker-compose其实是一个容器启动命令脚本,定义了多个容器的启动方式

docker-compose安装

安装docker-compose之前,我们首先要安装pip,按照以下步骤安装即可:

pip安装

  • 1.安装epel-release
yum -y install epel-release
  • 2.安装python-pip
yum -y install python-pip
  • 3.升级pip
pip install --upgrade pip
  • 4.安装依赖
yum install -y gcc libffi-devel python-devel openssl-devel 
  • 5.解决兼容
pip install 'more-itertools<=5.0.0'

到此,pip就安装配置完成了。下面我们利用pip安装docker-compose,输入命令:

pip install docker-compose -i https://mirrors.aliyun.com/pypi/simple/

验证安装docker-compose完成:

docker-compose -v

可以看到docker-compose版本为1.25.0。docker-compose安装成功。

[root@localhost ~]# docker-compose -v
docker-compose version 1.25.0, build b42d419

使用docker-compose部署前后端分离项目

上一章冗长的docker命令与配置想必让很多小伙伴很头痛,臣妾记不住哇。不用担心,我们这次就来给他改改版,使用docker-compose脚本与命令来部署一个前后端分离项目。话不多说,我们一起来看看docker-compose的脚本文件 —— docker-compose.yml 是长什么样的:

# docker version:  18.06.0+
# docker-compose version: 1.23.2+
# OpenSSL version: OpenSSL 1.1.0h
version: '3.7'
services:
  springboot-server:
    image: springbootimage:v1
    container_name: javaserver
    hostname: system.springbootserver.com
    ports:
    # 0.0.0.0:要绑定的宿主机端口:docker容器内端口
      - "8080:8080"
    env_file:
      - ./test.env
    expose:
      - "8080"
    depends_on:
      - mysql-db
    networks:
      - myserver-net
    restart: always

  mysql-db:
    image: mysql
    container_name: mydb
    hostname: system.db.com
    env_file:
      - ./test.env
    ports:
      - "3306:3306"
    expose:
      - "3306"
    volumes:
      - /usr/project/springboot_vue/mysql/data:/var/lib/mysql
      - /usr/project/springboot_vue/mysql/mysql_init_data:/docker-entrypoint-initdb.d
    networks:
      - myserver-net
    restart: always

  nginx:
    image: nginx
    container_name: nginx
    hostname: system.nginx.com
    ports:
      - "80:80"
    expose:
      - "80"
    depends_on:
      - springboot-server
    volumes:
      - /usr/project/springboot_vue/nginx/html:/usr/share/nginx/html
      - /usr/project/springboot_vue/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /usr/project/springboot_vue/nginx/logs:/var/log/nginx
    networks:
      - myserver-net
    restart: always

networks:
  myserver-net:
    driver: bridge

可能刚开始看的小伙伴会有点不知所措,没关系,我们先使用了再说。我们将docker-compose.ymltest.env两个文件使用Xftp放进虚拟机目录/usr/local/src,在使用docker-compose命令前,我们先看一下上一章创建的容器,使用docker ps -a命令:

可以看到我们的前后端分离项目总共起了三个容器,我们现在要用docker-compose的方式将这些容器重新启动,所以我们要使用命令将这三个容器都删掉

# 命令:停止并删除所有容器
docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)

删掉容器后,我们稍微修改下nginx的配置,执行命令cd /usr/project/springboot_vue/nginx/conf,对nginx.conf修改如下:

server {
        listen       80;
        server_name  你的VM虚拟机IP;

	location / {
	    root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
		
	location /renren-fast {
	    proxy_http_version 1.1;
	    ##### 这里你的VM虚拟机IP改为springboot-server
            proxy_pass http://springboot-server:8080/renren-fast;
        }
}

修改完nginx配置保存后,就可以尝试使用docker-compose部署项目啦。转到目录/usr/local/src下,使用以下命令启动docker-compose

docker-compose up -d

可以看到,三个容器已经编排好了,显示done的状态,使用命令docker ps -a查看也跟原来的容器状态一样!让我们像上一章一样测试一下,直接在浏览器访问http://system.7thmist.com

会看到我们的前后端分离项目已经部署好了!这次我们只使用了一个docker-compose命令,上一章冗长的docker启动命令都被有格式地写在了配置文件docker-compose.yml中。相比维护一大堆的docker命令,维护一个docker-compose.yml脚本会省事很多哦^_^~。

我们已经快速体验了一遍docker-compose,那么下面我们就要来详细的说明一下docker-compose.yml配置文件了。

docker-compose.yml配置文件详解

docker-compose.yml文件我们可以看到,它的大致结构是这样的:

version:  '3.7'  
services:
	...
networks:
	...

一份标准配置文件应该包含 version、services、networks 三大模块,其中最关键的就是 services 和 networks 两个部分。下面我们来逐个分析一下这三个模块。

version

version表示目前docker-compose文件的排版格式版本号,到目前为止总共有3个版本,分别是version1、2、3。最新的版本是version3.7,每个版本支持的Docker版本是不一样的,docker的版本与docker-compose的版本有互相对应的关系,如下表所示:

不同的version支持的指令和排版也不尽相同,越新的version支持的新特性就越多。本文我们使用的version是最新的version3.7。要查看docker-compose的各个版本的区别,请戳此看官网详细介绍。

services

servicesdocker-compose.yml中最核心的模块,他的结构为:

services
	容器服务1:
		image: xxx
		...
	容器服务2:
		image: xxx
		...
	容器服务3:
		image: xxx
		...

可以看到services模块的目标是通过预先配置好的参数启动多个docker容器。这其实跟docker run命令的编写有相像之处,仔细观察你会发现,services模块包含容器环境变量设定,容器目录挂载,容器端口映射,容器自定义命名等类似docker run命令的功能。我们从项目部署流程以及容器启动参数的编写两个方面对比一下他们的异同:

部署流程

  • 使用docker run命令部署项目流程图

  • 使用docker-compose部署项目流程图

容器启动参数配置编写

  • 使用docker run命令部署mysql服务器
docker run --name=mydb -itd -p 3306:3306 -v /usr/project/springboot_vue/mysql/data:/var/lib/mysql -v /usr/project/springboot_vue/mysql/mysql_init_data:/docker-entrypoint-initdb.d -e MYSQL_ROOT_PASSWORD=123456 -e default-authentication-plugin=mysql_native_password -e character-set-server=utf8mb4 -e collation-server=utf8mb4_unicode_ci mysql
  • 使用docker-compose部署mysql服务器
  # 容器服务名
  mysql-db:
    # 表示该容器基于哪个镜像
    image: mysql
    # 容器自定义命名,相当于`docker run`命令里面的 ` --name=mydb`
    container_name: mydb
    # 容器内部自定义域名
    hostname: system.db.com
    # 容器环境变量配置,相当于`docker run`命令里面的` -e `
    env_file:
      - ./test.env
    # 容器端口映射至docker宿主机,相当于`docker run`命令里面的` -p `
    ports:
      - "3306:3306"
    # 容器暴露出来的端口,供与其有同一局域网的容器使用
    expose:
      - "3306"
    # 容器目录挂载,相当于`docer run`命令里面的` -v `
    volumes:
      - /usr/project/springboot_vue/mysql/data:/var/lib/mysql
      - /usr/project/springboot_vue/mysql/mysql_init_data:/docker-entrypoint-initdb.d
    # 为`docker-compose`的networks模块配置
    networks:
      - myserver-net
    # 当容器宕机时,设置是否重启
    restart: always

从以上对比可以看出,docker-compose可以理解为docker run命令的格式化版本,他将原来无规律且冗长的docker run命令脚本化,格式化了,而且提供了容器启动顺序和网络配置等docker run命令不具备的功能

networks

努力码字Ing......

版权声明

本文采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。

关注我们,感恩有你

如果您觉得我的文章有帮助,可以关注下我的公众号哦,每周定期更新1~2篇文章 ~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!