On Github ahvargas / intro-docker
Se pueden pensar en los contenedores como un sistema operativo dentro del sistema operativo en el cual se pueden instalar y ejecutar aplicaciones.
Los contenedores desacoplan las aplicaciones del Sistema Operativo. Esto hace que los contenedores sean potables entre todas los sistemas que soporten Docker.
Debido a que las aplicaciones y cargas de trabajo están aisladas se pueden ejecutar múltiples versiones de PHP, Python , Apache, etc. conviviendo en sus contenedores.
También estos contenedores puedes ser clonados , respaldados y desplegados de manera rápida.
¿Pero entonces cual es la diferencia entre una máquina virtual?
Una maquina virtual emula un hardware. Todas las peticiones de CPU, memoria , disco y otros recursos son manejados por una capa de virtualización que se las traslada al hardware real.
La virtualización puede realizar lo mismo que Docker pero sin la misma flexibilidad, los contenedores no emulan una capa de hardware , usan el características del kernel de Linux para crear contenedores virtualizados ligeros.
Los contenedores simplemente son mas rápidos , portables y pueden escalar mas eficientemente que la virtualización de hardware.
Docker utiliza una arquitectura cliente-servidor. El cliente de Docker se comunica con el servidor que es es encargado de administrar los contenedores.
Ambos pueden ejecutarse en la misma maquina o el cliente puede acceder al demonio de Docker de forma remota. La comunicación entre ambos es mediante una API RESTful.
Por ejemplo:
» docker-machine inspect default
{ "ConfigVersion": 3, "Driver": { "IPAddress": "192.168.99.100", "MachineName": "default", "SSHUser": "docker", "SSHPort": 57894, "SSHKeyPath": "C:\\Users\\user\\.docker\\machine\\machines\\default\\id_rsa", "StorePath": "C:\\Users\\user\\.docker\\machine", "SwarmMaster": false, "SwarmHost": "tcp://0.0.0.0:3376", "SwarmDiscovery": "", "VBoxManager": {}, "CPU": 1, "Memory": 1024, "DiskSize": 20000, "Boot2DockerURL": "", "Boot2DockerImportVM": "", "HostDNSResolver": false, "HostOnlyCIDR": "192.168.99.1/24", "HostOnlyNicType": "82540EM", "HostOnlyPromiscMode": "deny", "NoShare": false, "DNSProxy": false, "NoVTXCheck": false }, "DriverName": "virtualbox", "HostOptions": { "Driver": "", "Memory": 0, "Disk": 0, "EngineOptions": { "ArbitraryFlags": [], "Dns": null, "GraphDir": "", "Env": [], "Ipv6": false, "InsecureRegistry": [], "Labels": [], "LogLevel": "", "StorageDriver": "", "SelinuxEnabled": false, "TlsVerify": true, "RegistryMirror": [], "InstallURL": "https://get.docker.com" }, "SwarmOptions": { "IsSwarm": false, "Address": "", "Discovery": "", "Master": false, "Host": "tcp://0.0.0.0:3376", "Image": "swarm:latest", "Strategy": "spread", "Heartbeat": 0, "Overcommit": 0, "ArbitraryFlags": [], "Env": null }, "AuthOptions": { "CertDir": "C:\\Users\\user\\.docker\\machine\\certs", "CaCertPath": "C:\\Users\\user\\.docker\\machine\\certs\\ca.pem", "CaPrivateKeyPath": "C:\\Users\\user\\.docker\\machine\\certs\\ca-key.pem", "CaCertRemotePath": "", "ServerCertPath": "C:\\Users\\user\\.docker\\machine\\machines\\default\\server.pem", "ServerKeyPath": "C:\\Users\\user\\.docker\\machine\\machines\\default\\server-key.pem", "ClientKeyPath": "C:\\Users\\user\\.docker\\machine\\certs\\key.pem", "ServerCertRemotePath": "", "ServerKeyRemotePath": "", "ClientCertPath": "C:\\Users\\user\\.docker\\machine\\certs\\cert.pem", "ServerCertSANs": [], "StorePath": "C:\\Users\\user\\.docker\\machine\\machines\\default" } }, "Name": "default" }