一、Docker介绍和与传统虚拟机的对比
1、Docker与传统虚拟机对比
Docker所代表的容器虚拟化技术属于操作系统级虚拟化:内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。
传统虚拟化和容器技术结构比较:传统虚拟化技术是在硬件层面实现虚拟化,增加了系统调用链路的环节,有性能损耗;容器虚拟化技术以共享Kernel的方式实现,几乎没有性能损耗。
2、Docker结构引擎
Docker是Client/Server的架构
- Docker Server:就是一个守护进程(daemon),用户不能直接和守护进程打交道,但是可以通过Docker客户端与其进行交互。其中daemon负责构建、运行和发布Docker容器(客户端可以和服务端运行在同一个系统中,也可以连接远程的daemon)。
- Docker Client:客户书写指令的地方,一般就是shell
- RESTful API:Docker客户端通过RESTful API与daemon进行socket通信
- Image:俗称镜像
- Container:俗称容器,装载和运行镜像
- Network:俗称网络,容器通过暴露端口与主机端口绑定,达到接受来自主机的信号
- Volume:俗称外挂,为了能够持久化数据以及共享容器间的数据,Docker提出了Volume的概念
3、Docker运行流程
当我们想运行一个容器的时候,docker会做如下操作:
- 拉取镜像,若本地已经存在该镜像,则不用到网上去拉取
- 创建新的容器
- 分配union文件系统并且挂着一个可读写的层,任何修改容器的操作都会被记录在这个读写层上,你可以保存这些修改成新的镜像,也可以选择不保存,那么下次运行改镜像的时候所有修改操作都会被消除
- 分配网络\桥接接口,创建一个允许容器与本地主机通信的网络接口
- 设置ip地址,从池中寻找一个可用的ip地址附加到容器上,换句话说,localhost并不能访问到容器
- 运行你指定的程序
- 捕获并且提供应用输出,包括输入、输出、报错信息
二、查看系统和内核(要求可连接公网)
1、查看系统版本
cat /etc/issue
2、查看内核(内核版本最低要求2.6.32)
cat /proc/version
三、安装docker
1、yum源安装docker
yum install docker-io -y
2、查看安装版本
docker -v
3、更改镜像和容器指向路径
yum安装的docker默认是在根分区的,所以我们要修改镜像和容器路径指向数据盘。
创建用来存储镜像的路径
mkdir /export/docker
打开配置文件
vim /etc/sysconfig/docker
修改路径:other_args=”–graph=/export/docker”
4、启动docker服务
service docker start
四、docker镜像(image)
0、Docker镜像
- Docker 镜像,就相当于是一个文件系统。比如官方镜像 ubuntu:14.04 就包含了完整的一套 Ubuntu 14.04 最小系统的 root 文件系统。
- Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资 源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境 变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
1、查看centos镜像列表
docker search centos
2、获取镜像
获取镜像命令:docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
- Docker Registry地址:地址的格式一般是 <域名/IP>[:端口号] 。默认地址是 Docker Hub。
- 仓库名:如之前所说,这里的仓库名是两段式名称 。 对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
这里我们根据上面列出的centos的镜像,按照star的数量选第一个
docker pull centos:6.8
3、查看 / 删除 已经获取的镜像
查看:docker images
删除:docker rmi
五、容器环境搭建配置
0、镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被 创建、启动、停止、删除、暂停等。
- 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的 独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
- 容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
- 按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者 绑定宿主目录(我们为了方便,使用了绑定了宿主目录),在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发 生读写,其性能和稳定性更高,这样的容器可以随意删除、重新 run ,数据却不会丢失。
1、 生成容器
docker run -it –name mupeifeng -v /export/mupeifeng/:/home/ centos:6.8 /bin/bash
-it 是以前台交互运行的方式
–name 指定容器名称
-v 指定该容器挂载宿主机的目录,我们这里是将宿主机的 /export/mupeifeng/ 挂载到 容器的 / home /,这样宿主机和容器就可以很方便的传文件之类的。
2、 部署环境(PHP7.1+MySql5.7+Nginx+Redis+ openssh)
- LNMP:为了方便部署我们使用的是整理好的LNMP源码包(先下载打包好的源码包到/home/目录下http://soft.vpser.net/lnmp/lnmp1.4-full.tar.gz,然后解压执行安装脚本,进行编译安装即可)。
- Openssh:安装 : yum install openssh-server -y
修改配置文件/etc/ssh/sshd_config中内容 :
PermitRootLogin yes
UsePAM no
修改root密码: passwd
启动sshd : service sshd start
- VIM无插件配置(可选), yum -y install vim
⚠️ /home/目录下的东西在定镜像时不会保留。
3、定制镜像
查看所有容器信息,获取容器id:docker ps -a
commit生成新镜像:docker commit -m “备注” 容器id 镜像名:tag版本
查看镜像列表:docker images
4、其他定制镜像方法
Dockerfile
六、创建多个容器
需求:我们需要给每人创建一个容器,并且都要可以通过宿主机80端口访问容器的80端口(因为我们的宿主机对外开放的只有一个80端口)。
思路:
- 首先我们将宿主机的8080端口映射到容器的80端口,这样我们要想访问容器的80端口,只需要直接访问宿主机的8080端口即可。这样我们每添加一台容器,只要在宿主机添加一个到该容器80端口的映射端口就可以了。
- 然后我们在nginx里添加一个反向代理,将访问宿主机的80请求,转发到宿主机的8080,这样就完美解决了端口限制的问题。每添加一台容器就在宿主机添加添加一个nginx的反向代理就可以了。
1、首先建立宿主机和容器的端口映射
docker run -it –name mupeifeng -v /export/mupeifeng/:/home/ -p 8080:80 -p 8082:22 lnmp:7.1 /bin/bash
-p 就是把宿主机的端口和容器的端口进行绑定,我们这里是将宿主机的8082端口绑定到容器的22端口,这样我们就可以通过ssh root@127.0.0.1 -p 8082登陆到容器。
2、在宿主机通过nginx建立反向代理
为了方便管理,我们将每个人在宿主机的nginx配置目录下(/etc/nginx/conf.d)都单独建立了一个配置文件。
nginx具体配置内容如下:
七、日常使用和其他常用命令
1、我们定制的Docker镜像是开启了sshd服务的,所以可以在宿主机通过绑定的端口进行ssh登陆,进行操作。
例如:我的容器22端口在宿主机绑定的是8082,那么我就可以在登陆宿主机(目前我们的宿主机是172.20.222.112)后通过ssh root@127.0.0.1 -p 8082登陆到容器。
ssh的初始用户是root,初始密码:1qaz@WSX
目前对应的端口列表如下:
或者我们也可以通过如下命令重新以前台交互的方式进入容器里
docker exec -it 容器id /bin/bash
另外:我们只需要在本地的hosts中配置172.20.222.112 test.自己名字拼音.com,就可以在浏览器通过访问test.自己名字拼音.com访问自己配置的项目(目前配置的项目目录是宿主机的/export/自己名字拼音/wwwroot/default/或者是登陆容器后的/home/wwwroot/default)。
2、其他常用的Docker命令
docker stop 容器id
终止一个正在运行的容器
docker start 容器id
启动已终止容器
启动ssh服务
docker exec -t -i <id/container_name> /bin/bash
service sshd start
docker logs -f -t –since=”2017-09-11″ –tail=10 mupeifeng
查看日志
–since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
-f : 查看实时日志
-t : 查看日志产生的日期
-tail=10 : 查看最后的10条日志。
mupeifeng : 容器名称