Docker理解与使用
Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。docker与虚拟机的区别如下:
对比项 | Docker | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较弱 |
内存代价 | 很小 线程 | 较多 |
硬盘使用 | 一般为MB | 一般为GB |
运行密度 | 单机支持上千docker容器 | 一般几十个 |
隔离性 | 安全隔离 | 安全隔离 |
迁移性 | 优秀 | 一般 |
1. 为什么用Docker
1.docker依赖于 “写时复制”(copy-on-write)模型,使修改应用程序非常迅速
2.docker容器启动速度秒级,基于操作系统内核技术,对现有基础设施的侵入较少,所有实现在内核中完成,所有性能几乎与原生一致,依赖简单,与进程无本质区别
3.同一硬件下多个负载docker更高效;docker运行在liunix内核上、可以更高效的使用物理硬件
4.高效部署和扩容
写时复制:
docker 镜像使用了写时复制(copy-on-write)的策略,在多个容器之间共享镜像,每个容器在启动的时候并不需要单独复制一份镜像文件,而是将所有镜像层以只读的方式挂载到一个挂载点,再在上面覆盖一个可读写的容器层。在未更改文件内容时,所有容器共享同一份数据,只有在 docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的老版本文件。写时复制配合分层机制减少了镜像对磁盘空间的占用和容器启动时间。
2.Docker 引擎
Docker引擎是一个c/s结构的应用(如图)
- Docker daemon(docker 守护进程):运行在宿主机上,用户通过Docker client(命令行工具)与Docker deamon交互
- Docker client(命令行工具):用户除了通过Docker client(命令行工具)与Docker deamon交互,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon
3. 安装Docker
先决条件
- 64位的cpu,目前不支持32位cpu
- 运行的Linux内核不低于3.8或更高版本
- 内核必须支持一种适合的存储驱动(默认存储驱动通常是Device Mapper 或AUFS)
- 内核必须支持并开启cgroup和命名空间功能
用户可以通过如下命令检查自己的内核版本详细信息:
uname -a
推荐使用脚本自动安装
- 官方安装脚本
curl -sSL https://get.docker.com/ | sh
由于国内的防火墙原因,在国内使用这个脚本可能会出现下载错误的情况,所于这里给出了阿里云的安装脚本
- 阿里云的安装脚本
curl -fsSL get.docker.com -o get-docker.sh #下载get-docker.sh文件
sudo sh get-docker.sh --mirror Aliyun #以阿里云镜像安装get-docker.sh脚本内容
- 使用docker version查看是否安装完成
4. Docker镜像加速器
官方镜像仓库地址:https://hub.docker.com/search?image_filter=official&type=image
修改系统中docker对应的配置文件即可(如果文件不存在请新建该文件),如下:
vi /etc/docker/daemon.json
{
“registry-mirrors”: [“https://registry.docker-cn.com”]
}
重启docker
systemctl restart docker #重启docker
5. Docker 私有仓库
- 拉取仓库镜像:registry
docker pull registry
docker pull konradkleine/docker-registry-frontend #页面镜像
cd /usr/local/
mkdir docker
cd docker
mkdir registry
cd registry
vi docker-compose.yml
- docker-composer.yml内容如下:
version: 3
services:
registry:
image: registry
restart: always
container_name: registry
port:
- 5000:5000
volumes:
- /usr/local/docker/registry/data:/var/lib/registry
frontend:
image: konradkleine/docker-registry-frontend
port:
- 80:80
volumes:
- /usr/local/docker/registry/certs/frontend.crt:/etc/apache2/server.crt:ro
- /usr/local/docker/registry/certs/frontend.key:/etc/apache2/server.key:ro
environment:
- ENV_DOCKER_REGISTRY_HOST=39.108.138.43
- ENV_DOCKER_REGISTRY_PORT=5000
- 运行docker-compose.yml
docker-compose -f docker-compose.yml up -d
- 访问http://ip成功,如图
6.Docker 镜像
Docker镜像是由文件系统叠加而成。最底端是一个文件引导系统,即bootfs。Docker用户不会与引导文件系统有直接的交互。Docker镜像的第二层是root文件系统rootfs(可以理解为ubuntu)。
在传统的 Linux 操作系统内核启动时,首先挂载一个只读的 rootfs,当系统检测其完整性之后,再将其切换为读写模式。而在 docker 架构中,当 docker daemon 为 docker 容器挂载 rootfs 时,沿用了 Linux 内核启动时的做法,即将 rootfs 设为只读模式。在挂载完毕之后,利用联合挂载(union mount)技术在已有的只读 rootfs 上再挂载一个读写层(说明一个镜像可以放到另一个镜像的顶部)。这样,可读写的层处于 docker 容器文件系统的最顶层,其下可能联合挂载了多个只读的层,只有在 docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的旧版本文件。
常用命令:
#列出镜像
docker images
#拉取镜像
docker pull image_name
#查找镜像
docker search image_name
#删除镜像
docker rmi image_name/image_id
#删除虚悬镜像(也叫是名为none的镜像)镜像更新的时候会产生,镜像构建失败也会产生
docker image prune
7.Dcoker 容器
容器之间互不干扰,镜像是静态的,镜像的每一层都只是可读的,而容器是动态的里面运行着我们指定的应用,容器里面的应用可能会新建一个文件,修改一个目录,这些操作所带来的改变并不会作用到镜像里面,因为镜像只是可读的。所以通过镜像创建容器就是在镜像上加一个可读写的层。
常用命令:
#查看当前有哪些容器正在运行
docker ps
#查看所有容器
docker ps -a
#启动、停止、重启容器命令:
docker start container_name/container_id
docker stop container_name/container_id
docker restart container_name/container_id
#进入到容器
sudo docker exec -it container_name/container_id bash
#删除容器
docker rm container_name/container_id
8. Docker数据卷
介绍:
数据卷是一个可供一个或多个容器使用的特殊目录,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和使用
- 对数据卷的修改会立刻生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。
docker run -v /opt/data:/data -d docker.io/redis:latest
数据卷设计原由:
数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。
9. Docker Compose
使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
- 安装Docker Compose
sudo curl -L https://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
- 执行docker-compose.yml文件
docker-compose -f docker-compose.yml up -d
- 关闭docker-compose 里的容器
docker-compose -f docker-compose.yml down
- 查看容器日志
docker logs -f 容器名/容器Id
docker logs -f --tail=300 容器名/容器Id
10. 参考资料
http://dockone.io/article/8148
http://www.cnblogs.com/sparkdev/p/9092082.html
https://www.cnblogs.com/sawyerlsy/p/7273161.html