笔记内容:安装docker
笔记日期:2018-02-02php
Docker是一个开放源代码软件项目,自2013年开始,近些年发展迅猛,它让应用程序布署在软件容器下的工做能够自动化进行,借此在Linux操做系统上,提供一个额外的软件抽象层,以及操做系统层虚拟化的自动管理机制。Docker利用Linux核心中的资源分脱机制,例如cgroups,以及Linux核心名字空间(name space),来建立独立的软件容器(containers)。这能够在单一Linux实体下运做,避免引导一个虚拟机形成的额外负担。Linux核心对名字空间的支持彻底隔离了工做环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、内存、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的 LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库作为以本身的方式开始直接使用由Linux核心提供的虚拟化的设施,依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,能够在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方均可以运行,不管是公有云、私有云、单机等。” 。linux
简单来讲Docker 是一个开源的应用容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,而后发布到任何流行的Linux机器上,也能够实现虚拟化,容器是彻底使用沙箱机制,相互之间不会有任何接口。git
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,能够把货物规整的摆放起来。而且各类各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不须要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就能够用一艘大船把他们都运走。docker就是相似的理念。如今都流行云计算了,云计算就比如大货轮。docker就是集装箱。docker
不一样的应用程序可能会有不一样的应用环境,好比.net开发的网站和php开发的网站依赖的软件就不同,若是把他们依赖的软件都安装在一个服务器上就要调试好久,并且很麻烦,还会形成一些冲突。好比IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来说,咱们能够在服务器上建立不一样的虚拟机在不一样的虚拟机上放置不一样的应用,可是虚拟机开销比较高。docker能够实现虚拟机隔离应用环境的功能,而且开销比虚拟机小,小就意味着省钱了。数据库
你开发软件的时候用的是Ubuntu,可是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,好比:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程中运维就得想办法解决这样的问题。这时候要是有docker你就能够把开发环境直接封装转移给运维,运维直接部署你给他的docker就能够了。并且部署速度快。apache
docker特色:json
docker的 官网地址:vim
https://www.docker.com/centos
docker从1.13x开始,版本分为社区版ce和企业版ee,而且基于年月的时间线形式,当前最新稳定版为17.09 参考:bash
http://blog.csdn.net/chenhaifeng2016/article/details/68062414
Docker和传统的虚拟化比较:
Docker的优点:
Docker核心概念:
因为docker的ee企业版是须要收取必定费用的,因此咱们安装的是ce社区版,如下是官方的安装文档:
如下是个人安装步骤:
1.若是你的系统没有安装过docker的话,只须要两步就能够把docker安装上,首先使用如下命令下载docker的repo源:
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
2.而后直接经过yum安装便可:
yum install -y docker-ce
若是以上这种安装方式的速度比较慢的话,你们也能够直接下载rpm包:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下载完以后也须要使用yum安装,yum能够自动解决依赖关系:
yum install -y docker-ce-xxxx.rpm
3.安装完成以后,启动docker:
[root@server ~]# systemctl start docker # 启动docker [root@server ~]# ps aux |grep docker # 查看进程 root 5289 2.3 1.6 531968 30256 ? Ssl 23:16 0:00 /usr/bin/dockerd root 5297 1.5 1.2 366740 22500 ? Ssl 23:16 0:00 docker-containerd --config /var/run/docker/containerd/containerd.toml root 5438 0.0 0.0 112652 964 pts/0 S+ 23:17 0:00 grep --color=auto docker
启动docker后,会自动生成一些iptables规则:
[root@server ~]# iptables -nvL Chain INPUT (policy ACCEPT 1022 packets, 421K bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 DOCKER-ISOLATION all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT 828 packets, 382K bytes) pkts bytes target prot opt in out source destination Chain DOCKER (1 references) pkts bytes target prot opt in out source destination Chain DOCKER-ISOLATION (1 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 Chain DOCKER-USER (1 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 [root@server ~]# iptables -t nat -nvL # 查看net表 Chain PREROUTING (policy ACCEPT 4 packets, 1040 bytes) pkts bytes target prot opt in out source destination 0 0 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT 4 packets, 1040 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 103 packets, 6545 bytes) pkts bytes target prot opt in out source destination 0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT 103 packets, 6545 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 Chain DOCKER (2 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0 [root@server ~]#
可是这生成的规则是临时的,若是想要保存,可使用如下命令,不过通常没有这个必要:
service iptables save
1.首先咱们须要从docker上拉取一个镜像,例如我要拉取一个centos的镜像,命令以下:
[root@server ~]# docker pull centos Using default tag: latest latest: Pulling from library/centos af4b0a2388c6: Pull complete Digest: sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d Status: Downloaded newer image for centos:latest # 拉取完成 [root@server ~]#
若是下载得很慢的话,咱们须要配置一个docker加速器,具体的配置能够参考如下文档:
个人配置以下:
[root@server ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["阿里云加速器地址"] }
说明:这个url为加速器地址,须要自行去阿里云申请。
配置完以后重启docker。而后再进行拉取镜像速度就会快不少了。
把镜像拉取下来以后,就能够进行使用了,如下是一些经常使用的命令:
1.查看本地的镜像:
[root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB [root@server ~]#
说明:
2.搜索镜像命令,用于搜索哪些镜像能够提供下载,其中xxx是关键词:
[root@server ~]# docker search xxx
例如我要搜索centos的镜像,则格式以下:
[root@server ~]# docker search centos
3.咱们能够给某一个镜像打标签或者说定义它的标识,打上标签后会新生成一个不一样标签的镜像:
[root@server ~]# docker tag centos test_centos [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB test_centos latest ff426288ea90 3 weeks ago 207MB [root@server ~]#
虽说会新生成一个镜像,但其实并非,从上面的输出结果能够看到,这两个镜像使用的IMAGE ID是同样的,那它们其实就是同一个,不一样的只是标签。
除了能够定义镜像的 REPOSITORY 以外,还能够定义镜像的TAG:
[root@server ~]# docker tag centos test_centos2:171104 [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB test_centos2 171104 ff426288ea90 3 weeks ago 207MB test_centos latest ff426288ea90 3 weeks ago 207MB [root@server ~]#
4.咱们说了docker是容器,因此下载到镜像后,还须要把镜像启动为容器:
[root@server ~]# docker run -itd centos 79fab4540315f6eb2b5616a2f8c8fabbcba7f3b5dffd46d52f98473c323594e9 [root@server ~]#
-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面。
5.查看运行中的容器:
[root@server ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 79fab4540315 centos "/bin/bash" 46 seconds ago Up 44 seconds friendly_chatterjee [root@server ~]#
加上-a选项后能够查看全部容器,包括未运行的。
6.删除指定镜像:
[root@server ~]# docker rmi test_centos Untagged: test_centos:latest [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB test_centos2 171104 ff426288ea90 3 weeks ago 207MB [root@server ~]#
后面的参数能够是 REPOSITORY 也能够是 TAG,若是是TAG时,其实是删除该TAG。当后面的参数为镜像ID时,则会完全删除整个镜像,全部标签也会一同删除。
或者 REPOSITORY 和 TAG 一块儿使用:
[root@server ~]# docker rmi test_centos2:171104 Untagged: test_centos2:171104 [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB [root@server ~]#
咱们从仓库上拉取到一个镜像后,启动为容器就可使用了,可是,可能这个容器里面的环境不是我须要的,因此咱们须要本身进行定制,例如在里面配置本身须要的环境什么的,配置好以后把这个容器生成一个镜像就能够拿到其余机器上使用了。
1.想要定制容器的环境,首先要进入到容器里,命令以下:
[root@server ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 79fab4540315 centos "/bin/bash" 27 minutes ago Up 27 minutes friendly_chatterjee [root@server ~]# docker exec -it 79fab4540315 bash [root@79fab4540315 /]# ls # 进入成功 anaconda-post.log dev home lib64 mnt proc run srv tmp var bin etc lib media opt root sbin sys usr [root@79fab4540315 /]#
这个拉取下来的centos镜像,是一个阉割的操做系统,不少东西都没有的,须要本身经过yum去安装。
说明:
2.进入到该容器后,咱们能够作一些变动,好比安装一些东西,搭建本身须要的环境,而后针对这个容器进行建立新的镜像:
## 随便装点东西 [root@79fab4540315 /]# yum install -y net-tools [root@79fab4540315 /]# yum install vim
3.安装完成后Ctrl + d退出该容器,而后执行如下命令生成一个镜像:
[root@server ~]# docker commit -m "install net-tools and vim" -a "author" 79fab4540315 test_centos sha256:0749459e3be3d66c787217bc7842c0856f7452e286f38e7e7979218787c1842a [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test_centos latest 0749459e3be3 11 seconds ago 359MB centos latest ff426288ea90 3 weeks ago 207MB [root@server ~]#
说明:
若是熟悉git或svn的命令行操做的话,会发现这和它们的命令格式很像。
以上咱们就经过容器建立了一个新的、由本身自定义环境的镜像,以后使用该镜像时,就不须要再去搭建环境了。并且咱们能够把这个镜像放到一个仓库上,这样其余机器也能够下载。这就和集装箱同样,把东西都封装到一个箱子里,不只方便移动,还能够开箱即用。