随着计算机近几十年的蓬勃发展,产生了大量优秀系统和软件。软件开发人员可以自由选择名种软件应用。但同时带来的问题就是需要维护一个非常庞大的开发、测试和生产环境。 面对这种情况,Docker 容器技术横空出世,提供了简单、灵活、高效的解决方案,不需要过多地改变现有的使用习惯,就可以和已有的工具,如 OpenStack 等配合使用。因此,掌握 Docker 相关技术也是途经云计算的必经之路。
本章将依次介绍 Docker 的三大核心概念--镜像、容器、仓库,以及安装 Docker 与介绍围绕镜像和容器的具体操作。
一、Docker概述
因为 Docker 轻便、快速的特性,可以使应用达到快速迭代的目的。每次小的变更,马上就可以看到效果,而不用将若于个小变更积攒到一定程度再变更。每次变更一小部分其实是一种非常安全的方式,在开发环境中能够快速提高工作效率。
Docker 容器能够帮助开发人员、系统管理员、质量管理和版本控制工程师在一个生产环节中一起协同工作。制定一套容器标准能够使系统管理员更改容器的时候,程序员不需要关心容器的变化,而更专注自己的应用程序代码。从而隔离开了开发和管理,简化了开发和部署的成本。
1.1什么是Docker
- 是一种轻量级的"虚拟机"
- 在Linux容器里运行应用的开源工具
如果要方便的创建运行在云平台上的应用,必须要脱离底层的硬件,同时还需要任何时 间地点可获取这些资源,这正是 Docker 所能提供的。Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。通过这种容器打包应用程序,意味着简化了重新部署、调试这些琐碎的重复工作,极大的提高了工作效率。
1.2Docker的优势
Docker 容器运行速度很快,启动和停止可以在秒级实现,比传统虚拟机要快很多;Docker 核心解决的问题是利用容器来实现类似虚拟机的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。因此,Docker 容器除了运行其中的应用之外,基本不消耗额外的系统资源,在保证应用性能的同时,又减小了系统开销,使得一台主机上同时运行数千个 Docker 容器成为可能。Docker 操作方便,可以通过 Dockerfile 配置文件支持灵活的自动化创建和部署。表 1-1将 Docker容器技术与传统虚拟机的特性进行了比较。
Docker之所以拥有众多优势,与操作系统虚拟化自身的特点是分不开的。传统虚拟机需要有额外的虚拟机管理程序和虚拟机操作系统层,而 Docker 容器则是直接在操作系统层面之上实现的虚拟化。图 1.2 是 Docker 与传统虚拟机架构。
1.3镜像
镜像、容器、仓库是 Docker 的三大核心概念。其中 Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。例如:一个镜像可以是一个完整的 Cent OS 操作系统环境,称为一个 CentOS 镜像;也可以是一个安装了 MSQL 的应用程序,称之为一个 MySQL 镜像等等。
Docker 提供了简单的机制来创建和更新现有的镜像,用户也可以从网上下载已经创建好的镜像直接使用。
1.4容器
Docker 的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证安全性的平台。可以将容器看作是一个简易版的 Linux 环境,Docker 利用容器来运行和隔离应用。
1.5仓库
Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用 push 命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
仓库注册服务器(Registry)是存放仓库的地方,其中包含了多个仓库。每个仓库集中存放某一类镜像,并且使用不同的标签(tag)来区分它们。目前最大的公共仓库是docker Hub,存放了数量庞大的镜像供用户下载使用。
二、安装 Docker
Docker 支持在主流的操作系统平台上进行使用,包括 Windows 系统、Linux 系统、以及 MacOS 系统等。目前最新的 RHEL、Cent OS 以及 Ubuntu 系统官方软件源中都已经默认自带了Docker 包,可直接安装使用,也可以用 Docker 自己的 YUM 源进行配置。
Cent OS 系统下安装 Docker 可以有两种方式:一种是使用 CURL 获得 Docker 的安装脚本进行安装,另一种是使用 YUM 仓库来安装 Docker。
注意:目前 Docker 只能支持 64 位系统。
2.1安装最新版本Docker依赖版本环境
#本安装方式使用阿里的软件仓库
#Step1: 添加软件源信息
yum -y install wget
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
#Step2: 使用本地yum源安装必要的一些系统工具
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#Step 3: 安装Docker-CE
yum clean all
yum makecache fast
yum repolist
yum -y install docker-ce
##Step 4:添加国内镜像站
mkdir /etc/docker/
cat>/etc/docker/daemon.json<<EOF
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
备注:
也可以将国内的镜像站改为阿里镜像加速器,Docker镜像加速地址可以在阿里上申请
#Step 5: 开启Docker服务
systemctl restart docker
systemctl enable docker
docker version
cat>> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p
三、Docker镜像操作
1.搜索镜像
[root@localhost ~]# docker search lamp
2.获取镜像
注意:可选择星级较高的镜像
[root@localhost ~]# docker pull mattrayner/lamp
3.查看镜像信息
[root@localhost ~]# docker images
查看镜像的详细信息
[root@localhost ~]# docker inspect c15
修改镜像标签(老名字+新名字)
[root@localhost ~]# docker tag mattrayner/lamp lamp:lamp
[root@localhost ~]# docker images
注意:
修改标签时可以只设置新的镜像名称,不要标签TAG,此时的标签会使用默认的latest当做标签名
4.删除镜像
用镜像名删除
[root@localhost ~]# docker rmi lamp:lamp
注意:如果标签名为latest,删除时只用镜像名即刻
用ID删除
[root@localhost ~]# docker rmi c15
注意:
用ID删除时,不能有同ID的镜像,比如修改镜像标签而生成的新的镜像,该镜像的ID和原始镜像是相同的,此时不能用ID删除。
5.存出镜像和载入镜像
[root@localhost ~]# docker save -o lamp mattrayner/lamp
[root@localhost ~]# docker rmi mattrayner/lamp
[root@localhost ~]# docker load<lamp
6.上传镜像
[root@localhost ~]# docker tag mattrayner/lamp 58wangjunqing/lamp:lamp
注意:
要想将自己的镜像上传到Docker,需要修改镜像名字,名字的前缀要使用Docker账号
[root@localhost ~]# docker login
输入账号和密码后即可登录成功
[root@localhost ~]# docker push 58wangjunqing/lamp:lamp
[root@localhost ~]# docker search 58wangjunqing
备注:注册Docker账号,登录网址https://hub.docker.com/
四、Docker容器操作
1.容器的创建与启动
[root@localhost ~]# docker create -it mattrayner/lamp /bin/bash
注意:
-i:让容器的输入保持打开状态
-t:让Docker分配一个伪终端
-d:以守护进程的方式运行该容器
此命令只是把容器创建了出来,并没有运行
[root@localhost ~]# docker ps -a
2.容器的运行
[root@localhost ~]# docker start 5a
在创建容器时直接启动容器
[root@localhost ~]# docker run centos:7 /usr/bin/bash -c "ls /root"
注意:此命令只是用该容器执行了一下ls命令,随后此容器就关闭了
在启动容器时持续在后台运行
[root@localhost ~]# docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
或
[root@localhost ~]# docker run -dit centos:7 /bin/bash
3.容器的终止
[root@localhost ~]# docker stop b18
4.进入容器
[root@localhost ~]# docker exec -it 03f /bin/bash
退出
[root@03f062851c52 /]# exit
5.容器导出
[root@localhost ~]# docker export 03f >centos7
6.容器导入生成镜像
[root@localhost ~]# docker import centos7 centos7:test
[root@localhost ~]# docker images
7.容器删除
[root@localhost ~]# docker rm 7f
删除所有容器
docker rm -f $(docker ps -a | awk '{print $1}')
8.端口映射
[root@consul ~]# docker pull httpd
(1)随机映射端口
[root@consul ~]# docker run -d -P httpd
[root@consul ~]# docker ps -a
(2)指定映射端口
[root@consul ~]# docker run -d -p 49280:80 httpd
[root@ consul ~]# docker ps -a
备注:
49280:是映射到外部的端口,这个端口范围通常是从32768到61000
80:是容器的端口
备注:
在开启防火墙的情况下,创建容器时如果指定了端口映射,转发规则会自动的添加到docker主机的防火墙策略中,这样,外部主机就可以通过docker主机的ip地址+容器对外映射的端口访问容器的服务,这样就保证了docker主机的安全性
如果要关闭防火墙,会提示无法创建iptables策略,重启一下docker进程即可
9.容器互联
(1)创建源容器
[root@consul ~]# docker run -dit --name web01 centos:7
(2)创建接收容器
[root@consul ~]# docker run -dit --name web02 --link web01:web01 centos:7
备注:
--link web1:web1
冒号前的web1,是第一个需要链接的容器的名字
冒号后的web1,是链接到第二个容器后,为第一个容器起的别名
(3)测试容器互联
[root@consul ~]# docker exec -it web02 /bin/bash
[root@71591dd4a58e /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 web01 36411a49ce54
172.17.0.3 71591dd4a58e
[root@71591dd4a58e /]# ping web01
五、Docker的数据管理
1.什么是数据卷
Docker 提供的一种持久化数据存储解决方案,用于在容器之间共享和持久化数据。数据卷解决了容器中数据易失性的问题,使得容器可以更加灵活和可移植。
2.创建数据卷
[root@localhost ~]# docker run -dit -v /data1 -v /data2 --name web03 centos:7
[root@localhost ~]# docker exec -it web03 /bin/bash
[root@9a398d3ec1f3 /]# cd /data1
[root@9a398d3ec1f3 data1]# cd /data2
3.数据卷容器
[root@localhost ~]# docker run -dit --volumes-from web03 --name db1 centos:7 /bin/bash
4.挂载主机目录作为数据卷
案例1
[root@localhost ~]# docker run -dit -p 8080:80 -v /data1:/usr/local/apache2/htdocs --name web04 httpd
[root@localhost ~]# echo "ni hao">/data1/index.html
[root@localhost ~]# curl 192.168.10.101:8080
案例2
[root@localhost ~]# mkdir -p /www/{conf,html}
将编辑好的nginx配置文件拷贝到/www/conf
将网站代码拷贝到/www/html
[root@localhost ~]# docker run -dit -p 9090:80 -v /www/conf/nginx.conf:/etc/nginx/nginx.conf -v /www/html:/www/html --name web05 nginx /bin/bash -c "nginx"
[root@localhost conf]# docker run -d -p 9090:80 -v /www/conf/default.conf:/etc/nginx/conf.d/default.conf -v /www/html:/usr/share/nginx/html -v/www/nginx/log:/var/log/nginx --name web05 nginx