Docker介绍
Docker 是一个能够把开发应用程序自动部署到容器的开源引擎。它由Docker公司的团队编写,基于Apache 2.0开源协议授权。它提供了一个简单、轻量的建模方式,使开发生命周期更高效快速,鼓励了面向服务的架构设计。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
Docker 的特点:
更快速的交付和部署
更高效的虚拟化
更轻松的迁移和扩展
更简单的管理
容器技术与传统虚拟机性能对比
Docker与虚拟机建构对比
Docker 容器本质上是宿主机上的一个进程。Docker 通过 namespace 实现了资源隔离,通过 cgroups 实现了资源的限制,通过写时复制机制(copy-on-write)实现了高效的文件操作。
Docker有五个命名空间:进程、网络、挂载、宿主和共享内存,为了隔离有问题的应用,Docker运用Namespace将进程隔离,为进程或进程组创建已隔离的运行空间,为进程提供不同的命名空间视图。这样,每一个隔离出来的进程组,对外就表现为一个container(容器)。需要注意的是,Docker让用户误以为自己占据了全部资源,但这并不是”虚拟机”。
Docker 中的三个概念:镜像,容器,仓库
镜像(image):Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
镜像是一种文件结构。Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。Docker官方网站专门有一个页面来存储所有可用的镜像,网址是:index.docker.io。
容器( Container):容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
仓库:仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。
Docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来就可以了。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的服务。
Docker 基本操作
[root@localhost ~]# docker search mysql
//查找镜像
这样查找相当于在https://hub.docker.com/中查找,大家尽量使用官方的镜像
[root@localhost ~]# docker pull busybox
//拉取镜像
[root@localhost ~]# docker save -o busybox.tar busybox:latest
//把镜像导出到本地 -o:相当--output导出
[root@localhost ~]# docker images
//查看本地镜像
仓库(镜像名称) 镜像标签 镜像id 创建时间 大小
虽然我们看到镜像标签为latest(最新的),但并不表示他一定是最新的。而且镜像如果没有写标签,默认以latest为标签。
[root@localhost ~]# docker rmi busybox:latest
//删除镜像
[root@localhost ~]# docker images
//查看本地镜像这里没有busybox
[root@localhost ~]# docker load -i busybox.tar
//根据本地镜像包导入镜像
[root@localhost ~]# docker images
//查看本地镜像这里又有busybox
[root@localhost ~]# docker ps
//查看容器-正在运行的
[root@localhost ~]# docker ps -a
//查看所有容器
[root@localhost ~]# docker rm c3bb3a6f73eb
//删除容器 id或镜像名称(不能删除正在运行的容器)
[root@localhost ~]# docker stop test
//停止容器运行 (记得验证一下docker ps -a)
[root@localhost ~]# docker start test
//启动容器 (记得验证一下docker ps -a)
[root@localhost ~]# docker rm test -f
//强制删除容器 (记得验证一下docker ps -a)
[root@localhost ~]# docker ps -a -q | xargs docker rm -f
//强制删除所有容器(生产环境严禁使用)
[root@localhost ~]# docker ps -a -q | xargs docker start -f
//强制开启所有容器(生产环境严禁使用)
[root@localhost ~]# docker ps -a -q | xargs docker stop -f
//强制关闭所有容器(生产环境严禁使用)
[root@localhost ~]# docker run -it --name test1 busybox:latest
//开启一个容器
-i:可交互
-t:伪终端
-d:守护进程
--name:容器命名
--restart=always:始终保持运行(随着docker开启而运行)
[root@localhost ~]# docker run -itd --name test2 --restart=always busybox:latest
//docker重启后,始终保持运行(随着docker开启而运行)
路由转发
[root@localhost ~]# vim /etc/sysctl.conf
//添加路由转发
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
进入容器方法
[root@localhost ~]# docker exec -it test2 /bin/sh
//进入一个容器(退出容器后还在运行)
[root@localhost ~]# docker attach test2
//也是进入一个容器(退出容器不在运行)
区别:exec进入的方式需要添加-i -t选项,后边还需要给容器一个shell环境。
但attach就不需要这么麻烦。
exec进入的方式:如果执行exit退出, 容器仍然保持运行。
attach:如果执行exit退出, 容器会被关闭。如果想要保持容器不被关闭,可以使用用键盘: Ctrl + p Ctrl +q可以实现。
本质上去区别: exec 进入的方法,会生产新的进程。
attach不会生产新进程。
强制删除镜像
[root@localhost ~]# docker rmi centos:7 -f
//强制删除镜像
上面是把镜像标签给删了,要想彻底删除镜像,用下面的命令把镜像id也删了,docker有缓存机制,即使把这个镜像给删了,但是会有缓存,其他的容器依旧可以使用
Docker的基本操作逻辑
基于centos: 7镜像运行-个容器,并且,在这个容器内部署Nginx服务。
1)下载centos:7镜像
[root@localhost ~]# docker pull centos:7
[root@localhost ~]# rz
上传一个nginx包
2)运行容器
[root@localhost ~]# docker run -itd --name webapp --restart=always centos:7
3)进入容器,开始部署nginx服务
[root@localhost ~]# docker cp nginx-1.14.0.tar.gz webapp:/root
//将nginx包导入到容器内
[root@localhost ~]# docker exec -it webapp /bin/bash
//进入容器
[root@8604fb370aab /]# ls root
安装nginx
[root@8604fb370aab /]# cd /root
[root@8604fb370aab ~]# tar zxf nginx-1.14.0.tar.gz
[root@8604fb370aab ~]# yum -y install gcc pcre pcre-devel openssl-devel zlib zlib-devel make
//安装nginx所需依赖
[root@8604fb370aab ~]# cd nginx-1.14.0
[root@8604fb370aab nginx-1.14.0]# useradd -M -s /sbin/nologin nginx
//创建用户
[root@8604fb370aab nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
//编译安装
[root@8604fb370aab nginx-1.14.0]# ln -s /usr/local/nginx/sbin/
nginx /usr/local/sbin/
//链接命令目录
[root@8604fb370aab nginx-1.14.0]# nginx
//启动nginx
[root@8604fb370aab nginx-1.14.0]# cd /usr/local/nginx/html/
[root@8604fb370aab html]# echo This is a testweb in container > index.html
//创建一个测试页面
[root@8604fb370aab html]# curl 127.0.0.1
//访问网页
[root@8604fb370aab /]# yum provides ip
//查看哪一个组件支持这条命令
[root@8604fb370aab /]# yum -y install net-tools
//安装支持这条命令的
[root@8604fb370aab /]# ifconfig
//查看ip
宿主机查看网页
[root@localhost ~]# curl 172.17.0.4
[root@localhost ~]# docker commit webapp myweb:xgp
//把容器制作成镜像 (会返回一个哈希值,代表的是镜像的id号)增加可移植性
[root@localhost ~]# docker images
//查看镜像
[root@localhost ~]# docker run -itd --name webapp-2 myweb:xgp
[root@localhost ~]# docker exec -it webapp-2 /bin/bash
[root@e8d15e9aef29 /]# nginx
[root@e8d15e9aef29 /]# curl 127.0.0.1
This is a testweb in container
[root@e8d15e9aef29 /]# ifconfig
查看网页
[root@localhost ~]# curl 172.17.0.5