Why Docker
常见问题:
-
环境配置难
- LAMP(Linux + Apache + Mysql + PHP)中所需软件及各种依赖的安装,流程及依赖复杂,测试时间及风险不可控 -
权限管理烦
- 比如很多公司都使用 Ubuntu、CentoOS,一般开发人员又不给 Root,因此很多软件及命令无法运行 -
隔离性差
- 不同的开发人员如果在同一台主机环境下共享开发,虽然是用户隔离,但端口如果不规范可能会冲突;同一个 Mysql 如果权限管理不好很有可能误删别人的数据 -
可移植性差
- 开发环境、测试环境及生产环境不一致,开发人员之间也无法共享;当有新人入职时,通常需要重新折腾一遍开发环境,无法快速搭建
注:这些问题可以通过在本地搭建虚拟机来解决,但虚拟机是一个很笨重的解决方案,Docker 是一个非常轻量级的方案,而且还拥有虚拟机没有的一些功能,例如标准化 Image,Image 共享等,更重要的是,利用 Docker,你可以运行非常多的容器,在你的 Mac 及 Windows 下搭建一个分布式的开发环境根本不是什么大的问题,而且对内存、磁盘和 CPU 的消耗相比传统的虚拟机要低许多,这些都要归功于 AUFS 和 LXC 这两大神奇的技术
附差异图:
什么是 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 客户端
- 即 Docker 的可执行程序,它可以通过命令行和 API 的形式与 Docker 的守护进程进行通信Docker 守护进程
- 提供 Docker 服务
Docker 三要素
基本要素:
-
Docker Containers
- 负责应用程序的运行,包括操作系统、用户添加的文件以及元数据 -
Docker Images
- 是一个只读模板,用来运行 Docker 容器 -
DockerFile
- 是文件指令集,用来说明如何自动创建 Docker 镜像
DockerFile[Defs] -> Image[Build] -> Contanier[Create] -> Docker[Start] 流程如下:
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 基本命令用法流程: