preloader

曾梦想仗剑走天涯,后来 bug 多没去!

Docker 大法好

Menu

使用Docker的原因:

有时候团队开发急需一个本地环境,配置开发环境又快又稳定,那必须使用 Docker 的 image 镜像啦!
此处传送门 感谢大佬的提供的文档:
教程:Docker 入门到实践此教程适合 Mac OS 用户

常用命令

  • 杀死所有正在运行的容器

    $ docker kill $(docker ps -a -q)
    
  • 删除所有已经停止的容器

    $ docker rm $(docker ps -a -q)
    
  • 删除所有未打 dangling 标签的镜像

    $ docker rmi $(docker images -q -f dangling=true)
    
  • 删除所有镜像

    docker rmi $(docker images -q)
    

安装步骤

  1. 使用 Homebrew 安装
    $ brew cask install docker
    
  2. 在任务栏点击 Docker for mac 应用图标 -> Perferences… -> Daemon -> Registry mirrors。在列表中填写加速器地址https://registry.docker-cn.com。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。
  3. 获取镜像 ,从仓库获取镜像
    $ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
    
  4. 运行镜像:
    $ docker run -it --rm \ 
    
  • docker run :==启动镜像·==
  • -it-i 交互式操作、 -t 终端
  • --rm:容器退出随之删除

列出镜像

命令 作用 释义补充
docker image ls 列出下载至本地的镜像 仓库名标签镜像ID创建时间占用空间
docker system df 镜像体积 镜像展开后的本地磁盘空间实际大小
docker image ls -f dangling=true 虚悬镜像 镜像既没有仓库名,也没有标签,均为 镜像版本更替会出现此类情况
docker image prune 镜像删除 删除悬虚镜像
docker image ls -a 中间层镜像 ls 显示顶层镜像,ls-a 中间层镜像罗列出来
docker image ls -q 列出悬虚镜像ID
docker image ls –format “ID: Repository” 自定义罗列镜像列表 --format 后面追加其他想要参数

镜像修改

命令 作用 释义补充
docker image rm [选项] <镜像1> [<镜像2> …] 删除镜像 根据镜像ID 、长ID 、标签删除 相关容器需要 docker rm [id] 后 在删除镜像
docker diff 修改内容的具体变化
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] 将容器的存储层保存新的镜像 就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。黑箱操作==不易常用==

Dockerfile 的使用

定制镜像

  1. 新建文件 Dockerfile 写入修改内容
    FROM nginx //引用基础镜像
    RUN buildDeps='gcc libc6-dev make' \  // 镜像的修改命令RUN执行 && 配合使用 达到多次改动 构建一层
    && apt-get update \ // 支持 Shell 类`\` 转行 、`#` 注释
    ...
    && apt-get purge -y --auto-remove $buildDeps // 最后一步避免臃肿需, 删除为了满足其他软件包的依赖而安装的,但现在不再需要的软件包。
    
  2. 构建镜像
    Dockerfile 文件所在目录执行:

$ docker build [选项] <上下文路径/URL/->

同时构建指定上下文(Context)路径,打包上传到 Docker 引擎
==注意==:一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。

  1. 其他 dockr build 用法
  • Git repo 进行构建
  • 给定 tar 压缩包
  • 标准输入读取 docker build - < Dockerfile

Dockerfile 指令详解

COPY 复制文件

格式:

  • COPY <源路径>… <目标路径>
  • COPY [“<源路径1>”,… “<目标路径>”]
    和 RUN 指令一样,也有两种格式,一种类似于命令行,一种类似于函数调用。

    ADD高级复制

    ADD 功能更复杂 ,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用

CMD 容器启动命令

CMD 指令的格式和 RUN 相似,也是两种格式:

  • shell 格式:CMD <命令>
  • exec 格式:CMD [“可执行文件”, “参数1”, “参数2”…]
  • 参数列表格式:CMD [“参数1”, “参数2”…]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。

ENV 设置环境变量

格式有两种:

  • ENV
  • ENV = =..

下列指令可以支持环境变量展开: ADDCOPYENVEXPOSELABELUSERWORKDIRVOLUMESTOPSIGNALONBUILD

VOLUME 定义匿名卷

数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,避免忘记挂载卷提前设置匿名卷存储目录

VOLUME /data

WORKDIR 指定工作目录

工作目录,在各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
==每一个 RUN 都是启动一个容器、执行命令、然后提交存储层文件变更==

需要改变以后各层的工作目录的位置,那么应该使用 WORKDIR 指令

HEALTHCHECK 健康检查

格式:

  • HEALTHCHECK [选项] CMD
  • <命令>:设置检查容器健康状况的命令
    HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
    可以判断容器死锁状态,或者死循环状态

镜像打包复用

  1. 下载镜像压缩包
  2. 定制打包 docker save 和 导入其他设备 docker load

操作容器

启动容器

新建并启动

  • 命令: docker run
  • 交互输入模式: docker run -t -i ubuntu:14.04 /bin/bash-t Docker 分配伪终端(pesudo-tty)绑定到容器标准输入 -i 让容器的标准输入保持打开。

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜
    像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

启动已终止容器
可以利用 docker container start 命令,直接将一个已经终止的容器启动运行。

守护态运行

后台运行

让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现

通过 docker container ls 命令来查看容器信息

要获取容器的输出信息,可以通过 docker container logs 命令

终止容器

使用 docker container stop 来终止一个运行中的容器。

进入容器

docker exec -it 镜像名 -i 标准输入保持打开 -t 分配伪终端 并且 exit 不会停止容器 docker attach 会停止

导入和导出

命令 作用
docker export 镜像id > file.tar 导出容器快照到本地
`cat ubuntu.tar docker import` - 镜像名 导入容器快照为镜像,丢弃所有记录
docker load -i file.tar 导入加载镜像到本地同时保持完整历史记录,占用空间大

删除容器

  • docker container rm 删除一个处于终止的容器
  • docker container ls -a 查看所有处于终止的容器
  • docker container prune 清理所有已终止容器

三剑客- Compose 项目

允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)
重要概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

使用

文件组成

  1. Dockerfile
  2. docker-compose.yml
  3. web 文件

运行项目: docker-compose up

数据管理

数据卷

命令 作用
docker volume create 卷名 创建数据卷
docker volume ls 查看所有的 数据卷
docker volume inspect 卷名 数据卷详细信息
docker run –mount source=卷名 镜像挂载数据卷
docker inspect web 主机内 查看 web 容器信息
docker volume rm 卷名 删除数据卷
docker volume prune 删除所有无主卷