docker

docker

起男 805 2021-08-29

docker

  • docker是一个开源的应用容器引擎
  • docker可用让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux机器上
  • 容器是完全使用沙箱机制,互相隔离
  • 容器性能开销极低

架构

  • 镜像(image):相当于是一个root文件系统。比如官方镜像ubuntu16.04就包含了一个完整的一套Ubuntu16.04最小系统的root文件系统
  • 容器(container):镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可用被创建、启动、停止、删除、暂停等
  • 仓库(repository):仓库可看成一个代码控制中心,用来保存镜像

服务命令

命令 作用
systemctl start docker 启动服务
systemctl status docker 查看服务状态
systemctl stop docker 停止服务
systemctl restart docker 重启服务
systemctl enable docker 开机自启动

镜像命令

命令 作用
docker images 查看本地镜像列表,可以通过后面跟仓库名的方式,查看具体仓库下的镜像
docker search 镜像名 搜索镜像,可以通过--limit显示显示数量
docker pull 镜像名[:版本号] 拉取镜像,不输入版本号则拉取latest
docker push 镜像名 把自己的镜像上传到仓库来共享
docker login -u 用户名 -p 密码 登录到一个docker镜像仓库,未指定地址默认官方仓库
docker logout 登出一个docker镜像仓库
docker rmi 镜像id 删除镜像,删除镜像时不能存在这个镜像的容器
docker commit [参数] 容器名 自定义容器名:版本 将容器提交成镜像
docker build -t=“自定义镜像名:版本号” dockerfile地址 根据dockerfile创建镜像
docker tag 镜像id 自定义镜像名:版本号 修改镜像的标签(创建一个新的)
docker import 包名 自定义镜像名:版本号 从本地导入一个镜像
docker save -o 文件名 镜像名 将镜像导出成文件
docker load < 文件名 将镜像文件导入到本地,也可以将<改为--input
docker history 镜像名 查看镜像的创建历史

docker images列表:

  • REPOSITORY:镜像名称
  • TAG:版本,默认版本latest最新
  • IMAGE ID:镜像id
  • CREATED:创建时间
  • SIZE:大小

docker search列表:

  • NAME:镜像名
  • DESCRIPTION:描述
  • STARS:加星
  • OFFICIAL:是否官方
  • AUTOMATED:是否自动流程构建

docker pull 需要的版本号可以通过: Docker Hub Container Image Library | App Containerization 查看

docker commit 参数:

  • -m:指定提交的说明信息
  • -a:指定更新的用户信息

删除所有镜像:docker rmi `docker images -q`

容器命令

命令 作用
docker ps 查看容器
docker run [参数] 镜像名:版本 /bin/bash 创建并启动容器
docker create 镜像名:版本 创建容器
docker exec -it 容器名 /bin/bash 进入容器
docker attach 容器名 进入容器,退出时关闭容器
docker start 容器名 启动已终止的容器
docker restart 容器名 重启容器
docker stop 容器名 停止容器
docker kill 容器名 杀掉容器
docker rm 容器id或名称 删除容器,-f强制删除
docker inspect 容器名 查看容器信息
docker export 容器id > 文件名 将容器导出为文件,可以配合import再导入为镜像
docker port 容器名 查看容器的端口映射
docker logs 容器名 查看容器的日志,-f让日志想tail -f一样输出
docker top 容器名 查看容器中运行的进程信息
docker events 容器名 查看实时事件
docker wait 容器名 阻塞运行直到容器停止
docker pause 容器名 暂停容器中所有进程
docker unpause 容器名 恢复容器中所有的进程
docker cp 文件源路径 文件目标路径 用于容器和数据直接的数据拷贝,容器的文件要以容器id:开头
docker diff 容器名 检查容器里文件结构的更改
docker container prune 清理停止的容器

docker run参数

  • -i:保持容器运行,和-t同时使用时,退出容器后,容器自动关闭
  • -t:分配一个终端,exit退出
  • -d:后台运行
  • -p:端口映射
  • -P:将容器内部使用的网络端口映射到主机上
  • -v:数据卷
  • -e:初始化环境变量
  • –name:设置容器名
  • –restart:重启策略
  • –rm:关闭容器时删除容器
  • –privileged:当等于true时,容器内的root拥有真正的root权限
  • –volumes-from:指定数据卷容器
  • –link 参数的格式为 --link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名

docker ps参数

  • -a:查看历史容器,默认只能查看运行中的容器
  • -f:根据条件过滤显示的内容
  • -l:显示最近创建的容器
  • -n:列出最近创建的n个容器
  • -q:只显示容器id
  • -s:显示容器的大小

docker ps列表:

  • CONTAINER ID:容器id
  • IMAGE:使用镜像
  • COMMAND:容器初始化命令
  • CREATED:创建时间
  • STATUS:状态
  • PORTS:端口映射
  • NAMES:名称

删除所有的容器:docker rm `docker ps -aq`

数据卷

  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以挂载多个数据卷

作用

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换

配置数据卷

创建启动容器时,使用-v参数设置数据卷

docker run … -v 宿主机目录:容器内目录 …

注意:

  • 目录必须是绝对路径
  • 如果目录不存在,会自动创建
  • 可以挂载多个数据卷

数据卷容器

多容器交换数据的方式:

  1. 多给容器挂载同一个数据卷
  2. 数据卷容器

配置

  1. 创建一个实例(数据卷实例),并设置数据卷
  2. 启动其他容器实例时,使用--volumes-from 数据卷实例名参数设置数据卷

镜像原理

  • docker镜像是由特殊的文件系统叠加而成
  • 最底层是bootfs,并使用宿主机的bootfs
  • 第二层是root文件系统rootfs,称为base image
  • 然后再往上可以叠加其他的镜像文件
  • 统一文件系统技术能够将不同的层整合成一个文件系统,这些层提供了一个统一的视角,这样就隐藏了多层的存在,再用户的角度看来,只存在一个文件系统
  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像
  • 当从一个镜像启动容器时,docker会在最顶层加载一个读写文件系统作为容器

镜像制作

  1. 容器转镜像:docker commit 容器id: 镜像名称:版本号
  2. dockerfile

如果要把镜像分享给他人使用,需要通过docker save -o 压缩文件名 镜像名称:版本号打成压缩包镜像传输(注意:如果设置了数据卷则不会生效)

然后对方使用docker load -i 压缩文件名命令加载镜像

dockerfile

  • dockerfile是一个文本文件
  • 包含了一条条的指令
  • 每条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 对于开发人员:可以为团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿着开发时所构建的镜像或者通过dockerfile文件构建一个新的镜像开始工作
  • 对于运维人员:再部署时,可以实现应用的无缝移植

关键字

关键字 作用 备注
FROM 指定父镜像 指定dockerfile基于那个image构建
MAINTAINER 作者信息 用来标明这个dockerfile谁写的
LABEL 标签 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN 执行命令 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]
CMD 容器启动命令 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”]
ENTRYPOINT 入口 一般在制作一些执行就关闭的容器中会使用
COPY 复制文件 build的时候复制文件到image中
ADD 添加文件 build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV 环境变量 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG 构建参数 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME 定义外部可以挂载的数据卷 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE 暴露端口 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目录 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER 指定执行用户 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK 健康检查 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD 触发器 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL 发送信号量到宿主机 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL 指定执行脚本的shell 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

案例部署springboot

  1. 准备一个springboot项目

  2. 编辑dockerfile文件

    FROM java:8 //需要的父容器
    ADD springboot.jar app.jar //将springboot的jar文件放入容器
    CMD java -jar app.jar  //执行
    
  3. 执行命令docker build -f dockerfile文件名 -t 镜像名,生产镜像

服务编排

微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大

docker compose

docker compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建、启动和停止

使用步骤:

  1. 利用dockerfile定义运行环境镜像
  2. 使用docker-compose.yml定义组成应用的各服务
  3. 运行docker-compose up启动应用