{"id":91905,"date":"2020-08-20T07:42:23","date_gmt":"2020-08-20T05:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii"},"modified":"2020-08-20T07:42:23","modified_gmt":"2020-08-20T05:42:23","slug":"chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","title":{"rendered":"What is Docker: a brief overview of the history and key abstractions","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>On August 10, Slyurm launched <noindex><a rel=\"nofollow\" href=\"http:\/\/to.slurm.io\/2patKQ\">a video course on Docker<\/a><\/noindex>, where we cover it thoroughly \u2014 from basic abstractions to network parameters. <\/p>\n<p><\/p>\n<p>In this article, we will discuss the history of Docker and its primary abstractions: Image, CLI, Dockerfile. The lecture is aimed at beginners, so it is unlikely to be interesting for experienced users. There will be no blood, appendices, or deep dives. Just the basics.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"What is Docker: a brief overview of the history and key abstractions\" src=\"\/wp-content\/uploads\/2020\/08\/f01af417f24c838577b09bdf90f02fb9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"chto-takoe-docker\">What is Docker<\/h2>\n<p><\/p>\n<p>Let\u2019s look at Docker\u2019s definition from Wikipedia.<\/p>\n<p><\/p>\n<blockquote><p>Docker is software for automating the deployment and management of applications in environments that support containerization.<\/p><\/blockquote>\n<p>This definition doesn\u2019t clarify much. Particularly, it\u2019s unclear what \u2018in environments that support containerization\u2019 means. To understand it, we need to go back in time. Let\u2019s start from what I term the 'Monolithic Era.'<\/p>\n<p><\/p>\n<h2 id=\"monolitnaya-era\">Monolithic Era<\/h2>\n<p><\/p>\n<p>The Monolithic Era was the early 2000s when all applications were monolithic, with a plethora of dependencies. Development took a long time. At that time, there weren't many servers; we all knew them by name and monitored them closely. There's a funny analogy:<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"Od7e6hqis7A\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/Od7e6hqis7A\/hqdefault.jpg\" alt=\"Play video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Pets \u2014 these are household animals. In the monolithic era, we treated our servers like pets, nurturing and cherishing them, dusting off any debris. To manage resources better, we used virtualization: taking one server and splitting it into several virtual machines to ensure environment isolation.<\/p>\n<p><\/p>\n<h2 id=\"sistemy-virtualizacii-na-baze-gipervizora\">Hypervisor-based Virtualization Systems<\/h2>\n<p><\/p>\n<p>Everyone has surely heard of virtualization systems: VMware, VirtualBox, Hyper-V, Qemu KVM, etc. They provide application isolation and resource management, but they also have downsides. To enable virtualization, a hypervisor is required. And a hypervisor brings resource overhead. Moreover, the virtual machine itself is usually quite bulky \u2014 a heavy image containing the operating system, Nginx, Apache, and possibly MySQL. The image is large and cumbersome to operate with. Consequently, working with virtual machines can be slow. To address this issue, virtualization systems at the kernel level were created.<\/p>\n<p><\/p>\n<h2 id=\"sistemy-virtualizacii-na-urovne-yadra\">Kernel-Level Virtualization Systems<\/h2>\n<p><\/p>\n<p>Kernel-level virtualization is supported by systems such as OpenVZ, Systemd-nspawn, LXC. A prominent example of such virtualization is LXC (Linux Containers). <\/p>\n<p><\/p>\n<p>LXC is an operating system-level virtualization system for running multiple isolated instances of the Linux operating system on a single node. LXC does not use virtual machines but creates a virtual environment with its own process space and network stack.<\/p>\n<p><\/p>\n<p>Essentially, LXC creates containers. What is the difference between virtual machines and containers?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"What is Docker: a brief overview of the history and key abstractions\" src=\"\/wp-content\/uploads\/2020\/08\/55afdcfd700d4869c9de488033a8e314.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A container is not suitable for isolating processes: kernel-level virtualization systems have vulnerabilities that allow escaping from the container to the host. Therefore, if you need to isolate something, it is better to use a virtual machine.<\/p>\n<p><\/p>\n<p>The differences between virtualization and containerization can be seen in the diagram.<br \/>\nThere are hardware hypervisors, hypervisors on top of the OS, and containers. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"What is Docker: a brief overview of the history and key abstractions\" src=\"\/wp-content\/uploads\/2020\/08\/a0c06e9adc1fab3b4b5e9e1b05b51d66.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hardware hypervisors are great if you really want to isolate something. Because they offer the ability to isolate at the level of memory pages and processors.<\/p>\n<p><\/p>\n<p>There are hypervisors as programs, and there are containers, which we will discuss next. In containerization systems, there is no hypervisor, but there is a Container Engine that creates and manages containers. This is a lighter-weight solution, so due to its operation with the kernel, the overhead is lower or nonexistent.<\/p>\n<p><\/p>\n<blockquote>\n<h2 id=\"chto-ispolzuetsya-dlya-konteynerizacii-na-urovne-yadra\">What is used for kernel-level containerization<\/h2>\n<p>The main technologies that allow creating a container isolated from other processes are Namespaces and Control Groups.<\/p>\n<p>Namespaces: PID, Networking, Mount, and User. There are others, but for simplicity, we will focus on these.<\/p>\n<p>The PID Namespace restricts processes. When we create a PID Namespace and place a process in it, it becomes PID 1. Normally, in systems, PID 1 is either systemd or init. Accordingly, when we place a process into a new namespace, it too receives PID 1.<\/p>\n<p>The Networking Namespace allows limiting\/isolate the network and to place its own interfaces within. Mount is a restriction on the file system. User is a restriction on users.<\/p>\n<p>Control Groups: Memory, CPU, IOPS, Network \u2014 there are about 12 settings in total. They are also called Cgroups.<\/p>\n<p>Control Groups manage resources for the container. Through Control Groups, we can specify that a container should not consume more than a certain amount of resources.<\/p>\n<p>For containerization to work effectively, additional technologies are used: Capabilities, Copy-on-write, and others.<\/p>\n<p>Capabilities refer to defining what a process is allowed to do and what it is not. At the kernel level, these are simply bitmaps with numerous parameters. For example, the root user has full privileges and can do anything. A time server can change the system time: it has capabilities for the Time Capsule, and that's it. Privileges allow for flexible configurations to set restrictions on processes, thereby enhancing security.<\/p>\n<p>The Copy-on-write system enables us to work with Docker images more efficiently.<\/p>\n<p><em>At present, Docker has compatibility issues with Cgroups v2; therefore, this article focuses on Cgroups v1.<\/em><\/p><\/blockquote>\n<p>But let's return to the history. <\/p>\n<p><\/p>\n<p>When virtualization systems at the kernel level emerged, they began to be actively adopted. The overhead for the hypervisor disappeared, but some problems remained:<\/p>\n<p><\/p>\n<ul>\n<li>large images: in OpenVZ, you push the operating system, libraries, and a bunch of different software, resulting in a rather large image;<\/li>\n<li>there's no proper packaging and delivery standard, leading to dependency issues. There are situations where two pieces of code use the same library but with different versions. Conflicts can arise between them.<\/li>\n<\/ul>\n<p><\/p>\n<p>To address all these issues, the next era came.<\/p>\n<p><\/p>\n<h2 id=\"era-konteynerov\">The Era of Containers<\/h2>\n<p><\/p>\n<p>When the Era of Containers began, the philosophy of how to work with them changed:<\/p>\n<p><\/p>\n<ul>\n<li>One process\u2014one container.<\/li>\n<li>All dependencies needed by the process are delivered within its container. This requires breaking down monoliths into microservices.<\/li>\n<li>The smaller the image, the better\u2014fewer potential vulnerabilities, faster deployments, and so on.<\/li>\n<li>Instances become ephemeral. <\/li>\n<\/ul>\n<p><\/p>\n<p>Remember, I mentioned pets vs cattle? Earlier, instances resembled pets, but now they resemble cattle. There used to be a monolith\u2014one application. Now, there are 100 microservices, 100 containers. Some containers may have 2-3 replicas. We are less concerned with controlling each container. Instead, we prioritize the availability of the service itself: what that set of containers does. This changes monitoring approaches.<\/p>\n<p><\/p>\n<p>In 2014-2015, Docker flourished\u2014the technology we will discuss now.<\/p>\n<p><\/p>\n<p>Docker has changed the philosophy and standardized application packaging. With Docker, we can package an application, send it to a repository, download it from there, and deploy it. <\/p>\n<p><\/p>\n<p>In a Docker container, we include everything necessary, thus solving the dependency problem. Docker ensures reproducibility. I believe many have faced the issue of non-reproducibility: everything works for you, you push it to production, and then it stops working. With Docker, this problem disappears. If your Docker container runs and does what it's supposed to do, it will very likely run in production and do the same thing there.<\/p>\n<p><\/p>\n<blockquote>\n<h2 id=\"otstuplenie-pro-overhed\">A digression about overhead<\/h2>\n<p>There are ongoing debates regarding overhead. Some believe that Docker does not impose additional load as it uses the Linux kernel and all the processes necessary for containerization. They argue, \"If you say Docker is overhead, then the Linux kernel is also overhead.\"<\/p>\n<p>On the other hand, if you look deeper, there are indeed several aspects of Docker that can be somewhat considered overhead.<\/p>\n<p>The first is the PID namespace. When we place a process in the namespace, it is assigned PID 1. At the same time, this process has another PID, which resides in the host namespace, outside the container. For example, if we run Nginx in a container, it becomes PID 1 (the master process). Meanwhile, on the host, it has PID 12623. It's difficult to say how much this constitutes overhead.<\/p>\n<p>The second aspect is Cgroups. Let's take Cgroups for memory, that is, the ability to limit the container's memory. When it's enabled, counters are activated, memory accounting: the kernel needs to understand how many pages have been allocated and how many are still free for that container. This could be overhead, but I haven't seen any precise studies on how it affects performance, and I haven't noticed that applications running in Docker suddenly lost performance. <\/p>\n<p>And one more note on performance. Some kernel parameters are passed from the host to the container. Specifically, some network parameters. Therefore, if you want to run something high-performance in Docker, for instance, something that will actively use the network, you will need to at least adjust these parameters. For example, nf_conntrack. <\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"o-koncepcii-docker\">About the concept of Docker<\/h2>\n<p><\/p>\n<p>Docker consists of several components: <\/p>\n<p><\/p>\n<ol>\n<li>The Docker Daemon is the Container Engine; it runs containers. <\/li>\n<li>Docker CII is a utility for managing Docker.<\/li>\n<li>A Dockerfile is an instruction on how to build an image.<\/li>\n<li>An Image is the template from which containers are created.<\/li>\n<li>Container.<\/li>\n<li>A Docker registry is a repository for images.<\/li>\n<\/ol>\n<p><\/p>\n<p>Schematically, it looks like this:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"What is Docker: a brief overview of the history and key abstractions\" src=\"\/wp-content\/uploads\/2020\/08\/73ccc02c14485f72cfd7c64e3074f3b9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>On the Docker host, the Docker daemon runs containers. There is a Client that sends commands: build an image, download an image, run a container. The Docker daemon connects to the registry to execute them. The Docker client can interact both locally (with a Unix socket) and remotely via TCP.<\/p>\n<p><\/p>\n<p>Let's go through each component.<\/p>\n<p><\/p>\n<p><u>Docker daemon<\/u> is the server part, running on the host machine: it downloads images and starts containers from them, creates a network between containers, and collects logs. When we say 'create an image,' that's also handled by the daemon.<\/p>\n<p><\/p>\n<p><u>Docker CLI<\/u> is the client part of Docker, a command-line utility for working with the daemon. Again, it can operate not only locally but over a network as well. <\/p>\n<p><\/p>\n<p><strong>Basic commands:<\/strong><\/p>\n<p><\/p>\n<p>docker ps \u2014 shows the containers currently running on the Docker host.<br \/>\ndocker images \u2014 displays images downloaded locally.<br \/>\ndocker search  \u2014 search for an image in the registry.<br \/>\ndocker pull  \u2014 download an image from the registry to the machine.<br \/>\ndocker build &lt;&gt; \u2014 build an image.<br \/>\ndocker run  \u2014 run a container.<br \/>\ndocker rm  \u2014 remove a container.<br \/>\ndocker logs  \u2014 view container logs.<br \/>\ndocker start\/stop\/restart  \u2014 manage a container.\n<\/p>\n<p>If you master these commands and use them confidently, you can consider yourself 70% proficient in Docker at the user level.<\/p>\n<p><\/p>\n<p><u>Dockerfile<\/u> is an instruction for creating an image. Almost every command in the instruction represents a new layer. Let's examine an example.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"What is Docker: a brief overview of the history and key abstractions\" src=\"\/wp-content\/uploads\/2020\/08\/4d61b58d0d0d8b2e4ddbbfe573f34f7e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Here's what a Dockerfile looks like: commands on the left, arguments on the right. Each command present here (and written in a Dockerfile) creates a new layer in the Image. <\/p>\n<p><\/p>\n<p>Even looking at the left side, you can get a rough idea of what's happening. We're saying, \"create a folder for us\" \u2014 that's one layer. \"Make the folder active\" \u2014 that's another layer, and so on. A layered approach simplifies life. If I create another Dockerfile and change something in the last line \u2014 instead of running \"python\" \"main.py\", I run something else or install dependencies from another file \u2014 the previous layers will be reused as cache.<\/p>\n<p><\/p>\n<p><u>Image<\/u> \u2014 is a container image, from which containers are launched. If we look at Docker from the perspective of a package manager (as if we were working with deb or rpm packages), then an image is essentially an rpm package. Through yum install, we can install an application, remove it, find it in the repository, download it. Here it is roughly the same: containers are launched from an image, they are stored in a Docker registry (similarly to yum, in a repository), and each image has a SHA-256 hash, name, and tag.<\/p>\n<p><\/p>\n<p>An image is built according to the instructions in the Dockerfile. Each instruction from the Dockerfile creates a new layer. Layers can be reused.<\/p>\n<p><\/p>\n<p><u>Docker registry<\/u> \u2014 is a repository of Docker images. Similarly to operating systems, Docker has a public standard registry \u2014 dockerhub. However, you can build your own repository, your own Docker registry. <\/p>\n<p><\/p>\n<p><u>Container<\/u> \u2014 is what runs from an image. After building an image according to the Dockerfile, we launch it from that image. This container is isolated from other containers; it must contain everything needed for the application to work. Moreover, one container means one process. Occasionally, you may have to run two processes, but this somewhat contradicts the ideology of Docker.<\/p>\n<p><\/p>\n<p>The requirement of \"one container \u2014 one process\" is associated with PID Namespace. When a process with PID 1 is launched in the Namespace, if it dies unexpectedly, the entire container dies as well. However, if two processes are running: one is alive while the other has died, the container will still continue to live. But this relates to Best Practices, which we will discuss in other materials.<\/p>\n<p><\/p>\n<p>To learn more about the features and full program of the course, follow this link: \"<noindex><a rel=\"nofollow\" href=\"http:\/\/to.slurm.io\/2patKQ\">Video Course on Docker<\/a><\/noindex>\u00bb. <\/p>\n<p><\/p>\n<p><em>Author: Marsel Ibraev, certified Kubernetes administrator, practicing engineer at Southbridge, speaker and course developer at Slurm.<\/em><\/p>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/515508\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e\u0431 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f Docker \u0438 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u0445: Image, Cli, Dockerfile. \u041b\u0435\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c. \u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u043e\u0432\u0438, \u0430\u043f\u043f\u0435\u043d\u0434\u0438\u043a\u0441\u0430 \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91906,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91905","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker: \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u044d\u043a\u0441\u043a\u0443\u0440\u0441 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-20T05:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-20T05:42:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47What is Docker: a brief excursion into history and key abstractions | ProHoster","description":"On August 10, a video course on Docker began at Slurm, where we cover it completely \u2014 from basic abstractions to network parameters.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker: \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u044d\u043a\u0441\u043a\u0443\u0440\u0441 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 | ProHoster","og:description":"10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-20T05:42:23+00:00","article:modified_time":"2020-08-20T05:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91905","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:18:28","updated":"2022-10-01 05:09:53","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/91905","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=91905"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/91905\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/91906"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=91905"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=91905"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=91905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}