
文章索引
Docker从入门到DevOps系列目录
- Docker从入门到DevOps| 第一篇:DevOps工程的基石 —— Docker
- Docker从入门到DevOps| 第二篇:Docker常用命令 —— 镜像与容器操作
- Docker从入门到DevOps| 第三篇:Docker镜像封装以及提交镜像至阿里云镜像库
- Docker从入门到DevOps| 第四篇:用Docker部署一个基于SpringBoot + vue 前后端分离的应用
- Docker从入门到DevOps| 第五篇:一键部署你的应用 —— docker-compose初体验
- Docker从入门到DevOps| 第六篇:初探DevOps思想,DevOps利器walle介绍
- Docker从入门到DevOps| 第七篇:Docker + walle + SpringBoot + Git实现项目的DevOps(一)
- Docker从入门到DevOps| 第八篇:Docker + walle + SpringBoot + Git实现项目的DevOps(二)
- Docker从入门到DevOps| 第九篇:Docker + walle + SpringBoot + Git实现项目的DevOps(三)
- Docker从入门到DevOps| 第十篇:初探Docker、Kubernetes与微服务思想
前言
- 本系列适合想了解Docker和DevOps的同学,学完你将可以熟练使用Docker,熟练使用DevOps思想部署你的项目。
- 本系列的每一行代码和命令都是确保可用的,请放心使用。
- 学习本系列需要搭建CentOS7环境,所有用到的软件将免费提供下载。戳此进入下载指引页面。
- 学习本系列,最快的方法是先动手将软件安装好,并简单使用一下,然后再回头来看这篇文章,效果更佳。
- 帮你总结了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.yml
和test.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
services是docker-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篇文章 ~
