文档章节

Docker实战笔记:Docker简介(一)

蛮大人
 蛮大人
发布于 2016/11/14 16:25
字数 2671
阅读 162
收藏 12
点赞 0
评论 0

Docker实战笔记

[TOC]

提纲

此Docker系列学习笔记,根据Reboot教育的运维自动化部分课程整理而成,补充少量个人理解以及练习日志(部分日志有删减)。

  • Docker简介(一)
  • Docker简介(二)
  • Docker管理系统(一)
  • Docker管理系统(二)
  • Docker管理系统(三)
  • Docker原理-namespace和文件系统
  • Docker原理-徒手创建一个docker容器
  • Docker、etcd构建服务自发现体系
  • Docker生态系统:k8s、etcd等
  • etcd分布式一致性算法paxos、raft

Docker简介(一)

百度百科:Docker

为什么要使用Docker

变复杂的安装配置为一条命令解决:秒级启动镜像,资源消耗极少;

Containers vs VMs

  • VMs = Server + Host OS + Hypervisor(Type2)+ Guest OS + Bins/Libs +(App A | App A' | App B)
  • Containers = Server + Host OS + Docker Engine + ((Bins/Libs +App A | App A') | (Bins/Libs +App B))
  • 结论:Docker去除了传统虚机的Guest OS层,免除了对应overhead
  • Docker Engine 替代了VM中的Guest OS + Hypervisor(Type2)层

Docker使得部署密度前所未有的高:

  • 32核/64G内存,
  • 开4*4虚机(4核,4G内存),开8~16个虚机极限了;
  • BAE:200个容器,系统资源还是很闲;

每个Docker进程可以忽略其存在,他的厚度和Hypervisor差不多,相当于一个转换器,在这个角度,Docker和Wine有点儿像。

Docker vs WINE

  • WINE:wine is not emulator
  • 在Linux下运行Windows程序的黑科技:Office、魔兽争霸、暗黑
  • 做一个二进制的翻译,把Windows的调用劫持,转换为Linux调用
  • Docker的位置和WINE很像,但都是Linux,所以不用做太多的转换

Docker和Linux

  • Linux = kernel + Gun(Glibc + ls等命令)
  • Docker = kernel + libc + 应用
  • 命令比如,yum (伪装成CentOS)、apt(伪装成 Ubuntu)

Docker这么设计,效率非常高基本上就是占了点儿磁盘,消耗基本上就是资源隔离

Docker、Vagrant、VMs

ThinkPad R400,双核,4G内存,Win10 OS;

启动一个虚拟机跑一个Redmine系统来配合开发验证,基本上卡得就动不了了;启动停止也慢;操作起来像慢镜头;

启动4-8个CentOS 6.6Vagrant服务,基本上不影响系统操作。只有启动停止耗时较长;

Docker,基本上无感:不影响系统,启动停止都是秒级的;

基本概念

三个基本组件:镜像、容器、仓库;

镜像

  • Docker镜像(Image)就是一个只读的模版。镜像可以用来创建Docker容器

容器

  • Docker利用容器(container)来运行应用
  • 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
  • 可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
  • 镜像是只读的,容器在启动的时候创建一层可写层作为最上层

仓库

  • 仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库又包含了多个镜像,每个镜像有不同的标签(tag)
  • 仓库分为公开仓库(Public)和私有仓库(Private)两种形式

快速安装

Linux下安装

  • Docker目前只能安装在64位平台上
  • 内核版本不低于3.10,实际上内核越新越好,过低的内核版本容易造成功能的不稳定
  • 尽量采用最新版的内核、docker-engine
  • 拒绝在CentOS6上运行Docker(太坑了),CentOS 不支持AUFS,不稳定;
    • CentOS上 = Docker + devicemapper(需要root)
    • Ubuntu上 = Docker + AUFS
  • sudo curl -sSL https://get.docker.com/ | sh
  • sudo chkconfig docker on(先启动dockerd服务,然后再运行Docker命令)
  • dockerd这个服务千万不要重启:重启所有容器都挂,那就是运行事故了

Mac & Windows平台安装

多用来学习Docker。我的安装日志:Docker的第一次亲密接触

Mac安装:Get started with Docker for Mac

Windows安装:Get started with Docker for Windows

基本操作

docker ps

默认列出当前运行的所有容器

加上-a 参数列出所有运行、运行过的容器(没有删除的)

[AnInputForce@teach ~]$ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                                               NAMES
48f6c0b28e09        jenkins                        "/bin/tini -- /usr/lo"   41 hours ago        Up 36 hours         0.0.0.0:50000->50000/tcp, 0.0.0.0:8081->8080/tcp                    myjenkins
acfdad773539        gitlab/gitlab-ce:latest        "/assets/wrapper"        42 hours ago        Up 42 hours         0.0.0.0:2022->22/tcp, 0.0.0.0:2080->80/tcp, 0.0.0.0:2443->443/tcp   gitlab
  • 为什么我这里没用root也能跑:
    • 我们把用户加入docker这个组,默认就有docker这个权限了
[AnInputForce@teach ~]$ cat /etc/group | grep docker
docker:x:1001:work,AnInputForce
  • 避免线上用root权限,也可以给docker加上一个SUID权限[^在linux中"chmod u+s "这个命令是做什么的?]
    • 示例账号没有root权限,所以赋权不成功
[AnInputForce@teach ~]$ which docker
/usr/bin/docker
[AnInputForce@teach ~]$ ll /usr/bin/docker
-rwxr-xr-x 1 root root 13914088 10月 12 01:36 /usr/bin/docker
[AnInputForce@teach ~]$ chomod u+s /usr/bin/docker
chmod: 更改"/usr/bin/docker" 的权限: 不允许的操作

[^在linux中"chmod u+s "这个命令是做什么的?]: “为了方便普通用户执行一些特权命令,SUID/SGID程序允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份。” chmod u+s 就是给某个程序的所有者以suid权限,可以像root用户一样操作。

docker ps结果字段注释

[AnInputForce@teach ~]$ docker run centos uname -a
Linux 60364ce6d60c 4.8.5-1.el7.centos.x86_64 #1 SMP Fri Oct 28 09:27:15 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
[AnInputForce@teach ~]$ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                                               NAMES
48f6c0b28e09        jenkins                        "/bin/tini -- /usr/lo"   42 hours ago        Up 36 hours         0.0.0.0:50000->50000/tcp, 0.0.0.0:8081->8080/tcp                    myjenkins
acfdad773539        gitlab/gitlab-ce:latest        "/assets/wrapper"        42 hours ago        
[AnInputForce@teach ~]$ docker ps -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                      PORTS                                                               NAMES
60364ce6d60c        centos                         "uname -a"               53 seconds ago      Exited (0) 52 seconds ago                                                                       adoring_mcclintock
f53886776491        ubuntu                         "/bin/bash"              14 hours ago        Exited (0) 14 hours ago                                                                         admiring_chandrasekhar
48f6c0b28e09        jenkins                        "/bin/tini -- /usr/lo"   42 hours ago        Up 36 hours                 0.0.0.0:50000->50000/tcp, 0.0.0.0:8081->8080/tcp                    myjenkins
acfdad773539        gitlab/gitlab-ce:latest        "/assets/wrapper"        42 hours ago        Up 42 hours                 0.0.0.0:2022->22/tcp, 0.0.0.0:2080->80/tcp, 0.0.0.0:2443->443/tcp   gitlab

[AnInputForce@teach ~]$ 
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
容器ID采用哪个镜像当前运行的命令起跑日期状态端口名字(自己起全局唯一)

command的设计场景

  • 我跑一个脚本一样的命令
docker run centos uname -a
  • 我跑一个虚拟机一样的命令
dokcer run centos tail -f /etc/hosts

docker port

查看容器已经做了端口映射的端口被映射到了哪个端口上。docker ps 也可以看到。这个命令或许为了方便二次开发;

比如我本机启动了个叫webserver的nginx容器,映射了本机80端口到容器的80端口:

ChinaDreams:etc kangcunhua$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
70d241e335b5        nginx               "nginx -g 'daemon off"   6 days ago          Up 4 days           0.0.0.0:80->80/tcp, 443/tcp   webserver
ChinaDreams:etc kangcunhua$ docker port webserver 80
0.0.0.0:80

Docker 默认访问外边是可以的,做了NAT。

[AnInputForce@teach ~]$ docker run centos ping -c 3 g.cn
PING g.cn (203.208.51.84) 56(84) bytes of data.
64 bytes from 203.208.51.84: icmp_seq=1 ttl=53 time=4.19 ms
64 bytes from 203.208.51.84: icmp_seq=2 ttl=53 time=4.24 ms
64 bytes from 203.208.51.84: icmp_seq=3 ttl=53 time=4.19 ms

--- g.cn ping statistics ---
3 packets transmitted, 3 received, 0% packet loss,

外边访问里边需要配置端口映射,后续讲(比较坑)

docker pull

以下三条命令一个作用:从官方dockerhub下载Ubuntu镜像

  • docker pull ubuntu
  • docker pull ubutu:12:04
  • docker pull registry.hub.docker.com/ubuntu:12.04

docker images

  • docker images

  • docker rmi:删镜像(比较危险,删之前关闭镜像启动的所有容器)

  • [AnInputForce@teach ~]$ docker images
    REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
    centos                    7                   0584b3d2cf6d        11 days ago         196.5 MB
    centos                    latest              0584b3d2cf6d        11 days ago         196.5 MB
    ubuntu                    latest              f753707788c5        4 weeks ago         127.2 MB
    ubuntu                    14.04               1e0c3dd64ccd        4 weeks ago         187.9 MB
    

docker run

  • 启动一个交互式的命令行容器

    • [AnInputForce@teach ~]$ docker run -it centos /bin/bash
      
    • i:交互,t:tty

  • 建议如下:

    • docker run —name="centos" -itd centos tail -f /etc/hosts
    • docker exec -it centos /bin/bash
    • -p 映射端口
    • -v映射目录

docker stop/rm

  • docker stop centos
  • docker rm centos
  • docker rm -f centos

docker rm命令演示

启动一个交互式容器

[AnInputForce@teach ~]$ docker run -it centos /bin/bash
[root@69719220cdb6 /]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.3  0.0  11784  2912 ?        Ss   04:48   0:00 /bin/bash
root        15  0.0  0.0  47432  3212 ?        R+   04:49   0:00 ps aux

退出容器后查看进程,删除容器

[AnInputForce@teach ~]$ docker ps -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                          PORTS                                                               NAMES
69719220cdb6        centos                         "/bin/bash"              10 minutes ago      Exited (0) About a minute ago                                                                       serene_murdock
97aff7c4e9a7        centos                         "ping -c 3 g.cn"         36 minutes ago      Exited (0) 36 minutes ago                                                                           berserk_fermat
2437fdcc6023        centos                         "uname -a"               43 minutes ago      Exited (0) 43 minutes ago                                                                           lonely_wright
[AnInputForce@teach ~]$ 
[AnInputForce@teach ~]$ docker rm 69719220cdb6
69719220cdb6
[AnInputForce@teach ~]$ docker ps -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                         PORTS                                                               NAMES
97aff7c4e9a7        centos                         "ping -c 3 g.cn"         43 minutes ago      Exited (0) 43 minutes ago                                                                          berserk_fermat
2437fdcc6023        centos                         "uname -a"               50 minutes ago      Exited (0) 50 minutes ago                                                                          lonely_wright
[AnInputForce@teach ~]$ docker rm 69719220cdb6
Error response from daemon: No such container: 69719220cdb6

docker exec 进入容器

  • docker run —name="centos_kch" -itd centos tail -f /etc/hosts

  • docker exec -it centos_kch /bin/bash #进入交互式bash

  • Run 命令可以启动一个容器(如果没有则启动,然后运行命令),exec的目标必须是一个启动的容器

  • [AnInputForce@teach ~]$ docker run --name="centos_kch" -itd centos tail -f /etc/hosts
    6b6a260a95754e2c2b4942506bd53d3aecacc26568b6242613b39648afa16876
    [AnInputForce@teach ~]$ docker exec -it centos_kch /bin/bash
    [root@6b6a260a9575 /]# ps aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0   4364   784 ?        Ss+  05:43   0:00 tail -f /etc/hosts
    root         7  0.0  0.0  11760  2924 ?        Ss   05:43   0:00 /bin/bash
    root        21  0.0  0.0  47432  3216 ?        R+   05:45   0:00 ps aux
    [root@6b6a260a9575 /]# 
    

好玩的

ps aux | grep tail :我们是可以在宿主机上看到Docker容器中的进程的

但是,我们在宿主机中杀不掉,因为docker的资源隔离做得好

[AnInputForce@teach ~]$ ps aux | grep tail
root      2773  0.0  0.0  18036   220 ?        S    11月12   0:00 /bin/bash /opt/gitlab/bin/gitlab-ctl tail
root      9369  0.0  0.0   4364   784 pts/14   Ss+  13:43   0:00 tail -f /etc/hosts
AnInput+  9486  0.0  0.0 112672  2228 pts/11   R+   13:43   0:00 grep --color=auto tail
[AnInputForce@teach ~]$ sudo killall tail #当然此用户没有sudo权限

结论:

如果有root还干不掉的进程,一个场景就是宿主机上运行的Docker容器里的进程:虽然可以看到,但是杀不掉。因为Docker优秀的资源隔离特性;

© 著作权归作者所有

共有 人打赏支持
蛮大人

蛮大人

粉丝 33
博文 24
码字总数 47360
作品 0
渝北
运维
Docker实战 LoRaServerProject

我正在学习Docker容器技术,相关笔记汇总在Docker容器技术 学习笔记汇总 这篇文章将以我目前正在研究的 lora-server 项目为例,研究下 Docker 在具体项目的实战应用,感受下 Docker 的魅力。...

iotisan
2017/10/31
0
0
Docker容器技术 学习笔记汇总

“如果你不出去走走,你就会以为这就是全世界。” 一直在嵌入式领域,这次遇到Docker算是长了见识。刚好公司同事们对这块了解地不多,那就把Docker容器技术的学习梳理成系列笔记,让其他伙伴少...

iotisan
2017/10/20
0
0
Docker实战笔记:Docker简介(二)

Docker实战笔记 [TOC] 提纲 此Docker系列学习笔记,根据Reboot教育的运维自动化部分课程整理而成,补充少量个人理解以及练习日志(部分日志有删减)。 + Docker简介(一)+ Docker简介(二)...

蛮大人
2016/11/17
734
3
基于 Docker 开发的 PaaS 平台--DINP

DINP是又一个基于Docker开发的PaaS平台。 DINP 包含如下组件: dinp-server master组件,控制集群中所有计算节点 dinp-agent Agent,部署在所有计算节点,收集各个节点运行状态和container列...

UlricQin
2015/02/09
17.1K
13
Docker入门简介

一、docker简介 官网:https://www.docker.com/products/overview Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过...

孟飞阳
2016/06/24
29
0
阿里巴巴微服务架构到底有多牛逼?

微服务架构专题 围绕微服务的通用模式,讲解Spring Cloud的常见用法及原理。让微服务的开发更加方便、快捷,让微服务应用更加稳定、可用。 理论结合实战,透彻理解分布式架构及其解决方案。 ...

Java高级架构
2017/12/21
0
0
史上最简单的SpringCloud教程 | 第十一篇: docker部署spring cloud项目

转载请标明出处: http://blog.csdn.net/forezp/article/details/70198649 本文出自方志朋的博客 一、docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、...

forezp
2017/04/16
0
0
Docker学习笔记一 简介

写在前面 工作原因需要接触很火的Docker,所以开始这个系列的笔记。初步制定的学习教材是《第一本Docker书》,辅以一些网上材料,所以笔记先以此书为主要内容。 1.0 容器的简介 容器与管理程...

一万
2016/07/07
47
0
DeepLearning笔记:Docker 入门和用 Python 实现词频统计

一、神经网络简介 神经网络简史: 40年代:概念雏形(没有学习算法) 50年代:可用的学习算法 - 感知机 1969年:Minsky 泼冷水 70年代:BP 算法,训练多层神经网络 90年代:SVM 支持向量机「...

Kidult
2017/12/27
0
0
cyzhang/docker-training

cSphere Docker 实训课程 课程安排 第一讲 Docker 实战之入门以及 Dockerfile 第二讲 Docker 实战之 Registry 以及持续集成 第三讲 Docker 实战之监控管理以及日志管理 第四讲 Docker 实战之...

cyzhang
2016/01/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
9分钟前
1
0
python上传文件

//注意 <form action="/login/" method="post" enctype="multipart/form-data"> f=request.FILES.get('fafa') ff=open(f.name,mode='wb') for i in f.chunks(): ff.write(i) ff.close()......

南桥北木
21分钟前
0
0
CISCO VPN Client Reason 442 WIN8/10错误解决方案

http://jdkleo.iteye.com/blog/2163493 引用 http://my.oschina.net/cloudcoder/blog/220391?p={{currentPage 1}} 在使用cisco VPN 客户端登录时,产生Reason 442:Failedto enable Virtual......

chenfj_fer
25分钟前
0
0
信号量有没有容量限制?

之前一直误以为信号量初始化的时候那个初始化的值是信号量的“容量”,昨天同事指出了我的错误,最初我是不相信的,经过以下代码实践,证明了我的错误: Java版: import java.util.concurr...

锟斤拷烫烫烫
29分钟前
0
0
【RocketMQ】Message存储笔记

概述 消息中间件存储分为三种,一是保存在内存中,速度快但会因为系统宕机等因素造成消息丢失;二是保存在内存中,同时定时将消息写入DB中,好处是持久化消息,如何读写DB是MQ的瓶颈;三是内...

SaintTinyBoy
40分钟前
0
0
Android应用Context详解及源码解析

Android应用Context详解及源码解析 本文定位:优质文章收集 本文转载 1 背景 今天突然想起之前在上家公司(做TV与BOX盒子)时有好几个人问过我关于Android的Context到底是啥的问题,所以就马...

lichuangnk
今天
0
0
PostgreSQL的昨天今天和明天

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS), 也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。 这个起源于伯克利(...

闻术苑
今天
1
0
Mysql对自增主键ID进行重新排序

1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段: ALTER TABLE `table_name` ADD `id` MEDIUMINT( 8 ) NOT NULL FIRST; 3,设置新主键: ALTER TABLE `table_nam......

niithub
今天
0
0
福利篇:免费csdn vip账号分享

分享一个发布免费csdn vip账号的网站:啰嗦vip www.lostvip.com , 各种软件开发类的视频教程:慕课网、动脑学院、黑马各大培训机构VIP视频教程,非常不错!

在水一方发盐人
今天
1
0
Nginx+Tomcat搭建高性能负载均衡集群

一、 工具   nginx-1.8.0   apache-tomcat-6.0.33 二、 目标   实现高性能负载均衡的Tomcat集群:    三、 步骤   1、首先下载Nginx,要下载稳定版:      2、然后解压两个Tom...

码代码的小司机
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部