本篇经作为新手入门使用,大神们可以指导小弟修正,不喜勿喷,谢谢
本篇主要讲解如下几个知识点:
- CentOS7与Ubuntu下安装Docker,配置加速器
- 常见Dockerfile命令讲解
- docker-compo安装与常见命令讲解
根据项目如何使用Docker部署应用
- Swarm集群下发布基于LNMP的WordPress应用发布
- NodeJS应用发布
- Flask应用发布
- 基于Tomcat定制封装Jenkins镜像
- 搭建私有仓库
- 每次代码写好了都要自己构建觉得麻烦怎么办?
这里应该有人会有一个疑问,为什么软件包名是docker-ce而不是docker-engine。docker版本在1.13以后有两个版本,分别是ce和ee版本,ce是开源社区办,ee是收费版,所以改了。
CentOS7
Ubuntu
配置加速器
不想申请加速器的朋友可以使用我的,也可以自己去申请阿里云或者Daocloud的加速器。docker版本不同配置文件路径存在差异,具体请查询官网,本篇针对17.*的版本。
Dockerfile简单一点就是描述你这个镜像安装了哪些软件包,有哪些操作,创建了什么东西。有些人喜欢用 命令去打包镜像,这样是不好的,首先commit出来的镜像比你使用Dockerfile构建出来的体积大,而且commit出来的镜像属于黑盒镜像,除了制作者,谁都不知道你在里面干了什么,属于不安全的镜像,很少会有人使用,最后就是不便于你最终的管理和更新。所以推荐使用Dockerfile去管理你的镜像,下面将简单介绍Dockerfile常见的指令和注意事项:
FROM命令是指定你所使用的基础镜像,一般写在文件开头,对于官方没给出Dockerfile的软件想Docker化,那么引用的镜像一般是、、,如果官方已经有了,比如nginx、php、mysql这写,那么基本直接引用即可。
指令语法:
MAINTAINER命令一般是描述这个Dockerfile的作者信息,
指令语法:
运行指定的命令,此命令只有在执行时才会执行,其他情况下不会执行。这时候有很多初学者会以为在写SHELL,那么在一个Dockerfile里面会出现很多不合理的RUN指令,了解过Docker的朋友应该都知道Docker的镜像是分层结构,说白了就是Dockerfile里面一个指令的操作就是一层。比如下面的操作,一条RUN命令包含了更新源缓存,安装openjdk,清理垃圾,这样的好处是最终这一层会很小,假设你分开写,四个命令四个RUN指令,但是只有第二条命令才是你想要的,那么第一条产生的缓存垃圾就不发删除掉。这也算是优化的一部分。
指令语法:
设置容器启动时要运行的命令只有在你执行 或者 命令是才会运行,其他情况下不运行。如果一个Dockerfile里面有多条CMD指令,那么只有文件最后一行的 指令才会生效,其他的全部没用,还有一点,还有一点 指令是可以在你执行 的时候覆盖的。
指令语法:
设置暴露的容器端口,注意是容器端口。
指令语法:
功能为设置环境变量,此环节变量可以是在构建镜像时使用,也可以在运行中的容器使用。
指令语法:
复制命令,把本机的文件复制到镜像中,如果dest是目录则会帮你创建出这个目录,如果src是压缩文件会帮你解压出来。当然ADD指令中的src也可以是URL链接,还有另外一个指令(),请注意区别!!!
另外,src部分是是你Dockerfile的相对路径,这个请注意!!!
指令语法:
与ADD指令一样,但是COPY的src部分只能是本地文件,文件路径是Dockerfile的相对路径。如果dest是目录并且目录不存在,会帮你创建,如果是压缩文件不会帮你解压。
指令语法:
启动时的默认命令,此指令设置的命令不可修改。与CMD是有区别的。此命令在Dockerfile只能有一个,若有多个,则以文件最后一个出现的才生效。
指令语法:
如上,如果执行 则最终容器内执行的命令是 ,如果你执行的命令是 则最终容器内执行的命令是 注意区别,细心体会。
设置你的卷,在启动容器的时候Docker会在/var/lib/docker的下一级目录下创建一个卷,以保存你在容器中产生的数据。若没有申明则不会创建。
指令语法:
指定容器运行的用户是谁,前提条件,用户必须存在。此指令可以在构建镜像是使用或指定容器中进程的运行用户是谁。
指令语法:
指定容器中的工作目录,可以在构建时使用,也可以在启动容器时使用,构建使用就是通过 将当前目录切换到指定的目录中,容器中使用的意思则是在你使用 命令启动容器时,默认进入的目录是 指定的,下面的example中我使用环境变量。
指令语法:
以上为常用的Dockerfile指令,详细文档请参考官方文档:https://docs.docker.com/engine/reference/builder/
docker-compose安装
方法一
方法二
常见命令讲解
单机docker-compose模版
注意nginx、php、mysql、redis这几个容器的网络是怎么通讯的。
集群docker-compose模版
以下文件中将只会备注单机版中没有说明的部分。
这里我只是把我常用的贴出来加以说明,如果各位有想要补充的可以告诉我,我在加上去,详细介绍可以看官网
https://docs.docker.com/compose/compose-file/
Swarm集群下发布基于LRNMP的WordPress应用发布
本实例,默认你已经装好系统,装好Docker并创建好Swarm集群。
集群约定,对于无状态应用如Nginx,WordPress我们使用NFS去实现Web站点的数据保存以及共享服务以保证所有容器(Nginx、WordPress)数据一致性问题,MySQL数据库我将指定单台主机去实现MySQL数据库功能,数据库目录将存放在所在宿主机上,那么存在一个问题,MySQL高可用如何去实现,这里可以基于MySQL的架构去实现数据库这块的高可用性本篇不讨论如何实现。
应用目录结构:
站点在NFS主目录位置:/nfs/lnmp
站点目录:/nfs/lnmp/www
Nginx配置文件目录:/nfs/lnmp/nginx
WordPress配合文件目录:/nfs/lnmp/php
Redis数据目录(Docker-Swarm-Redis主机下):/redis/lnmp
MySQL数据目录(Docker-Swarm-MySQL主机下):/mysql/lnmp
镜像相关文档:
Redi:https://hub.docker.com/_/redis/
Nginx:https://hub.docker.com/_/nginx/
WordPress:https://hub.docker.com/_/wordpress/
MySQL:https://hub.docker.com/_/mysql/
集群节点清单:
准备编排文件,内容如下(docker-compose.yaml):
Nginx配置文件(nginx.conf):
WordPress配置文件(uploads.ini):
本实例项目地址:https://github.com/buxiaomo/docker-compose/tree/master/wordpress
总结:
本实例我们直接使用的是官方的镜像,没有做定制操作,原因如下:
1、不要重复造轮子,官方有镜像尽量使用官方的镜像不要自己构建
2、官方镜像有人维护,不需要自己维护,较少成本
3、官方镜像基本可以满足大部分应用需求,所以基本不需要进行定制化,如果需要定制化可以直接使用FROM BASEIMAGE去做定制化,而不是从头再来。
NodeJS应用发布
针对自己写Dockerfile构将APP镜像,首先需要有一点,你的APP必须可以前台运行!!!
由于官方有镜像,我们就直接引用即可,不需要自己去构建NodeJS的镜像,这里我一一个NodeJS的WebUI去实现镜像封装以及运行。对于NodeJS应用,大概分为两部分,下载依赖包,运行分为,这里可以更具实际情况决定Dockerfile如何编写,理论上依赖包只需要下载一次就行了,不需要每次运行分为都去下载镜像包,那么针对这种情况可以在构建的时候把依赖包一起打包到镜像中,当然,将依赖包打包到镜像中构建出来的镜像会有点大,但是好处就是启动服务的时候不需要下载依赖包,启动时间会很快,适合离线环境;一种是在启动的时候去下载依赖包,这样的话镜像会小一点,但是启动时会去下载依赖包,启动时间会比较长,具体方式可以自己选。下面简要说一下步骤:
编写Dockerfile内容如下:
进入Dockerfile所在目录执行构建镜像
待补充
Flask应用发布
项目代码:https://github.com/buxiaomo/dockerfile/tree/master/ssserverweb
应用简介:应用通过Docker Engine API对基于Docker Swarm提供的SS服务管理用户添加删除和添加节点的小demo项目,本应用通过Swarm实现。Docker化应用类似于NodeJS。通过阿里云的域名API配置主机IP与域名的关系,本篇只针对应用如何使用Docker部署,代码实现不在本篇讨论范围这里不详细说明。
申明:代码可能存在逻辑问题,不要纠结这个,本篇只讨论如何容器化应用。
可以直接看GitHub的代码查看详情。准备Dockerfile,内容如下:
进入Dockerfile所在目录执行构建镜像
启动容器:
查看服务,访问链接:http://IP:8080 即可访问到访问页面
基于Tomcat封装Jenkins镜像
待补充
无SSL私有仓库搭建
准备docker-compose.yml文件,内容如下:
启动registry容器
查看运行的私有仓库
测试私有仓库,假设我的私有仓库的IP地址为:192.168.0.10
PUSH镜像
上面的问题是因为你没事使用HTTPS,编辑docker配置文件即可,注意文件格式是JSON
再次PUSH镜像
有SSL私有仓库搭建
准备证书
准备docker-compose.yml文件
启动registry容器
查看运行的私有仓库
测试私有仓库,假设我的私有仓库的IP地址为:192.168.0.10
客户端配置
未完待补充
1、可以结合GitHub与Dockerhub做到持续构建。
2、使用GitHub代码托管与daocloud的公有云服务,构建速度不错,比Dockerhub快,不用等太久。
3、Jenkins + github/Gitlab(自己动手丰衣足食)