目录
一、什么是容器
Linux容器是一种对进程进行隔离的运行环境。运行这些进程所需的所有文件都由另一个镜像提供,具有可移植性和一致性
二、什么是docker
一个容器进程本质上是一个运行在沙盒中的隔离进程,由Linux系统本身负责隔离,Docker只是提供了一系列工具,帮助我们设置好隔离环境后,启动这个进程。所以docker可以理解为管理容器的工具,用于开发、发布和运行应用程序的开放平台
三、docker与虚拟机相比的优缺点
• docker 创建和部署应用更快,扩展性更好,特别使用了k8s编排容器后
• docker 需要的资源更少, docker 在操作系统级别进行虚拟化, docker 容器和内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化;
• docker 更轻量, docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境, Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高;
• 高可用和可恢复性: docker 对业务的高可用支持是通过快速重新部署实现的。虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制, VMware 可承诺虚拟机 99.999% 高可用,保证业务连续性;
• 交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化。 Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署。
• (缺点)与虚拟机相比, docker 隔离性更弱, docker 属于进程之间的隔离,虚拟机可实现系统级别隔离;
• (缺点)可管理性: docker 的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如 VMware vCenter 提供完备的虚拟机管理能力;
• (缺点)安全性: docker 的安全性也更弱。 Docker 的租户 root 和宿主机 root 等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作。虚拟机租户 root 权限和宿主机的 root 虚拟机权限是分离的,并且虚拟机利用如 Intel 的 VT-d 和 VT-x 的 ring-1 硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击
四、docker的架构
Docker 使用 C/S 结构,即客户端/服务器体系结构。 Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像。docker客户端主要是管理员与docker通信用的,管理员从客户端键入命令让docker去执行。 Docker 客户端和服务端可以运行在一台机器上,也可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信。
镜像:app的封装,里面有一些程序代码,基础系统、依赖库、工具等
容器:镜像运行的一个场所,一个容器启动相当于一个进程在运行
仓库:存放镜像的地方
五、docker底层隔离技术的实现
主要基于lxc-linux container实现,包含下面两部分:
namespace:用来给进程隔离资源的(资源:文件系统、网络等),不同的命名空间里有不同的资源,而容器由不同的命名空间组合而成
cgroups:对资源进行限制,比如限制某个容器用多少cpu、内存、磁盘等
六、volume
1、使容器里的数据保存到宿主机磁盘里,达到数据的持久化,实现容器和宿主机之间共享数据,
2、正常的停止容器,容器里的数据不会丢失,会保存在/var/lib/docker/volumes
示例:创建一个卷底层挂载到nfs服务器192.168.1.133上的共享目录/web里
1、[root@sc-docker nfs-web]# docker volume create --driver local --opt type=nfs --opt o=addr=192.168.1.133,nolock,soft,rw,sync --opt device=:/web nfs-web-6 nfs-web-6 2、[root@sc-docker nfs-web]# docker volume ls DRIVER VOLUME NAME local 2f1f1ac5ccdde7a9d80e277a974eeb3c2b6ff98b7126349f52caaef0042bbf9f local 5103a4c07fe6745fba25c88320cc42a385c1e44b9cd461ed6b7be894e77bf357 local b9eeeb4fc5d95a184919ad9dbdb6a329771950a85a98e3729ad911107eb681d4 local nfs-web local nfs-web-2 local nfs-web-6 local nginx-web 3、[root@sc-docker nfs-web]# docker volume inspect nfs-web-6 [ { "CreatedAt": "2022-08-26T18:24:33+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/nfs-web-6/_data", "Name": "nfs-web-6", "Options": { "device": ":/web", "o": "addr=192.168.1.133,nolock,soft,rw,sync", "type": "nfs" }, "Scope": "local" } ] 4、创建一个容器使用nfs-web-6卷 docker run -d -p 8818:80 -v nfs-web-6:/usr/share/nginx/html --name siyx-nginx-8 nginx
七、compose
是一个容器编排工具,启动一个容器,进行哪些配置,端口,启动那个进程,使用那个卷,是否链接其他的容器等,同时可以启动多个容器
例如:我们现在需要启动10个容器,其中3个nginx,2个redis,3个mysql,1个zabbix,1个ansible
有些容器需求先启动,有容器需要后启动,在启动的时候是有先后顺序的。
批量启动容器,而且启动的时候容器之间是有依赖关系,需要考虑启动顺序的
编排的内容全部写到一个yaml文件里,docker 的compose根据这个yaml文件里的安排去启动容器。
优点:
1.快速批量的启动容器,效率高
2.不容易出错,可靠
八、docker常用命令
1、docker version 查看docker的版本
1、docker info 查看docker的详细信息
2、docker images 查看自己的docker里有那些镜像
3、docker search 搜索doucker镜像
docker search nginx 查找nginx镜像
docker search mysql 查找mysql镜像
4、docker pull 下载docker镜像
docker pull mysql 下载mysql镜像,默认是下载最新版本的
docker pull mysql:5.7.37 下载指定版本的mysql镜像,5.7.37
5、docker ps 查看有多少容器正在运行
6、docker ps -a 查看有多少容器,没有运行的也显示出来
7、dokcer stats 查看容器的使用情况
6、docker run 启动某个容器,第一次启动
docker run -d -p 8090:80 --name sc-nginx nginx
-d 在后台运行 daemon 守护进程
-p 8090:80 指定端口映射 DNAT 访问本机的8090端口,转发到docker容器的80端口
--name sc-nginx 指定容器的名字
nginx 是镜像的名字
7、docker stop 停止某个容器
docker stop lhj-nginx-3 停止lhj-nginx-3这个容器
8、docker start 启动某个容器
docker start lhj-nginx-3 启动运行lhj-nginx-3这个容器
9、docker rm 删除某个容器
docker rm lhj-nginx 删除lhj-nginx容器
10、docker rmi 删除某个镜像,还要指定版本
docker rmi mysql:latest 删除mysql:latest镜像
11、ps aux|grep containerd-shim--》查看docker里有多少容器正在运行
12、docker logs 查看容器日志,当容器启动不起来,它会给予相应的提醒,还可以用来排错
docker logs centos7-lhj-1 查看centos7-lhj-1这个容器的日志
13、docker create --name sc-lhj-1 -p 8090:80 nginx 创建静态的容器
14、docker exec -it sc-lhj-1 /bin/bash 进入容器的内部
docker exec 进入容器内部
-it 开启一个交互式的中端,进入容器里面,运行/bin/bash
15、docker inspect 查看容器的详细信息
docker inspect sc-lhj-1 查看sc-lhj-1这个容器的详细信息
16、docker network ls 查看容器使用的网络类型
17、docker registry/harbor 搭建私有仓库
18、docker cp 可以实现容器和宿主机里面文件的相互拷贝
docker cp re.txt sc-nginx:/root
复制r宿主机里re.txt到容器sc-nginx的家目录下面