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

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 + GNU(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,不稳定;
    • 可以尝试用:bnied/kernel-ml-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加上一个setuid权限[^在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 就是给某个程序的所有者以setuid权限,可以像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 ID #容器ID
  • IMAGE #采用哪个镜像
  • COMMAND #当前运行的命令
  • CREATED #起跑日期
  • STATUS #状态
  • PORTS #端口
  • NAMES #名字(自己起全局唯一)
command的设计场景
  • 我跑一个脚本一样的命令
docker run centos uname -a
  • 我跑一个虚拟机一样的命令
docker run centos tail -f /etc/hosts
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 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映射目录

- 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优秀的资源隔离特性。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,514评论 15 147
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,481评论 0 120
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,382评论 0 27
  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,728评论 1 21
  • 僅此一次的生命可別浪費了,一路追趕著清風,離開這條熟悉的街道,奔跑起來吧。這段歌詞浸入心脾,說的好像就是自己,寶貴...
    范韜阅读 332评论 0 0