使用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:

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镜像,启动容器并进入这个容器内部:

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

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

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

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

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

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

apt-get install -y nginx

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

apt-get install -y procps

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

docker-php-ext-configure pdo_mysql
docker-php-ext-install pdo_mysql

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

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

gd扩展安装

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

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

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

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

 
在这里插入图片描述

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

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

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

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,检查是否正常运行。

nginx && php-fpm -D

第三步:打包镜像

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

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

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

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命令将打包好的新镜像上传至镜像仓库:

docker push yourhubid/php-nginx:v0.1.0

第五步:登录URLOS制作应用

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

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

 
在这里插入图片描述

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

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

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

nginx
php-fpm -D

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

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

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

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

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

添加LNP模板

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

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

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

 
在这里插入图片描述
 
在这里插入图片描述
[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = {w:PHP_memory_limit:w}
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = {w:upload_max_filesize:w}
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
extension=gd.so
extension=memcached.so
extension=sockets.so
extension=mysqli.so
extension=pdo_mysql.so
[CLI Server]
cli_server.color = On
[Date]
[filter]
[iconv]
[imap]
[intl]
[sqlite3]
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_mysql.default_socket=
[Phar]
[mail function]
SMTP = localhost
smtp_port = 25
mail.add_x_header = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.cookie_samesite =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5
[Assertion]
zend.assertions = -1
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[dba]
[opcache]
[curl]
[openssl]

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

 
在这里插入图片描述
 
在这里插入图片描述
server {
server_name {w:domains:w};
{w:listenLines:w}
set $websiteRoot "/data/www/{w:indexDirName:w}";
root $websiteRoot;
index index.html index.htm index.php;
client_max_body_size {w:upload_max_filesize:w};
client_body_buffer_size 128;
location / {
{w:rewriteContents:w}
}
location ~ \.(php|phtml)$ {
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
}
location ~ /\.ht {
deny all;
}
}

添加变量

变量分为:环境变量、数据变量和扩展变量。在这里只需要添加扩展变量。
环境变量:在操作系统中用来指定操作系统运行环境的一些参数,与平常使用的环境变量相同。有时容器启动需要设置一些参数提供给容器内部的程序。如: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. 【排序算法】冒泡排序(Bubble Sort)

    0. 说明 参考 维基百科中的冒泡排序 冒泡排序 (Bubble Sort) 是与插入排序拥有相等的执行时间,但是两种算法在需要的交换次数却很大地不同. 在最坏的情况,冒泡排序需要 O(n2)  次交 ...

  2. Orange Pi 3 GPIO 笔记

    这是我写过的最水的文章 设备:Orange pi H6,Pi 3 引脚图: (使用Wiringpi 查看GPIO) +------+-----+----------+------+---+Orange ...

  3. November 15th, 2017 Week 46th Wednesday

    Of all the tribulations in this world, boredom is the one most hard to bear. 所有的苦难中,无聊是最难以忍受的. When ...

  4. 安装和配置Apache服务器(上)

    首先,安装软件分安装版和压缩版,压缩版也就是我们现在所说的绿色安装包.安装板和压缩版的区别就是,安装板在安装的时候就已经自动给你配置好环境,压缩版安装之后还要自己配置环境.自己配置环境也是有好处的,知 ...

  5. 阿里八八Alpha阶段Scrum(9/12)

    今日进度 叶文滔: 成功完成多级悬浮按钮,并添加与日程输入界面的连接.debug了一些对接产生的问题 黄梅玲: 合并单日项目至多日.获取json数据 王国超: 完成了初步的多日界面,pull至项目.进 ...

  6. 【2017下集美大学软工1412班_助教博客】团队作业3——需求改进&系统设计团队成绩公示

    作业要求 团队作业3--需求改进&系统设计 团队评分结果 Total QH BZ GJ MS SXX WBS SJ JG SJK JH NR CS PHILOSOPHER 需求改进&系 ...

  7. python第三十五课——生成器

    1.生成器: 什么是生成器? 它内部封装了一套公式/算法,只有等到需要调用/执行数据时 --> next()函数执行 才会将公式计算得到数据结果,这就是生成器的原理(核心思想): [注意事项]: ...

  8. 死磕nginx系列--nginx服务器做web服务器

    nginx 做静态服务器 HTML页面如下 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  9. BZOJ3233:[AHOI2013]找硬币(DP)

    Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...

  10. k8s 隔离context+namespace

    kubernetes 最简单的隔离是 应用间使用 namespace进行,对应不同项目,namespace 不同,那么相互调用使用 dns.namespace,而使用 context + namesp ...