什么是Docker?
Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
为什么要使用Docker
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker只需要启动 10 个隔离的应用即可。
具体说来,Docker 在如下几个方面具有较大的优势。
1、更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2、更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
4、更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
相关概念
Docker是CS架构,主要有两个概念:
- Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互
- Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon
了解了Docker的组成,再来了解一下Docker的三个主要概念:
- Docker image(镜像):镜像是只读的,镜像中包含有需要运行的文件。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。
- Docker container(容器):容器是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
- Docker hub/registry(仓库): 共享和管理Docker镜像,用户可以上传或者下载上面的镜像,官方地址为
https://registry.hub.docker.com/
,也可以搭建自己私有的Docker registry。
镜像就相当于打包好的版本,镜像启动之后运行在容器中,仓库就是装存储镜像的地方。
常用命令
查看当前系统Docker信息
docker info
拉取镜像,docker pull [镜像名称[:版本]],如:docker pull tomcat:7
docker pull tomcat:7
查看镜像
docker images
删除镜像,-f选项强制删除。
docker rmi image_id
清理所有未打过标签的本地镜像:
# docker rmi $(docker images -q -f "dangling=true")
其中 -q 和 -f 是 quiet,–filter 的缩写, 完整的命令其实可以写着下面这样,是不是更容易理解一点? # docker rmi $(docker images --quiet --filter "dangling=true")
注: 容器是否会长久运行,是和docker run指定的命令有关,和 -d 参数无关。
在线查找镜像:docker search + [你想查找的镜像关键字],如:
docker search tomcat
-----------------------------------镜像end,容器start-----------------------------------
创建一个容器
docker run hello-world
步骤:
1.Docker客户端连接到守护进程
2.Docker守护进程从Docker Hub拉取了hello-world镜像
3.Docker守护进程从该镜像创建了一个容器,来执行了命令并输出了我们当前看的这条消息
4.Docker守护进程将容器中的标准输出转发到你的终端。
docker在运行一个容器时,首先会检查本地是否存在指定的镜像,如果有,则直接运行,如果没有,才会去Docker Hub上拉取。这也就是命令结果第一行为什么会显示Unable
to find image 'hello-world:latest' locally
的原因。
docker run -d --name myapp -v D:\docker:/usr/local/tomcat/webapps -p 8888:8080 tomcat:7
-d:指定容器在后台运行
–name:用于指定容器的名称
-p:8888:8080 用于将容器内的8080端口映射到主机的8888端口
查看当前有哪些容器正在运行,-a查看所有
docker ps -a
停止、启动、重启容器
docker stop tomcat
docker start tomcat
docker restart tomcat
删除容器
docker rm tomcat
查看容器日志
docker logs -f tomcat
exec进入Docker容器,/bin/bash:表示执行的command
C:\Windows\system32>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a89b0987dbc tomcat: "catalina.sh run" hours ago Up hours 0.0.0.0:->/tcp myapp C:\Windows\system32>docker exec -it 5a89b0987dbc /bin/bash
root@5a89b0987dbc:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf lib native-jni-lib webapps
CONTRIBUTING.md NOTICE RELEASE-NOTES bin include logs temp work
root@5a89b0987dbc:/usr/local/tomcat#
exec执行某一个命令ls /
D:\docker>docker exec -it 5a89b0987dbc ls /
bin dev etc lib media opt root sbin sys usr
boot docker-java-home home lib64 mnt proc run srv tmp var
将镜像导出:
docker save -o tomcat.tar tomcat
将本地包导入到镜像中:
docker load --input tomcat.tar
参考文章:http://www.ityouknow.com/docker/2018/03/07/docker-introduction.html