Docker容器
容器背景
- 随着云计算和DevOps生态圈的蓬勃发展,产生了大量优秀的系统和软件。软件开发人员可以自由选择各种软件应用环境。但同时带来的问题就是需要维护一个非常庞大的开发、测试、预上线、和生产环境。面对这种情况,docker容器技术横空出世、提供了简单、灵活、高效的解决方案,不需要改变现有的使用习惯,就可以和已有的工具进行整合。因此,掌握docker相关技术也是途径云计算的必经之路。
- Docker是在Linux容器里运行应用的开源容器管理工具,可以理解为轻量级的“虚拟机”。它诞生于 2013 年初,最初是 DotCloud 公司内部商业版项目,后来更换架构师,此架构师将Docker进行了开源,导致Docker使用人员增多。基于 Google公司推出的 Go(Golang) 语言开发。该项目后来加入了Linux基金会,遵从了Apache 2.0协议进行推广,项目代码在 GitHub(https://github.com/docker)上进行维护。
- **docker官网:**https://www.docker.com/
- Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。鲸鱼可以看做宿主机,而集装箱可以理解为实现应用相互隔离的容器,每个集装箱中都包含自己的应用程序。正如Docker的设计宗旨一样:Build、Ship and Run Any App、Anywhere,即通过对应用组件的封装、发布、部署、运行等生命周期的管理、达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
一、虚拟化与传统物理机部署方式
1.传统物理机部署:
部署非常慢、成本高、资源浪费、难于迁移和扩展、可能会被限定硬件厂商
2.虚拟化技术:
一个物理机可以部署多个app,每个app独立运行在一个vm里,现如今虚拟主机、web服务器、数据库、对象存储等等各种服务都可以同个各种各样的云平台来完成
3.虚拟化:
是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境
4.镜像和容器的区别
镜像是只读的,就是拉到本地并没有运行
容器是可写的,已经运行并且能进入到容器内
docker容器与传统虚拟化的对比
特性 | 容器 | 虚拟机 |
---|---|---|
启动时间 | 秒级 | 分钟级 |
资源损耗 | 几乎无 | 至少损耗50%左右(系统占用) |
硬盘空间 | MB | GB |
系统支持 | 上千个 | 几十个 |
隔离性 | 资源限制 | 完全隔离 |
性能 | 接近原生 | 弱于 |
二、docker优点
1.快速的交付和部署:
对(DevOps)人员来说,最希望的就是项目环境一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套项目开发容器,代码开发完成之后,运维人员可以直接此容器打包迁移。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker将会大量地节约开发、测试、部署的时间。
2.高效的虚拟化:
Docker容器的运行不需要额外的管理系统支持,它是内核级的虚拟化,并且容器调用的是宿主机的bin和lib。因此可以实现更高的性能和效率。
3.更轻松的迁移和扩展:
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个平台。
4.简单的管理:
使用 Docker只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理
三、docker的底层原理:
Docker是基于google公司推出的golang语言开发而来,基于linux系统内核的Cgroups、NmaeSpace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术
对进程进行封装隔离,属于操作系统层面的虚拟化技术
利用docker可以实现开发,测试,生产环境的部署一致性,极大的减少运维成本
1.docker核心组件:
Image镜像,构建容器(我们讲应用程序所需要的环境,打包为镜像文件)
Container,容器(应用程序跑在容器中)
镜像仓库(dockerhub)保存镜像文件,提供上传,下载镜像,作用好比github
Dockerfile,将你部署项目的操作,写成一个部署脚本,这就是dockerfile,且该脚本还能够构建出镜像文件
2.创建容器过程:
获取镜像,如docker pull centos,从镜像仓库拉取
使用镜像创建容器
分配文件系统,挂载一个读写层,在读写层加载镜像
分配网络/网桥接口,创建一个网络接口,让容器和宿主机通信
容器获取ip地址
执行容器命令,如/bin/bash
反馈容器启动结果
3.概念名称
镜像:image
容器:container
仓库:Repository
四、docker安装部署
1.环境
docker必须在centos7平台,内核版本不低于3.10
uname -r 查看本主机内核
环境初始化 关闭防火墙、安全机制
2.开启linux内核的路由转发(也就是宿主机能干啥容器也能干啥)
cat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.ip_forward=1
EOF
加载修改内核的参数配置文件
modprobe br_netfilter
sysctl -p /etc/sysctl.d/docker.conf
3. yum快速安装docker
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce
systemctl start docker
systemctl enable docker
清理缓存创建新的缓存
yum clean all && yum makecache
安装yum -y install docker-ce
卸载yum -y remove docker-版本号
4.配置docker镜像加速器,拉取镜像
mkdir /etc/docker #如果没有启动docker需要创建此目录
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://8xpkSwnt.mirror.aliyuncs.com"]
}
EOF
5.启动使用docker
systemctl daemon-reload ##重新加载配置文件
systemctl start docker ##启动docker
systemctl enable docker ##设为开机自启动
//查看是否设置为开机自启动systemctl is-enabled 服务名称
[root@localhost ~]# systemctl is-enabled docker
enabled
\##查看docker有没有启动成功
ps -ef |grep docker 或 docker version
启动/停止docker
//启动
systemctl start docker
//停止
systemctl stop docker
//开机自启
systemctl enable docker
//重启docker
systemctl restart docker
//查看状态
systemctl status docker
五、docker命令及用法
一些快捷键
esc键+. #可以调用上一条命令
ctrl+insert #复制
shift+insert #粘贴
ctrl+r #输入某个单词搜索历史命令
ctrl+p #返回上一次输入命令字符
查看版本信息
//docker 帮助命令
docker --help
//如果忘记某一个命令怎么使用,有哪些参数
eg:docker pull --help
//查看docker内组件及版本信息
docker version
//查看docker版本信息
docker --version
//显示docker的系统信息,包括镜像和容器的数量
docker info
docker images 或docker image ls
选项:
-q 或 --quit #只显示镜像的id
-qa #显示所有镜像的id
--format #格式化显示镜像 例::docker images --format "{
{.ID}}--{
{.Repository}}"
##参数详解:
REPOSITORY:镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像的id
CREATED:镜像的创建时间
SIZE:镜像的大小
//打标签(原有的容器删除,标签还能继续使用)
docker tag 镜像名 自定义标签名
//查看一个镜像具体信息加inspect参数即可
docker image inspect 镜像id
查找镜像&拉取
//查找镜像,查到之后一般选择第一个,是官方认证
docker search nginx ##nginx为镜像名
//拉取镜像,如果不加版本号会自动拉取最新版本,如果本地没有会直接拉取
docker pull nginx:1.22.1
查看容器内详细信息
##查看容器的详细信息,用于高级的调试
docker container inspect 容器id/容器名称
查看容器日志信息
##查看容器内的所有日志信息
docker logs 容器id/容器名称
docker logs -f --tail=要查看末尾多少行 默认all 容器ID
-f 实时刷新
##查看容器端口转发情况
docker port 容器id/容器名称
查看容器进程
##登录方式
docker run -it 自定义起的那个名 bash
##查看容器内进程信息
docker top 容器id
##动态查看容器内资源信息
docker stats 容器id
运行镜像
//运行镜像
docker run -d -p 80:80 nginx
//选项
-d ##后台运行容器
-p ##宿主机端口:容器内端口(端口映射)/tcp (tcp指定远程传输协议) 当访问宿主机端口也就是访问到了容器内的端口,启动后会返回一个容器id
--expose:接受指定范围作为参数比如:--expose=2000~3000
-P ##大P 随机指定端口
-it ##使用交互方式运行, 进入容器查看内容
--rm