25.1 docker简介linux
25.2 安装dockergit
25.3 镜像管理github
25.4 经过容器建立镜像docker
25.1 docker简介apache
docker比如一个集装箱,咱们能够把全部的想要运行的环境、软件包等等打包好,放到docker里。那你就能够把这个docker拿走,随便装到哪里去,能够装到任何一台服务器上去json
打包的东西包含了他依赖的环境,库等等。主要就是移植方便,交付很快ubuntu
官网 www.docker.comwindows
github https://github.com/docker/docker.github.iocentos
开源的容器引擎,可让开发者打包应用以及依赖的库,而后发布到任何流行的linux发行版上,移植很方便bash
由go语言编写,基于apache2.0协议发布
基于linux kernel,要想在win下运行须要借助一个vm(虚拟机)来实现
自2013年开始,近些年发展迅猛
docker从1.13x开始,版本分为社区版ce和企业版ee,而且基于年月的时间线形式,当前最新稳定版为17.09 参考http://blog.csdn.net/chenhaifeng2016/article/details/68062414
Docker和传统的虚拟化比较
相比传统的虚拟化,docker少一层(Hypervisor),不须要操做系统(占用CPU),轻量化。拉下来就能用
Docker的优点
1.启动很是快,秒级实现
2.资源利用率高,一台高配置服务器能够跑上千个docker容器
#由于是轻量的虚拟化
3.更快的交付和部署,一次建立和配置后,能够在任意地方运行
4.内核级别的虚拟化,不须要额外的hypevisor支持,会有更高的性能和效率
#不须要去虚拟化CPU、内存等等,不须要这些服务
5.易迁移,平台依赖性不强
#能够在linux下搞一个docker的镜像,而后能够在windows下运行
Docker核心概念
1.镜像,是一个只读的模板,相似于安装系统用到的那个iso文件,咱们经过镜像来完成各类应用的部署。
2.容器,镜像相似于操做系统,而容器相似于虚拟机自己。它能够被启动、开始、中止、删除等操做,每一个容器都是相互隔离的。
3.仓库,存放镜像的一个场所,仓库分为公开仓库和私有仓库。 最大的公开仓库是Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25.2 安装docker
1.curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
#首先下载repo的yum源
2.yum install -y docker-ce
速度比较慢,你们也能够直接下载rpm包
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下载完,上传到linux下
也须要用yum安装,能够自动解决依赖关系
yum install -y docker-ce-xxxx.rpm
3.systemctl start docker 启动docker
实例:
1.[root@axinlinux-01 ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2424 100 2424 0 0 1082 0 0:00:02 0:00:02 --:--:-- 1082
[root@axinlinux-01 ~]# cat !$ #也能够看一下官方给咱们提供的这个yum源
cat /etc/yum.repos.d/docker.repo
[root@axinlinux-01 ~]# yum list |grep docker #能够看一下系统自带的docker
docker.x86_64 2:1.13.1-75.git8633870.el7.centos #1.13的,这个版本很老了
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable #这个是他的最新版,也是我么要安装的
2.[root@axinlinux-01 ~]# yum install -y docker-ce #然而报错了
错误:docker-ce conflicts with 2:docker-1.13.1-88.git07f3374.el7.centos.x86_64
错误:docker-ce-cli conflicts with 2:docker-1.13.1-88.git07f3374.el7.centos.x86_64
[root@axinlinux-01 ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine #执行这一步,卸载以前的docker相关
[root@axinlinux-01 ~]# yum -y install docker-ce #再次执行
若是下载很慢,https://coding.net/u/aminglinux/p/yuanke_centos7/git/tree/master/25docker下载rpm包(docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm)。而后yum install 指定这个rpm包,就能够了
3.[root@axinlinux-01 ~]# systemctl start docker
[root@axinlinux-01 ~]# ps aux |grep docker
[root@axinlinux-01 ~]# iptables -nvL #他会自动的帮咱们生成一些规则
[root@axinlinux-01 ~]# iptables -t nat -nvL #针对nat的
[root@axinlinux-01 ~]# cat /etc/sysconfig/iptables #这些规则不能帮咱们保存
[root@axinlinux-01 ~]# service iptables save #咱们要手动的保存一下
[root@axinlinux-01 ~]# iptables -t nat -F #作个试验先把他清空掉
[root@axinlinux-01 ~]# iptables -t nat -nvL #再次查看就没有规则了
[root@axinlinux-01 ~]# systemctl restart docker #咱们一旦重启docker,这些规则就回来了
[root@axinlinux-01 ~]# iptables -t nat -nvL
由于重启的时候,设计一些容器的启动。他会自动把容器关闭,你还须要把容器再起来。因此通常做为docker的服务器,iptables尽可能的不要动
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25.3 镜像管理
1.docker pull centos//能够下载centos镜像,速度很慢
配置docker加速器(参考 http://blog.csdn.net/xlemonok/article/details/71403534)
2.vi /etc/docker/daemon.json//加入以下内容
{
"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}
说明:这个url为加速器地址,须要同窗们自行到阿里云申请
3.配置完加速器,重启docker服务,再次docker pull centos会快不少
4.docker images 查看本地的镜像
5.docker search xxx //搜索镜像,其中xxx是关键词
6.docker tag centos aming123 //给镜像打标签 #冒号的用法
7.docker run -itd centos //把镜像启动为容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面
8.docker ps //查看运行的容器,加上-a选项后能够查看全部容器,包括未运行的
9.docker rmi centos //用来删除指定镜像, 其中后面的参数能够是tag,若是是tag时,其实是删除该tag。当后面的参数为镜像ID时,则会完全删除整个镜像,全部标签也会一同删除
实例:
[root@axinlinux-01 ~]# docker pull centos #咱们直接拉取centos镜像。由于在国外,很慢因此超时报错了
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fcentos%3Apull&service=registry.docker.io: net/http: TLS handshake timeout
[root@axinlinux-01 ~]# vi /etc/docker/daemon.json #搞一个加速器
{
"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}
[root@axinlinux-01 ~]# systemctl restart docker #重启一下docker
[root@axinlinux-01 ~]# docker pull centos #再次拉取镜像
[root@axinlinux-01 ~]# docker images #看本地有哪些镜像
REPOSITORY TAG(版本标签) IMAGE ID(区分系统里镜像的惟一标示) CREATED SIZE
centos latest 1e1148e4cc2c 7 days ago 202MB
[root@axinlinux-01 ~]# docker search jumpserver #搜索jumpserver镜像。直接pull就能够直接使用了
[root@axinlinux-01 ~]# docker tag centos axinlinux_centos #给centos打标签
[root@axinlinux-01 ~]# docker images #会生成一个跟centos同样的镜像出来。ID(惟一标示并无变)
REPOSITORY TAG IMAGE ID CREATED SIZE
axinlinux_centos latest 1e1148e4cc2c 7 days ago 202MB
centos latest 1e1148e4cc2c 7 days ago 202MB
ubuntu latest 93fd78260bd1 3 weeks ago 86.2MB
[root@axinlinux-01 ~]# docker tag centos test111:222222 #以冒号分隔可更改,左边为REPOSITORY,右边为TAG
[root@axinlinux-01 ~]# docker images #以上更改的结果。更改标签的时候,以冒号分隔便可
REPOSITORY TAG IMAGE ID CREATED SIZE
axinlinux_centos latest 1e1148e4cc2c 7 days ago 202MB
centos latest 1e1148e4cc2c 7 days ago 202MB
test111 222222 1e1148e4cc2c 7 days ago 202MB
ubuntu latest 93fd78260bd1 3 weeks ago 86.2MB
[root@axinlinux-01 ~]# docker run -itd centos
55ad3e4d41d31abe444ffab8143245566b4b0e84704f241c14568e55849014a2
[root@axinlinux-01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55ad3e4d41d3 centos "/bin/bash" 5 seconds ago Up 4 seconds xenodochial_thompson
[root@axinlinux-01 ~]# docker ps -a #查看所有的容器,包括已经启动的和中止的
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55ad3e4d41d3 centos "/bin/bash" About a minute ago Up About a minute xenodochial_thompson
[root@axinlinux-01 ~]# docker rmi test111 #删除test111。报错由于他默认会找test111:latest。而咱们刚才建立的是test111:222222
Error: No such image: test111
[root@axinlinux-01 ~]# docker rmi test111:222222 #因此咱们要加上冒号222222,才能删除
Untagged: test111:222222
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25.4 经过容器建立镜像
咱们能够去官方直接拉取(pull)镜像,也能够自定义建立一个镜像。好比我拉取了一个centos,可是这个镜像的一些东西没有,我想安装一个jumpserver出来。这个时候就能够在这个容器里yum一些东西或者编译一些东西。按完之后在把这个容器搞到镜像里去,建立一个镜像出来,就能够直接用这个镜像
1.docker run启动容器后,能够经过下面命令进入容器
2.docker exec -it xxxxx bash//其中xxxxx为容器id,这个id能够用docker ps查看,最后面的bash为进入容器后咱们要执行的命令,这样就能够打开一个终端
3.进入到该容器中,咱们作一些变动,好比安装一些东西,而后针对这个容器进行建立新的镜像
4.在容器中执行 yum install -y net-tools,而后ctrl d退出容器
5.docker commit -m "change somth" -a "somebody info" container_id new_image_name //container_id经过docker ps -a获取,后面的new_image_name为新镜像名字
例如: docker commit -m "install net-tools" -a "Aming" 2c74d574293f centos_with_nettool 这个命令有点像svn的提交,-m 加一些改动信息,-a 指定做者相关信息 2c74d这一串为容器id,再后面为新镜像的名字
实例:
[root@axinlinux-01 ~]# docker ps #查看一下开启的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55ad3e4d41d3 centos "/bin/bash" 17 minutes ago Up 16 minutes xenodochial_thompson
[root@axinlinux-01 ~]# docker exec -it 55ad3e4d41d3 bash #进入这个开启的容器。bash为一个交互
[root@55ad3e4d41d3 /]# df -h #进去以后咱们能够看他的里面的东西
[root@55ad3e4d41d3 /]# free -h
[root@55ad3e4d41d3 /]# cat /proc/cpuinfo
[root@55ad3e4d41d3 /]# ifconfig #ifconfig用不了,安装一个
bash: ifconfig: command not found
[root@55ad3e4d41d3 /]# yum install -y net-tools
[root@55ad3e4d41d3 /]# ifconfig #安装完,就能够用ifconfig看一下了
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 #这个是docker本身的一个网段
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 5419 bytes 8616331 (8.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3156 bytes 173704 (169.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
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 0
[root@55ad3e4d41d3 /]# exit #退出来
exit
[root@axinlinux-01 ~]# ifconfig #看看系统的网卡,就多了这个docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:5ff:fe7e:1917 prefixlen 64 scopeid 0x20<link>
ether 02:42:05:7e:19:17 txqueuelen 0 (Ethernet)
RX packets 3156 bytes 129520 (126.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5411 bytes 8615683 (8.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
.。。。。
veth9f87026: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 #每开启一个容器都会有一个这样虚拟的网卡产生。这样才能正常的跟宿主机正常的通讯
inet6 fe80::c8fc:9dff:feb7:e5cc prefixlen 64 scopeid 0x20<link>
ether ca:fc:9d:b7:e5:cc txqueuelen 0 (Ethernet)
RX packets 3156 bytes 173704 (169.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5419 bytes 8616331 (8.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@axinlinux-01 ~]# docker commit -m "install net-tools" -a "axinlinux" 55ad3e4d41d3 centos_with_net #作成镜像。跟git很像,-a可理解为做者,55ad3e4d41d3表示这个镜像一开始的惟一ID,后面的就是这个新的镜像的名字
sha256:9fe62e7d735523370bfb5c03029178f6edf92e4c4120e9adcfbf5a3fa637b49c
[root@axinlinux-01 ~]# docker images #就会有你这个镜像出来。而后咱们跑一跑
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_with_net latest 9fe62e7d7355 3 minutes ago 272MB
axinlinux_centos latest 1e1148e4cc2c 7 days ago 202MB
centos latest 1e1148e4cc2c 7 days ago 202MB
ubuntu latest 93fd78260bd1 3 weeks ago 86.2MB
[root@axinlinux-01 ~]# docker run -itd centos_with_net #先打开
8028e7aa9820d9bf000a51fbad5cc3744fbf2134e3c5d388f33990e902d5a2d4
[root@axinlinux-01 ~]# docker exec -it 8028e7aa9820d9b bash #而后再进去
[root@8028e7aa9820 /]# ifconfig #就能够运行ifconfig了
[root@8028e7aa9820 /]# ping www.baidu.com #也是能够联网的