使用Docker技术能够帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起以后,Docker的使用场景和范围进一步发展,现在在微服务架构愈来愈流行的状况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地。php
如何快速入门docker,开发属于本身的容器应用?咱们今天不整虚的,来点实打实的干货:利用URLOS快速开发docker应用,并可随意将应用导出给他人使用。html
对URLOS不了解的朋友,这里大概介绍一下,URLOS是一个容器云管理面板,基于Docker容器技术打包和运行应用,可自动识别机器和云应用的故障并将云应用转移至可用的机器上,单机故障并不影响业务开展,配合云存储即可轻松搭建7x24小时持续运行的应用环境。mysql
URLOS官网:https://www.urlos.com/linux
URLOS安装方法:https://www.urlos.com/center-home-index-detail-10-22-y.htmlnginx
安装URLOS:web
curl -SO https://www.urlos.com/install && chmod 544 install && ./install
安装完成后,地址栏输入 http://ip:9968 便可访问。redis
划重点:利用URLOS开发docker应用的最基本的流程: sql
这里咱们以制做一个LNP(linux+nginx+php)网站环境为例,快速制做一个能够导出给他人使用的docker应用。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
先更新一下镜像源,国内用阿里的会快一些
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-configure
和docker-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-development
和php.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
注意:须要修改将/data/urlos/master-config/config.jsonc
文件的envType的值设置为dev(开发环境):
vim /data/urlos/master-config/config.jsonc
浏览器地址栏输入http://主机ip:9968,登陆URLOS,在左侧菜单栏选择镜像管理,而后点击右上角的添加按钮。
输入镜像名称
镜像地址
开发者信息
在左侧菜单中选择应用管理。而后点击右上角的添加应用按钮:
应用的基本信息如上图所示。
**镜像:**选择上一步骤添加的镜像。
**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
**退出脚本:**容器关闭时以前,执行的脚本。如同,咱们关闭电脑时,系统会关闭正在容许的程序。
在这个应用,咱们须要添加模板php.ini
、vhost.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,在左侧菜单点击导入应用
,将内容粘贴进去,提交
导入成功!!点击安装便可。哈哈,太爽了吧。任何服务器环境可使用的应用均可以用这个方法来制做,好比微信小程序后端部分等等均可以这样制做,方便分发和安装。