zoukankan      html  css  js  c++  java
  • Docker从安装部署到Hello World

    Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

    v认识Docker

    Docker自2013年以来非常火热,无论是从 github上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。

    1.0 Docker 架构

    Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。

    Docker从安装部署到Hello World

    图片来源于网络,侵删。

    Docker 镜像(Images)

    Docker 镜像是用于创建 Docker 容器的模板。

    Docker 容器(Container)

    容器是独立运行的一个或一组应用。

    Docker 客户端(Client)

    Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。

    Docker 主机(Host)

    一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

    Docker 仓库(Registry)

    Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

    Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

    Docker Machine

    Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

    1.1 Docker 特性

    由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。

    • 构建标准化的运行环境,现有的方案大多是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write 的文件格式在运行时rootfs是read only的)。并且后者文件体积大,环境管理和版本控制本身也是一个问题。
    • PaaS环境是不言而喻的,其设计之初和dotcloud的案例都是将其作为PaaS产品的环境基础
    • 因为其标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来
    • 因为LXC轻量级的特点,其启动快,而且docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源

    1.2 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、数据库和后台服务)

    1.3 Docker到底是什么?

    来举个简单的例子。docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端署上自己的名字(最后一个标准化组件是用户的app)。这也就是基于docker的PaaS产品的原型。

    v安装Docker

    2.0 版本检测

    正如上文所说,Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。

    通过 uname -r 命令查看你当前的内核版本

    Docker从安装部署到Hello World

    2.1 安装docker

    Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令: yum -y install docker

    Docker从安装部署到Hello World

    2.2 启动docker服务

    通过 service docker start systemctl start docker 均无法启动docker。错误信息: Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details. 。如下图:

    Docker从安装部署到Hello World

    于是在网上找各种类似错误,试过关闭防火墙,关闭selinux,重装系统,等等网上能查到的方法都解决不了。

    在docker里禁用selinux( vim /etc/sysconfig/docker ), –selinux-enabled=false ,重启启动服务解决问题。

    Docker从安装部署到Hello World

    更新后的完整配置: OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'

    Docker从安装部署到Hello World

    2.3 测试运行 hello-world

    docker run hello-world

    但是在运行:docker run hello-world的时候报错:

    container_linux.go:235: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused "Cannot set property TasksAccounting, or unknown property.""
    /usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused "Cannot set property TasksAccounting, or unknown property."".

    解决:主要原因还是centos系统版本兼容性问题,如果将系统做更新升级,即可解决。

    yum update

    Docker从安装部署到Hello World

    此时重新运行 docker run hello-world ,结果如下:

    Docker从安装部署到Hello World

    2.4 修改镜像源

    docker默认的源为国外官方源,下载速度较慢,可改为国内。

    # vi /etc/docker/daemon.json
    {
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    service docker restart

    国内的阿里和网易等都可以,或者直接使用官方->国内的。

    2.5 设置docker开机自动启动

    systemctl enable docker

    Docker从安装部署到Hello World

    docker已经成功启动,至此,docker已经安装完毕。

    v探索Hello World

    3.0 docker hello world

    可以使用docker run 命令来在容器内运行一个应用程序,比如输出Hello World。

    docker run centos /bin/echo "Hello World"

    Docker从安装部署到Hello World

    参数解析:

    • docker : Docker 的二进制执行文件。
    • run :与前面的 docker 组合来运行一个容器。
    • centos :指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
    • /bin/echo "Hello world" : 在启动的容器里执行的命令

    以上命令完整的意思可以解释为:Docker 以 centos 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world" ,然后输出结果。

    3.1 运行交互式的容器

    我们通过docker的两个参数 -i -t,让docker运行的容器实现"对话"的能力 docker run -i -t centos /bin/bash

    参数解析:

    • -t :在新容器内指定一个伪终端或终端。
    • -i :允许你对容器内的标准输入 (STDIN) 进行交互。

    此时我们已进入一个centos系统的容器.我们尝试在容器中运行命令 cat /proc/version ls 分别查看当前系统的版本信息和当前目录下的文件列表

    Docker从安装部署到Hello World

    我们可以通过运行exit命令或者使用CTRL+D来退出容器。

    3.2 启动容器(后台模式)

    使用 docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done" 命令创建一个以进程方式运行的容器

    Docker从安装部署到Hello World

    a2274d84c6e8025623a17d1262f1a65dfaa9ce982de94d2301f4c0fff049ed7e 这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。

    我们需要确认容器有在运行,可以通过 docker ps 来查看

    Docker从安装部署到Hello World

    CONTAINER ID :容器ID; NAMES :自动分配的容器名称

    在容器内使用docker logs命令,查看容器内的标准输出 docker logs a2274d84c6e8

    Docker从安装部署到Hello World

    3.3 停止容器

    我们使用 docker stop 命令来停止容器

    Docker从安装部署到Hello World

    至此,docker hello world就完毕了。


    作  者:请叫我头头哥
    出  处:http://www.cnblogs.com/toutou/
    关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
    版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
    特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!

  • 相关阅读:
    作业5:扒开系统调用的三层皮(下) 20135115臧文君
    课本学习笔记2:第五章 20135115臧文君
    Linux及安全实践二
    Linux内核分析 期中总结
    Linux内核分析08
    Linux内核分析07
    Linux内核分析06
    Linux内核分析 05
    Linux内核分析04
    Linux内核分析 03
  • 原文地址:https://www.cnblogs.com/toutou/p/install_docker.html
Copyright © 2011-2022 走看看