使用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,在左側菜單點擊導入應用
,將內容粘貼進去,提交
導入成功!!點擊安裝便可。哈哈,太爽了吧。任何服務器環境可使用的應用均可以用這個方法來製做,好比微信小程序後端部分等等均可以這樣製做,方便分發和安裝。