这是我参与「第五届青训营 」笔记创作活动的第14天
人生没有白走的路,每一步它都算数——考研政治老师孔昱力
序言
传统虚拟机
虚拟机是虚拟出一套硬件,在其上面运行一个完整的操作系统,例如我们使用VMware,指定系统镜像,然后装系统,最终可以使用,在该系统上再运行所需的应用程序。
VMware创建虚拟机时,需要在其模拟出来的硬件上安装繁重的操作系统。每一个虚拟机可以看做是一个当前主机上的独立空间。当我们需要在当前主机上模拟出多个独立空间时,就需要运行多个繁重的操作系统。这是虚拟机的天然缺陷。
换个角度来看,假设你的公司开发了一个“稀土掘紫金”,从开始到开发完成,开发小哥哥配置好各种环境,引入了各种依赖。现在需要移交给OA进行测试,在测试小姐姐那她同样需要配置各种环境、引入各种依赖。开发小哥哥所走过的环境配置路线,测试小姐姐同样需要走一遍,环境配置这种东西,那就是玄学,总会有各种各样的问题。此外,人工配置也避免不了马虎失误。假设测试小姐姐测试完毕了,运维需要讲“稀土掘紫金”上线,对于线上环境,运维同样需要走一遍曾经走过的环境配置路线。属实是太麻烦了。。。。。
容器技术
容器内的应用程序直接运行在宿主机的内核上,容器内没有自己的内核,也没有对硬件进行虚拟,因此容器比起虚拟机更为轻便。
为什么选择docker
-
docker更高效的利用系统资源
容器不需要进行硬件虚拟化以及运行一个完整操作系统的额外开销,docker对系统资源的利用率更高,无论是应用执行,文件存储,还是在内存消耗等方面,都比传统虚拟机更高效。因此一个同样配置的主机,可以运行处更多数量的容器实例。
-
更快的启动时间
传统的虚拟机启动时间较久,docker容器直接运行在宿主机的内核上,无须启动一个完整的操作系统,因此可以达到秒级启动,大大的解决开发,测试,部署的时间。
-
一致性的环境
在企业里,程序从开发环境,到测试服务器,到生产环境,难以保证机器环境一致性,极大可能出现系统依赖冲突,导致难以部署等Bug。
然而利用docker的容器—镜像技术,提供了除了内核以外完整的运行时环境,确保了应用环境的一致性。
整个容器内部的内容可以被打包在一起,打包完成的东西叫做镜像
image,由于我们的应用就运行在该容器内部,即该容器提供了应用运行的全部环境,于是image就可看做是当前容器内容的一个副本,将该副本放到其余任何存在Docker引擎上的环境中都可以无缝衔接地运行。 -
持续交付和部署
还是刚才所说的一致性的环境,对于开发和运维的人员,最希望的就是环境部署迁移别处问题,利用docker可以定制镜像,以达到持续集成,持续交付和部署。
通过Dockerfile来进行镜像构建,实现系统集成测试,运维进行生产环境的部署。
且Dockerfile可以使镜像构建透明化,方便技术团队能够快速理解运行环境部署流程。
-
更轻松的迁移
Docker可以在很多平台运行,无论是物理机,虚拟机,云服务器等环境,运行结果都是一致的。用于可以轻松的将一个平台的应用,迁移到另一个平台,而不用担心环境的变化,导致程序无法运行。
把docker跑起来先
安装docker
我这里的操作系统是Centos
-
查看当前Centos版本,根据版本配置镜像(我这配置的是阿里的镜像)
-
[root@4bd9ee8cbed3 /]# cat /etc/redhat-release CentOS Linux release 8.4.2105
-
-
可以看到,我这边是Centos8,就应该配置Centos8的镜像。不是Centos8的自行百度镜像。
-
# curl curl -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
-
-
开启流量转发。docker是主机内一个隔离的环境,不开启流量转发docker内的应用是没有办法连接到网络的。
-
modprobe tfilter cat <<EOF> /etc/sysctl.d/docker.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables =1 net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.all.rp_filter =0 net.ipv4.ip_forward=1 EOF
-
-
重新加载内核参数
-
sysctl -p /etc/sysctl.d/docker.conf
-
-
然后更新源、安装docker、启动docker、设置开机自启
-
yum -y update yum -y install docker
-
配置镜像加速器
使用docker首要操作就是获取镜像文件,默认下载是从Docker Hub下载,网速较慢,国内很多云服务商都提供了加速器服务,阿里云加速器,Daocloud加速器,灵雀云加速器。
mkdir -p /etc/docker
touch /etc/docker/daemon.json
vim /etc/docker/daemon.json
# 把下边这段粘进去
{
"registry-mirrors":[
"https://8xpk5wnt.mirror.aliyuncs.com"
]
}
重新读取一下配置,设置开机自启
systemctl daemon-reload
systemctl enable docker
启动docker
systemctl start docker
验证docker是否启动
docker version
启动第一个docker容器
Docker平台的组成
第一节我们了解到容器就是一个独立的环境,其中包含了能够运行的应用以及支持应用运行的依赖。将容器打包封装到一起就形成了该容器的镜像。
开始一个使用docker之前,非常有必要了解docker的组成部分。
- Registry是镜像仓库,保存镜像文件,提供上传,下载镜像操作(常见的应用都可以在仓库中找到镜像)
- Docker_host就是运行在操作系统上的docker服务,其包含着容器以及镜像。镜像是可以从仓库中获取的。获取后的镜像可以运行,成为当前主机中一个容器。即容器可以打包成镜像,镜像可以运行成为容器。一个dockerHost中可以运行多个容器。
- Client就是docker提供的一个交互客户端,通过客户端执行不同的命令操作dockerHost。
获取镜像→启动容器
这里以Nginx为例, Nginx 是一个web服务器,运行后会监听80端口。
先搜索一下Nginx镜像是和否存在
docker search nginx
第一个是官方的Nginx,我们要用的就是这个,其他的可能是别人基于Nginx添加一下环境或者其他依赖又打包的镜像,这个我们后边会了解到。
获取镜像
docker pull nginx
查看本地镜像
docker images
可以看到ignix已经下载到本地了
一键启动
使用docker run nginx启动容器,这个命令需要详细解释一下。此时,nginx就启动了,但是这个控制台也就没办法再操作了。一会对docker run 命令详细解释。另起一控制台,使用docker ps查看运行的容器。
常用命令
Docker run
# 将镜像运行为容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Options说明:
-d: 后台运行容器,它会返回容器ID-it:以交互模式运行容器,并返回一个伪终端。这是俩命令,但是通常一起用。--name=“容器名”:自定义指定容器名- -p:指定端口映射,格式为
宿主机端口:容器端口 - -P:随机映射端口
-v:将宿主机的目录映射到容器的目录,格式为宿主机目录:容器目录
例子:
使用nginx镜像在后台运行一个容器,并将容器命名为"mynginx"
docker run --name mynginx -d nginx
使用nginx镜像在后台运行一个容器,并将容器的80端口映射到宿主机的一个可用的随机端口。因为nginx本身使用的就是80端口,所以是将容器的80端口向主机端口映射。
docker run -P -d nginx
使用nginx:latest镜像在后台运行一个容器,并将容器的80端口映射到宿主机的80端口,将宿主机的/data目录映射到容器的/data目录
docker run -p 80:80 -v /data:/data -d nginx:latest
使用nginx:latest镜像以交互模式运行一个容器
docker run -it nginx:latest bash
root@b8573233d675/#
Docker ps
查看正在运行的容器
docker ps
下图的输出中显示目前有两个容器在运行,第一列是容器的ID,第六列是容器端口映射。我们可以基于容器ID操作容器。
Docker ps -a
查看所有的容器,包括正在运行的和已经停止运行的。
docker ps -a
下图展示的容器中,通过第五列的STATUS可以看出,有两个容器正在运行,有一个已经在10h之前下线。
Docker exec
常用docker exec -it 容器ID bash/sh 进入正在运行的容器内部。
下图先用docker ps 查看正在运行的容器,然后根据容器ID进入redis容器内部并开启伪命令行。在这里就可输入命令,打开redis客户端
镜像管理
| 操作 | 命令 | 备注 |
|---|---|---|
| 搜索镜像 | docker search 镜像名 | |
| 获取镜像 | docker pull 镜像名 | |
| 查看镜像 | docker images | |
| 删除镜像 | docker rmi 镜像名 | 如果该镜像的容器正在运行,是无法删除的。需要停止该容器,并删除容器。docker rm 容器id/容器名 |