什么是Docker?
简介: Docker,一个开源的引擎,可以轻松的为任何应用创建一个轻量级的,可移植,自给自足的容器,开发者在啊笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机),bare metal,OpenStack集群和其他的基础应用平台.
- Docker应用在什么地方
- Web应用的自动化打包和发布
- 自动化测试和持续集成,部署
- 在服务型环境中部署和调整数据库或其他的后台应用
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境.
- Docker有什么优点
- 简化程序
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,开发者可以直接将自己的应用放入Docker进行管理。对于开发者极为便利,所以已成为一种主流.过去需要用数天乃至数周的部署任务,在Docker容器的处理下,只需要数秒就能完成。 - 节省开支
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。 - 做更少的选择
Docker 打包更为简洁,快速.比如 Docker 镜像,其中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
Docker的相关概念
Docker 是一个为开发者和运维者去开发、发布和在容器中运行应用的平台。使用Linux容器来部署应用程序被称为容器化。 容器并非新的概念,但容器的使用使得应用的发布更为简单.
容器化越来越流行,因为容器化具有以下的优点:
- 灵活(Flexible):即使最复杂的应用也能够被容器化。
- 轻量(Lightweight):容器最大化利用和分享宿主主机的内核。
- 可互换(interchangeable):你可以即时部署更新和升级应用。
- 便捷(Portable):你可以在本地构建应用,并部署到容器云,并在任何地方运行。
- 可扩展(Scalable): 你可以增加和自动分发容器的个数。
- 可堆叠(Stackable):你可以垂直堆叠服务和即时堆叠服务。
镜像和容器
容器是通过运行一个镜像来启动的.镜像是一个可执行程序包,其中包含运行应用程序所需的所有内容,包括代码,运行时库,环境变量和配置文件。
容器其实是一个镜像的运行时实例,它是一个在内存中运行的镜像(即一个镜像有了状态,或者一个用户进程)。可以通过linux环境键入docker ps来查看一系列正在运行的容器。
容器和虚拟机
一个容器是在linux服务本地运行,并和其他的容器共享主机的内核。它运行在一个独立的进程中,相对于其他可执行的进程(比如虚拟机)来说,容器的内存占用空间更小,更加的轻量化。
相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,通过虚拟机管理程序虚拟访问主机资源。 一般来说,虚拟机提供的环境比大多数应用程序需要的资源更多。
Docker环境准备
首先下载主机支持的Docker版本,包括社区版和企业版),也有对应的Windows,Linux和Mac版的.
例如在centos上安装:
yum -y install docker-io
启动:
service docker start
Docker版本测试
- 运行
docker --version
命令,并确保所安装的docker支持该命令.
docker --version
Docker version 18.09.2, build 6247962
- 运行```docker info(或者docker version)查看更多的Docker安装信息
docker info
Containers: 5
Running: 0
Paused: 0
Stopped: 5
Images: 7
Server Version: 18.09.2
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce
runc version: 09c8266bf2fcf9519a651b04ae54c967b9ab86ec
init version: fec3683
......
同时为了避免权限错误,应使用sudo来查看,并添加用户到docker
组中.
测试Docker安装是否成功
- 运行一个简单的镜像(hello-world)来测试docker安装是否成功
docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
- 列出在你机器上下载的Docker镜像
dockers image ls
mysql latest 990386cbd5c0 2 days ago 443MB
docs/docker.github.io latest d3e9ac15d81a 2 days ago 1.62GB
nginx latest 53f3fd8007f7 3 days ago 109MB
ubuntu latest d131e0fa2585 2 weeks ago 102MB
centos latest 9f38484d220f 8 weeks ago 202MB
scrapinghub/splash latest 241c7dde86d9 2 months ago 1.22GB
hello-world latest fce289e99eb9 4 months ago 1.84kB
- 列出已经退出的
hello-world
容器(由镜像产生)的消息,如果该容器正在运行,则不需要-all
选项
docker container ls -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
405f7985eadd hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago thirsty_jackson
ec3086b56677 docs/docker.github.io:latest "/bin/sh -c '#(nop) …" 47 hours ago Exited (0) 47 hours ago boring_wing
a83e0966ea05 docs/docker.github.io:latest "/bin/sh -c '#(nop) …" 47 hours ago Exited (0) 47 hours ago elegant_snyder
2a100bf45522 nginx "nginx -g 'daemon of…" 2 days ago Exited (0) 2 days ago webserver
9457297972b8 ubuntu "bash" 2 days ago Exited (127) 2 days ago serene_euler
7788536e62aa hello-world "/hello" 2 days ago Exited (0) 2 days ago trusting_mayer
总结和回顾
## List Docker CLI commands(列出dockers命令)
docker
docker container --help
## Display Docker version and info(查看docker信息)
docker --version
docker version
docker info
## Execute Docker image(运行Dockers镜像)
docker run hello-world
## List Docker images(列出镜像)
docker image ls
## List Docker containers (running, all, all in quiet mode)(同上,列出全部镜像)
docker container ls
docker container ls --all
docker container ls -aq
结语
容器化使得CI/CD(持续集成/持续部署)更加无缝化.例如:
- 应用没有系统任何系统依赖
- 更新可以被推顺到分布式应用的任何部分
- 更高的利用系统资源
使用Docker,扩展应用程序就是启动新的可执行文件,而不是运行繁重的虚拟机.