请叫我头头哥

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

posted @ 2019-06-01 22:27  请叫我头头哥  阅读(7197)  评论(0编辑  收藏  举报
//Setting ico for cnblogs