/*! elementor - v3.16.0 - 14-09-2023 */ "use strict"; (self["webpackChunkelementor"] = self["webpackChunkelementor"] || []).push([["accordion"],{ /***/ "../assets/dev/js/frontend/handlers/accordion.js": /*!*******************************************************!*\ !*** ../assets/dev/js/frontend/handlers/accordion.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _baseTabs = _interopRequireDefault(__webpack_require__(/*! ./base-tabs */ "../assets/dev/js/frontend/handlers/base-tabs.js")); class Accordion extends _baseTabs.default { getDefaultSettings() { const defaultSettings = super.getDefaultSettings(); return { ...defaultSettings, showTabFn: 'slideDown', hideTabFn: 'slideUp' }; } } exports["default"] = Accordion; /***/ }), /***/ "../assets/dev/js/frontend/handlers/base-tabs.js": /*!*******************************************************!*\ !*** ../assets/dev/js/frontend/handlers/base-tabs.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; class baseTabs extends elementorModules.frontend.handlers.Base { getDefaultSettings() { return { selectors: { tablist: '[role="tablist"]', tabTitle: '.elementor-tab-title', tabContent: '.elementor-tab-content' }, classes: { active: 'elementor-active' }, showTabFn: 'show', hideTabFn: 'hide', toggleSelf: true, hidePrevious: true, autoExpand: true, keyDirection: { ArrowLeft: elementorFrontendConfig.is_rtl ? 1 : -1, ArrowUp: -1, ArrowRight: elementorFrontendConfig.is_rtl ? -1 : 1, ArrowDown: 1 } }; } getDefaultElements() { const selectors = this.getSettings('selectors'); return { $tabTitles: this.findElement(selectors.tabTitle), $tabContents: this.findElement(selectors.tabContent) }; } activateDefaultTab() { const settings = this.getSettings(); if (!settings.autoExpand || 'editor' === settings.autoExpand && !this.isEdit) { return; } const defaultActiveTab = this.getEditSettings('activeItemIndex') || 1, originalToggleMethods = { showTabFn: settings.showTabFn, hideTabFn: settings.hideTabFn }; // Toggle tabs without animation to avoid jumping this.setSettings({ showTabFn: 'show', hideTabFn: 'hide' }); this.changeActiveTab(defaultActiveTab); // Return back original toggle effects this.setSettings(originalToggleMethods); } handleKeyboardNavigation(event) { const tab = event.currentTarget, $tabList = jQuery(tab.closest(this.getSettings('selectors').tablist)), // eslint-disable-next-line @wordpress/no-unused-vars-before-return $tabs = $tabList.find(this.getSettings('selectors').tabTitle), isVertical = 'vertical' === $tabList.attr('aria-orientation'); switch (event.key) { case 'ArrowLeft': case 'ArrowRight': if (isVertical) { return; } break; case 'ArrowUp': case 'ArrowDown': if (!isVertical) { return; } event.preventDefault(); break; case 'Home': event.preventDefault(); $tabs.first().trigger('focus'); return; case 'End': event.preventDefault(); $tabs.last().trigger('focus'); return; default: return; } const tabIndex = tab.getAttribute('data-tab') - 1, direction = this.getSettings('keyDirection')[event.key], nextTab = $tabs[tabIndex + direction]; if (nextTab) { nextTab.focus(); } else if (-1 === tabIndex + direction) { $tabs.last().trigger('focus'); } else { $tabs.first().trigger('focus'); } } deactivateActiveTab(tabIndex) { const settings = this.getSettings(), activeClass = settings.classes.active, activeFilter = tabIndex ? '[data-tab="' + tabIndex + '"]' : '.' + activeClass, $activeTitle = this.elements.$tabTitles.filter(activeFilter), $activeContent = this.elements.$tabContents.filter(activeFilter); $activeTitle.add($activeContent).removeClass(activeClass); $activeTitle.attr({ tabindex: '-1', 'aria-selected': 'false', 'aria-expanded': 'false' }); $activeContent[settings.hideTabFn](); $activeContent.attr('hidden', 'hidden'); } activateTab(tabIndex) { const settings = this.getSettings(), activeClass = settings.classes.active, $requestedTitle = this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]'), $requestedContent = this.elements.$tabContents.filter('[data-tab="' + tabIndex + '"]'), animationDuration = 'show' === settings.showTabFn ? 0 : 400; $requestedTitle.add($requestedContent).addClass(activeClass); $requestedTitle.attr({ tabindex: '0', 'aria-selected': 'true', 'aria-expanded': 'true' }); $requestedContent[settings.showTabFn](animationDuration, () => elementorFrontend.elements.$window.trigger('elementor-pro/motion-fx/recalc')); $requestedContent.removeAttr('hidden'); } isActiveTab(tabIndex) { return this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]').hasClass(this.getSettings('classes.active')); } bindEvents() { this.elements.$tabTitles.on({ keydown: event => { // Support for old markup that includes an `` tag in the tab if (jQuery(event.target).is('a') && `Enter` === event.key) { event.preventDefault(); } // We listen to keydowon event for these keys in order to prevent undesired page scrolling if (['End', 'Home', 'ArrowUp', 'ArrowDown'].includes(event.key)) { this.handleKeyboardNavigation(event); } }, keyup: event => { switch (event.code) { case 'ArrowLeft': case 'ArrowRight': this.handleKeyboardNavigation(event); break; case 'Enter': case 'Space': event.preventDefault(); this.changeActiveTab(event.currentTarget.getAttribute('data-tab')); break; } }, click: event => { event.preventDefault(); this.changeActiveTab(event.currentTarget.getAttribute('data-tab')); } }); } onInit() { super.onInit(...arguments); this.activateDefaultTab(); } onEditSettingsChange(propertyName) { if ('activeItemIndex' === propertyName) { this.activateDefaultTab(); } } changeActiveTab(tabIndex) { const isActiveTab = this.isActiveTab(tabIndex), settings = this.getSettings(); if ((settings.toggleSelf || !isActiveTab) && settings.hidePrevious) { this.deactivateActiveTab(); } if (!settings.hidePrevious && isActiveTab) { this.deactivateActiveTab(tabIndex); } if (!isActiveTab) { this.activateTab(tabIndex); } } } exports["default"] = baseTabs; /***/ }) }]); //# sourceMappingURL=accordion.c16b88b2e8a0c50189bc.bundle.js.map(function(e,t){"use strict";var n=e.History=e.History||{},r=e.jQuery;if(typeof n.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");n.Adapter={bind:function(e,t,n){r(e).bind(t,n)},trigger:function(e,t,n){r(e).trigger(t,n)},extractEventData:function(e,n,r){var i=n&&n.originalEvent&&n.originalEvent[e]||r&&r[e]||t;return i},onDomLoad:function(e){r(e)}},typeof n.init!="undefined"&&n.init()})(window),function(e,t){"use strict";var n=e.console||t,r=e.document,i=e.navigator,s=!1,o=e.setTimeout,u=e.clearTimeout,a=e.setInterval,f=e.clearInterval,l=e.JSON,c=e.alert,h=e.History=e.History||{},p=e.history;try{s=e.sessionStorage,s.setItem("TEST","1"),s.removeItem("TEST")}catch(d){s=!1}l.stringify=l.stringify||l.encode,l.parse=l.parse||l.decode;if(typeof h.init!="undefined")throw new Error("History.js Core has already been loaded...");h.init=function(e){return typeof h.Adapter=="undefined"?!1:(typeof h.initCore!="undefined"&&h.initCore(),typeof h.initHtml4!="undefined"&&h.initHtml4(),!0)},h.initCore=function(d){if(typeof h.initCore.initialized!="undefined")return!1;h.initCore.initialized=!0,h.options=h.options||{},h.options.hashChangeInterval=h.options.hashChangeInterval||100,h.options.safariPollInterval=h.options.safariPollInterval||500,h.options.doubleCheckInterval=h.options.doubleCheckInterval||500,h.options.disableSuid=h.options.disableSuid||!1,h.options.storeInterval=h.options.storeInterval||1e3,h.options.busyDelay=h.options.busyDelay||250,h.options.debug=h.options.debug||!1,h.options.initialTitle=h.options.initialTitle||r.title,h.options.html4Mode=h.options.html4Mode||!1,h.options.delayInit=h.options.delayInit||!1,h.intervalList=[],h.clearAllIntervals=function(){var e,t=h.intervalList;if(typeof t!="undefined"&&t!==null){for(e=0;e")&&n[0]);return e>4?e:!1}();return e},h.isInternetExplorer=function(){var e=h.isInternetExplorer.cached=typeof h.isInternetExplorer.cached!="undefined"?h.isInternetExplorer.cached:Boolean(h.getInternetExplorerMajorVersion());return e},h.options.html4Mode?h.emulated={pushState:!0,hashChange:!0}:h.emulated={pushState:!Boolean(e.history&&e.history.pushState&&e.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(i.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(i.userAgent)),hashChange:Boolean(!("onhashchange"in e||"onhashchange"in r)||h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<8)},h.enabled=!h.emulated.pushState,h.bugs={setHash:Boolean(!h.emulated.pushState&&i.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)),safariPoll:Boolean(!h.emulated.pushState&&i.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)),ieDoubleCheck:Boolean(h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(h.isInternetExplorer()&&h.getInternetExplorerMajorVersion()<7)},h.isEmptyObject=function(e){for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},h.cloneObject=function(e){var t,n;return e?(t=l.stringify(e),n=l.parse(t)):n={},n},h.getRootUrl=function(){var e=r.location.protocol+"//"+(r.location.hostname||r.location.host);if(r.location.port||!1)e+=":"+r.location.port;return e+="/",e},h.getBaseHref=function(){var e=r.getElementsByTagName("base"),t=null,n="";return e.length===1&&(t=e[0],n=t.href.replace(/[^\/]+$/,"")),n=n.replace(/\/+$/,""),n&&(n+="/"),n},h.getBaseUrl=function(){var e=h.getBaseHref()||h.getBasePageUrl()||h.getRootUrl();return e},h.getPageUrl=function(){var e=h.getState(!1,!1),t=(e||{}).url||h.getLocationHref(),n;return n=t.replace(/\/+$/,"").replace(/[^\/]+$/,function(e,t,n){return/\./.test(e)?e:e+"/"}),n},h.getBasePageUrl=function(){var e=h.getLocationHref().replace(/[#\?].*/,"").replace(/[^\/]+$/,function(e,t,n){return/[^\/]$/.test(e)?"":e}).replace(/\/+$/,"")+"/";return e},h.getFullUrl=function(e,t){var n=e,r=e.substring(0,1);return t=typeof t=="undefined"?!0:t,/[a-z]+\:\/\//.test(e)||(r==="/"?n=h.getRootUrl()+e.replace(/^\/+/,""):r==="#"?n=h.getPageUrl().replace(/#.*/,"")+e:r==="?"?n=h.getPageUrl().replace(/[\?#].*/,"")+e:t?n=h.getBaseUrl()+e.replace(/^(\.\/)+/,""):n=h.getBasePageUrl()+e.replace(/^(\.\/)+/,"")),n.replace(/\#$/,"")},h.getShortUrl=function(e){var t=e,n=h.getBaseUrl(),r=h.getRootUrl();return h.emulated.pushState&&(t=t.replace(n,"")),t=t.replace(r,"/"),h.isTraditionalAnchor(t)&&(t="./"+t),t=t.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),t},h.getLocationHref=function(e){return e=e||r,e.URL===e.location.href?e.location.href:e.location.href===decodeURIComponent(e.URL)?e.URL:e.location.hash&&decodeURIComponent(e.location.href.replace(/^[^#]+/,""))===e.location.hash?e.location.href:e.URL.indexOf("#")==-1&&e.location.href.indexOf("#")!=-1?e.location.href:e.URL||e.location.href},h.store={},h.idToState=h.idToState||{},h.stateToId=h.stateToId||{},h.urlToId=h.urlToId||{},h.storedStates=h.storedStates||[],h.savedStates=h.savedStates||[],h.normalizeStore=function(){h.store.idToState=h.store.idToState||{},h.store.urlToId=h.store.urlToId||{},h.store.stateToId=h.store.stateToId||{}},h.getState=function(e,t){typeof e=="undefined"&&(e=!0),typeof t=="undefined"&&(t=!0);var n=h.getLastSavedState();return!n&&t&&(n=h.createStateObject()),e&&(n=h.cloneObject(n),n.url=n.cleanUrl||n.url),n},h.getIdByState=function(e){var t=h.extractId(e.url),n;if(!t){n=h.getStateString(e);if(typeof h.stateToId[n]!="undefined")t=h.stateToId[n];else if(typeof h.store.stateToId[n]!="undefined")t=h.store.stateToId[n];else{for(;;){t=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof h.idToState[t]=="undefined"&&typeof h.store.idToState[t]=="undefined")break}h.stateToId[n]=t,h.idToState[t]=e}}return t},h.normalizeState=function(e){var t,n;if(!e||typeof e!="object")e={};if(typeof e.normalized!="undefined")return e;if(!e.data||typeof e.data!="object")e.data={};return t={},t.normalized=!0,t.title=e.title||"",t.url=h.getFullUrl(e.url?e.url:h.getLocationHref()),t.hash=h.getShortUrl(t.url),t.data=h.cloneObject(e.data),t.id=h.getIdByState(t),t.cleanUrl=t.url.replace(/\??\&_suid.*/,""),t.url=t.cleanUrl,n=!h.isEmptyObject(t.data),(t.title||n)&&h.options.disableSuid!==!0&&(t.hash=h.getShortUrl(t.url).replace(/\??\&_suid.*/,""),/\?/.test(t.hash)||(t.hash+="?"),t.hash+="&_suid="+t.id),t.hashedUrl=h.getFullUrl(t.hash),(h.emulated.pushState||h.bugs.safariPoll)&&h.hasUrlDuplicate(t)&&(t.url=t.hashedUrl),t},h.createStateObject=function(e,t,n){var r={data:e,title:t,url:n};return r=h.normalizeState(r),r},h.getStateById=function(e){e=String(e);var n=h.idToState[e]||h.store.idToState[e]||t;return n},h.getStateString=function(e){var t,n,r;return t=h.normalizeState(e),n={data:t.data,title:e.title,url:e.url},r=l.stringify(n),r},h.getStateId=function(e){var t,n;return t=h.normalizeState(e),n=t.id,n},h.getHashByState=function(e){var t,n;return t=h.normalizeState(e),n=t.hash,n},h.extractId=function(e){var t,n,r,i;return e.indexOf("#")!=-1?i=e.split("#")[0]:i=e,n=/(.*)\&_suid=([0-9]+)$/.exec(i),r=n?n[1]||e:e,t=n?String(n[2]||""):"",t||!1},h.isTraditionalAnchor=function(e){var t=!/[\/\?\.]/.test(e);return t},h.extractState=function(e,t){var n=null,r,i;return t=t||!1,r=h.extractId(e),r&&(n=h.getStateById(r)),n||(i=h.getFullUrl(e),r=h.getIdByUrl(i)||!1,r&&(n=h.getStateById(r)),!n&&t&&!h.isTraditionalAnchor(e)&&(n=h.createStateObject(null,null,i))),n},h.getIdByUrl=function(e){var n=h.urlToId[e]||h.store.urlToId[e]||t;return n},h.getLastSavedState=function(){return h.savedStates[h.savedStates.length-1]||t},h.getLastStoredState=function(){return h.storedStates[h.storedStates.length-1]||t},h.hasUrlDuplicate=function(e){var t=!1,n;return n=h.extractState(e.url),t=n&&n.id!==e.id,t},h.storeState=function(e){return h.urlToId[e.url]=e.id,h.storedStates.push(h.cloneObject(e)),e},h.isLastSavedState=function(e){var t=!1,n,r,i;return h.savedStates.length&&(n=e.id,r=h.getLastSavedState(),i=r.id,t=n===i),t},h.saveState=function(e){return h.isLastSavedState(e)?!1:(h.savedStates.push(h.cloneObject(e)),!0)},h.getStateByIndex=function(e){var t=null;return typeof e=="undefined"?t=h.savedStates[h.savedStates.length-1]:e<0?t=h.savedStates[h.savedStates.length+e]:t=h.savedStates[e],t},h.getCurrentIndex=function(){var e=null;return h.savedStates.length<1?e=0:e=h.savedStates.length-1,e},h.getHash=function(e){var t=h.getLocationHref(e),n;return n=h.getHashByUrl(t),n},h.unescapeHash=function(e){var t=h.normalizeHash(e);return t=decodeURIComponent(t),t},h.normalizeHash=function(e){var t=e.replace(/[^#]*#/,"").replace(/#.*/,"");return t},h.setHash=function(e,t){var n,i;return t!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.setHash,args:arguments,queue:t}),!1):(h.busy(!0),n=h.extractState(e,!0),n&&!h.emulated.pushState?h.pushState(n.data,n.title,n.url,!1):h.getHash()!==e&&(h.bugs.setHash?(i=h.getPageUrl(),h.pushState(null,null,i+"#"+e,!1)):r.location.hash=e),h)},h.escapeHash=function(t){var n=h.normalizeHash(t);return n=e.encodeURIComponent(n),h.bugs.hashEscape||(n=n.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),n},h.getHashByUrl=function(e){var t=String(e).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return t=h.unescapeHash(t),t},h.setTitle=function(e){var t=e.title,n;t||(n=h.getStateByIndex(0),n&&n.url===e.url&&(t=n.title||h.options.initialTitle));try{r.getElementsByTagName("title")[0].innerHTML=t.replace("<","<").replace(">",">").replace(" & "," & ")}catch(i){}return r.title=t,h},h.queues=[],h.busy=function(e){typeof e!="undefined"?h.busy.flag=e:typeof h.busy.flag=="undefined"&&(h.busy.flag=!1);if(!h.busy.flag){u(h.busy.timeout);var t=function(){var e,n,r;if(h.busy.flag)return;for(e=h.queues.length-1;e>=0;--e){n=h.queues[e];if(n.length===0)continue;r=n.shift(),h.fireQueueItem(r),h.busy.timeout=o(t,h.options.busyDelay)}};h.busy.timeout=o(t,h.options.busyDelay)}return h.busy.flag},h.busy.flag=!1,h.fireQueueItem=function(e){return e.callback.apply(e.scope||h,e.args||[])},h.pushQueue=function(e){return h.queues[e.queue||0]=h.queues[e.queue||0]||[],h.queues[e.queue||0].push(e),h},h.queue=function(e,t){return typeof e=="function"&&(e={callback:e}),typeof t!="undefined"&&(e.queue=t),h.busy()?h.pushQueue(e):h.fireQueueItem(e),h},h.clearQueue=function(){return h.busy.flag=!1,h.queues=[],h},h.stateChanged=!1,h.doubleChecker=!1,h.doubleCheckComplete=function(){return h.stateChanged=!0,h.doubleCheckClear(),h},h.doubleCheckClear=function(){return h.doubleChecker&&(u(h.doubleChecker),h.doubleChecker=!1),h},h.doubleCheck=function(e){return h.stateChanged=!1,h.doubleCheckClear(),h.bugs.ieDoubleCheck&&(h.doubleChecker=o(function(){return h.doubleCheckClear(),h.stateChanged||e(),!0},h.options.doubleCheckInterval)),h},h.safariStatePoll=function(){var t=h.extractState(h.getLocationHref()),n;if(!h.isLastSavedState(t))return n=t,n||(n=h.createStateObject()),h.Adapter.trigger(e,"popstate"),h;return},h.back=function(e){return e!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.back,args:arguments,queue:e}),!1):(h.busy(!0),h.doubleCheck(function(){h.back(!1)}),p.go(-1),!0)},h.forward=function(e){return e!==!1&&h.busy()?(h.pushQueue({scope:h,callback:h.forward,args:arguments,queue:e}),!1):(h.busy(!0),h.doubleCheck(function(){h.forward(!1)}),p.go(1),!0)},h.go=function(e,t){var n;if(e>0)for(n=1;n<=e;++n)h.forward(t);else{if(!(e<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(n=-1;n>=e;--n)h.back(t)}return h};if(h.emulated.pushState){var v=function(){};h.pushState=h.pushState||v,h.replaceState=h.replaceState||v}else h.onPopState=function(t,n){var r=!1,i=!1,s,o;return h.doubleCheckComplete(),s=h.getHash(),s?(o=h.extractState(s||h.getLocationHref(),!0),o?h.replaceState(o.data,o.title,o.url,!1):(h.Adapter.trigger(e,"anchorchange"),h.busy(!1)),h.expectedStateId=!1,!1):(r=h.Adapter.extractEventData("state",t,n)||!1,r?i=h.getStateById(r):h.expectedStateId?i=h.getStateById(h.expectedStateId):i=h.extractState(h.getLocationHref()),i||(i=h.createStateObject(null,null,h.getLocationHref())),h.expectedStateId=!1,h.isLastSavedState(i)?(h.busy(!1),!1):(h.storeState(i),h.saveState(i),h.setTitle(i),h.Adapter.trigger(e,"statechange"),h.busy(!1),!0))},h.Adapter.bind(e,"popstate",h.onPopState),h.pushState=function(t,n,r,i){if(h.getHashByUrl(r)&&h.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(i!==!1&&h.busy())return h.pushQueue({scope:h,callback:h.pushState,args:arguments,queue:i}),!1;h.busy(!0);var s=h.createStateObject(t,n,r);return h.isLastSavedState(s)?h.busy(!1):(h.storeState(s),h.expectedStateId=s.id,p.pushState(s.id,s.title,s.url),h.Adapter.trigger(e,"popstate")),!0},h.replaceState=function(t,n,r,i){if(h.getHashByUrl(r)&&h.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(i!==!1&&h.busy())return h.pushQueue({scope:h,callback:h.replaceState,args:arguments,queue:i}),!1;h.busy(!0);var s=h.createStateObject(t,n,r);return h.isLastSavedState(s)?h.busy(!1):(h.storeState(s),h.expectedStateId=s.id,p.replaceState(s.id,s.title,s.url),h.Adapter.trigger(e,"popstate")),!0};if(s){try{h.store=l.parse(s.getItem("History.store"))||{}}catch(m){h.store={}}h.normalizeStore()}else h.store={},h.normalizeStore();h.Adapter.bind(e,"unload",h.clearAllIntervals),h.saveState(h.storeState(h.extractState(h.getLocationHref(),!0))),s&&(h.onUnload=function(){var e,t,n;try{e=l.parse(s.getItem("History.store"))||{}}catch(r){e={}}e.idToState=e.idToState||{},e.urlToId=e.urlToId||{},e.stateToId=e.stateToId||{};for(t in h.idToState){if(!h.idToState.hasOwnProperty(t))continue;e.idToState[t]=h.idToState[t]}for(t in h.urlToId){if(!h.urlToId.hasOwnProperty(t))continue;e.urlToId[t]=h.urlToId[t]}for(t in h.stateToId){if(!h.stateToId.hasOwnProperty(t))continue;e.stateToId[t]=h.stateToId[t]}h.store=e,h.normalizeStore(),n=l.stringify(e);try{s.setItem("History.store",n)}catch(i){if(i.code!==DOMException.QUOTA_EXCEEDED_ERR)throw i;s.length&&(s.removeItem("History.store"),s.setItem("History.store",n))}},h.intervalList.push(a(h.onUnload,h.options.storeInterval)),h.Adapter.bind(e,"beforeunload",h.onUnload),h.Adapter.bind(e,"unload",h.onUnload));if(!h.emulated.pushState){h.bugs.safariPoll&&h.intervalList.push(a(h.safariStatePoll,h.options.safariPollInterval));if(i.vendor==="Apple Computer, Inc."||(i.appCodeName||"")==="Mozilla")h.Adapter.bind(e,"hashchange",function(){h.Adapter.trigger(e,"popstate")}),h.getHash()&&h.Adapter.onDomLoad(function(){h.Adapter.trigger(e,"hashchange")})}},(!h.options||!h.options.delayInit)&&h.init()}(window){"id":1952,"date":"2021-08-31T22:49:48","date_gmt":"2021-08-31T15:49:48","guid":{"rendered":"https:\/\/uetacad.com\/?p=1952"},"modified":"2021-08-31T22:49:52","modified_gmt":"2021-08-31T15:49:52","slug":"cac-van-de-ve-docker-tren-production","status":"publish","type":"post","link":"https:\/\/uetacad.com\/cac-van-de-ve-docker-tren-production\/","title":{"rendered":"C\u00e1c v\u1ea5n \u0111\u1ec1 v\u1ec1 Docker tr\u00ean Production"},"content":{"rendered":"\n

1. Kh\u00f4ng th\u1ec3 xo\u00e1 c\u00e1c image c\u0169<\/strong><\/p>\n\n\n\n

C\u00f3 l\u1ebd y\u00eau c\u1ea7u c\u1ea7n nhi\u1ec1u nh\u1ea5t v\u00e0 c\u00e1c t\u00ednh n\u0103ng c\u00f2n thi\u1ebfu trong Docker l\u00e0 m\u1ed9t l\u1ec7nh \u0111\u1ec3 xo\u00e1 c\u00e1c image c\u0169 (l\u1edbn h\u01a1n X ng\u00e0y ho\u1eb7c kh\u00f4ng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong v\u00f2ng X ng\u00e0y,hay b\u1ea5t c\u1ee9 \u0111i\u1ec1u g\u00ec t\u01b0\u01a1ng t\u1ef1 nh\u01b0 th\u1ebf). Dung l\u01b0\u1ee3ng \u1ed5 c\u1ee9ng l\u00e0 m\u1ed9t v\u1ea5n \u0111\u1ec1 quan tr\u1ecdng cho r\u1eb1ng h\u00ecnh \u1ea3nh \u0111\u01b0\u1ee3c \u0111\u1ed5i m\u1edbi th\u01b0\u1eddng xuy\u00ean v\u00e0 h\u1ecd c\u00f3 th\u1ec3 m\u1ea5t nhi\u1ec1u h\u01a1n 1GB m\u1ed7i.<\/p>\n\n\n\n

C\u00e1ch duy nh\u1ea5t \u0111\u1ec3 gi\u1ea3i ph\u00f3ng l\u01b0u l\u01b0\u1ee3ng \u0111\u0129a c\u1ee9ng l\u00e0 ch\u1ea1y c\u00e2u l\u1ec7nh n\u00e0y, \u0111\u1eb7t cron cho ch\u1ea1y \u0111\u1ecbnh k\u1ef3 trong 1 kho\u1ea3ng th\u1eddi gian, v\u1edbi t\u00f4i th\u00ec 2 tu\u1ea7n ho\u1eb7c 1 th\u00e1ng :<\/p>\n\n\n\n

docker rmi $(docker images -q -a)\n<\/code><\/pre>\n\n\n\n

C\u00e2u l\u1ec7nh tr\u00ean s\u1ebd li\u1ec7t k\u00ea t\u1ea5t c\u1ea3 c\u00e1c h\u00ecnh \u1ea3nh v\u00e0 xo\u00e1. C\u00e1c b\u1ea1n s\u1ebd th\u1ea5y c\u00f3 l\u1ed7i v\u1edbi c\u00e1c image \u0111ang \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng b\u1edfi c\u00e1c container \u0111ang ch\u1ea1y. Tuy output kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1eb9p cho l\u1eafm nh\u01b0ng \u00edt ra th\u00ec n\u00f3 c\u0169ng ch\u1ea1y ch\u00ednh x\u00e1c \u0111\u01b0\u1ee3c 1 ph\u1ea7n n\u00e0o \u0111\u00f3\u00a0\u00a0.<\/p>\n\n\n\n

Th\u1ef1c ra t\u00f4i c\u0169ng \u0111\u00e3 t\u00ecm ki\u1ebfm kh\u00e1 nhi\u1ec1u tr\u00ean internet nh\u01b0ng kh\u00f4ng c\u00f3 gi\u1ea3i ph\u00e1p n\u00e0o cho nh\u1eefng g\u00ec t\u00f4i suy ngh\u0129. Kh\u00f4ng c\u00f3 API \u0111\u1ec3 li\u1ec7t k\u00ea c\u00e1c images theo ng\u00e0y, c\u00f3 1 gi\u1ea3i ph\u00e1p c\u00f3 nh\u01b0ng m\u00e0 ch\u1ec9 \u0111\u01b0\u1ee3c trong 1 kho\u1ea3ng th\u1eddi gian nh\u1ea5t \u0111\u1ecbnh. Nh\u00ecn chung c\u00e1c c\u00e1ch l\u00e0m \u0111\u1ec1u l\u00e0 \u0111\u1ecdc thu\u1ed9c t\u00ednh ng\u00e0y th\u00e1ng t\u1eeb image v\u00e0 sau \u0111\u00f3 l\u00e0 g\u1ecdi l\u1ec7nh ‘docker rmi’, nh\u01b0ng s\u1ebd b\u1ecb fail n\u1ebfu t\u00ean image b\u1ecb thay \u0111\u1ed5i. M\u1ed9t c\u00e1ch kh\u00e1c c\u0169ng kh\u00e1 gi\u1ed1ng v\u1edbi c\u00e1ch tr\u00ean \u0111\u00f3 l\u00e0 \u0111\u1ecdc ng\u00e0y th\u00e1ng sau \u0111\u00f3 th\u00ec xo\u00e1 ngay l\u1eadp t\u1ee9c nh\u01b0ng c\u00e1ch n\u00e0y kh\u00f4ng ho\u00e0n h\u1ea3o.<\/p>\n\n\n\n

2. Docker Issue: h\u1ed7 tr\u1ee3 kernel<\/strong><\/p>\n\n\n\n

C\u00f3 v\u00f4 s\u1ed1 nh\u01b0ng v\u1ea5n \u0111\u1ec1 li\u00ean quan \u0111\u1ebfn s\u1ef1 t\u01b0\u01a1ng t\u00e1c gi\u1eefa c\u00e1c kernel, b\u1ea3n ph\u00e2n ph\u1ed1i Docker v\u00e0 h\u1ec7 th\u1ed1ng t\u1eadp tin.<\/p>\n\n\n\n

V\u00ed d\u1ee5 v\u1edbi Debian b\u1ea3n stable, nh\u01b0 c\u00e1c b\u1ea1n \u0111\u00e3 t\u1eebng c\u00e0i docker ch\u1eafc h\u1eb3n \u0111\u00e3 bi\u1ebft docker y\u00eau c\u1ea7u kernel 3.10 tr\u1edf l\u00ean. Tr\u00ean Debian Jessie 3.16.7-ckt20-1 (ph\u00e1t h\u00e0nh th\u00e1ng 11 n\u0103m 2015). C\u00f3 v\u1ea5n \u0111\u1ec1 \u0111\u00f3 l\u00e0 host hay b\u1ecb crash, trung b\u00ecnh ch\u1ec9 ch\u1ea1y \u0111\u01b0\u1ee3c kho\u1ea3ng v\u00e0i gi\u1edd, vi\u1ec7c n\u00e0y c\u0169ng \u0111\u00e3 \u0111\u01b0\u1ee3c ph\u1ea7n l\u1edbn c\u1ed9ng \u0111\u1ed3ng report.<\/p>\n\n\n\n

_Linux 3.x: storage driver kh\u00f4ng \u1ed5n \u0111\u1ecbnh_\n<\/code><\/pre>\n\n\n\n

Docker c\u00f3 tr\u00ecnh \u0111i\u1ec1u khi\u1ec3n l\u01b0u tr\u1eef kh\u00e1c nhau. V\u00e0 duy nh\u1ea5t (\u0111\u01b0\u1ee3c khuy\u1ebfn c\u00e1o) \u0111\u01b0\u1ee3c h\u1ed7 tr\u1ee3 t\u1ed1t \u0111\u00f3 l\u00e0 AUFS. Nh\u01b0ng drive AUFS l\u1ea1i kh\u00f4ng \u1ed5n \u0111\u1ecbnh. N\u00f3 b\u1ecb l\u1ed7i nghi\u00eam tr\u1ecdng l\u00e0m kernel panic v\u00e0 l\u00e0m h\u01b0 d\u1eef li\u1ec7u. V\u00e0 v\u1ea5n \u0111\u1ec1 \u0111\u00f3 \u00edt nh\u1ea5t x\u1ea3y ra v\u1edbi t\u1ea5t c\u1ea3 kernel “linux-3.16.x”. V\u00f4 ph\u01b0\u01a1ng c\u1ee9u ch\u1eefa.<\/p>\n\n\n\n

Sau \u0111\u00f3 t\u00f4i c\u0169ng \u0111\u00e3 th\u1eed l\u00e0m theo Debian c\u1eadp nh\u1eadt kernel m\u1edbi nh\u1ea5t. Debian c\u00f4ng b\u1ed1 b\u1ea3n v\u00e1 \u0111\u1eb7c bi\u1ec7t b\u00ean ngo\u00e0i chu k\u1ef3 release th\u01b0\u1eddng xuy\u00ean c\u1ee7a h\u1ecd. C\u00f3 m\u1ed9t bugfix l\u1edbn \u0111\u1ec3 v\u00e1 l\u1ed7i AUFS kho\u1ea3ng th\u00e1ng ba n\u0103m 2016. Sau \u0111\u00f3 c\u00f3 v\u1ebb v\u1ea5n \u0111\u1ec1 AUFS \u0111\u00e3 \u0111\u01b0\u1ee3c gi\u1ea3i quy\u1ebft nh\u01b0ng l\u1ea1i kernel panic, reboot li\u00ean t\u1ee5c li\u00ean t\u1ee5c. C\u00f3 nhi\u1ec1u b\u1ea3n s\u1eeda l\u1ed7i cho AUFS xu\u1ea5t b\u1ea3n c\u00f9ng n\u0103m 2016. C\u00f3 m\u1ed9t s\u1ed1 l\u1ed7i \u0111\u01b0\u1ee3c kh\u1eafc ph\u1ee5c khi update kernel nh\u01b0ng sau \u0111\u00f3 l\u1ea1i c\u00f3 nh\u1eefng l\u1ed7i m\u1edbi. M\u00ecnh xin t\u1ed5ng h\u1ee3p l\u1ea1i c\u0169ng nh\u01b0 c\u00e1ch kh\u1eafc ph\u1ee5c nh\u01b0 sau :<\/p>\n\n\n\n

  • Debian stable ch\u1ea1y kh\u00f4ng \u1ed5 \u0111\u1ecbnh tr\u00ean kernel 3.16, c\u00f3 th\u1ec3 chuy\u1ec3n sang d\u00f9ng kernel 4 \u0111\u1ec3 fix l\u1ed7i t\u1ea1m th\u1eddi.<\/li>
  • RHEL \/ CentOS-6 l\u00e0 tr\u00ean kernel 2.x v\u00e0 RHEL\/CentOS-7 l\u00e0 tr\u00ean kernel 3.10, theo m\u00ecnh n\u00ean s\u1eed d\u1ee5ng Redhat ho\u1eb7c CentOS 7 s\u1ebd \u1ed5n \u0111\u1ecbnh h\u01a1n l\u00e0 upgrade kernel tr\u00ean CentOS ho\u1eb7c Redhat 6.<\/li>
  • S\u1eed d\u1ee5ng ubuntu, qua m\u1ed9t th\u1eddi gian s\u1eed d\u1ee5ng docker m\u00ecnh th\u1ea5y ubuntu m\u1eb7c d\u00f9 v\u1eabn c\u00f3 l\u1ed7i kh\u00f3 hi\u1ec3u x\u1ea3y ra nh\u01b0ng c\u00f3 v\u1ebb n\u00f3 l\u00e0 distro \u1ed5n \u0111\u1ecbnh nh\u1ea5t v\u1edbi docker t\u00ednh t\u1edbi th\u1eddi \u0111i\u1ec3m n\u00e0y.<\/li><\/ul>\n\n\n\n

    Linux 4.x: Kernel 4.0 official \u0111\u00e3 kh\u00f4ng h\u1ed7 tr\u1ee3 c\u00f2n h\u1ed7 tr\u1ee3 docker \u0110\u00f3 l\u00e0 \u0111i\u1ec1u m\u00ecnh mu\u1ed1n chia s\u1ebb v\u1edbi c\u00e1c b\u1ea1n, \u0111\u00f3 l\u00e0 nh\u1eefng v\u1ea5n \u0111\u1ec1 v\u1ec1 AUFS s\u1ebd \u0111\u01b0\u1ee3c k\u1ebft th\u00fac b\u1edfi v\u00ec kernel 4.0 s\u1ebd ko support AUFS n\u1eefa.<\/p>\n\n\n\n

    Kh\u00f4ng c\u00f3 b\u1ea3n v\u00e1 ch\u00ednh th\u1ee9c h\u1ed7 tr\u1ee3, kh\u00f4ng c\u00f3 m\u00f4-\u0111un t\u00f9y ch\u1ecdn. AUFS l\u00e0 ho\u00e0n to\u00e0n bi\u1ebfn m\u1ea5t. Ch\u1eafc l\u00e0 nh\u1eefng ng\u01b0\u1eddi ph\u00e1t tri\u1ec3n kernel c\u0169ng ph\u1ea3i qu\u1ef3 g\u1ed1i tr\u01b0\u1edbc \u00f4ng AUFS n\u00e0y r\u1ed3i\u00a0.<\/p>\n\n\n\n

    V\u1eady th\u00ec l\u1ea1i c\u00f3 1 c\u00e2u h\u1ecfi \u1edf \u0111\u1ea5y \u0111\u00f3 l\u00e0 n\u1ebfu Docker kh\u00f4ng c\u00f3 AUFS th\u00ec n\u00f3 s\u1ebd ho\u1ea1t \u0111\u1ed9ng nh\u01b0 th\u1ebf n\u00e0o ? C\u00f3 l\u1ebd ch\u00ednh nh\u1eefng nh\u00e0 ph\u00e1t tri\u1ec3n docker c\u0169ng nh\u1eadn ra \u0111\u01b0\u1ee3c v\u1ea5n \u0111\u1ec1 c\u1ee7a ch\u00ednh m\u00ecnh v\u00ec v\u1eady h\u1ecd \u0111\u00e3 vi\u1ebft 1 h\u1ec7 th\u1ed1ng t\u1eadp tin m\u1edbi g\u1ecdi l\u00e0 OverlayFS.<\/p>\n\n\n\n

    OverlayFS l\u00e0 m\u1ed9t filesystem hi\u1ec7n \u0111\u1ea1i t\u01b0\u01a1ng t\u1ef1 nh\u01b0 AUFS. So v\u1edbi AUFS, OverlayFS c\u00f3 m\u1ed9t thi\u1ebft k\u1ebf \u0111\u01a1n gi\u1ea3n, nhanh h\u01a1n v\u00e0 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng t\u1eeb b\u1ea3n kernel 3.18. M\u1edbi \u0111\u00e2y th\u00ec phi\u00ean b\u1ea3n OverlayFS 2 c\u0169ng \u0111\u00e3 ra m\u1eaft tr\u00ean docker 1.12, n\u00f3 kh\u1eafc ph\u1ee5c \u0111\u01b0\u1ee3c \u0111i\u1ec3m y\u1ebfu c\u1ee7a overlayfs \u0111\u00f3 ch\u1ea1y \u0111\u01b0\u1ee3c tr\u00ean kernel 4.<\/p>\n\n\n\n

    3. Docker Registry : B\u1ecb ph\u1ee5 thu\u1ed9c<\/strong><\/p>\n\n\n\n

    L\u00e0 n\u01a1i l\u01b0u tr\u1eef v\u00e0 ph\u00e2n ph\u1ed1i c\u00e1c image c\u1ee7a dockerdocker<\/p>\n\n\n\n

    Automatic CI build  ===> (on success) push the image to ===> docker registry\n<\/code><\/pre>\n\n\n\n
    Deploy command <=== pull the image from <=== docker registry\n<\/code><\/pre>\n\n\n\n

    Public registry \u0111\u01b0\u1ee3c v\u1eadn h\u00e0nh b\u1edfi Docker \u0111\u00f3 l\u00e0 Docker Hub. V\u1edbi c\u00e1 nh\u00e2n ho\u1eb7c c\u00f4ng ty ri\u00eang n\u1ebfu b\u1ea1n ko mu\u1ed1n b\u1ecf ti\u1ec1n th\u00ec ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 t\u1ea1o 1 registry ri\u00eang. C\u00f3 3 phi\u00ean b\u1ea3n c\u1ee7a registry Docker m\u00e0 b\u1ea1n c\u00f3 th\u1ec3 ch\u1ecdn :<\/p>\n\n\n\n

    • Registry v1, hi\u1ec7n t\u1ea1i \u0111\u00e3 b\u1ecb c\u1ed9ng \u0111\u1ed3ng b\u1ecf r\u01a1i<\/li>
    • Registry v2, vi\u1ebft l\u1ea1i \u0111\u1ea7y \u0111\u1ee7 b\u1eb1ng Golang, l\u1ea7n \u0111\u1ea7u ti\u00ean \u0111\u01b0\u1ee3c ph\u00e1t h\u00e0nh v\u00e0o th\u00e1ng 4 n\u0103m 2015<\/li>
    • Trusted Registry l\u00e0 1 m\u1ed9t d\u1ecbch v\u1ee5. Vd nh\u01b0 Docker Hub<\/li><\/ul>\n\n\n\n

      4. V\u1ea5n \u0111\u1ec1 c\u1ee7a Docker Registry<\/strong><\/p>\n\n\n\n

      T\u1eeb khi docker registry v2 c\u00f3 m\u1eb7t th\u00ec v1 \u0111\u00e3 ho\u00e0n to\u00e0n ko \u0111\u01b0\u1ee3c support. \u0110i\u1ec1u \u0111\u00f3 c\u00f3 ngh\u0129a l\u00e0 g\u00ec ? Ngh\u0129a l\u00e0 n\u1ebfu b\u1ea1n hay c\u00f4ng ty c\u1ee7a b\u1ea1n \u0111\u00e3 s\u1eed d\u1ee5ng v1 th\u00ec b\u1eaft bu\u1ed9c ph\u1ea3i upgrade l\u00ean v2 \u0111\u1ec3 nh\u1eadn \u0111\u01b0\u1ee3c s\u1ef1 h\u1ed7 tr\u1ee3 t\u1eeb ph\u00eda Docker. Th\u1eddi gian \u0111\u1ec3 chuy\u1ec3n \u0111\u1ed5i ph\u1ee5 thu\u1ed9c v\u00e0o \u0111\u1ed9 ph\u1ee9c t\u1ea1p c\u1ee7a h\u1ec7 th\u1ed1ng (config, path, URL, thi\u1ebft b\u1ecb \u0111\u1ea7u cu\u1ed1i v.v…). V\u1eady b\u00e0i h\u1ecdc r\u00fat ra \u1edf \u0111\u00e2y \u0111\u00f3 l\u00e0 s\u1ebd l\u00e0 qu\u00e1 phi\u00eau l\u01b0u n\u1ebfu tin c\u1eady v\u00e0o docker \u0111\u1ec3 tri\u1ec3n khai tr\u00ean production r\u1ed3i 1 ng\u00e0y n\u00e0o \u0111\u00f3 b\u1ea1n s\u1ebd g\u1eb7p nh\u1eefng v\u1ea5n \u0111\u1ec1 khi c\u1ee9 \u0111u\u1ed5i theo h\u1ecd.<\/p>\n\n\n\n

      Docker Registry: Kh\u00f4ng th\u1ec3 xo\u00e1 \u0111\u01b0\u1ee3c image Kh\u1ed5ng th\u1ec3 xo\u00e1 c\u00e1c image tr\u00ean Docker Registry, dung l\u01b0\u1ee3ng s\u1ebd t\u0103ng d\u1ea7n. N\u1ebfu b\u1ea1n s\u1eed d\u1ee5ng x\u00e2y d\u1ef1ng docker registry ri\u00eang m\u00e0 c\u1ee9 m\u1ed7i tu\u1ea7n d\u1eef li\u1ec7u c\u1ee7a b\u1ea1n t\u0103ng l\u00ean 50GB v\u1eady th\u00ec c\u1ea7n bao nhi\u00eau cho \u0111\u1ee7 \u0111\u00e2y. \u1ede \u0111\u00e2y th\u00ec t\u00f4i s\u1ebd ngh\u0129 \u0111\u1ebfn l\u01b0u image c\u1ee7a registry l\u00ean storage v\u00e0 mua th\u00eam \u1ed5 c\u1ee9ng l\u1eafp v\u00e0o n\u1ebfu c\u1ea7n. T\u00f4i c\u0169ng \u0111\u00e3 t\u1eebng xo\u00e1 th\u1eed b\u1eb1ng tay c\u00e1c t\u1ec7p tin c\u1ee7a Docker Registry nh\u01b0ng cu\u1ed1i c\u00f9ng l\u00e0 h\u1ecfng h\u1ebft, h\u1ecfng to\u00e0n b\u1ed9 d\u1eef li\u1ec7u. N\u00f3i \u0111\u1ebfn \u0111\u00e2y th\u00ec c\u00e1ch cu\u1ed1i l\u00e0 ch\u1edd \u0111\u1ee3i v\u00e0 ph\u1ee5 thu\u1ed9c v\u00e0o Docker s\u1ebd c\u1ea3i ti\u1ebfn d\u1ea7n th\u00f4i. C\u00f3 th\u1ec3 l\u00e0 ra v3 hay v4 g\u00ec \u0111\u00f3 r\u1ed3i ch\u00fang ta l\u1ea1i ch\u1ea1y theo h\u1ecd.<\/p>\n\n\n\n

      Nh\u1eefng kinh nghi\u1ec7m r\u00fat ra t\u1eeb b\u1ea3n th\u00e2n:<\/em><\/p>\n\n\n\n

      • Kh\u00f4ng \u0111\u1ec3 d\u1eef li\u1ec7u \u1edf tr\u00ean container, t\u1ea5t c\u1ea3 \u0111\u1ec1u \u0111\u01b0\u1ee3c mount t\u1eeb ph\u00eda ngo\u00e0i<\/li>
      • Kh\u00f4ng ch\u1ea1y nh\u1eefng g\u00ec quan tr\u1ecdng tr\u00ean Docker<\/li>
      • Hi\u1ec7n t\u1ea1i docker v\u1eabn c\u00f2n kh\u00e1 nhi\u1ec1u v\u1ea5n \u0111\u1ec1 ch\u1ec9 n\u00ean ch\u1ea1y tr\u00ean m\u00f4i tr\u01b0\u1eddng test ho\u1eb7c staging<\/li>
      • N\u1ebfu ch\u1ea1y docker ph\u1ea3i \u0111\u1ea3m b\u1ea3o c\u00f3 h\u1ec7 th\u1ed1ng auto scaling<\/li>
      • Th\u1eed 1 service kh\u00e1c, coreos l\u00e0 m\u1ed9t d\u1ecbch v\u1ee5 nh\u01b0 v\u1eady v\u00e0 c\u0169ng \u0111ang nh\u1eadn \u0111\u01b0\u1ee3c ph\u1ea3n \u1ee9ng kh\u00e1 t\u00edch c\u1ef1c t\u1eeb ph\u00eda c\u1ed9ng \u0111\u1ed3ng<\/li>
      • S\u1eed d\u1ee5ng 1 c\u00f4ng c\u1ee5 \u0111\u1ec3 qu\u1ea3n l\u00fd nh\u01b0 Kubernetes ho\u1eb7c Rancher.<\/li>
      • D\u00f9ng d\u1ecbch v\u1ee5 c\u1ee7a 1 \u00f4ng l\u1edbn vd nh\u01b0 Google Cloud: Google Container Engine ch\u1eb3ng h\u1ea1n<\/li><\/ul>\n\n\n\n

        5. K\u1ebft lu\u1eadn<\/strong><\/p>\n\n\n\n

        N\u00f3i chung, s\u1ebd kh\u00f4ng c\u00f3 v\u1ea5n \u0111\u1ec1 g\u00ec qu\u00e1 to t\u00e1t n\u1ebfu b\u1ea1n ko s\u1eed d\u1ee5ng docker tr\u00ean production. T\u00f4i ch\u1ec9 mu\u1ed1n ch\u1ec9 ra v\u1ea5n \u0111\u1ec1 c\u00f2n t\u1ed3n t\u1ea1i m\u00e0 nhi\u1ec1u ng\u01b0\u1eddi c\u0169ng \u0111\u00e3 g\u1eb7p ph\u1ea3i trong \u0111\u00f3 c\u00f3 t\u00f4i. D\u00f9 sao, t\u00f4i c\u0169ng tin docker s\u1ebd c\u00f3 nh\u1eefng s\u1ea3n ph\u1ea9m t\u1ed1t h\u01a1n, ho\u00e0n thi\u1ec7n h\u01a1n v\u00e0 ch\u00fang ta s\u1ebd c\u00f3 1 s\u1ea3n ph\u1ea9m \u1ed5n \u0111\u1ecbnh \u0111\u1ec3 tri\u1ec3n khai \u0111\u01b0\u1ee3c nh\u1eefng d\u1ecbch v\u1ee5 1 c\u00e1ch nhanh nh\u1ea5t, t\u1ed1n \u00edt t\u00e0i nguy\u00ean nh\u1ea5t.<\/p>\n","protected":false},"excerpt":{"rendered":"

        1. Kh\u00f4ng th\u1ec3 xo\u00e1 c\u00e1c image c\u0169 C\u00f3 l\u1ebd y\u00eau c\u1ea7u c\u1ea7n nhi\u1ec1u nh\u1ea5t v\u00e0 c\u00e1c t\u00ednh n\u0103ng c\u00f2n thi\u1ebfu trong Docker l\u00e0 m\u1ed9t l\u1ec7nh \u0111\u1ec3 xo\u00e1 c\u00e1c image c\u0169 (l\u1edbn h\u01a1n X ng\u00e0y ho\u1eb7c kh\u00f4ng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong v\u00f2ng X ng\u00e0y,hay b\u1ea5t c\u1ee9 \u0111i\u1ec1u g\u00ec t\u01b0\u01a1ng t\u1ef1 nh\u01b0 th\u1ebf). Dung l\u01b0\u1ee3ng \u1ed5 c\u1ee9ng […]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[122,127],"tags":[],"class_list":["post-1952","post","type-post","status-publish","format-standard","hentry","category-blog","category-forum"],"_links":{"self":[{"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/posts\/1952"}],"collection":[{"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/comments?post=1952"}],"version-history":[{"count":1,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/posts\/1952\/revisions"}],"predecessor-version":[{"id":1971,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/posts\/1952\/revisions\/1971"}],"wp:attachment":[{"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/media?parent=1952"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/categories?post=1952"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uetacad.com\/wp-json\/wp\/v2\/tags?post=1952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}