Docker部署应用并发布以及搭建私有仓库

   日期:2024-12-27    作者:gdbjie 移动:http://mip.riyuangf.com/mobile/quote/63424.html

本篇经作为新手入门使用,大神们可以指导小弟修正,不喜勿喷,谢谢

本篇主要讲解如下几个知识点

  1. CentOS7与Ubuntu下安装Docker,配置加速器
  2. 常见Dockerfile命令讲解
  3. docker-compo安装与常见命令讲解
  4. 根据项目如何使用Docker部署应用

    1. Swarm集群下发布基于LNMP的WordPress应用发布
    2. NodeJS应用发布
    3. Flask应用发布
    4. 基于Tomcat定制封装Jenkins镜像
  5. 搭建私有仓库
  6. 每次代码写好了都要自己构建觉得麻烦怎么办

​ 这里应该有人会有一个疑问,为什么软件包名是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-Swarm-MySQLMySQL节点,只跑MySQL不跑其他的应用MySQLDocker-Swarm-RedisRedis节点,只跑Redis不跑其他的应用RedisDocker-Swarm-NFSNFS节点,只用于数据共享,不运行任何应用N/ADocker-Swarm-Master01Swarm集群管理节点N/ADocker-Swarm-Node01Swarm集群工作节点Nginx、WordPressDocker-Swarm-Node02Swarm集群工作节点Nginx、WordPress

准备编排文件,内容如下(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(自己动手丰衣足食


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号