docker 的技术实现
命名空间,控制组(CGgroups),联合文件系统(union file system)
- CGgroups:资源的隔离,和资源的分配
docker 组成
镜像 image,容器 container,网络 network,数据卷 volume
优势:利用 AUFS 对镜像进行增量更新,方便共用镜像;写时复制更快
image
只读的文件包,包含了虚拟环境运行的最原始文件系统的内容
数据卷
为保证数据的独立性,可以基于 docker 的 unionfs,建立独立的目录持久存放数据,或者在文件中共享;通过这几种方式实现持久化,或者数据共享,我们称之为数据卷
container
启动与 PID 为 1 的进程共生命;写时复制的机制,启动时,利用 unionfs 将镜像以只读的方式挂载到沙盒文件中。
network
容器网络模型核心组成:沙盒(Sandbox),网络(Network),端点(Endpoint)
有五种驱动,其中两种常用 Bridge Driver,Overlay Driver
Bridge,是默认网络驱动可以通过软硬件来实现网桥;Overlay 通过 Docker 集群模块来搭建,可以跨物理主机的虚拟网络。
docker 指令
启动 docker:sudo systemctl start docker
开机自启动:sudo systemctl enable docker
docker info
镜像
拉取镜像:docker pull
(默认为 latest 版本)
docker images
docker search name:version
docker rmi name:version
容器
创建:docker create –name
name:version
运行: docker start name
二合一: docker run -d –namename:version(合并指令,run 为前台,-d 转为后台运行)
docker rm(docker 记得随用随删)
docker ps
docker ps -a
查看容器具体信息:docker inspect
进入容器启动 bash:docker exec -itbash
nginx -s top/quit(进入后停止)
exit(进入后退出)
容器网络
(network 暴露接口)(https://blog.csdn.net/Michaelwubo/article/details/82493006)
–expose(暴露容器 port),EXPOSE 与-P(dockersfile 中使用),-p(指定宿主机的 port 与容器 port 的映射)
创建新的虚拟子网:docker network create -d(-d 可以指定新的网络驱动,默认是 bridge)
docker network ls/rm/..
docker run -d –name–link –network –expose –expose name:version
docker -d –name-p port:port -p port:port name:version
管理存储数据
数据有三种挂载方式:Bind Mount,Volume,Tmpfs Mount
- Bind Mount:指定宿主系统文件目录,以及容器内部的路径
- Volume:指定容器内部的路径,
- Tmpfs Mount:系统内存中的一部分早容器的文件系统中,并不是持久的,其中的内容会随着容器的停止而消失
Bind Mount
必须使用绝对路径不能相对路径,默认是 RW,如果只读,加:ro
docker run -d –name
-v : (:ro) name:version(或者是–volume )
使用的场景:
- 当我们需要从宿主系统共享配置的时候
- 把代码挂载进入容器,每次对代码的修改都可以直接在容器外部进行
Tmpfs Mount 临时文件
docker run -d –name
–tmpfs name:version
Volume 使用数据卷
无需知道数据存储在了宿主的哪里,一般默认在 docker 的资源区域(/var/lib/docker)
docker run -d –name
-v ( :) name:version
共用数据卷
我们用-v 来挂载的时候,如果数据卷不存在,那么会创建,否则直接引用
-v html:…
-v html:…
直接创建数据卷:docker volume create
docker volume ls
docker volume rm
删除容器的时候,加 -v 删除关联的数据卷: docker volume rm -v
删除没有容器引用的数据卷,用 prune:docker volume prune
数据卷容器
数据卷容器不需要运行,用一个系统的镜像就可以
是容器间的文件系统的桥梁,可以像引用 network 一样引用,用–volumes-from 就可以
docker create –name
-v (name:) ubuntu
docker run -d –name–volumes-from name:version
迁移和备份数据卷
对于临时容器,我们在 run 的时候加入 –rm,让容器在停止的时候自动删除
docker run –rm –volumes-from appdata -v /backup:/backup ubuntu tar cvf /backup/backup.tar /webapp/storage
docker run –rm –volumes-from appdata -v /backup:/backup ubuntu tar xvf /backup/backup.tar -C /webapp/storage –strip
保存和共享数据
1、容器–>提交新的镜像:docker commit -m “desc”
name:version
2、导出镜像,可批量:docker save> .tar
docker save -o ./.tar
3、恢复镜像,可批量:docker load <.tar
docker load -i ./.tar
合并 1 和 2:docker export -o ./
docker import ./(注意 load 不可以指定名称,import 可以指定名称)
DockerFile
变量
- 使用变量:用
来传参,在构建的时候传入指令
传入:docker build –build-arg arg=value
只影响构建过程 - 环境变量:用
来指定
可以影响基于此镜像创建的容器,因此可以在运行容器的时候,加入<-e/–env arg=value>来覆盖环境变量,如之前的 mysql
ARG 和 ENV 在使用的时候,采用$arg 来占位,如出现冲突,ENV 的一直都会覆盖 ARG
合并命令
由于镜像是由多个镜像叠加而得,它是由 dockerfile 中的每条指令生成的,因此适度的合并 RUN 到一条指令中,会减少镜像层的数量,较少反复创建容器的次数,提高了镜像构建的速度。
建议将不容易变化的搭建过程放到前面,充分利用构建缓存提高镜像构建的速度。
合并指令的时候,将易变的和不易变的拆分,放到不同的指令里。
Docker Compose 管理容器
Dockerfile 是将容器内部运行环境的搭建固化下来,那么 Docker Compose 是将多个容器运行的方式和配置固化下来。
使用步骤:
1、编写容器所需要的 Dockerfile
2、编写配置容器的 docker-compose.yml
3、使用 docker-compose 命令启动
启动:docker-compose -f ./name.yml -p pj-name up -d
(-f 指令 yml,否则是当前目录下的 yml;-p 指定项目名字;-d 在后台)
删除:docker-compose down