使用Docker部署线上开发/生产环境
不擅长运维又很喜欢运维的我,每次在线上或者线下部署开发/生产环境时都无聊到要死,感觉就跟ctrl+c、ctrl+v似的,既浪费了大把的时间,又觉得索然无味,所以就有了这篇文章。
Docker是什么?借用wikipedia上的解释:
Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
至于我们为什么要使用Docker?那就得说到它的众多优势了:
- 更高效的利用系统资源
- 更快的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松的维护和扩展
安装Docker
Docker有两个版本,CE(社区版、免费)和EE(企业版、付费),这里我使用到的是社区版,主要讲在Linux(CentOS 7)下到安装:
注意:这里讲到的安装前提是以前没有安装过Docker。
系统要求
- CentOS 7 64位及以上
- 内核 >= 3.10
使用yum安装
首先安装以下依赖包:
1 | # sudo yum install -y yum-utils \ |
添加yum安装源,任选其一,国内源会快些:
1 | # sudo yum-config-manager \ |
安装Docker CE
1 | # sudo yum makecache fast |
启用Docker CE:
1 | # sudo systemctl enable docker |
默认情况下,只有root和docker用户组才能访问Docker引擎,因此需要将使用Docker的用户加入到Docker用户组中。
建立docker组:
1 | # sudo groupadd docker |
添加当前用户至Docker组:
1 | # sudo usermod -aG docker $USER |
查看是否安装:
1 | # docker info |
同时我们还需要安装Docker-compose:
1 | 注意:其中1.22.0是版本号,将其替换为最新的 |
使用Docker
镜像
拉取镜像:
1 | # docker pull [仓库名]:[标签] |
例如,拉取版本为16.04的Ubuntu:
1 | # docker pull ubuntu:16.04 |
列出本机所有的image(镜像):
1 | # docker image ls |
删除本机指定镜像,其中,[镜像]值可以是镜像短ID、长ID、镜像名、镜像摘要:
1 | # docker image rm [镜像] |
容器
容器轻量到我们可以随时删除和启用它。
新建及启用:
1 | # docker run [镜像名] |
可能需要进入容器bash终端:
1 | # docker run -t -i [镜像名] /bin/bash |
查看当前运行的所有容器:
1 | # docker container ls |
终止一个容器,[容器名]值可以是镜像短ID、长ID、镜像名、镜像摘要:
1 | # docker stop [容器名] |
重启一个容器:
1 | # docker restart [容器名] |
删除指定的容器,需要先终止:
1 | # docker container rm [容器名] |
最好的实践
khs1994-docker/lnmp是基于Docker Compose的一键搭建 LNMP(LEMP) 开发环境和生产环境(集群)的开源项目。
该项目严禁直接编辑除 .env 文件以外的所有文件,目的是方便我们可以 无痛升级 。虽然如此,但是仍然可以实现全部的自定义功能,在这里查看指南。
先决条件
- Docker CE 18.06 Stable +
- Docker Compose 1.22.0+
- WSL (Windows Only)
快速指南
拉取项目到你想存放的指定(如:/var/www/example/)目录:
1 | # git clone --depth=1 --recursive https://code.aliyun.com/khs1994-docker/lnmp.git /var/www/example/ |
进入项目并启用一个Demo:
1 | # cd /var/www/example/ |
启用后访问IP可得到如下信息即可正常运行:
Welcome use khs1994-docker/lnmp v18.10 x86_64 With Pull Docker Image development
数据库切换
编辑 .env 文件,修改变量 LNMP_MYSQL_VERSION 的值,这里我们把默认的版本降级为 5.6.41:
1 | LNMP_MYSQL_VERSION=5.6.41 |
注意,先前我们运行最新版的mysql,现在我们降级到 5.6.41 版本,导致数据不兼容,所以mysql容器没起来,所以需要先删除mysql数据卷,再启动:
1 | # ./lnmp-docker down -v |
而由于 mysql5.6.41 版本中不支持变量log_timestamps(5.7中新增),所以我们需要把该项目中该变量的定义注释掉:
1 | # vi lnmp/config/mysql/docker.cnf |
注释其中的 log_timestamps=SYSTEM
SSl证书
该项目集成了acme.sh,在这里查看
提示,
*.example.com
的证书不支持example.com
所以一个主域要写两次
提示,第一个网址不用加
-d
参数,后面的需要加-d
参数
1 | # ./lnmp-docker ssl example.cn -d *.example.cn |
总结
这是第一次接触 Docker,不明之处还有很多,所以会持续学习并更新该文,谢谢大家的阅读!