Docker 基础介绍及配置安装 [一]php
Docker
时间:2016年11月2日
前端
Docker是Docker.lnc
公司开源的一个基于LXC技术
之上构建的Container容器引擎
,源代码托管在Github
上,基于Go语言并听从Apache2.0
协议开源
Docker是经过内核
虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。因为Docker经过操做系统层的虚拟化实现隔离,因此Docker容器在运行时,不须要相似虚拟机(VM)额外的操做系统开销,提升资源利用率java
构建 运输 运行node
Docker的组成部分docker相似于cs结构
Docker Client
Docker Server
咱们能够将docker启动
比喻成Docker server
,咱们执行命令的时候至关于Docker client
提示:目前的版本是若是docker的服务端
挂了,运行在docker上的全部容器
都会挂掉linux
镜像(Image)
容器(Container)
仓库(Repository)
镜像介绍:相似于虚拟机,做用和虚拟机是同样的,惟独是组成部分会有些区别。简单的说若是咱们想启动一个容器就必需要有镜像nginx
容器介绍: docker是经过容器来运行业务的,就像运行一个kvm虚拟机是同样的。容器其实就是从镜像建立的一个实例。
咱们能够对容器进行增删改查,容器之间也是相互隔离的。和虚拟机最大的区别就是一个是虚拟的一个是隔离的。 缺点:
不会像虚拟机那样隔离的那么完全,咱们能够将容器理解为简化版的linux,有进程运行在里面。git
仓库介绍: 根据docker的三大理念构建 运输 运行,咱们就须要一个仓库来存放镜像
简单的说:咱们将镜像建立完成就须要存放到仓库里面,进行集中式的管理。仓库这点相似于github,docker也有一个dockerhub,他也是一个公共对外的仓库。github
简单解释,VMware运行在操做系统上,而docker是直接运行在应用上。因此docker没法提供一个像VMware那样彻底的隔离,甚至到不少地方都没有进行隔离,好比说用户空间。
这里能够解释一下 若是你用的是centos5版本那你就别想安装docker了,若是是centos6的你能够看一眼。由于内核版本比较低,可是若是使用乌班图就能够,由于乌班图的内核更新的比较快。
若是公司服务器是centos5和centos6 用docker就须要升级内核,相对比较麻烦.web
类别 | Docker | openstack/KVM |
---|---|---|
部署男刀 | 很是简单 | 组件多,部署复杂 |
启动速度 | 秒级 | 分钟级 |
执行性能 | 和物理系统几乎一致 | VM会占用一些资源 |
镜像体积 | 镜像是MB级别 | 虚拟机镜像GB级别 |
管理效率 | 管理简单 | 组件相互依赖,管理复杂 |
隔离性 | 隔离性高 | 完全隔离 |
可管理性 | 单进程、不建议启动SSH | 完整的系统管理 |
网络链接 | 比较弱 | 借助Neutron能够灵活组件各种网络架构 |
提示:在这里能够简单的说一下,有些场景是不适合用到docker。例如我前端web使用docker,此时docker挂掉了,里面不会像数据库那样有数据写入。这时候我重新起一个docker就能够了。因此有的场景是不适合使用docker的docker
1、简化配置
这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各类配置不同的平 台(软件、系统),Docker在下降额外开销的状况下提供了一样的功能。它能让你将运行环境和配置放在代码中而后部署,同一个Docker的配置能够在 不一样的环境中使用,这样就下降了硬件要求和应用环境之间耦合度。
2、代码流水线(Code Pipeline
)管理
前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,须要通过不少的中间环境。而每个中间环境都有本身微小的差异,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单很多。
3、提升开发效率
这就带来了一些额外的好处:Docker能提高开发者的开发效率。若是你想看一个详细一点的例子,能够参考Aater在DevOpsDays Austin 2014 大会
或者是DockerCon
上的演讲。
不一样的开发环境中,咱们都想把两件事作好。一是咱们想让开发环境尽可能贴近生产环境,二是咱们想快速搭建开发环境。
理想状态中,要达到第一个目标,咱们须要将每个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,咱们却不想每次都须要网络连 接,每次从新编译的时候远程链接上去特别麻烦。这就是Docker作的特别好的地方,开发环境的机器一般内存比较小,以前使用虚拟的时候,咱们常常须要为 开发环境的机器加内存,而如今Docker能够轻易的让几十个服务在Docker中跑起来。
4、隔离应用
有不少种缘由会让你选择在一个机器上运行不一样的应用,好比以前提到的提升开发效率的场景等
5、整合服务器
正如经过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker能够整合多个服务器以下降成本。因为没有多个操做系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker能够比虚拟机提供更好的服务器整合解决方案
6、调试能力
Docker提供了不少的工具,这些工具不必定只是针对容器,可是却适用于容器。它们提供了不少的功能,包括能够为容器设置检查点、设置版本和查看两个容器之间的差异,这些特性能够帮助调试Bug。你能够在《Docker拯救世界》
的文章中找到这一点的例证。
7、多租户环境
另一个Docker有意思的使用场景是在多租户的应用中,它能够避免关键应用的重写。咱们一个特别的关于这个场景的 例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码很是复杂,很难处理,从新规划这样一个应用不但消耗时间, 也浪费金钱。
使用Docker,能够为每个租户的应用层的多个实例建立隔离的环境,这不只简单并且成本低廉,固然这一切得益于Docker环境的启动速度和其高效的diff命令。
8、快速部署
在虚拟机以前,引入新的硬件资源须要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟,Docker只是建立一个容器进程而无需启动操做系统,这个过程只须要秒级的时间。这正是Google和Facebook都看重的特性。
你能够在数据中心建立销毁资源而无需担忧从新启动带来的开销。一般数据中心的资源利用率只有30%,经过使用Docker并进行有效的资源分配能够提升资源的利用率。
小结: 一句话说明docker
的本质就是 低开销(系统文件、内存 共用)的虚拟机
面向产品:产品交付
面向开发:简化环境配置
面向测试:多版本测试
面向运维:环境一致
面向架构:自动化扩容(微服务)
[root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@linux-node1 ~]# uname -r3.10.0-327.36.2.el7.x86_64
[root@linux-node1 ~]# yum install dockerLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile * base: mirrors.aliyun.com * epel: mirrors.tuna.tsinghua.edu.cn * extras: mirrors.aliyun.com * updates: mirrors.aliyun.comPackage docker-1.10.3-46.el7.centos.14.x86_64 already installed and latest versionNothing to do
Centos7默认安装docker1.10
,咱们能够经过官方的yum源安装docker1.12
Docker官网:http://www.docker.com/
最新版本咱们能够去官方网站进行下载。
舒适提示:使用docker最好使用最新版,由于功能比较完善。
[root@linux-node1 ~]# systemctl start docker启动以后咱们能够查看一下docker的状态[root@linux-node1 ~]# systemctl status docker● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2016-10-19 02:32:37 CST; 3h 54min ago Docs: http://docs.docker.com Main PID: 31807 (docker-current) CGroup: /system.slice/docker.service └─31807 /usr/bin/docker-current daemon --exec-opt native.cgroupdriver=systemd --selinux-enabled --log-driver=journaldOct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.832703497+08:00" level=info msg="Graph migration to content-addressability took 0.00 seconds"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.840719984+08:00" level=warning msg="Running modprobe bridge br_netfilter failed with message: m...Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.854022259+08:00" level=info msg="Firewalld running: false"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.908314481+08:00" level=info msg="Default bridge (docker0) is assigned with an IP addr...P address"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967870654+08:00" level=info msg="Loading containers: start."Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967930460+08:00" level=info msg="Loading containers: done."Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967937814+08:00" level=info msg="Daemon has completed initialization"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967961305+08:00" level=info msg="Docker daemon" commit=cb079f6-unsupported execdriver...ion=1.10.3Oct 19 02:32:37 linux-node1.abcdocker.com systemd[1]: Started Docker Application Container Engine.Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.972026130+08:00" level=info msg="API listen on /var/run/docker.sock"Hint: Some lines were ellipsized, use -l to show in full.
咱们可使用ifconfig查看网卡
[root@linux-node1 ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 ether 02:42:c5:44:7d:3b txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.56.11 netmask 255.255.255.0 broadcast 192.168.56.255 inet6 fe80::20c:29ff:fef4:affe prefixlen 64 scopeid 0x20<link> ether 00:0c:29:f4:af:fe txqueuelen 1000 (Ethernet) RX packets 167717 bytes 175534600 (167.4 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 69646 bytes 12187530 (11.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 2322 bytes 247665 (241.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2322 bytes 247665 (241.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
提示: 咱们启动docker的时候,docker会帮咱们建立一个docker 0的网桥
查看当前镜像 docker p_w_picpaths
[root@linux-node1 ~]# docker p_w_picpathsREPOSITORY TAG IMAGE ID CREATED SIZE
搜索镜像 docker search [镜像名字]
执行docker search centos 会从dockerhub上搜索镜像
[root@linux-node1 ~]# docker search centosINDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATEDdocker.io docker.io/centos The official build of CentOS. 2757 [OK] docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 90 [OK]docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8... 42 [OK]docker.io docker.io/jdeathe/centos-ssh-apache-php CentOS-6 6.8 x86_64 / Apache / PHP / PHP M... 21 [OK]docker.io docker.io/nimmis/java-centos This is docker p_w_picpaths of CentOS 7 with dif... 17 [OK]docker.io docker.io/gluster/gluster-centos Official GlusterFS Image [ CentOS7 + Glus... 12 [OK]docker.io docker.io/million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 12 [OK]docker.io docker.io/torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK]docker.io docker.io/nickistre/centos-lamp LAMP on centos setup 7 [OK]docker.io docker.io/kinogmt/centos-ssh CentOS with SSH 6 [OK]docker.io docker.io/nathonfowlie/centos-jre Latest CentOS p_w_picpath with the JRE pre-insta... 4 [OK]docker.io docker.io/centos/mariadb55-centos7 3 [OK]docker.io docker.io/consol/sakuli-centos-xfce Sakuli JavaScript based end-2-end testing ... 2 [OK]docker.io docker.io/blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK]docker.io docker.io/darksheer/centos Base Centos Image -- Updated hourly 1 [OK]docker.io docker.io/harisekhon/centos-java Java on CentOS (OpenJDK, tags jre/jdk7-8) 1 [OK]docker.io docker.io/harisekhon/centos-scala Scala + CentOS (OpenJDK tags 2.10-jre7 - 2... 1 [OK]docker.io docker.io/timhughes/centos Centos with systemd installed and running 1 [OK]docker.io docker.io/grayzone/centos auto build for centos. 0 [OK]docker.io docker.io/januswel/centos yum update-ed CentOS p_w_picpath 0 [OK]docker.io docker.io/labengine/centos Centos p_w_picpath base 0 [OK]docker.io docker.io/repositoryjp/centos Docker Image for CentOS. 0 [OK]docker.io docker.io/smartentry/centos centos with smartentry 0 [OK]docker.io docker.io/ustclug/centos USTC centos 0 [OK]docker.io docker.io/vcatechnology/centos A CentOS Image which is updated daily 0 [OK]
下载镜像
咱们可使用docker pull centos
docker pull nginx
来安装centos和nginx的镜像
导出镜像 docker save -o [镜像名称] [镜像]
[root@linux-node1 ~]# docker save -o centos.tar centos[root@linux-node1 ~]# lsanaconda-ks.cfg centos.tar须要将docker导出为tar,后面为镜像名称
导入镜像
[root@linux-node1 ~]#docker load --input centos.tar #使用input导入[root@linux-node1 ~]# docker load < nginx.tar #使用重定向导入
删除镜像 docker删除可使用docker rmi 后面加上docker的ID
例如:
提示:若是镜像已经建立了一个容器,那么将没法进行删除
删除容器:
[root@linux-node1 ~]# docker rm abcdocker或者使用[root@linux-node1 ~]# docker rm -f abcdocker
第二种会提示容器在将它关闭
docker另外一种删除方式
启动一个容器 echo
完就删除
[root@linux-node1 ~]# docker run --rm centos /bin/echo "www.abcdocker.com"www.abcdocker.com[root@linux-node1 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf974696a121a centos "/bin/bash" 2 minutes ago Up About a minute abcdockerbcededa4b82c centos "/bin/echo hello" 6 hours ago Exited (0) 4 hours ago awesome_dijkstra
启动容器 docker run [镜像]
[root@linux-node1 ~]# docker run centoscentos是镜像的名称,镜像的名称必须在选项的后面
启动镜像,输入Hello,并关闭
[root@linux-node1 ~]# docker run centos /bin/echo 'Hello Wordl
本命令的意思是启动一个docker进程,并echo 执行后面的命令能够有能够没有(hello),若是咱们的镜像启动就会执行一个进程就不须要咱们输入
查看启动镜像 docker ps -a
ps
是显示正在运行的容器 -a
是显示不运行的
[root@linux-node1 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESbcededa4b82c centos "/bin/echo hello" 32 seconds ago Exited (0) 32 seconds ago awesome_dijkstra
咱们能够看到,如今容器并无启动。由于docker启动须要在前台启动一个进程。容器的名称能够咱们指定或自动生成
提示: 管理docker容器能够经过名称也能够经过ID
例如:我要新建一个abcdocker
的容器,它的镜像是centos.
他有三个参数,第一个是给容器起一个名称,-t 分配一个伪终端(tty)-i标准输入打开,我要在里面输入命令
[root@linux-node1 ~]# docker run --name abcdocker -t -i centos /bin/bash--name 容器的名称-t 让docker分配一个伪终端-i 让docker的标准输入打开{input}
提示:最后的/bin/bash
能够省略,可是最后一个若是不是命令,那就是镜像的名称
输入上方的命令以后会直接进入到容器里面
[root@f8c8c8156e26 /]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 11752 1920 ? Ss 19:38 0:00 /bin/bashroot 18 0.0 0.0 47424 1660 ? R+ 21:32 0:00 ps aux[root@f8c8c8156e26 /]#
舒适提示:容器不是一个虚拟机,由于他就是一个进程,若是咱们退出,这个进程就退出了。
若是咱们执行建立容器的时候,里面没有咱们指定的镜像,那么他会从dockerhub
上进行下载而后在启动
容器启动
咱们经过docker ps -a
能够查看到没有启动的容器
使用docker start [名称或PORTS]
[root@linux-node1 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf8c8c8156e26 centos "/bin/bash" 2 hours ago Exited (0) 34 minutes ago abcdockerbcededa4b82c centos "/bin/echo hello" 2 hours ago Exited (0) 2 hours ago awesome_dijkstra[root@linux-node1 ~]# docker start abcdockerabcdocker[root@linux-node1 ~]# docker start bcededa4b82cbcededa4b82c
进入容器
[root@linux-node1 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf8c8c8156e26 centos "/bin/bash" 2 hours ago Up 24 minutes abcdockerbcededa4b82c centos "/bin/echo hello" 3 hours ago Exited (0) 23 minutes ago awesome_dijkstra[root@linux-node1 ~]# docker attach abcdocker[root@f8c8c8156e26 /]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 11776 1872 ? Ss 22:09 0:00 /bin/bashroot 14 0.0 0.0 47424 1660 ? R+ 22:33 0:00 ps aux
这样进入容器的缺点就是若是在开一个窗口就会同步操做,相似于单用户模式(windows远程桌面)
提示:生产场景是不使用docker attach
的,须要咱们使用nsenter
这个工具,这个工具包含在util-linux
软件包里面
[root@linux-node1 ~]# yum install util-linux -y Centos7默认最小化已经安装
咱们经过nsenter
就能够进入容器
,可是nsenter是经过pid
进入容器里,因此咱们须要知道容器的pid。咱们能够经过docker inspect
来获取到pid
[root@linux-node1 ~]# docker start abcdockerabcdocker[root@linux-node1 ~]# docker inspect -f "{{ .State.Pid }}" abcdocker37434[root@linux-node1 ~]# nsenter -t 37434 -m -u -i -n -p
docker inspect -f ``.`State`.`Pid`
容器名或者容器id
#每个容器都有.State.Pid,因此这个命令除了容器的id须要咱们根据docker ps
-a
去查找,其余的所有为固定的格式 nsenter --target
上面查到的进程id --mount --uts --ipc --net --pid
#输入该命令便进入到容器中
解释nsenter指令中进程id以后的参数的含义:
* –mount参数是进去到mount namespace中 * –uts参数是进入到uts namespace中 * –ipc参数是进入到System V IPC namaspace中 * –net参数是进入到network namespace中 * –pid参数是进入到pid namespace中 * –user参数是进入到user namespace中
更多参数咱们能够经过nsenter --help
进行获取
咱们进入容器中查看进程
如下是以nsenter启动的进程
[root@f8c8c8156e26 /]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 11776 1664 ? Ss+ Oct18 0:00 /bin/bashroot 27 0.0 0.1 13376 1984 ? S Oct18 0:00 -bashroot 40 0.0 0.0 49024 1808 ? R+ 00:11 0:00 ps aux
/bin/bash
是咱们运行容器产生的进程 -bash
是咱们使用nsenter产生的,这样若是咱们退出容器,容器就不会退出,由于-bash
还在运行
[root@f8c8c8156e26 /]# exitlogout[root@linux-node1 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf8c8c8156e26 centos "/bin/bash" 4 hours ago Up 48 minutes abcdocker
由于每次进入容器都须要输入那两条命令,因此咱们能够写一个脚原本获取。
脚本内容以下:
[root@linux-node1 ~]# cat docker_in.sh #!/bin/bash# Use nsenter to access dockerdocker_in(){ NAME_ID=$1 PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID) nsenter -t $PID -m -u -i -n -p}docker_in $1
执行结果以下:
[root@linux-node1 ~]# chmod +x docker_in.sh [root@linux-node1 ~]# ./docker_in.sh abcdocker[root@f8c8c8156e26 /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 Oct18 ? 00:00:00 /bin/bashroot 54 0 0 00:23 ? 00:00:00 -bashroot 67 54 0 00:23 ? 00:00:00 ps -ef[root@f8c8c8156e26 /]#
咱们也能够不进入容器进行查看
[root@linux-node1 ~]# docker exec abcdocker ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 Oct18 ? 00:00:00 /bin/bashroot 85 0 0 00:28 ? 00:00:00 ps -ef[root@linux-node1 ~]# docker exec abcdocker ls /anaconda-post.logbindev
提示:可使用exec
参数,不进入容器查看内容
咱们还可使用exec进入docker容器中
[root@linux-node1 ~]# docker exec -it abcdocker /bin/bash
可是最好仍是少使用exec
,有可能会对容器形成一些意外的影响
请点击下一章