Docker学习


参考文档
docker从入门到实践
Dockerfie 官方文档
Docker 最佳实践文档
Docker 官方镜像

一、Docker简介

  • 更高效的利用系统资源
  • 更快速的启动时间
  • 一致的运行环境
  • 持续交付和部署
  • 更轻松的迁移
  • 更轻松的维护和扩展

二、基本概念

镜像

  • 概念:相当于模板
  • 分层存储:每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

容器

  • 容器的实质是进程。与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
  • 容器是以镜像为模板而运行的进程。容器可以被创建、启动、停止、删除、暂停等。
  • 容器存储层:每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的层为容器存储层。
    容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器。

仓库

概念:

  • Docker Registry 公共仓库
  • <仓库名>:<标签>

三、安装Docker

Windows PC

CentOS

镜像加速器(私服)

Docker 官方提供的中国加速仓库镜像 https://registry.docker-cn.com
七牛云加速仓库镜像 https://reg-mirror.qiniu.com/

  • Windows 10:对于使用 Windows 10 的系统,在系统右下角托盘 Docker 图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Daemon。在 Registry mirrors 一栏中填写加速器地址 https://registry.docker-cn.com ,之后点击 Apply 保存后 Docker 就会重启并应用配置的镜像地址了。
  • Linux
    执行命令docker info,检查是否生效;

四、操作镜像

获取镜像

  • docker search image
  • docker pull image:[tag]

列出镜像

  • 虚悬镜像
    • docker image ls -f dangling=true
    • docker image prune
  • 顶层镜像
    • docker images
  • 中间层镜像
  • 列出部分镜像
    • docker images 仓库名
  • 列出过滤镜像 -f
    • docker image ls -f since=mongo:3.2
    • since:列出自某镜像之后的镜像
    • before:列出自某镜像之前的镜像
    • label:根据LABEL列出镜像

删除本地镜像

  • 用 docker image ls 命令来配合
    • docker image rm $(docker image ls -q redis)
    • docker image rm $(docker image ls -q -f before=mongo:3.2)
  • CentOS/RHEL 的用户需要注意的事项:内核中没有UnionFS相关驱动

利用commit理解镜像

  • docker run --name container -d -p 80:80 image:[tag]
  • docker exec -it container bash
  • docker diff
  • docker history

注意:镜像制作通常有两种方式,dockerfile与docker commit。慎用 docker commit 这种方式。

  1. 因为在容器上即使是执行一些简单的操作,也会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿,更不用说一些安装软件包、编译构建等。
  2. 使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,这对维护工作是非常痛苦的,其他人甚至是制作者一段时间之后也很难知晓对镜像做了什么。

使用Dockerfile定制镜像

  1. FROM 指定基础镜像

    • FROM scratch 以空白镜像为基础
  2. RUN 执行命令

    1. RUN <命令>
    2. RUN ["可执行文件", "参数1", "参数2"]

    以良好的格式编排Dockerfile,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯。 每一层构建的最后一定要清理掉无关文件。


RUN buildDeps='gcc libc6-dev make' \
    && apt-get update \
    && apt-get install -y $buildDeps \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
    && mkdir -p /usr/src/redis \
    && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
    && make -C /usr/src/redis \
    && make -C /usr/src/redis install \
    && rm -rf /var/lib/apt/lists/* \
    && rm redis.tar.gz \
    && rm -r /usr/src/redis \
    && apt-get purge -y --auto-remove $buildDeps
  1. 构建镜像
    1. docker build [选项] <上下文路径/URL/->
      例:docker build -t nginx:v3 .
      -t nginx:v3 指定最终镜像的名称 . 代表当前目录

    2. 镜像构建上下文(Context)
      一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。那么为什么会有人误以为 . 是指定 Dockerfile 所在目录呢?这是因为在默认情况下,如果不额外指定 Dockerfile 的话,会将上下文目录下的名为 Dockerfile 的文件作为 Dockerfile。这只是默认行为,实际上 Dockerfile 的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,比如可以用 -f ../Dockerfile.php 参数指定某个文件作为 Dockerfile。

    3. 其它 docker build 的用法

      1. 直接用 Git repo 进行构建
      2. 用给定的 tar 压缩包构建
      3. 从标准输入中读取 Dockerfile 进行构建
      4. 从标准输入中读取上下文压缩包进行构建

Dockerfile指令详解

  1. COPY复制文件
    使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。

  2. ADD高级复制文件
    适用于需要自动解压缩的场合。

  3. CMD容器启动命令

    1. shell 格式:CMD <命令>
    2. exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
    3. 参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
      Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。在运行时可以指定新的命令来替代镜像设置中的这个默认命令。
      在指令格式上,一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 ",而不要使用单引号。
  4. ENTRYPOINT入口点
    ENTRYPOINT 的格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式。
    ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 --entrypoint 来指定。
    当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:

<ENTRYPOINT> "<CMD>"
  1. ENV设置环境变量
    通过环境变量,我们可以让一份 Dockerfile 制作更多的镜像,只需使用不同的环境变量即可。

  2. ARG构建参数

  3. VOLUME定义匿名卷

  4. ENPOSE暴露端口

  5. WORKDIR指定工作目录

  6. USER指定当前用户

  7. HEALTHCHECK健康检查

  8. ONBUILD为他人做嫁衣

五、操作容器

启动

守护态运行

终止

docker container ls -a
docker container start
docker container restart

进入容器

docker exec 推荐原因:从容器退出不会终止容器运行;
docker attach

导入和导出

docker export
docker import
考虑docker load与 import的区别

六、访问仓库

Docker Hub

私有仓库

私有仓库高级设置

Nexus 3

七、数据管理

数据卷

Volumes

挂在主机目录

Bind mounts

八、使用网络

高级网络配置

Docker三剑客之Compose项目

Docker三剑客之Machine项目

Docker三剑客之DockerSwarm项目

Swarm mode

安全

底层实现

技术点

  • shell
  • linux
  • docker
  • drone
  • git
  • maven

目标

镜像制作流程

操作

**
-- 查看所有镜像
docker images
--进入镜像内部
docker run -it imageId
注:sh  chmod +x ![.png](file:///C:/Users/Administrator/AppData/Roaming/Tencent/TIM/Temp/%W@GJ$ACOF(TYDYECOKVDYB.png)
cmd.sh
         给执行脚本赋予可执行命令
docker commit -m '注释'  imageId(跟之前的不是同一个) 新的镜像名称
docker push 新的镜像名称**

两种制作镜像方式

运行容器,更新

Dockerfile制作

业务组镜像目标

  • 抽取应用的公共配置到镜像中;
    • 四个环境的网关
  • 简化drone配置及执行命令;

实操流程

  • drone中对项目注册秘钥设置;
posted @ 2019-12-27 15:57  LuciusNi  阅读(151)  评论(0)    收藏  举报