前言
提示:这里可以添加本文要记录的大概内容:
提示:以下是本篇文章正文内容,下面案例可供参考
一、doc的介绍
. 开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源;
. linux容器的一种封装,提供简单易用的容器使用接口;
. 接口相当简单,用户可以方便的创建、销毁容器;
. 将应用程序与程序的依赖,打包在虚拟容器中 ;
. Docker是C/S模式
1.docker三大件
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
如下图:
镜像(Image):就相当于是一个 root 文件系统。是用来创建 Docker 容器的模板,比如 centOS、nginx、php等。
容器(Container):容器是独立运行的一个或一组应用,是镜像运行时的实体。镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。
仓库(Repository):用来保存镜像,可以理解为代码控制中的代码仓库。
1.1.1docker的镜像
-
极度精简版的Linux程序运行环境;
-
需要定制化Build的一个“安装包”;
-
不建议有运行时需要修改的配置文件;
-
尽量重用和使用网上公开的基础镜像。
精简版的到连vi,这样的命令都没有 所以这时候我们就需要根据自己的需要定制化build出另一个镜像; 这个镜像不建议有运行时需要修改的配置文件; 镜像是可以用来被创建容器
1.1.2docker的容器
-
容器是镜像的实体,共享主机内核;
-
容器里可以运行不同OS的镜像,如centos、ubuntu;
-
容器使用沙箱机制,相互间没有任何接口;
-
容器性能开销极低。
镜像的一个实体,可以被启动、开始、停止、删除; 容器都是相互隔离,完全的沙箱机制; 容器也可以看成是一个简易版的Linux环境(包括了root用户权限、进程空间、用户空间和网络空间等),另外也可能包含了运行在其中的应用程序;
1.1.2.1容器的生命周期
created -> 初建状态
running -> 运行状态
stopped -> 停止状态
paused -> 暂停状态
deleted -> 删除状态
如下图:
通过这个生命周期,大致会认为,这就是一台服务器、或是虚拟机;
物理机是一栋楼一户人家,独立的地基,独立的花园
虚拟机是一栋楼包含了多套房,一套房一户人家,共享地基、共享花园,但是有独立的卫生间、厨房和宽带;
Docker容器是一套房隔成多个小隔间(类似胶囊式公寓),每个小隔间住一位租户,共享地基、共享花园,还共享卫生间、厨房和宽带;
1.1.2.2docker容器 vs.虚拟机VM
VM是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。
Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效。
虚拟机开一下大概得2分多钟,而Docker只需要2秒钟。
3.docker的仓库
https://hub.docker.com/
Docker之所以这么吸引人,除了它的新颖的技术外,围绕官方Registry仓库的生态圈也是相当吸引人眼球的地方。在Docker Hub上可以很轻松下载到大量已经容器化好的应用镜像,即拉即用。
这些镜像,有些是官方维护的,还有很多的开发者自发上传分享的。
4.docker的机制
由docker客户端向docker主机发起请求,如:创建、停止、销毁容器等操作
Docker主机中的守护进程,接收指令后从镜像仓库拉取镜像,构建镜像、构建容器
5.docker的原理
Linux Containers 简称 LXC,基于容器的操作系统层级的虚拟化技术。借助于namespace的隔离机制和cgroup的限额功能。
LXC不是硬件的虚拟化,而是Linux内核的级别的虚拟机化,相对于传统的虚拟机,节省了很多硬件资源。
LXC提供了一套统一的API和工具来建立和管理Container。
docker是利用Linux内核虚拟机化技术(LXC),提供轻量级的虚拟化,以便隔离进程和资源。并利用LXC的内核namespace技术,进行进程的隔离。
6.docker的特点
-
非常的轻量级,内存占用小;
-
可以快速、毫秒级别的启动;
-
一致的运行环境;
-
一台服务器上运行成百上千的容器,并且相互隔离;
-
更轻松的迁移。
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。 由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运 行结果是一致的。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),保证A容器看不到B容器B,更重要的是容器性能开销极低。
7.docker应用场景
-
web应用的自动化打包和发布。
-
自动化测试和持续集成、发布。
-
在服务型环境中部署和调整数据库或其他的后台应用。
-
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
Docker 还鼓励面向服务的体系结构和微服务架构。Docker 推荐单个容器只运行一个应 用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服 务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序 都变得非常简单,同时也提高了程序的内省性。
8.docker不足
-
资源隔离方面不足;
-
安全问题;
-
版本兼容问题;
只能限制资源消耗的最大值,不能隔绝其他程序占用自己的资源; 只要拥有执行docker的权限,那就可以对docker容器进行所有的操作。 Docker目前还在版本的快速更新中,细节功能调整较大,一些核心模块依赖于高版本内核,因此存在着版本的兼容问题;
二、Docker的基本操作
1.Docker的版本
-
Docker-CE 社区版
-
Docker-EE 企业版(收费)
Docker-CE 社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用。 Docker-EE 企业版,为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和IT团队而设计。Docker-EE,增加一些额外功能,更重要的是提供了更安全的保障。
通常情况下,Docker-CE足以满足我们的需求
2.Docker的安装
- 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2 - 设置阿里云镜像
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - 安装 Docker-CE
yum -y install docker-ce(最新版本)
docker-ce-18.03.1.ce-1.el7.centos(安装指定版本) - 查看docker 版本-v
docker -v
docker version - 启动与设置开机启动
systemctl start docker
systemctl enable docker
2.Docker的基本命令操作
docker images # 显示本地所有的镜像列表
docker import # 从一个tar包创建一个镜像,往往和export结合使用
docker build # 使用Dockerfile创建镜像(推荐)
docker commit # 从容器创建镜像
docker rmi # 删除一个镜像
docker load # 从一个tar包创建一个镜像,和save配合使用
docker save # 将一个镜像保存为一个tar包,带layers和tag信息
docker history # 显示生成一个镜像的历史命令
docker tag # 为镜像起一个别名
docker login # 登录到一个registry
docker search # 从registry仓库搜索镜像
docker pull # 从仓库下载镜像到本地
docker push # 将一个镜像push到registry仓库中
docker create # 创建一个容器但是不启动它
docker run # 创建并启动一个容器
docker stop # 停止容器运行,发送信号SIGTERM
docker start # 启动一个停止状态的容器
docker restart # 重启一个容器
docker rm # 删除一个容器
docker kill # 发送信号给容器,默认SIGKILL
docker attach # 连接(进入)到一个正在运行的容器
docker wait # 阻塞到一个容器,直到容器停止运行
docker ps # 显示状态为运行(Up)的容器
docker ps -a # 显示所有容器,包括运行中(Up)的和退出的(Exited)
docker inspect # 深入容器内部获取容器所有信息
docker logs # 查看容器的日志(stdout/stderr)
docker events # 得到docker服务器的实时的事件
docker port # 显示容器的端口映射
docker top # 显示容器的进程信息
docker diff # 显示容器文件系统的前后变化
3.Docker案例
-
搜过镜像
docker search redis
-
拉取镜像
docker pull redis:5 #拉取指定版本镜像 docker pull redis #拉取最新镜像
-
正式创建容器并启用
docker run -itd -p 6379:6379 --name redis -v /data/redis/data:/data redis:5 redis-server /etc/redis/redis.conf --appendonly yes
3.1参数介绍
-p 6379:6379 #容器redis端口6379映射宿主主机6379
--name redis #容器名字为redis
--restart always #自动重启
-v /data/redis/data:/data #容器/data映射到宿主机 /data/docker/redis 下
-d redis:5 #后台模式启动redis
--appendonly yes #开启redis的AOF持久化,默认为false,不持久化
4.图像化界面
- 可以使用 Portainer 作为容器的 GUI 管理方案
https://portainer.io/install.html
- 拉取镜像与容器运行
docker pull docker.io/portainer/portainer docker run -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-demo -d docker.io/portainer/portainer
三、Dockerfile
1.Dockerfile介绍
- Docker构建镜像的基础,区别于其他容器的重要特征;
- Dockerfile是一个文本文件,包含了一条条的指令;
- 学会编写Dockerfile几乎是必备的,这有助于你理解整个容器的运行;
- 自动化和可移植性成为更容易的一件事;
2.Dockerfile基本指令
FROM #从一个基础镜像构建新的镜像
MAINTAINER #维护者信息
ENV #设置环境变量
RUN #非交互式运行shell命令
ADD #将外部文件拷贝到镜像里,src可以为url
WORKDIR #/path/to/workdir, 设置工作目录
USER #设置用户ID
VULUME #<#dir>, 设置volume
EXPOSE #暴露哪些端口
ENTRYPOINT #执行命令 ENTRYPOINT ["/usr/sbin/nginx"]
CMD #执行命令 CMD ["start"]
3.Docker Compose
- 实现Dockerfile的快速编排
docker search redis
- 安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.23.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
- 查看docker-compose
docker -compose version