安装docker以及经过容器建立镜像

笔记内容:安装docker
笔记日期:2018-02-02php

  • 25.1 docker简介
  • 25.2 安装docker
  • 25.3 镜像管理
  • 25.4 经过容器建立镜像

25.1 docker简介

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

  1. 不一样的应用程序可能会有不一样的应用环境,好比.net开发的网站和php开发的网站依赖的软件就不同,若是把他们依赖的软件都安装在一个服务器上就要调试好久,并且很麻烦,还会形成一些冲突。好比IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来说,咱们能够在服务器上建立不一样的虚拟机在不一样的虚拟机上放置不一样的应用,可是虚拟机开销比较高。docker能够实现虚拟机隔离应用环境的功能,而且开销比虚拟机小,小就意味着省钱了。数据库

  2. 你开发软件的时候用的是Ubuntu,可是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,好比:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程中运维就得想办法解决这样的问题。这时候要是有docker你就能够把开发环境直接封装转移给运维,运维直接部署你给他的docker就能够了。并且部署速度快。apache

  3. 在服务器负载方面,若是你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。总之docker就是集装箱原理。

docker特色:json

  • Docker由go语言编写的,基于apache2.0协议发布。
  • 基于linux kernel,要想在win下运行须要借助一个vm(虚拟机)来实现

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的优点:

  • 启动很是快,秒级实现
  • 资源利用率高,一台高配置服务器能够跑上千个docker容器
  • 更快的交付和部署,一次建立和配置后,能够在任意地方运行
  • 内核级别的虚拟化,不须要额外的hypevisor支持,会有更高的性能和效率
  • 易迁移,平台依赖性不强

安装docker以及经过容器建立镜像

Docker核心概念:

  • 镜像,是一个只读的模板,相似于安装系统用到的那个iso文件,咱们经过镜像来完成各类应用的部署。
  • 容器,镜像相似于操做系统,而容器相似于虚拟机自己。它能够被启动、开始、中止、删除等操做,每一个容器都是相互隔离的。
  • 仓库,存放镜像的一个场所,仓库分为公开仓库和私有仓库。 最大的公开仓库是Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)

25.2 安装docker

因为docker的ee企业版是须要收取必定费用的,因此咱们安装的是ce社区版,如下是官方的安装文档:

https://docs.docker.com/install/linux/docker-ce/centos/

如下是个人安装步骤:

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


25.3 镜像管理

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加速器,具体的配置能够参考如下文档:

http://blog.csdn.net/xlemonok/article/details/71403534

个人配置以下:

[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 ~]#

说明:

  • REPOSITORY 仓库
  • TAG 标签,至关于给这个镜像标上一个版本,用于区分这是新版本仍是旧版本,或者用于区分这是什么环境的版本,老是就是做为一个标识符的存在
  • IMAGE ID是这个镜像的惟一标识,用于区分系统中不一样的镜像
  • CREATED ,何时建立的
  • SIZE,这个镜像的大小

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 ~]#

25.4 经过容器建立镜像

咱们从仓库上拉取到一个镜像后,启动为容器就可使用了,可是,可能这个容器里面的环境不是我须要的,因此咱们须要本身进行定制,例如在里面配置本身须要的环境什么的,配置好以后把这个容器生成一个镜像就能够拿到其余机器上使用了。

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去安装。

说明:

  • 其中 79fab4540315 为运行时该容器的id,这个id使用docker ps命令能够查看到
  • 最后面的bash为进入容器后咱们要执行的命令,这样就能够打开一个终端

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 ~]#

说明:

  • docker commit建立镜像命令
  • -m指定该镜像的描述信息
  • -a指定镜像做者的信息
  • 79fab4540315为该容器的id
  • test_centos则是生成的新镜像的名称

若是熟悉git或svn的命令行操做的话,会发现这和它们的命令格式很像。

以上咱们就经过容器建立了一个新的、由本身自定义环境的镜像,以后使用该镜像时,就不须要再去搭建环境了。并且咱们能够把这个镜像放到一个仓库上,这样其余机器也能够下载。这就和集装箱同样,把东西都封装到一个箱子里,不只方便移动,还能够开箱即用。

相关文章
相关标签/搜索