Docker学习

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 –name name:version(合并指令,run 为前台,-d 转为后台运行)
docker rm (docker 记得随用随删)
docker ps
docker ps -a
查看容器具体信息:docker inspect
进入容器启动 bash:docker exec -it bash
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