Docker基础知识
Docker基础知识
Docker简介
什么是Docker
Docker
使用 Google 公司推出的 Go语言
进行开发实现,基于 Linux
内核的 cgroup
、namespace
等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
为什么要使用Docker
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,
Docker
对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而
Docker
容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而
Docker
的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。持续交付和部署
对开发和运维 DevOps 人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用
Docker
可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过Dockerfile
来进行镜像构建,并结合持续集成系统
进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统
进行自动部署。而且使用Dockerfile
使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
Docker基本概念
镜像
包含应用本身,还包含应用运行所需要的环境、配置、系统函数库的文件系统,是一种轻量级、可执行的独立软件包。
容器
是镜像的运行实例,运行于属于自己的独立的命名空间(一个隔离的环境),拥有自己的文件系统、自己的网络配置、自己的进程空间等。这种特性使得容器封装的应用比直接在宿主运行更加安全。
仓库
存储和管理镜像的平台。
Docker镜像
基本命令
- 获取镜像
1 | docker pull name[:tag] |
- 查看镜像列表
1 | $ docker images |
- 删除镜像
1 | docker rmi 镜像ID |
实现原理
docker的镜像实际上由一层一层的文件系统组成,使用这种层级的文件系统 UnionFS
将这些不同的层结合到一个镜像中。当我们拉取一个一个镜像时,可能会看到多个下载操作,像是一层一层的在下载镜像。采取分层的结构更利于资源复用。
DockerFile TODO
三、Docker容器
基本命令
- 新建并启动容器
1 | docker run [OPTIONS] name:tag |
- 启动已终止容器
1 | docker start |
- 获取容器的输出信息
1 | docker logs |
- 终止容器
1 | docker stop |
- 重新启动容器
1 | docker restart |
- 容器执行命令(进入容器)
1 | docker exec |
- 查看容器列表
1 | docker ps |
- 查看容器内运行的进程
1 | docker top |
- 查看容器内部细节
1 | docker inspect |
- 删除容器
1 | docker rm |
- 拷贝容器内文件
1 | docker 容器ID:容器内路径 主机路径 |
容器数据卷
数据卷是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁,可在容器之间共享或重用数据,卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷,对数据卷的修改会立马生效。
在创建并启动容器时加上 -v 数据卷名称:容器内目录[:ro(只读权限共享数据)]
即可实现数据卷挂载,数据卷不存在时会自动创建。本地目录挂载 -v /目录:容器内目录
。
容器网络互联
在同一个Docker自定义网络的容器相互之间可用通过容器名进行访问。在创建并启动容器时加上 --network 网络名
即可在创建时加入指定网络,创建时指定网络时该容器不会加入到默认的网络中。
- 查看网络列表
1 | docker network ls |
- 创建网络
1 | docker network create 网络名 |
- 加入网络
1 | docker network connect 网络名 容器名 |
DockerCompose TODO
部分内容转载自Docker从入门到实践