最近有个段子非常火,说有个程序员梦见自己被阎王召见,让他帮忙开发一个后台管理系统。在一笑而过之后,我觉得如果要是能把这个系统做出来,应该颇具娱乐性,也顺便了解一下高并发以及大数据的相关技术——每天要上生死簿的人估计不会少。于是,本着娱乐大众的目的,我抓来了一个mysql的DBA@BigCat_X还有一个前端@MC,开始构建这个系统。
我们初步决定的技术路线为:数据库使用mysql,web服务器使用nginx,web后端框架采用tornado,消息队列以及缓存采用redis,而前端使用H5。如果后期脑洞开的大的话,之前在博客里用过的ES搜索也可以往上加。
为了保证部署环境的统一,我们将部署环境做成docker。此docker中装有mysql5.7,nginx以及redis,并放在docker hub上,这样便可保证三人都使用相同的环境开发;而python和tornado的版本相对稳定,因此并没有把python和tornado放入docker。
因此,在这篇博客中,我会介绍docker的基本概念以及使用方式。
首先来讲docker是什么东西:docker是一套基于容器(Container)的环境引擎,开发者可以在docker上的容器中进行开发、部署、运行的操作。与虚拟机相比,docker容器更轻量化,占据资源更少,这使得每个docker容器都可以轻易的大规模部署,而无需担心消耗过多资源。此外,docker便于分发,这样可以使得同组开发人员使用相同的开发/部署环境。
Docker有两个核心的概念:镜像(Image)和容器(Container)。如果套用面向对象的概念的话,镜像相当于类,而容器相当于对象。在docker中,我们可以使用一个镜像来创建多个容器,每个容器都可以跑不同的服务,这样我们只要拉下来一个镜像,就可以运行我们项目所需的所有服务,而不是将每个服务各拉一个镜像(虽然官方推荐这么做。。。)。
如下,我们使用capliu/deadheaven:final镜像启动了nginx,mysql-server和redis:
下面让我们来看看如何使用docker和构建自己的镜像。在这里,我们先介绍使用Ubuntu系统来运行docker,稍后再介绍在Win10中如何使用docker。在Ubuntu下安装docker十分简单,输入以下命令即可安装:
wget -qO- https://get.docker.com/ | sh
在安装完成后,可以输入docker version来查看当前docker的版本:
同时系统还会提示你,如果不是root用户的话,每次运行docker命令都要加上sudo。
在安装好之后,我们可以跑一下docker官方提供的hello-world镜像来检验我们的docker是否安装正确。输入如下命令即可运行hello-world的docker:
docker run hello-world
由于我这里将docker用alias换成了sudo docker,因此没有加sudo。
在第一次运行时,docker会从docker hub网站上拉镜像到本地,因此需要等一会;在拉下来之后,如果看到了上面的画面,说明docker安装正确了。
在学习构建自己的镜像之前,我们先来看一下docker几个常用命令:
1. docker image ls:列出本地所有的镜像
2. docker run [参数列表] <镜像名> [命令]:run命令的意思是启动一个新的容器,并在容器中执行命令。常用的参数列表有-i,-t和-d,其中-i和-t通常连用,如docker run -it <镜像名称> bash:进入到容器内部进行查看与修改,用exit命令退出。镜像名称的格式为仓库:标签,这标志着可以用不同版本的镜像启动容器;而-d的含义表示容器中的命令将在后台运行,不会影响当前的终端。
注意,使用bash对容器的任何修改在退出后都不会保存。若想保存,需要在容器打开的时候用另一个终端使用docker commit命令进行保存,随后再退出。
3. docker commit -m=
4. docker stop <容器ID>:顾名思义,停止一个容器。
5. docker pull <镜像名称>:从dockerhub上拉下来一个镜像。
在介绍了docker的常用命令后,让我们看看如何建立自己的镜像。docker镜像的构建基于Dockerfile,这是一种文本文件,用于告诉docker这个镜像要从什么地方获取,要如何设置docker的工作目录,以及要安装哪些软件和在容器运行时要运行哪些命令。
让我们来看一下我们的Dockerfile:
FROM redis:5.0
WORKDIR /app
COPY . /app
RUN apt-get update
RUN apt-get install mysql-server -y
RUN apt-get install nginx -y
这是一个比较简单的Dockerfile,其中涉及了4个关键字:FROM,WORKDIR,COPY和RUN。在Dockerfile中,所有的关键字必须以大写形式出现,其中FROM关键字是必须的,用于告诉docker这个镜像要用哪个镜像作为“基类”;WORKDIR关键字会指定容器的工作目录;COPY顾名思义会将当前目录里的内容copy到容器里面,这行似乎是可有可无的;RUN命令则是执行软件安装和更新命令。建议在apt-get install前执行update,不然可能会出现找不到软件包的情况。
在写好Dockfile后,我们可以使用docker build的命令根据当前的Dockerfile来构建镜像,命令如下:
docker build -t <镜像名称> .
最后那个点不能省,表示当前目录。
输完命令后就进入到等待阶段,当build完成后,就可以使用docker image ls命令来查看我们的镜像了,并且用run命令跑一跑我们装的各种软件。
这里给出用docker运行redis,mysql和nginx的命令:
docker run -p 8080:80 -d capliu/deadheaven:v5 nginx -g 'daemon off;'
docker run -p 6380:6379 -v /home/dsliu/redis/data:/app/data -d capliu/deadheaven:v5 redis-server --protected-mode no --appendonly yes
docker run -p 3306:3306 -v /home/dsliu/mysql/conf:/etc/mysql/conf.d -v /home/dsliu/mysql/logs:/logs -v /home/dsliu/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d capliu/deadheaven:final service mysql start
这里的-p表示将主机端口映射到容器端口,即将主机的8080端口映射到容器的80端口;而-v表示将主机的目录挂载到容器的目录下,这样我们就可以通过修改主机的配置文件来改变容器的配置文件了。
在测试完成后,我们就可以通过docker将我们的镜像推送到docker hub,以便小组其他成员使用。首先我们要注册一个docker hub账号,网址是https://hub.docker.com,在注册完成后,在终端输入以下命令登录docker hub:
docker login
登陆后,执行docker push <镜像名>就将我们的镜像发布到dockerhub上了。
最后给大家介绍如何在Win10下跑docker。对于Win10系统,我们首先需要打开Win10的Hyper-V功能,然后需要安装docker-toolbox,登录dockerhub后点击右边的Download docker desktop即可:
安装完之后在任务栏下会出现一个鲸鱼图标,表示docker正在运行:
随后我们就可以通过powershell运行docker的相关命令了:
在这篇博客中,为我们的生死簿管理系统使用docker搭建了开发环境。通过使用docker,小组的每位成员都可以使用相同的开发环境,大幅减少了各人配置环境的时间。在后续的博客中,将继续为大家介绍这个鬼系统的开发进程,也希望大家踊跃报名参与业务测试~