docker容器是一种容器虚拟化技术,主要是为了解决开发和运维在软件或代码交付时,由于环境差异或配置差异,导致软件无法正常运行的问题。通过docker可以将软件及其软件运行环境进行打包,也就是镜像,在其他主机上只需要一个docker引擎,就可以将打包好的软件一键部署到其他主机上。
一、Docker
1. docker的介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker的基本组成:
(1) 镜像:镜像是一种轻量级,可执行的独立软件包,用来打包软件及软件运行环境,它包含运行某个软件所需要的所有内容,包括代码、运行时、库、环境变量和配置文件。它可以看作是一个只读模板,镜像可以用来创建docker容器,一个镜像可以创建多个容器
(2) 容器:容器是用镜像创建的运行实例,通过容器可以独立运行一个或一组应用,对容器可以进行启动、开始、停止、删除等操作,每个容器都是相互隔离的
(3) 仓库:仓库是集中存放镜像文件的场所,仓库分为公开仓库和私有仓库两种
2. 传统虚拟化与容器技术的对比
(1)传统虚拟机技术
传统虚拟机技术是一种带环境安装的解决办法,它可以在一个操作系统中再运行另一个操作系统,如在windows中运行centos、ubuntu等,应用程序对此毫无感知,因为虚拟机看上去跟真实的系统一模一样,而对于底层系统来说,虚拟机就是一个普通的文件,删除、创建对其他部分没有影响。它保证了应用程序、操作系统和硬件之间的逻辑关系不变。但它也有许多不足,占用资源比较多,启动速度慢
(2)docker容器技术
linux容器不是模拟一个完整的操作系统,而是对进程进行隔离,通过容器可以将软件运行所需要的所有资源打包到一个隔离的容器中,容器内的应用进程直接运行在宿主机的内核,共享宿主机中的资源,它的解决了传统虚拟机技术的缺点,docker占用资源少,由于不需要启动操作系统,加载内核,启动速度快(秒级)
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上在运行所需要的应用进程,而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,因此容器要比虚拟机更轻便。每个容器之间相互隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源
二、docker的搭建
实验准备:搭建docker的yum源中包含如下软件包docker-ce-18.09.6-3.el7.x86_64.rpm、docker-ce-cli-18.09.6-3.el7.x86_64.rpm、containerd.io-1.2.5-3.1.el7.x86_64.rpm、container-selinux-2.21-1.el7.noarch.rpm
1. 搭建docker的yum源,用来解决软件依赖性
vim /etc/yum.repos.d/docker-ce.repo
[docker]
name=docker-ce
baseurl=http://172.25.65.250/docker
gpgcheck=0
2. 安装和开启docker
yum install -y docker-ce
systemctl start docker
yum install -y bash-* #安装自动补全软件
3. 查看docker是否开启
ip addr show
docker images #查看docker镜像
docker info #查看docker信息
三、docker常用命令
1. 帮助命令
docker --help
docker info #查看docker详细信息
docker inspect #查看容器内部详细信息
2. 镜像命令
#查看所有镜像,该命令后可以跟-a(查看全部信息)、-q(查看镜像id)、--digests(显示摘要信息)、--no-trunc(查看完整镜像信息)
docker images [-a|-q|--digests|--no-trunc]
#查找镜像,-s(收藏数不小于指定值的列出)、--automated(仅列出自动构建的)
docker search [--no-trunc|-s 数字|--automated] 镜像名
#提交镜像
docker commit -a="作者" -m="信息" 容器id 目标镜像名:标签
#镜像的构建
docker build [-f Dockerfile文件位置] -t 镜像名:标签 #可以不使用-f指定文件位置,镜像名称可以任意指定
#镜像的删除
docker rmi -f 镜像iid或镜像名:标签 #删除单个镜像
docker rmi -f 镜像1:标签 镜像2:标签 #删除多个,用空格隔开
docker rmi -f $(docker images -aq) #删除全部镜像
3. 容器命令
#新建并运行容器
docker run 参数 镜像名
参数:-i(交互方式)、-t(创建伪输入终端)、--name(指定用户名称,未指定则系统自动分配)、-d(后台运行)、-P(随机端口映射)、-p(指定端口映射)
#容器进程的查看
docker ps
可跟参数:-a(查看停止和运行的所有进程)、-l(查看最近创建的)、-n(最近n个进程)、-q(进程id)
#容器的退出
exit #直接退出,容器停止
ctrl+p+q #容器不停止退出
#查看日志
docker logs 参数 容器id
参数:-f(跟随最新日志打印)、-t(打印时间)、--tail 数字(显示最后几条)
#其他容器命令
docker [start|restart|stop|kill|top] #其中,stop正常关闭容器,kill直接杀死容器进程
#进入正在运行的容器
docker attach 容器id #重新进入容器
docker exec -it 容器id [命令|/bin/bash]
#从容器中拷贝文件到宿主机
docker cp 容器id:文件路径 宿主机目录
-p参数指定容器端口的四种指定方式:
(1)-p
(2)-p
(3)-p
(4)-p
attach与exec的区别:
(1)attach:直接进入容器启动命令的终端,不会启动新的进程,在使用exit退出时,容器会关闭
(2)exec:在容器中打开新的终端,并且可以启动新的进程,使用exit退出时,容器不会关闭
四、docker容器实现网页游戏
1. 下载game2048镜像(game2048.tar)
2. 导入镜像到docker容器中
docker load -i game2048.tar #导入镜像
3. 后台运行
docker run -d --name vm1 -p 80:80 game2048 #运行
##-d 打入后台 -p 端口映射 宿主端口:docker开启的端口
docker ps #查看进程
netstat -antlp
查看端口,如果出现80则证明,名为vm1的容器已经创建并运行了,如果有报错,可以查看80端口是否被占用。
4. 网页中查看
http://172.25.5.1