• 1. Docker介绍小莫
  • 2. 什么是dockerDocker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。 Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。Docker内核版本要求3.1以上。 Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。 在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
  • 3. Docker与虚拟机的区别虚拟机dockerDocker 和传统虚拟化方式的不同之处,可见 容器是在操作系统层面上实现虚拟化,直接 复用本地主机的操作系统,而传统方式则是在 硬件层面实现
  • 4. 容器与虚拟机性能对比特性容器虚拟机启动秒级分钟级硬盘使用一般为 MB一般为 GB性能接近原生弱于系统支持量单机支持上千个容器一般几十个
  • 5. Docker为什么火开源 提高生产效率,快速部署扩展分发 标准化应用发布,保证开发、测试、生产环境一致性 轻量级,节约成本
  • 6. Docker应用场景
  • 7. Docker应用场景简化配置 代码流水线管理 提高开发效率 隔离应用 整合服务器 调试能力 多租户环境 快速部署
  • 8. Docker基本概念镜像 Docker 镜像就是一个只读的模板。 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。 镜像可以用来创建 Docker 容器。 Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
  • 9. Docker基本概念容器 Docker 利用容器来运行应用。 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 *注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
  • 10. Docker基本概念仓库 仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。  仓库分为公开仓库(Public)和私有仓库(Private)两种形式。 最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。 当然,用户也可以在本地网络内创建一个私有仓库。  当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。 *注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
  • 11. Docker基本概念容器的短暂性 一般认为容器是短暂的,也就是说,在容器内做的修改不可靠。如果只是将容器重启并不会导致内容丢失,但是如果删除了容器,那所有在容器里面做的修改都会丢失。一般来说,每次启动的容器,都会删除后重新创建的。
  • 12. Docker基本概念卷 因为容器的短暂性,为了保存重要数据不丢失。可以使用卷来保存重要的数据,防止数据丢失。 单进程模式 一般一个容器只运行一个进程,而且这个进程必须运行在前台,而且进程退出之后,容器也会退出。也就是说,不可以使用常用的服务脚本在docker内直接运行mysql、nginx等服务。可以使用 supervisord 运行多个程序。
  • 13. Docker基本概念网络 1.Bridge模式(默认) Docker守护进程创建了一个虚拟以太网桥docker0,附加在其上的任何网卡之间都能自动转发数据包。默认情况下,守护进程会创建一对对等接口,将其中一个接口设置为容器的eth0接口,另一个接口放置在宿主机的命名空间中,从而将宿主机上的所有容器都连接到这个内部网络上。同时,守护进程还会从网桥的私有地址空间中分配一个IP地址和子网给该容器。
  • 14. Docker基本概念网络 2. host模式网络 该模式将禁用Docker容器的网络隔离。因为容器共享了宿主机的网络命名空间,直接暴露在公共网络中。因此,你需要通过端口映射(port mapping)来进行协调。
  • 15. Docker基本概念网络 3.container模式网络 该模式会重用另一个容器的网络命名空间。通常来说,当你想要自定义网络栈时,该模式是很有用的。 172.17.0.17 Mysql container eth0
  • 16. Docker基本概念网络 4.none模式网络 该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的: 容器并不需要网络(例如只需要写磁盘卷的批处理任务);你希望自定义网络
  • 17. Docker基本用法拉取镜像 Docker默认从Docker Hub 拉去镜像。示例如下: docker pull nginx
  • 18. Docker基本用法查看本地镜像 docker images
  • 19. Docker基本用法创建容器 docker run -d --name nginx -p 8181:80 -v /tmp:/tmp nginx 说明: -d 启动后台运行的容器。 -p 将容器端口映射到宿主机,宿主机端口:容器端口。 -v 挂载卷,宿主机目录:容器目录。 nginx 镜像名称。
  • 20. Docker基本用法查看已经运行的容器 docker ps 查看所有容器,包含已停止的 docker ps -a 查看容器日志 docker logs 容器名或id 查看容器进程 docker top 容器名或id
  • 21. Docker基本用法在已运行的容器内执行命令 docker exec -it nginx /bin/bash 说明: -it 使用交互模式,如果没有这两个选项,则不会进入容器。 nginx 容器名称,也可以使用容器ID。 /bin/bash 在容器内执行的命令,也可以是其他命令。
  • 22. Docker基本用法关闭容器 docker stop 容器名 删除容器 docker rm 容器名 导出镜像 docker save 镜像名:标签 > XXXX.tar 删除镜像 docker rm 镜像名:标签 导入镜像 docker load < XXX.tar
  • 23. Dockerfile(编译自己的镜像)基本结构 Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。 一般的,Dockerfile 分为四部分: 基础镜像信息 维护者信息 镜像操作指令 容器启动时执行指令
  • 24. Dockerfile(编译自己的镜像)FROM centos:7 MAINTAINER mohongshu@qq.com RUN yum install epel-release -y RUN yum install mariadb-* -y RUN mysql_install_db --user=mysql ADD ./readme.txt /home VOLUME /var/lib/mysql ENV PATH=$PATH:/home/mo EXPOSE 3306 WORKDIR /home CMD /usr/bin/mysqld_safe --datadir='/var/lib/mysql' --port=3306 镜像操作指令基础镜像信息维护者信息容器启动时执行指令
  • 25. Dockerfile(编译自己的镜像)指令 FROM 格式为 FROM 或 FROM : 。 第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。 MAINTAINER 格式为 MAINTAINER ,指定维护者信息。
  • 26. Dockerfile(编译自己的镜像)RUN 格式为 RUN 或 RUN ["executable", "param1", "param2"] 。 前者将在 shell 终端中运行命令,即 /bin/sh -c ;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现, 例如 RUN ["/bin/bash", "-c","echo hello"] 。 每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。
  • 27. Dockerfile(编译自己的镜像)CMD 支持三种格式 CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式; CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用; CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数; 指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。 如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
  • 28. Dockerfile(编译自己的镜像)EXPOSE 格式为 EXPOSE [...] 。 告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。 ENV 格式为 ENV 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
  • 29. Dockerfile(编译自己的镜像)ADD 格式为 ADD 。 该命令将复制指定的 到容器中的 。 其中 可以是 Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。 COPY 格式为 COPY 。 复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。当使用本地目录为源目录时,推荐使用 COPY 。
  • 30. Dockerfile(编译自己的镜像)ENTRYPOINT 两种格式: ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 (shell中执行)。 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。 每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。 VOLUME 格式为 VOLUME ["/data"] 。创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
  • 31. Dockerfile(编译自己的镜像)USER 格式为 USER daemon 。 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。 当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: RUN groupadd -r postgres && useradd -r –g postgres postgres 。要临时获取管理员权限可以使用 gosu ,而不推荐sudo 。 WORKDIR 格式为 WORKDIR /path/to/workdir 。 为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。 可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径
  • 32. Dockerfile(编译自己的镜像)编译镜像 docker build -t 镜像名:标签 Dockerfile路径 docker build -t mysql:1.0 /mariadb
  • 33. 我们在哪些地方可以用到docker开发环境 测试环境
  • 34. 推荐网站: http://dockone.io/ https://www.docker.com/
  • 35. THANKS谢谢观看