使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地。

如何快速入门docker,开发属于自己的容器应用?我们今天不整虚的,来点实打实的干货:利用URLOS快速开发docker应用,并可随意将应用导出给他人使用。

对URLOS不了解的朋友,这里大概介绍一下,URLOS是一个容器云管理面板,基于Docker容器技术打包和运行应用,可自动识别机器和云应用的故障并将云应用转移至可用的机器上,单机故障并不影响业务开展,配合云存储便可轻松搭建7x24小时持续运行的应用环境。
URLOS官网:https://www.urlos.com/
URLOS安装方法:https://www.urlos.com/center-home-index-detail-10-22-y.html
URLOS开发交流QQ群:695164700,147882180
URLOS微信公众号:

 
在这里插入图片描述

安装URLOS:

  1. curl -SO https://www.urlos.com/install && chmod 544 install && ./install

安装完成后,地址栏输入 http://ip:9968 即可访问。

划重点:利用URLOS开发docker应用的最基本的流程:

 
在这里插入图片描述

这里我们以制作一个LNP(linux+nginx+php)网站环境为例,快速制作一个可以导出给他人使用的docker应用。

在开始制作之前,我们先到docker官网注册一个账号,这样我们才能将制作好的镜像上传到docker仓库,打开https://hub.docker.com/

 
在这里插入图片描述

有了hub账号,那么我们开始制作吧!

第一步:拉取镜像,启动容器,进入容器

使用SSH工具连接主机,输入以下命令拉取一个php:7.3.3-fpm-stretch镜像,启动容器并进入这个容器内部:

  1. docker run -it php:7.3.3-fpm-stretch bash
 
在这里插入图片描述

看到类似上图中类似的字符串时,表示已经成功进入容器内部,这个便是当前容器的ID

第二步:更新镜像,安装我们要的nginx以及PHP相关扩展

先更新一下镜像源,国内用阿里的会快一些

  1. set -ex \ && sed -i 's@security.debian.org@mirrors.aliyun.com@' /etc/apt/sources.list
  2. set -ex \ && sed -i 's@deb.debian.org@mirrors.aliyun.com@' /etc/apt/sources.list
  3. apt-get update

更新完成之后,再来安装nginx,默认安装目录为/etc/nginx

  1. apt-get install -y nginx

官方镜像默认是没有ps -ef 命令,因此需要手动安装

  1. apt-get install -y procps

安装PHP扩展。安装php自带的一些扩展时,可以使用docker-php-ext-configuredocker-php-ext-install
例如我们要安装pdo_mysql:

  1. docker-php-ext-configure pdo_mysql
  2. docker-php-ext-install pdo_mysql

然后使用 php -m查看我们的扩展是否安装成功。使用这种方式安装,系统会自动生成一个配置文件,提供给
php加载,使用命令查看:

  1. ls -l /usr/local/etc/php/conf.d/

gd扩展安装

  1. apt-get install -y libfreetype6-dev \
  2. libjpeg62-turbo-dev \
  3. libpng-dev
  4. docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpegdir=/usr/include/
  5. docker-php-ext-install gd

如果需要安装memcached、redis扩展,则需要下载扩展到容器,然后手动编译安装。地址:
https://pecl.php.net/package/memcached
https://pecl.php.net/package/redis
memcached扩展安装:

  1. curl -O https://pecl.php.net/get/memcached-3.1.3.tgz
  2. tar xf memcached-3.1.3.tgz && cd memcached-3.1.3
  3. phpize
  4. ./configure

编译过程中若出现以下错误提示:

 
在这里插入图片描述

则执行安装命令,然后重新编译安装memcached扩展:

  1. apt-get install -y libmemcached-dev
  2. ./configure
  3. make && make install

添加extension=memcached.so语句到php.ini文件。安装完成后通过命令查看扩展存放的位置

  1. ls /usr/local/lib/php/extensions/no-debug-non-zts-20170718/

php安装目录:/usr/local/php
php.ini的配置文件目录:/usr/local/etc/php/。在这个目录下有两个文件:php.ini-developmentphp.iniproduction
因此,我们需要将php.ini-production文件重命名为php.ini。以后手动编译安装php扩展后需要添加extension=xx.so到php.ini。
启动Nginx和php,检查是否正常运行。

  1. nginx && php-fpm -D

第三步:打包镜像

在打包成镜像之前,我们先将nginx、php-fpm关闭,删除一些不需要的应用以及清理一些安装的缓存文件,从而减小最终打包成镜像的大小。

  1. apt-get purge vim make
  2. apt-get autoremove
  3. apt-get autoclean
  4. rm -f /usr/local/etc/php/conf.d/* #统一将php扩展写入到php.ini文件

然后,输入exit退出容器,通过以下命令将更新过的容器重新打包成一个新镜像:

  1. docker commit -m="php-nginx-website" -a="yourname" 96b3f038590b yourhubid/php-nginx:v0.1.0

参数说明:

-m:提交的描述信息
-a:指定镜像作者
96b3f038590b:容器ID
yourhubid/php-nginx:v0.1.0:指定要创建的目标镜像名

可以使用docker images命令来查看我们的新镜像

第四步:上传镜像

使用docker login命令登录 hub.docker.com,按提示输入账号和密码即可
使用docker push命令将打包好的新镜像上传至镜像仓库:

  1. docker push yourhubid/php-nginx:v0.1.0

第五步:登录URLOS制作应用

注意:需要修改将/data/urlos/master-config/config.jsonc文件的envType的值设置为dev(开发环境):

  1. vim /data/urlos/master-config/config.jsonc
 
在这里插入图片描述

添加镜像

浏览器地址栏输入http://主机ip:9968,登录URLOS,在左侧菜单栏选择镜像管理,然后点击右上角的添加按钮。

 
在这里插入图片描述

输入镜像名称

 
在这里插入图片描述

镜像地址

 
在这里插入图片描述

开发者信息

 
在这里插入图片描述

添加LNP应用

在左侧菜单中选择应用管理。然后点击右上角的添加应用按钮:

 
在这里插入图片描述
 
在这里插入图片描述

应用的基本信息如上图所示。
镜像:选择上一步骤添加的镜像。
URLOS最低版本号:如设置此选项则表示安装URLO的版本高于或者等于当前设置的值,才允许用户安装
使用。
容器端口:容器启动时对外通信的端口,即参数-p。网站的80、443等端口默认是对外开发的,在这里可
以不用设置。如必须特定端口时,设置的格式{"22":true}。
标签:应用标签多用于搜索场景。

 
在这里插入图片描述

选项开关注解:
固定节点运行:若勾选,则表示用户在安装此应用时(创建此应用的服务)需要选择安装在某个节点(云
主机)。若取消勾选,则表示此应用安装在选择的集群(单容器运行也取消勾选),可达到负载均衡,故障
转移的效果。
单容器运行:若勾选,则表示安装此应用时,每个服务只运行一个容器。与固定节点运行配合使用,即固
定节点运行时,则单容器运行。
允许特权允许:若勾选,则容器内的root拥有了真正的root权限(宿主机器的root),在容器内部就可以做
任何事情(包括修改宿主机器的文件,启动宿主机器其他容器,执行mount等操作),不建议勾选。
以root用户允许容器:这里的root用户是容器外部的一个普通用户,默认勾选。若容器内部的程序禁止
root用户允许,则取消(如:MySQL)。
挂载存储目录:如需要从宿主机器挂载文件到容器,则勾选。即参数 -v。
挂载时区定义文件:容器的时间与宿主机器的时间保持一致。
容器只读:禁止向容器写数据。
全局网络:允许同一集群不同容器网络的容器通信。
允许快照备份:勾选则允许执行快照备份(仅挂载了本地存储时有效)

开启反向代理,则可以实现多容器共享端口,反之则不能。

 
在这里插入图片描述
 
在这里插入图片描述
 
在这里插入图片描述

注解:
插件:由PHP语言编辑的脚本文件组成。插件的使用会让用户在安装应用(创建服务)时更便捷,更智
能。这里选择phpWebSite:v0_1_0 --- Liu Xin ---php网站环境这个插件即可。(制作插件后续会有详细说
明)
服务别名:创建服务时,在左上角显示的描述。
应用数据别名:创建服务完成后,服务产生的数据或者用户基于创建的服务需要添加新的数据,对这些数
据管理取的名字,即为应用数据别名。(如:创建MySQL数据库服务,用户可以手动添加数据库,创建网
站服务时也可以新增数据库。)
服务表单步骤:创建服务时,用户填写表单的步骤。(数字表示必填,其他符号表示选填)
额外挂载:将宿主机器的除存储目录外的其他目录挂载到容器。
额外启动参数:通过docker run运行容器时的额外参数,如:--add-host a.com:192.168.0.1

 
在这里插入图片描述

注解:
安装脚本:安装应用时需要执行的脚本命令。

  1. test -d /etc/nginx/conf.d/ || mkdir -p /etc/nginx/conf.d/

启动脚本:需要启动程序的命令。

  1. nginx
  2. php-fpm -D

状态脚本:每隔2秒执行此脚本,用来检查程序是否正常允许。当前的脚本命令用来检查apache是否启动。

  1. status1=0 && (ps -ef|grep "php-fpm"|grep "master process"|grep -v "grep") &&
  2. status1=1;
  3. status2=0 && (ps -ef|grep "nginx"|grep "master process"|grep -v "grep") &&
  4. status2=1;
  5. if [ ${status1} != 0 ] && [ ${status2} != 0 ]; then
  6. statusScriptResult=1
  7. fi

监控脚本:每隔1秒执行此脚本,检查状态脚本返回的结果判断程序是否正常允许。若异常,则执行退脚本。

  1. {w:statusScript:w}
  2. [ "$statusScriptResult" != 1 ] && exit 1

退出脚本:容器关闭时之前,执行的脚本。如同,我们关闭电脑时,系统会关闭正在允许的程序。

添加LNP模板

在这个应用,我们需要添加模板php.inivhost.conf,然后在这两个模板的参数设置一些变量,这样用户在安装应用时,就可以根据自己的需要动态的调整。(如:设置php的上传大小,最大内存等)那么如何添加模板呢?我们在应用管理列表中找到上述创建的应用,然后点击右侧的更多选择管理模板。

 
在这里插入图片描述
 
在这里插入图片描述

添加一个php.ini模板,然后在模板内容将php.ini文件内容复制进入,同时设置变量{w:upload_max_filesize:w}{w:PHP_memory_limit:w}

 
在这里插入图片描述
 
在这里插入图片描述
  1. [PHP]
  2. engine = On
  3. short_open_tag = Off
  4. precision = 14
  5. output_buffering = 4096
  6. zlib.output_compression = Off
  7. implicit_flush = Off
  8. unserialize_callback_func =
  9. serialize_precision = -1
  10. disable_functions =
  11. disable_classes =
  12. zend.enable_gc = On
  13. expose_php = On
  14. max_execution_time = 30
  15. max_input_time = 60
  16. memory_limit = 128M
  17. error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
  18. display_errors = Off
  19. display_startup_errors = Off
  20. log_errors = On
  21. log_errors_max_len = 1024
  22. ignore_repeated_errors = Off
  23. ignore_repeated_source = Off
  24. report_memleaks = On
  25. html_errors = On
  26. variables_order = "GPCS"
  27. request_order = "GP"
  28. register_argc_argv = Off
  29. auto_globals_jit = On
  30. post_max_size = {w:PHP_memory_limit:w}
  31. auto_prepend_file =
  32. auto_append_file =
  33. default_mimetype = "text/html"
  34. default_charset = "UTF-8"
  35. doc_root =
  36. user_dir =
  37. enable_dl = Off
  38. file_uploads = On
  39. upload_max_filesize = {w:upload_max_filesize:w}
  40. max_file_uploads = 20
  41. allow_url_fopen = On
  42. allow_url_include = Off
  43. default_socket_timeout = 60
  44. extension=gd.so
  45. extension=memcached.so
  46. extension=sockets.so
  47. extension=mysqli.so
  48. extension=pdo_mysql.so
  49. [CLI Server]
  50. cli_server.color = On
  51. [Date]
  52. [filter]
  53. [iconv]
  54. [imap]
  55. [intl]
  56. [sqlite3]
  57. [Pcre]
  58. [Pdo]
  59. [Pdo_mysql]
  60. pdo_mysql.default_socket=
  61. [Phar]
  62. [mail function]
  63. SMTP = localhost
  64. smtp_port = 25
  65. mail.add_x_header = Off
  66. [ODBC]
  67. odbc.allow_persistent = On
  68. odbc.check_persistent = On
  69. odbc.max_persistent = -1
  70. odbc.max_links = -1
  71. odbc.defaultlrl = 4096
  72. odbc.defaultbinmode = 1
  73. [Interbase]
  74. ibase.allow_persistent = 1
  75. ibase.max_persistent = -1
  76. ibase.max_links = -1
  77. ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
  78. ibase.dateformat = "%Y-%m-%d"
  79. ibase.timeformat = "%H:%M:%S"
  80. [MySQLi]
  81. mysqli.max_persistent = -1
  82. mysqli.allow_persistent = On
  83. mysqli.max_links = -1
  84. mysqli.default_port = 3306
  85. mysqli.default_socket =
  86. mysqli.default_host =
  87. mysqli.default_user =
  88. mysqli.default_pw =
  89. mysqli.reconnect = Off
  90. [mysqlnd]
  91. mysqlnd.collect_statistics = On
  92. mysqlnd.collect_memory_statistics = Off
  93. [OCI8]
  94. [PostgreSQL]
  95. pgsql.allow_persistent = On
  96. pgsql.auto_reset_persistent = Off
  97. pgsql.max_persistent = -1
  98. pgsql.max_links = -1
  99. pgsql.ignore_notice = 0
  100. pgsql.log_notice = 0
  101. [bcmath]
  102. bcmath.scale = 0
  103. [browscap]
  104. [Session]
  105. session.save_handler = files
  106. session.use_strict_mode = 0
  107. session.use_cookies = 1
  108. session.use_only_cookies = 1
  109. session.name = PHPSESSID
  110. session.auto_start = 0
  111. session.cookie_lifetime = 0
  112. session.cookie_path = /
  113. session.cookie_domain =
  114. session.cookie_httponly =
  115. session.cookie_samesite =
  116. session.serialize_handler = php
  117. session.gc_probability = 1
  118. session.gc_divisor = 1000
  119. session.gc_maxlifetime = 1440
  120. session.referer_check =
  121. session.cache_limiter = nocache
  122. session.cache_expire = 180
  123. session.use_trans_sid = 0
  124. session.sid_length = 26
  125. session.trans_sid_tags = "a=href,area=href,frame=src,form="
  126. session.sid_bits_per_character = 5
  127. [Assertion]
  128. zend.assertions = -1
  129. [COM]
  130. [mbstring]
  131. [gd]
  132. [exif]
  133. [Tidy]
  134. tidy.clean_output = Off
  135. [soap]
  136. soap.wsdl_cache_enabled=1
  137. soap.wsdl_cache_dir="/tmp"
  138. soap.wsdl_cache_ttl=86400
  139. soap.wsdl_cache_limit = 5
  140. [sysvshm]
  141. [ldap]
  142. ldap.max_links = -1
  143. [dba]
  144. [opcache]
  145. [curl]
  146. [openssl]

添加Nginx的虚拟站点配置vhost.conf模板

 
在这里插入图片描述
 
在这里插入图片描述
  1. server {
  2. server_name {w:domains:w};
  3. {w:listenLines:w}
  4. set $websiteRoot "/data/www/{w:indexDirName:w}";
  5. root $websiteRoot;
  6. index index.html index.htm index.php;
  7. client_max_body_size {w:upload_max_filesize:w};
  8. client_body_buffer_size 128;
  9. location / {
  10. {w:rewriteContents:w}
  11. }
  12. location ~ \.(php|phtml)$ {
  13. include fastcgi.conf;
  14. fastcgi_pass 127.0.0.1:9000;
  15. }
  16. location ~ /\.ht {
  17. deny all;
  18. }
  19. }

添加变量

变量分为:环境变量、数据变量和扩展变量。在这里只需要添加扩展变量。
环境变量:在操作系统中用来指定操作系统运行环境的一些参数,与平常使用的环境变量相同。有时容器启动需要设置一些参数提供给容器内部的程序。如:MySQL容器启动时可以设置MYSQL_ROOT和MYSQL_ROOT_PASSWORD。
数据变量:添加存储数据时设置的一些参数。如:往MySQL数据服务添加数据库时,需要填写dbName,dbPassword,status,charset。具体可以使用可以创建MySQL服务,然后在管理数据库中添加数据库。
扩展变量:即普通变量。如:上述在模板中设置的变量{w:upload_max_filesize:w}、{w:PHP_memory_limit:w}。变量的格式:{w:变量名:w}。
添加PHP最大内存变量:PHP_memory_limit

 
在这里插入图片描述
 
在这里插入图片描述

添加上传大小限制:upload_max_filesize

 
在这里插入图片描述
 
在这里插入图片描述

至此,LMP应用已经制作完成,我们在应用管理列表中,选择刚才制作好的应用,点击创建服务

 
在这里插入图片描述

部署完成后,地址栏输入域名访问一下,如果访问正常,说明我们制作的应用没有问题了,可以导出供他人安装!

第六步:导出应用

将我们制作的应用导出,可将导出的文件发布到任何地方,供他人安装使用,只要对方的主机安装了URLOS,都可以完美运行(无需考虑兼容性问题)我们制作的应用。

 
在这里插入图片描述

导出的文件为txt文本。只要其他用户使用URLOS直接导即可。下面是导入方法:
打开文本,全选复制其中内容

 
在这里插入图片描述

登录URLOS,在左侧菜单点击导入应用,将内容粘贴进去,提交

 
在这里插入图片描述
 
在这里插入图片描述

导入成功!!点击安装即可。哈哈,太爽了吧。任何服务器环境可以使用的应用都可以用这个方法来制作,比如微信小程序后端部分等等都可以这样制作,方便分发和安装。

 
在这里插入图片描述

如何使用URLOS进行docker应用开发的更多相关文章

  1. 谁是Docker的开发人员

    由CHRIS DAWSON发表在thenewstack/DATA RESEARCH qianhen123/CHB译 我们分析了Docker的容器库并提出两个问题: 1.Docker的贡献者们感兴趣的其 ...

  2. [转]利用Docker构建开发环境

    利用Docker构建开发环境 Posted by  makewonder on 2014 年 4 月 2 日   最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境, ...

  3. .net core——Docker化开发和部署

    原文:.net core--Docker化开发和部署 本篇文章是使用Vs2017生成的Dockerfile进行部署的. 目录 VS2017生成Docker部署项目 Dockerfile内容 在开发服务 ...

  4. Docker 下开发安装hyperf

    Docker 下开发hyperf # 下载并运行 hyperf/hyperf 镜像,并将镜像内的项目目录绑定到宿主机的 /tmp/skeleton 目录 docker run -v /tmp/skel ...

  5. 利用Docker构建开发环境

    最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境,感觉生活在PAAS时代的程序员真是幸福,本文会简要介绍下Docker是什么,如何利用Docker来搭建自己的开发环 ...

  6. 如何使用Docker构建开发环境

    我们在开发中都会遇到这样的问题:在本地开发好功能后,部署到服务器,或者其他人拉到本地接着开发时,会出现功能无法使用的情况. 这些异常情况,大多数时候是因为系统不同而导致的依赖差异.因此,为了解决这个问 ...

  7. [译]如何使用 Docker 组件开发 Django 项目?

    原文地址:Django Development With Docker Compose and Machine 以下为译文 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包 ...

  8. Docker 搭建开发环境

    本文介绍如何将Docker集成到开发环境,自动构建应用,并使容器拥有独立的内网IP为开发人员提供服务. 术语解释 Docker镜像:一个不可修改的"模板",每个代码版本对应一个镜像 ...

  9. Docker标准化开发测试和生产环境

    对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点. 可以用 Docker 来标准化开发.测试.生产环境. Docker 占用资 ...

随机推荐

  1. 1.1环境的准备(一)之Python解释器的安装

    目录: 1.Python-解释器的下载 2.Python-解释器的安装 3.Python-解释器的测试 4.Python的环境变量的配置 (一)Python解释器的安装: 1.官网:https://w ...

  2. route命令详解与使用实例 ,同时访问内外网

    route命令详解与使用实例     2011-10-18 12:19:41|  分类: 其他 |  标签:route   |字号 订阅   1.   使用背景 需要接入两个网络,一个是部署环境所在内 ...

  3. PyQt5--QFileDiaglog

    # -*- coding:utf-8 -*- ''' Created on Sep 17, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...

  4. FastDFS_v5.05+nginx+cache集群安装配置手册

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.FastDFS简单介绍 FastDFS是由淘宝的余庆先生所开发,是一个轻量级.高性能的开源分布式文件系统, ...

  5. redis在.net架构中的应用(2)--并发和原子操作不可兼得

    在上一篇文章中,我主要向大家介绍了利用servicestack连接redis以及一些redis的基本数据类型,传送门 本文中,我将通过一个具体应用场景为大家介绍redis中的并发和原子操作 其中用到的 ...

  6. jQuery 实现复选框的全选与反选

    <script> //实现全选与反选 $(".allAndNotAll").click(function () { if ($(this).prop("che ...

  7. svn 更新提交文件冲突

    文件冲突定义:svn up更新服务器文档到本地的时候发现本地的文件有所改动,和svn服务器不同步 服务器会报冲突,让你觉得已谁的为准,根据实际情况我们需要选择是以服务器还是以本地代码为准 报错: Co ...

  8. cocoapods 报错

    1.[!] ERROR: Parsing unable to continue due to parsing error: contained in the file located at xxx/x ...

  9. “System.Reflection.AmbiguousMatchException”类型的异常在 mscorlib.dll 中发生

    错误提示: “System.Reflection.AmbiguousMatchException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理. 发现不明确的匹配. 问题原 ...

  10. 生成定长随机数-可做3des密钥

    3DES加解密需要密钥支持,要求为8的倍数,一般会使用32位的字母数字随机字符串作为密钥. 下面这个工具类,可用做key值的生成,详见下方代码: package test; import java.u ...