Why Docker

常见问题:

  • 环境配置难 - LAMP(Linux + Apache + Mysql + PHP)中所需软件及各种依赖的安装,流程及依赖复杂,测试时间及风险不可控
  • 权限管理烦 - 比如很多公司都使用 Ubuntu、CentoOS,一般开发人员又不给 Root,因此很多软件及命令无法运行
  • 隔离性差 - 不同的开发人员如果在同一台主机环境下共享开发,虽然是用户隔离,但端口如果不规范可能会冲突;同一个 Mysql 如果权限管理不好很有可能误删别人的数据
  • 可移植性差 - 开发环境、测试环境及生产环境不一致,开发人员之间也无法共享;当有新人入职时,通常需要重新折腾一遍开发环境,无法快速搭建

注:这些问题可以通过在本地搭建虚拟机来解决,但虚拟机是一个很笨重的解决方案,Docker 是一个非常轻量级的方案,而且还拥有虚拟机没有的一些功能,例如标准化 Image,Image 共享等,更重要的是,利用 Docker,你可以运行非常多的容器,在你的 Mac 及 Windows 下搭建一个分布式的开发环境根本不是什么大的问题,而且对内存、磁盘和 CPU 的消耗相比传统的虚拟机要低许多,这些都要归功于 AUFS 和 LXC 这两大神奇的技术

附差异图:

怎么学docker和swarm docker难学吗_怎么学docker和swarm

什么是 Docker?

基本概念:

  • Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上
  • Docker 是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker 则可以称为构建一次,到处运行,这就是 Docker 提出的 Build, Ship And Run Any App, Anywhere
  • Docker 基于 Linux 的多项开源技术提供了高效、敏捷和轻量级的容器方案,并且 支持在多种主流云平台(paas)和本地系统上部署,可以说 Docker 为应用的开发部署提供了一站式的解决方案
  • Docker 采用 C/S 架构,客户端与服务器端不一定要在一起,客户端可以运行在Windows、Linux 等机器上,然后服务器端必须运行在 Linux 64bit 的操作系统上

Docker 特性

基本特性:

  • 速度飞快以及优雅的隔离框架
  • 物美价廉
  • CPU/内存的低消耗
  • 快速开/关机
  • 跨云计算基础构架

Docker 组件

基本组件:

  • Docker Client - 速度飞快以及优雅的隔离框架
  • Docker Daemon - 运行于主机上,处理服务请求
  • Docker Index - 是中央 Registry,支持拥有公有与私有访问权限的 Docker 容器镜像的备份
  • Docker 服务端 - 是一个服务进程,管理着所有的容器
  • Docker 客户端 - 扮演着 Docker 服务端的远程控制器,可以用来控制 Docker 的服务端进程,大部分情况下,Docker 服务端和客户端运行在一台机器上

Docker 采用 C/S 架构开发,整体架构如图所示:

怎么学docker和swarm docker难学吗_怎么学docker和swarm_02

  • Docker 客户端 - 即 Docker 的可执行程序,它可以通过命令行和 API 的形式与 Docker 的守护进程进行通信
  • Docker 守护进程 - 提供 Docker 服务

Docker 三要素

基本要素:

  • Docker Containers - 负责应用程序的运行,包括操作系统、用户添加的文件以及元数据
  • Docker Images - 是一个只读模板,用来运行 Docker 容器
  • DockerFile - 是文件指令集,用来说明如何自动创建 Docker 镜像

DockerFile[Defs] -> Image[Build] -> Contanier[Create] -> Docker[Start] 流程如下:

怎么学docker和swarm docker难学吗_docker_03

DockerFile 实例:

FROM ubuntu   
MAINTAINER Victor Vieux <victor@docker.com>   
RUN apt-get update && apt-get install -y inotify-tools 
nginx apache2 openssh-ser
  • Microservices(微服务) - Docker 官方建议,一只程序安装在一个 Container 内,再把这些 Container 迭起来提供一个完整的服务 - 此新软件架构将组成一个应用系统的每一个 Stack,拆解成许多小型服务,例如 Apache 服务、MySQL 服务、Node.js 服务、Ruby 服务,每一个服务都是包在 Container 里的一只程序,例如 MySQL 服务就是部署在 Container 内的 MySQL。这么做的好处是可以建立一个松散耦合的弹性应用程序架构,也能轻易地抽换其中一个 Container,例如要升级 MySQL,只需要重载新版 MySQL 的 Container 映象文件,就可以完成数据库升级,不用将整套应用系统停机
  • Image 和 Container 的区别 - 他们的区别仅仅是一个是只读的层,一个是可写的层,你可以使用 Docker Commit 命令,将你的 Container 变成一个 Image,也就是提交你所运行的 Container 的修改内容,变成一个新的只读的 Image,这非常类似于 Git Commit命令,其实我们可以把 Image 看作是 PHP 中的 Class,Container 看作是 PHP 中 Object,关系尽显
  • DockerFiler - FROM 声明了 Base Layer,RUN 定义了一层 Layer 安装各种应用
  • Docker Compose - Docker 提供 Compose 来完成一个命令启动多个 Container 的机制

Docker 的应用场景

基本场景:

  • 代码一致 - 在没有 Docker 之前,开发、测试、生成环境可能不一样,如发布某个服务的端口时,开发是 1000,而生产是 2000,这就导致配置文件不一致。然而使用 Docker后,我在容器内的端口都是一样的,而容器对外暴露的端口可能不一样
  • 环境一致 - 我们知道,在生产环境的部署比较复杂,服务非常繁多。通过 Docker,我们可以单机版上通过容器来模拟生产环境的分布式环境。从而让开发人员的开发更有效率**
  • 快速部署 - 可以将 Docker 理解为轻量级的虚拟机,启动 Docker 容器速度很快,启动虚拟机很慢
  • 自动依赖 - 在没有 Docker 之前,在部署程序之前,势必要搭建环境,而搭建环境很花费时间,还要解决环境的各种依赖,而docker通过镜像机制,将你的代码和运行环境直接打包成镜像,扔到容器启动即可
  • 开心运维 - 在没有 Docker 之前,由于技术不断发展,运维也要不停的学习各种软件的使用技能,如 Node.js、redis 等。有了 Docker,根本不用关系这些技术(或者少关心),只需要关注容器就可以了,能够正常的发布容器,停止容器、删除容器、迁移容器就可以了

Docker 基本命令

常用命令:

  • docker-machine env - 查看宿主服务器信息
  • docker-machine ssh default - 进入 Docker 宿主服务器
  • sudo -i - 宿主服务器中切换 Root 用户
  • sudo mount -t vboxsf PHP /mnt/PHP - 宿主服务器中挂载共享文件夹 [PHP 即共享文件夹名称]
  • var/lib/docker/containers/ - 此为宿主服务器创建 Docker 容器的目录,可进行相关信息的修改
  • docker run --rm -v $(pwd):/app composer/composer install - 容器外部运行 Composer 命令
  • git config --global credential.helper store - GIT 保存用户名及密码
  • git config --global user.name "Bruce Liu" - GIT 全局用户名
  • git config --global user.email "bruceliu@jootop.com" - GIT 全局邮箱
  • E: Package 'git' has no installation candidate - apt-get update/upgrade - apt-get 无 Candidate 处理
  • docker search - 搜索仓库中镜像
  • docker pull ubuntu - 获取镜像到本地
  • docker rmi REPOSITORY NAME - 删除本地镜像
  • docker images - 查看本地镜像列表
  • docker run hello-world - 获取并运行 Hello World 镜像
  • docker run -it ubuntu bash - 获取并运行 Ubuntu 镜像,进入 Ubuntu CLI 交互界面 [-it]
  • docker run --name php-dev -p 80:80 -v /mnt/PHP/Project/php-dev:/var/www/html -e 'WEBROOT=/var/www/html/web/' -dit richarvey/nginx-php-fpm - 获取并运行 Nginx PHP 环境,设置容器名称 [–name],设置访问端口 [-p host_port:container_port],设置目录映射 [-v],设置全局变量 [-e],设置后台运行 [-d],进入交互终端 [-it]
  • docker exec -u root -it CONTAINER ID /bin/bash - 以 Root 用户重新进入容器中
  • docker ps -as - 查看所有容器列表
  • docker inspect CONTAINER ID - 查看容器详情
  • docker logs -f CONTAINER ID - 查看容器日志
  • docker commit Name NewName - 根据容器创建镜像
  • docker tag REPOSITORY NAME NEW NAME - 给镜像添加 TAG

Docker 基本命令用法流程:

怎么学docker和swarm docker难学吗_怎么学docker和swarm_04