;

Kontejnerizace versus virtualizace

23. 4. 2025
Doba čtení: 6 minut

Sdílet

Autor: Exponet
Technologie jako kontejnerizace a virtualizace se staly klíčovými nástroji pro optimalizaci a efektivní využití zdrojů. Kontejnery i virtuální stroje se používají ke spouštění aplikací v izolovaných prostředích, ale mají zásadní rozdíly v architektuře a využití zdrojů.

Virtualizace je technologie, která umožňuje vytvářet virtuální verze fyzických zdrojů, nejčastěji virtuálních serverů, počítačů a síťových zařízení. Pomocí hypervizoru neboli softwaru, který vytváří a spravuje virtuální počítače, můžeme na jednom fyzickém serveru nebo počítači provozovat více operačních systémů. To umožňuje efektivnější využití hardwarových zdrojů a zjednodušuje správu IT infrastruktury.

Virtualizace umožňuje konsolidovat více serverů nebo počítačů do jediného fyzického zařízení, čímž se snižují náklady na hardware a energii a zároveň se zvyšuje flexibilita a škálovatelnost: virtuální počítače lze podle potřeby rychle vytvářet, klonovat nebo přesouvat mezi fyzickými servery. Každý virtuální počítač běží ve vlastním izolovaném prostředí, což zvyšuje bezpečnost a stabilitu systému.

Máme nové jméno

Populární ekonomicko-technický magazín CIO Business World od letošního roku změnil název na CIOtrends.

Virtualizace má vyšší nároky na výkon, protože hypervizory spotřebovávají určitý podíl fyzických zdrojů, což může vést k nižšímu výkonu aplikací ve srovnání s nativním provozem na fyzických serverech. Správa velkého počtu virtuálních počítačů může být složitá a vyžaduje specializované nástroje a znalosti.

Kontejnerizace

Kontejnerizace je moderní technologie, která umožňuje provozovat aplikace v izolovaných prostředích zvaných kontejnery. Kontejner obsahuje vše potřebné pro běh aplikace, tj. frameworky, knihovny, databázové platformy atd.

Jak je na tom kybernetická bezpečnost v České republice? Jak bezpečné jsou české digitální sítě?
Jak je na tom kybernetická bezpečnost v České republice? Jak bezpečné jsou české digitální sítě?
0:00/

Na rozdíl od virtualizace kontejnery sdílejí jádro operačního systému, ale běží jako samostatné procesy, což snižuje jejich nároky na zdroje, takže na stejném hardwaru může běžet více aplikací. Kontejnerizace usnadňuje škálovatelnost a přenositelnost díky menšímu množství dat, která kontejner tvoří, protože neobsahuje obraz kompletního operačního systému.

Kontejnery lze rychle vytvářet, zastavovat a znovu spouštět, což umožňuje rychlé nasazení a škálovatelnost aplikace. Každý kontejner obsahuje vše potřebné ke spuštění aplikace, což usnadňuje nasazení a provoz v různých prostředích. Zároveň je dosaženo určité izolace od ostatních procesů, aniž by bylo nutné spouštět celý operační systém jen pro jednu aplikaci nebo vývojové prostředí.

Chcete dostávat do mailu týdenní přehled článků z CIOtrends? Objednejte si náš mailový servis a žádná důležitá informace vám neuteče. Objednat si lze také newsletter To hlavní, páteční souhrn nejdůležitějších článků ze všech našich serverů. Newslettery si můžete objednat na této stránce.

Existují však také určitá bezpečnostní rizika. Kontejnery sdílejí jádro operačního systému, což může vést k potenciálním bezpečnostním problémům, pokud nejsou řádně izolovány nebo aktualizovány. Některé aplikace nemusejí být s kontejnerovými technologiemi kompatibilní a mohou vyžadovat více či méně sofistikované úpravy.

Kontejnery Docker

Docker je otevřená platforma pro vývoj, distribuci a spouštění aplikací. Umožňuje oddělit aplikace od infrastruktury, abyste je mohli rychle nasadit nebo pokračovat ve vývoji.  Docker poskytuje možnost zabalit a spustit aplikaci ve volně izolovaném prostředí zvaném kontejner. Kontejnery vytvářejí prostředí pro běh programu. Využívají hardware prostřednictvím vašeho operačního systému, ale jsou to samostatné entity, které běží v izolovaných pískovištích. V kontejneru je předinstalováno vše potřebné ke spuštění aplikace, takže se nemusíte spoléhat na to, co je nainstalováno v hostitelském počítači.

Potřebujeme například vytvořit prostředí pro hluboké učení a trénování neuronových sítí v systému Windows. Prostředí obsahuje platformu Anaconda, PyTorch a různé další knihovny, takže můžeme začít navrhovat neuronovou síť například v jazyce Python. Pak potřebujeme z nějakého důvodu pokračovat v Linuxu, například proto, že některé knihovny, které potřebujeme, nejsou pro Windows k dispozici. Nebo vývojář pracuje v Linuxu a pak se k týmu připojí kolega, který chce pracovat v systému Windows.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »