Docker (Full-1)

*   Docker(1)-基础知识
    *   Docker(搬运工)
        *   [https://baike.baidu.com/pic/Docker/13344470/0/203fb80e7bec54e7719c18b0bb389b504fc26a2f?fr=lemma&ct=single#aid=0&pic=f703738da977391281957edbf0198618377ae2dd](https://baike.baidu.com/pic/Docker/13344470/0/203fb80e7bec54e7719c18b0bb389b504fc26a2f?fr=lemma&ct=single#aid=0&pic=f703738da977391281957edbf0198618377ae2dd) (Docker的图片:像船,船上有很多集装箱,每个集装箱就是一个)
        *   [https://baike.baidu.com/item/Docker/13344470?fr=aladdin](https://baike.baidu.com/item/Docker/13344470?fr=aladdin)
    *   Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上。
    *   Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
    *   一个完整的Docker有以下几个部分组成:
        *   dockerClient客户端
        *   Docker Daemon守护进程
        *   Docker Image镜像
        *   DockerContainer容器
    *   几个问题:
        *   环境管理复杂 - 从各种OS到各种中间件到各种app, 一款产品能够成功作为开发者需要关心的东西太多,且难于管理,这个问题几乎在所有现代IT相关行业都需要面对。
        *   云计算时代的到来 - AWS的成功, 引导开发者将应用转移到 cloud 上, 解决了硬件管理的问题,然而中间件相关的问题依然存在 (所以openstack HEAT和 AWS cloudformation 都着力解决这个问题)。开发者思路变化提供了可能性。
        *   虚拟化手段的变化 - cloud 时代采用标配硬件来降低成本,采用虚拟化手段来满足用户按需使用的需求以及保证可用性和隔离性。然而无论是KVM还是Xen在 docker 看来,都在浪费资源,因为用户需要的是高效运行环境而非OS, GuestOS既浪费资源又难于管理, 更加轻量级的LXC更加灵活和快速
        *   LXC的移动性 - LXC在 linux 2.6 的 kernel 里就已经存在了,但是其设计之初并非为云计算考虑的,缺少标准化的描述手段和容器的可迁移性,决定其构建出的环境难于迁移和标准化管理(相对于KVM之类image和snapshot的概念)。docker 就在这个问题上做出实质性的革新。这是docker最独特的地方。
    *   面对上述几个问题,docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付
    *   Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
    *   Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。
        *   Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
    *   在docker的网站上提到了docker的典型场景:
        *   Automating the packaging and deployment of applications(使应用的打包与部署自动化)
        *   Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
        *   Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
        *   Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
    *   局限 (Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品 )
        *   Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
        *   LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
        *   隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
        *   网络管理相对简单,主要是基于namespace隔离
        *   cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
        *   Docker对disk的管理比较有限
        *   container随着用户进程的停止而销毁,container中的log等用户数据不便收集
    *   原理
        *   Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。
            *   隔离性 - 每个用户实例之间相互隔离, 互不影响。 硬件虚拟化方法给出的方法是VM, LXC给出的方法是container,更细一点是kernel namespace
            *   可配额/可度量 - 每个用户实例可以按需提供其计算资源,所使用的资源可以被计量。硬件虚拟化方法因为虚拟了CPU, memory可以方便实现, LXC则主要是利用cgroups来控制资源
            *   移动性 - 用户的实例可以很方便地复制、移动和重建。硬件虚拟化方法提供snapshot和image来实现,docker(主要)利用AUFS实现
            *   安全性 - 这个话题比较大,这里强调是host主机的角度尽量保护container。硬件虚拟化的方法因为虚拟化的水平比较高,用户进程都是在KVM等虚拟机容器中翻译运行的, 然而对于LXC, 用户的进程是lxc-start进程的子进程, 只是在Kernel的namespace中隔离的, 因此需要一些kernel的patch来保证用户的运行环境不会受到来自host主机的恶意入侵, dotcloud(主要是)利用kernel grsec patch解决的.
    *   采用AUFS作为docker的container的文件系统,能够提供如下好处:
        *   节省存储空间 - 多个container可以共享base image存储
        *   快速部署 - 如果要部署多个container,base image可以避免多次拷贝
        *   内存更省 - 因为多个container共享base image, 以及OS的disk缓存机制,多个container中的进程命中缓存内容的几率大大增加
        *   升级更方便 - 相比于 copy-on-write 类型的FS,base-image也是可以挂载为可writeable的,可以通过更新base image而一次性更新其之上的container
        *   允许在不更改base-image的同时修改其目录中的文件 - 所有写操作都发生在最上层的writeable层中,这样可以大大增加base image能共享的文件内容。
    *   Docker解决的问题
        *   云计算、大数据,移动技术的快速发展,加之企业业务需求的不断变化,导致企业架构要随时更改以适合业务需求,跟上技术更新的步伐。毫无疑问,这些重担都将压在企业开发人员身上;团队之间如何高效协调,快速交付产品,快速部署应用,以及满足企业业务需求,是开发人员亟需解决的问题。Docker技术恰好可以帮助开发人员解决这些问题。
        *   为了解决开发人员和运维人员之间的协作关系,加快应用交付速度,越来越多的企业引入了DevOps这一概念。但是,传统的开发过程中,开发、测试、运维是三个独立运作的团队,团队之间沟通不畅,开发运维之间冲突时有发生,导致协作效率低下,产品交付延迟, 影响了企业的业务运行。Docker技术将应用以集装箱的方式打包交付,使应用在不同的团队中共享,通过镜像的方式应用可以部署于任何环境中。这样避免了各团队之间的协作问题的出现,成为企业实现DevOps目标的重要工具。以容器方式交付的Docker技术支持不断地开发迭代,大大提升了产品开发和交付速度。
        *   此外,与通过Hypervisor把底层设备虚拟化的虚拟机不同,Docker直接移植于Linux内核之上,通过运行Linux进程将底层设备虚拟隔离,这样系统性能的损耗也要比虚拟机低的多,几乎可以忽略。同时,Docker应用容器的启停非常高效,可以支持大规模的分布系统的水平扩展,真正给企业开发带来福音。
    *   Docker问题
        *   虽然Docker技术发展很快,但技术还不够成熟,对存储的灵活的支持、网络的开销和兼容性方面还存在限制,这是Docker没有被企业大范围使用的一个主要原因。另外一个原因是企业文化是否与DevOps运动一致,只有企业支持DevOps,才能更大地发挥Docker的价值。最后一个原因就是安全性问题,Docker对于Linux这一层的安全的隔离还有待改进,才能进一步得到企业的认可。
*   Docker(2)-实战
    *   1.什么是docker:
        *   docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解.
        *   Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行;
        *   Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主要是聚焦于如何机器启动地更快和耗更少的内存;
        *   Docker为App提供了一种自动化构建机制(Dockerfile),包括打包,基础设施依赖管理和安装等等;
        *   Docker提供了一种类似git的Container版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git那样进行合并;
        *   Docker Container是可重用的,依赖于版本化机制,你很容易重用别人的Container(叫Image),作为基础版本进行扩展;
        *   Docker Container是可共享的,有点类似github一样,Docker有自己的INDEX,你可以创建自己的Docker用户并上传和下载Docker Image;
        *   Docker提供了很多的工具链,形成了一个生态系统;这些工具的目标是自动化、个性化和集成化,包括对PAAS平台的支持等;
    *   2.docker运用场景:
        *   web应用的自动化打包和发布;
        *   自动化测试和持续集成、发布;
        *   在服务型环境中部署和调整数据库或其他的后台应用;
        *   从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
            *   可以看出来docker其实就是使得部署,发布变得更加快捷,更加自动化,且适应云平台环境.再看定义:
            *   Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、
            *   OpenStack 集群和其他的基础应用平台。
                *   意思很明显了.按照我的理解,先不考虑docker的实现方式,其实docker就是一个包含运行环境的应用,由于自身带有所有需要的运行环境促成了他的可移植性和快速部署.
                *   docker应用环境的集成是通过一层一层的镜像叠加实现的,这种方式可以使得底层镜像多次复用,结构清晰
    *   3.Docker 的优点
        *   1、简化程序:Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。
        *   2、避免选择恐惧症:如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
        *   3、节省开支:一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
    *   4.Docker架构
        *   Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
        *   Docker 容器通过 Docker 镜像来创建。
        *   容器与镜像的关系类似于面向对象编程中的对象与类。
            *   Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板。
            *   Docker 容器(Container) 容器是独立运行的一个或一组应用。
            *   Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。
            *   Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
            *   Docker 仓库(Registry) Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
            *   Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean
    *   4.docker安装
        *   配置要求:
            *   docker容器最早受到RHEL完善的支持是从最近的CentOS 7.0开始的,官方说明是只能运行于64位架构平台,内核版本为2.6.32-431及以上(即>=CentOS 6.5,运行docker时实际提示3.8.0及以上),升级内核请参考CentOS 6.x 内核升级(2.6.32 -> 3.10.58)过程记录
            *   需要注意的是CentOS 6.5与7.0的安装是有一点点不同的,CentOS-6上docker的安装包叫docker-io,并且来源于Fedora epel库,这个仓库维护了大量的没有包含在发行版中的软件,所以先要安装EPEL,而CentOS-7的docker直接包含在官方镜像源的Extras仓库(CentOS-Base.repo下的[extras]节enable=1启用)。前提是都需要联网
        *   查看CentOS内核
            *   [root@localhost ~]# uname -r // 2.6.32-696.el6.x86_64
                *   或 lsb_release -a 或 cat /etc/redhat-release
        *   Linux怎么查看设置系统语言包
            *   1\. Linux中没有安装中文包
                *   1.1查看当前系统语言
                *   登陆linux系统打开操作终端之后,输入 echo $LANG可以查看当前使用的系统语言

                    [图片上传失败...(image-c123cf-1543981840419)]

                *   1.2查看安装的语言包
                *   查看是否有中文语言包可以在终端输入 locale命令,如有zh cn 表示已经安装了中文语言

                    [图片上传失败...(image-db3ac-1543981840419)]

                *   1.2如果没有中文语言呢
                *   可以通过网上下载安装中文语言包yum groupinstall chinese-support(不能联网的通过其他电脑下载,上传上去吧)
                *   1.3如何修改系统语言为中文
                    *   1.3.1 临时更换语言
                    *   如果只是临时更换linux系统的语言环境,可以通过输入设置 LANG=语言名称, 如中文是
                    *   Zn_CN.UTF-8(注意我这里本来就是中文的,我临时设置为英文
                    *   1.3.2修改系统默认语言
                    *   以上方法是通过修改设置系统默认的语言配置
                    *   如Vi  /etc/sysconfig/i18n (注意改好之后重启一下系统)

                        [图片上传失败...(image-488a48-1543981840414)]

            *   2如果按照以上方法设置修改设置中文语言还是不行的话,注意您的链接终端选择的编码。
            *   如xshell为例,把终端的编码选择中文,或者UTF8即可

                [图片上传失败...(image-55e1ed-1543981840422)]

        *   安装
            *   Docker都需要64位环境。此外,内核版本必须最低为3.10
            *   1\. 禁用selinux
                *   # getenforce // enforcing
                *   # setenforce 0
                *   # vi /etc/selinux/config // SELINUX=disabled
            *   2\. 安装 Fedora EPEL (安装yum源)
                *   # yum install epel-release-6-8.noarch.rpm // 或 yum -y install [http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm](http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm)
                    *   这一步执行之后,会在/etc/yum.repos.d/下生成epel.repo、epel-testing.repo两个文件,用于从Fedora官网下载rpm包。
            *   3、更新yum
                *   yum update // 其实不需要这步“升级yum” 升级需要安装100多个包,很慢
            *   4、安装docker
                *   yum -y install docker-io
            *   5、查看docker版本
                *   docker --version // Docker version 1.7.1, build 786b29d/1.7.1
            *   6、启动docker服务
                *   service docker start // 或: docker -d # tail -f /var/log/docker查看日志
                *   docker的关闭使用:service docker stop
                    *   [root@localhost bin]# docker -d
                        *   WARN[0000] You are running linux kernel version 2.6.32-696.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0\. // 整这么久,还是安装失败了!! 提示需要升级内核版本至3.10.0
            *   docker卸载与安装( CentOS release 6.9 (Final) - 内核3.10 - Docker1.7.1)
                *   因为我最开始在服务器上装了错误的docker版本,所有先把错误的版本卸载,再重新安装,我的服务器是  CentOS release 6.9 (Final)
                    *   docker卸载
                        *   1、列出已经安装的docker
                            *   yum list installed | grep docker
                        *   2、卸载docker安装包
                            *   sudo yum -y remove docker-engine.x86_64
                                *   卸载失败(error: %preun(docker-io-1.7.1-2.el6.x86_64) scriptlet failed, exit status 1,Error in PREUN scriptlet in rpm package docker-io,docker-io-1.7.1-2.el6.x86_64 was supposed to be removed but is not!
                                    *   解决方法: rpm -e --noscripts docker-io.x86_64 // 需要加上参数--noscripts
                        *   3、删除docker镜像
                            *   rm -rf /var/lib/docker
                    *   升级Linux内核版本,docker官方需要linux内核版本至少3.10以上(带aufs模块,记住一定要升级,要不然会出现很多莫名奇怪的问题,建议用yum安装)
                        *   yum安装带aufs模块的3.10内核
                            *   cd /etc/yum.repos.d
                            *   wget [http://www.hop5.in/yum/el6/hop5.repo](http://www.hop5.in/yum/el6/hop5.repo)
                            *   yum -y install kernel-ml-aufs kernel-ml-aufs-devel
                        *   修改内核配置,设置default=0,表示第一个title下的内容为默认启动的kernel(一般新安装的内核在第一个位置)
                            *   vi /etc/grub.conf
                        *   重启系统
                            *   reboot
                        *   重启之后,查看内核版本 // uname -r 已经是3.10.5-3.el6.x86_64了
                        *   查看内核是否支持aufs,输出nodev   aufs表示支持
                            *   grep aufs /proc/filesystems # 等于 cat /proc/filesystems | grep aufs //查看结果: nodev    aufs
                    *   安装docker
                        *   1、关闭selinux
                            *   setenforce 0
                            *   sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config # 修改为:SELINUX=disabled
                        *   2、安装epel (在Fedora EPEL源中已经提供了docker-io包,下载安装epel)
                            *   rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
                            *   sed -i 's/^mirrorlist=https/mirrorlist=http/' /etc/yum.repos.d/epel.repo # 所有的https替换成http
                                *   grep mirrorlist /etc/yum.repos.d/epel.repo //查看是否修改成功
                        *   3、yum安装docker-io
                            *   yum -y install docker-io
                        *   4、启动docker
                            *   service docker start // 或 /var/bin/docker -d
                                *   Usage: /etc/init.d/docker {start|stop|status|restart|condrestart|try-restart|reload|force-reload}
                                *   如果输出如下信息说明应该启动成功了
                                    *   Starting cgconfig service:                                 [  OK  ]
                                    *   Starting docker:                                              [  OK  ]
                            *   docker日志在/var/log/docker
                        *   5、查看docker版本
                            *   docker version / 或: docker -v 、 docker info
                                *   升级Docker
                                    *   [root@localhost etc]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://d88cf08e.m.daocloud.io
                                        *   please upgrade your docker to v1.9 or later
                    *   命令[http://blog.csdn.net/wuzhilon88/article/details/41621285](http://blog.csdn.net/wuzhilon88/article/details/41621285)
                        *   docker // 查看所有的Options和Commands
                        *   docker COMMAND --help // 查看某一个command的详细使用方法
                        *   [root@localhost opt]# docker search centos //搜索可用镜像
                            *   Get http:///var/run/docker.sock/v1.19/images/search?term=centos: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
                                *   报错原因:没有启动Daemon // 解决方法: docker -d
                        *   docker pull centos:latest // 下载镜像 # 获取最新的centos镜像
                            *   注意:这里要写用docker search搜索到的完整的镜像名。
                                *   解决docker pull镜像速度慢的问题
                                    *   可以进入Docker Hub Mirror注册入口注册([https://account.daocloud.io/signin](https://account.daocloud.io/signin))。在进入控制台页面后直接点击 启动你的加速器后,您即可得到一个Mirror的地址,将该地址配置在Docker Daemon的启动脚本中,重启Docker Daemon即可使得Docker Hub Mirror配置生效。 // 我注册获取的为: yum-config-manager --add-repo [https://download.docker.com/linux/centos/docker-ce.repo](https://download.docker.com/linux/centos/docker-ce.repo)
                                        *   yum update升级到最新版
                                            *   yum -y update docker-io // No Packages marked for Update
                                        *   二进制的方法去升级docker //无效
                                            *   [root@localhost ~]# wget [https://get.docker.com/builds/Linux/x86_64/docker-latest](https://get.docker.com/builds/Linux/x86_64/docker-latest) -O /usr/bin/docker
                                                *   /usr/bin/docker: Text file busy # 解决方法: ps -ef | grep docker 得到进程PID >> kill PID
                                                *   wget [https://get.docker.com/builds/Linux/x86_64/docker-latest](https://get.docker.com/builds/Linux/x86_64/docker-latest) -O /usr/bin/docker # 一直报错,HTTP request sent, awaiting response... 403 Forbidden,原因是 [https://get.docker.com/builds/Linux/x86_64/docker-latest](https://get.docker.com/builds/Linux/x86_64/docker-latest) 这个链接无效
                                            *   升级
                                                *   使用脚本安装
                                                    *   curl -fsSL [https://get.docker.com/](https://get.docker.com/) | sh
                                                        *   或: wget -qO- [https://get.docker.com/](https://get.docker.com/)| sh
                                                *   通过源安装(例如,在Centos下使用yum安装)
                                                    *   $ sudo yum install docker-engine
                        *   docker images centos // 查看安装的镜像
*   Docker(3)-Ubuntu 安装
    *   Docker平台推荐:文档: [http://docs.tenxcloud.com/guide/concepts](http://docs.tenxcloud.com/guide/concepts)、网址:[https://hub.tenxcloud.com](https://hub.tenxcloud.com/) /
    *   通俗解释Docker是什么?
        *   docker就是集装箱原理。Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。
            *   1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
            *   2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
            *   3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。
        *   Docker就是一个应用的容器
            *   Docker是容器,放应用。应用是啥?一个网站、一个程序、一个系统等都是应用。从此不用配置环境,也不用装环境,更不用统一环境了。因为docker都打包好了,开一个容器不到一秒,环境什么的别人都配好了,我就老老实实写代码就可以。奔溃了重启(重启才3秒而已)。所以,docker就是用来存放和运行应用的一个容器,更轻量、更简单、更快速、更好玩。
        *   箱子神奇之处:标准
            *   如何通俗解释Docker是什么?有个著名的隐喻:集装箱。但是它却起了个“码头工人”(docker 的英文翻译)的名字。这无疑给使用者很多暗示:“快来用吧!用了Docker,就像世界出现了集装箱,这样你的业务就可以随意的、无拘无束的运行在任何地方(Docker 公司的口号:Build,Ship,and Run Any App,Anywhere),于是码头工人就基本都可以下岗了。”
            *   在集装箱之前,货物运输没有统一的标准方式进行搬运,于是铁路、公路、海洋等各种运输之间,需要大量的人力作为货物中转,效率极低,而且成本很高。集装箱出现之后,世界上绝大多数的货物运输都可以放到这个神奇的箱子里,然后在公路、铁路、海洋等所有运输场景下,这个箱子都可以不用变化形态直接可以承运,而且中间的中转工作,都可以通过大型机械搞定,效率大大提升。牛逼之处我就不多说了,可是这个箱子为什么这么神奇呢?答案其实也就在上面的描述中,无非就是两个字:标准。
        *   Logo说明
            *   那个大鲸鱼(或者是货轮)就是操作系统。把要交付的应用程序看成是各种货物,原本要将各种各样形状、尺寸不同的货物放到大鲸鱼上,你得为每件货物考虑怎么安放(就是应用程序配套的环境),还得考虑货物和货物是否能叠起来(应用程序依赖的环境是否会冲突)。现在使用了集装箱(容器)把每件货物都放到集装箱里,这样大鲸鱼可以用同样地方式安放、堆叠集装了,省事省力。Docker就是这整套机制啦
        *   Docker举例:租房子
            *   租过房子没?单个服务直接部署在物理机上不做虚拟化,就好比你一家人整个大房子住,好不好?当然好,但是贵啊,有钱就这么玩,省心,比如——银行。那我钱没那么多怎么办,混部呗,就好比你和你舅两家合住一个大房子,也能住的挺舒服,不过所有的资源就不像你单独住的时候那么随心所欲,你俩得商量着来,比如:你外甥非要占用向阳的书房(端口/目录占用),你可能也只能让出来。啊~,这样两家人住一起好不舒服,怎办?有钱买房,没钱就隔断呗!隔断这招就是虚拟机(VM)的思路了,虚拟机的这种隔断你可以理解成比较决绝的隔断,墙上自己掏洞开个门开个窗,厨房卫生间我在自己的这个隔断里都单独来一套,基本就是一个完整的家装工程了,你进这个隔断感觉——喔,这就是个完整的房子嘛。   所以虚拟机的好处坏处也你也就明白了:隔离效果好,但是损耗大。那有没有更节约的做法呢,有啊,当过北漂上漂肯定租过单间,做的好一点是中介,比如青年公寓,就是docker,不仅能做资源隔离,人家还规范化系统化了(repo/image),所有房间(container)统一装修和家具,你交钱签约就能享受一个相对独立的生活环境(environment)了,你自己的东西在你屋子里随便摆,都可以的;对中介来说,你当下不过就是个正在running的instance,的当你gameover了以后,这个房间他还可以以很小的代价租给别人run,是不是效率好高了?    
        *   反方向
            *   人们开发了操作系统的进程,后来觉得进程太浪费,又搞了线程,后来又觉得线程还是浪费,就搞了纤程。而容器则是自动化部署的反方向,发布单独程序文件不解气,打包发布,打包发布还不解气,web服务器组件发布,web服务器组件发布还不解气,然后操作系统配置一起发布。
        *   兼容性
            *   Java号称“一次编译,到处运行”,因为java虚拟机解决平台的兼容性问题,所以有java虚拟机的地方就能跑java代码;
            *   Docker是:“一次封装,到处运行”,因为docker决绝了应用环境的问题,安装了docker的平台就能跑“docker包”,这样就决绝了“开发环境能跑,一上线就崩”的尴尬。
    *   Docker?
        *   Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。 
        *   Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。
    *   Docker通常应用的场景
        *   web应用的自动化打包和发布;
        *   自动化测试和持续集成、发布;
        *   在服务型环境中部署和调整数据库或其他的后台应用;
        *   从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
    *   安装ubuntu ( Desktop & Server 版本)
        *   下载网址:[http://cn.ubuntu.com/download/](http://cn.ubuntu.com/download/)# Ubuntu 下载
        *   VM虚拟机启动报错: 无法连接虚拟设备sata0:0,因为主机上没有相应设备
            *   setting设置,选择iso文件,网络:桥接 ,然后重启虚拟机
        *   VM安装ubuntu时,由于分辨率问题 ,导致显示不全,无法移动窗口选择,安装不下去
            *   解决:alt + 鼠标左键 ,可以移动窗口
        *   安装过程中,提示想要安装的软件(如LAMP / openssh-server 等)
            *   关键是设置一个用户名,及密码 // 后面登录系统需要用到
        *   关闭ubuntu的防火墙 # ufw disable
            *   开启防火墙 # ufw enable
        *   Ubuntu下的sysv-rc-conf完美“替代”CentOS下的chkconfig
            *   装了Ubuntu14.04后发现chkconfig用不了,并且也安装不了chkconfig,于是老表便在网上找解决办法,最终发现原来chkconfig是Redhat下的程序,而在Ubuntu下有一个更好的程序可以完美“替代”chkconfig,那就是sysv-rc-conf
                *   apt -y install sysv-rc-conf # apt 跟 apt-get一样的效果,都是安装
                    *   sysv-rc-conf 命令,可以查看所有的进程开启启动状态
                        *   用鼠标点击,也可以用键盘方向键定位,用空格键选择, “X”表示开启该服务。用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出。
                        *   也可以用命令:
                            *   # sysv-rc-conf --level 2345 mysql off
                        *   注意:Ubuntu系统中服务的运行级别:
                            *   0        系统停机状态
                            *   1        单用户或系统维护状态
                            *   2~5      多用户状态
                            *   6        重新启动
    *   ubuntu命令
        *   查看Ubuntu版本
            *   jet@ubuntu:~$ lsb_release -a
                *   No LSB modules are available.
                *   Distributor ID: Ubuntu
                *   Description:    Ubuntu 16.04.3 LTS
                *   Release:        16.04
                *   Codename:       xenial
            *   jet@ubuntu:~$ uname -a
            *   Linux ubuntu 4.4.0-87-generic #110-Ubuntu SMP Tue Jul 18 12:55:35 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
            *   注销
                *   $sudo systemctl  restart  lightdm // 或 $sudo pkill  Xorg
        *   Ubuntu上开启SSH服务
            *   sudo service ssh start // 提示ssh.service not found
                *   更新源列表 // sudo apt-get update
                *   安装openssh-server // 在终端中输入: sudo apt-get install openssh-server
                *   查看查看ssh服务是否启动 // sudo ps -e | grep ssh 提示sshd,说明安装成功
        *   更新root密码
            *   ubuntu的root密码是每次开机随机的,所以我们可以修改root密码
                *   sudo passwd // 输入当前账户的密码(我的账号是jet,所以输入jet的密码) > 然后输入unix密码2次,此密码即为root密码
                *   su root // 登录root账号,输入刚才设置的root密码即可
        *   Ubuntu设置固定IP
            *   打开/etc/network/interfaces文件,内容为(默认使用DHCP分配IP)
                *   auto lo
                *   iface lo inet loopback   
                *   auto ens33
                *   iface ens33 inet dhcp
            *   修改为:
                *   auto lo
                *   iface lo inet loopback   
                *   auto ens33
                *   iface ens33 inet static

                *   address 192.168.1.249  # 想要设置的固定IP
                *   netmask 255.255.255.0
                *   gateway 192.168.1.1
                *   dns-nameservers 192.168.1.1
                    *   # 这里dns可以在电脑的网络中 本地连接/无线连接--详细信息中查看IPv4 DNS服务器
                    *   # 这里的dns配置的优先级比resolv.conf中配置的优先级高,所以,只需要在这里配置即可
            *   # vi /etc/resolvconf/resolv.conf.d/base,写入以下内容: //上面dns-nameservers中配置之后,这步骤可以省略
                *   nameserver 192.168.1.1
                *   nameserver 192.168.1.1
            *   重启系统即可 # reboot
                *   service networking restart 或 ifconfig eth0 up 重启网络/网卡,无效,还是reboot成功!
        *   Ubuntu上软件安装情况,安装,卸载
            *   dpkg -l | grep mysql # 查看是否安装mysql
            *   apt purge mysql* -y # 卸载mysql(不保留配置信息)
            *   apt install -y mysql # 安装mysql
        *   为Ubuntu server 16.04 安装图形界面
            *   1\. sudo apt-get install xinit
            *   2\. sudo apt-get install gdm
            *   3\. sudo apt-get install kubuntu-desktop
            *   4\. reboot

                [图片上传失败...(image-4aae26-1543981840422)]

                [图片上传失败...(image-ffc312-1543981840422)]

        *   ubuntu 命令行 和 图形界面 切换
            *   ctrl + Alt + F1 # 从图形界面切换到命令行
            *   ctrl + alt + F7 # 从命令行切换到图形界面
        *   ubuntu中vim下按上下左右键时输入A、B、C、D
            *   解决方法:
                *   $ sudo apt-get install vim-gtk
        *   vm安装ubuntu后,update报错问题解决

            [图片上传失败...(image-e3a621-1543981840424)]

            *   1\. sudo vi /etc/apt/sources.list
            *   2\. 然后使用#注释掉以 deb cdrom 打头的所有行(行首已有#的不需要再注释)
                *   我的文件中注释的是如下行
                *   # deb cdrom:[Ubuntu-Server 16.04.3 LTS _Xenial Xerus_ - Release amd64 (20170801)]/ xenial main restricted
                *   需要注意,实际情况中后半部分可能不同,但一定是deb cdrom打头 ,把这打头的所有行都注释准没错,但不建议直接删除,避免无法预知的错误出现后无法恢复
            *   使用脚本自动安装docker (执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中)
                *   $ curl -fsSL [get.docker.com](http://get.docker.com/)-o [get-docker.sh](http://get-docker.sh/)
                    *   国内镜像加速
                        *   Docker使用阿里云docker镜像加速
                            *   进入阿里云docker库首页 [https://dev.aliyun.com](https://dev.aliyun.com/)(我的阿里云账号为:happyjetderek ( qq********) ),进入“管理中心”-“镜像加速器”-Ubuntu-按照上面的提示步骤设置即可
                                *   sudo mkdir -p /etc/docker //我的默认已经存在此目录
                                *   sudo tee /etc/docker/daemon.json <<-'EOF'
                                *   { "registry-mirrors": ["[https://60017a5a.mirror.aliyuncs.com](https://60017a5a.mirror.aliyuncs.com/)"] }
                                *   EOF
                                *   sudo systemctl daemon-reload
                                *   sudo systemctl restart docker
                        *   root@ubuntu:/etc/docker# docker pull centos //亲自试验,发现设置了阿里云镜像加速后,下载速度快了N多
            *   $ sudo sh [get-docker.sh](http://get-docker.sh/) --mirror Aliyun
                *   启动 Docker CE
                    *   $ sudo systemctl enable docker
                    *   $ sudo systemctl start docker
                *   建立 docker 用户组
                    *   docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
                        *   建立 docker 组: $ sudo groupadd docker
                        *   将当前用户加入 docker 组:$ sudo usermod -aG docker jet //我登录系统的用户名是jet
                        *   退出当前终端并重新登录
                *   测试 Docker 是否安装正确
                    *   $sudo docker run hello-world
            *   Docker常用命令
                *   启动Docker
                    *   sudo service docker start
                *   查看docker信息(version、info)
                    *   docker version # 查看版本
                    *   docker info # 显示docker系统的信息
                *   对image的操作(search、pull、images、rmi、history)
                    *   搜索镜像
                        *   sudo docker search mysql
                    *   从Docker Hub上下载最新版本的ubuntu
                        *   sudo docker pull centos
                            *   Docker官方网站专门有一个页面来存储所有可用的镜像,网址是:[https://hub.docker.com/](https://hub.docker.com/)。你可以通过浏览这个网页来查找你想要使用的镜像,或者使用命令行的工具来检索。
                    *   查看本地主机上已有的镜像,及添加一个新的ubuntu:latest镜像标签
                        *   docker images # 查询出所有images ID
                        *   sudo docker images
                        *   docker tag 4129 centos_tree:1.0.1 # 其中,4129为要修改的image ID,centos_tree:1.0.1 为新镜像名:版本
                    *   使用下载的镜像创建一个容器,在其中运行echo
                        *   jet@ubuntu:~$ sudo docker run -t -i centos echo "Hello"
                    *   查看镜像的详细信息
                        *   sudo docker inspect 8e5b // 一般镜像ID的3-4个即可
                    *   删除镜像
                        *   通过镜像name / ID删除 # sudo docker rmi ff42
                            *   jet@ubuntu:~$ sudo docker rmi -f f2a9 # 参数-f 是强制删除 # f2a9为镜像ID
                            *   docker rmi -f imageName:imageVersion
                    *   显示一个镜像的历史
                        *   jet@ubuntu:~$ sudo docker history centos # 显示镜像centos的历史
                *   启动容器(run)
                    *   docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。
                        *   $docker run centos echo "hello word" # 在容器centos中运行"echo"命令,输出"hello word"
                        *   $docker run -ti centos /bin/bash # 交互式进入容器中
                            *   [root@3e6a483e2a27 /]# yum -y install tree # 容器中安装tree命令
                            *   exit 退出容器
                        *   $docker run centos apt-get install -y mysql # 在centos中安装新的程序mysql # 容器修改后,需要commit保存对容器的修改,否则下次启动时还是没有安装!!
                            *   Note:  在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。
                *   查看容器(ps)
                    *   $docker ps # 列出当前所有正在运行的container
                    *   $docker ps -a # 列出所有的container
                    *   $docker ps -l # 列出最近一次启动的container
            

你可能感兴趣的:(Docker (Full-1))