1.Docker到底能解决什么问题?

以前:“我本地能跑,你机器跑不起来”,环境不一致就跑不了。

虚拟机:完整的操作系统,内核,驱动,文件系统全部复制一份,体积大,启动慢,占用内存CPU高。

Docker容器:不装完整的操作系统,直接用宿主机的Linux的内核。只打包你的程序,以及程序需要的库,配置文件等。

通俗来讲:虚拟机是新房子;Docker容器是房子的隔间,共用一套地基,也就是宿主机的内核。

2.四大核心概念

(1)镜像image(模板,只读)

镜像就是安装包/模板,只读,不能改。比如alpine,nginx镜像。

通俗来说,蛋糕模具,不能吃,只能用来生产蛋糕。

(2)容器container(跑起来的实例)

镜像运行起来就是容器。

基于同一个镜像,可以启动成千上万个容器。

容器拥有一层可读写层,所有修改全部写在这一层,镜像本身丝毫不动。

类比:用模具(镜像)烤出来的蛋糕(容器),蛋糕上面可以抹奶油(读写层),模具不变。

关键:容器删除,读写层全部销毁。容器内部的数据全部丢失。想要数据留下来就必须用数据卷volume。

(3)仓库registry

存放镜像的网上仓库,Docker Hub是公共仓库。

docker pull nginx:去仓库下载镜像到本地。

(4)数据卷volume

容器销毁数据就没了。把宿主机的目录挂载映射进容器,数据存储在宿主机磁盘,容器删了数据还保留。

两种挂载:

volume:docker管理的卷

bind mount:手动指定宿主机任意目录映射

3.容器和虚拟机核心区别

docker不是虚拟机,容器只是进程的集合,宿主机上看就是一堆进程。

4.两个底层内核技术

(1)NameSpace命名空间

做隔离:给容器里面的进程制造假象,容器内部看到独立的PID,独立网络,独立主机名,独立文件系统视图。

(容器里面看到PID=1的进程,在宿主机上实际是一个很大的PID)

(2)Cgroup控制组

做限制:限制这个容器最多能用多少CPU,内存,防止一个容器把整机资源用光。

(namespace:看不见外面;cgroup:不能用太多资源,两者结合实现容器隔离)

5.镜像分层

docker镜像不是一个完整大文件,是一层一层堆叠。

每执行Dockerfile一行指令,生成一层layer。

多层只读层叠加,最上面一层是容器读写层。

好处:多个镜像可以共享底层层,节省磁盘。

6.常用命令

docker pull nginx   #下载镜像(拿模板)

docker images       #查看本地有哪些镜像模板

docker run -d nginx #根据镜像启动容器(把模具烤成蛋糕,后台运行)

docker ps               #看正在运行的容器

docker ps -a           #看全部的容器,包括已经停止运行的

docker stop 容器id #停止容器,容器还在磁盘,数据读写层保留

docker start 容器id #再次启动停止的容器

docker rm 容器id    #删除容器,读写层全部数据丢失

docker rmi 镜像id   #删除镜像模板,没有容器使用才可以删

docker exec -it 容器id /bin/bash  #进入正在运行的容器内部终端

docker volume create myvol #创建数据卷

7.Dockerfile(如何自己做镜像)

Dockerfile就是一份脚本,描述怎么构建镜像。每一行生成一层layer。

FROM alpine  #基础镜像

RUN apk add nginx  #执行命令安装软件

CMD ["nginx","-g","daemon off;"]  #容器执行命令

构建:docker build -t mynginx:v1 .

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐