文章目录
容器技术概述
在介绍容器之前,先来聊聊应用部署的发展历史。
-
传统方式,通过物理机部署,即需要先购买一台服务器,然后再部署。
但存在着如下问题:
(1)部署非常慢
(2)成本非常高
(3)资源浪费
(4)难于迁移和扩展
(5)可能会被限定硬件厂商 -
虚拟化技术出现以后,通过虚拟机部署。
在物理机上通过 Hypervisor 技术,对物理资源(内存、CPU、硬盘等)进行虚拟化,并在其基础之上安装操作系统(即虚拟机),从而实现对物理资源的合理性调度和使用率最大化。
其优点如下:
(1)资源池:一个物理资源分配到不同的虚拟机里
(2)很容易扩展:加物理机器 or 加虚拟机
(3)很容易云化:如亚马逊AWS、阿里云等
也存在如下局限性:
每一个虚拟机都是一个完整的操作系统,要给其分配资源,当虚拟机数量增多时,操作系统本身的资源的资源势必增多。 -
通过容器部署应用。
有如下特点:
(1)对软件和其依赖的标准化打包
(2)应用之间相互隔离
(3)共享同一个OS Kernel
(4)可以运行在很多主流的操作系统上
与虚拟机之间的区别:
直观上来讲vm多了一层guest OS,同时 Hypervisor 会对硬件资源进行虚拟化,而容器直接使用硬件资源,所以vm资源的利用率相对容器是低的。
可以和虚拟机进行结合:
此外从开发、测试、运维的角度来看,容器更容易统一环境,不需要各种繁琐的配置。
Docker是什么,
Docker 是容器技术的一种实现,提供了一个开发,打包,运行app的平台。
通过Docker Engine 引擎将app和底层的infrastructure隔离开来。
Docker Engine 组成:
Docker 架构
典型的CS架构。可以类比于GIT。
client: 和docker daemon进行交互的
docker daemon: 负责docker的各种各样的操作,如下载docker镜像,运行docker容器等
registry: docker镜像的Sass服务
Docker 底层技术支持
- Namespaces:做隔离pid、net、ipc、mnt、uts(容器之间网络、进程之间的隔离)
- Control groups:做资源控制(如内存、硬盘灯)
- Union file System:Container 和 image 的分层
Docker 安装
mac 安装:
- 下载:https://www.docker.com/docker-mac
- 安装:下载文件为.dmg文件,打开,拖动到Application文件夹中即可
linux 安装:
-
打开命令行,输入命令:
sudo wget -qO- https://get.docker.com/ | sh
,命令解析:sudo 是以root权限运行命令,wget是linux下的一个下载命令,-qO-
是让wget命令的参数信息,其中 q 是让简化wget的输出信息,O-(大写的字母O和减号)是让wget的输出直接输出到标准输出,而不是输出到文件,|
是管道,指的是将输出移交给后面的命令进行执行。所以上述命令的意思是,下载一个shell脚本并执行这个shell脚本。
输出如下:
-
docker 默认是以root用户进行执行的,如果我们要以非root用户运行Docker,在命令行中执行如下命令:
sudo usermod -aG docker your-user(linux的用户名)
,该命令的意思是,将指定的用户名加入到 docker用户组中, 下次你在用此用户运行docker时,就不要用sudo了
。
Docker 简单使用(运行一个nginx容器)
- 拉取image:命令行输入
docker pull nginx
,从远程拉取一个 nginx 镜像,可以类比git;如果首次运行会有如下输出:
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/library/nginx/manifests/latest: unauthorized: incorrect username or password
即你没有权限到从docker hub(可类比github)上下载镜像,登陆 https://hub.docker.com/,注册用户。
之后在命令行中输入 docker login
,根据提示输入用户名(不是注册的邮箱…)和密码即可登陆。
- 查看镜像:
docker images
- 运行镜像:
docker run -p 8080:80 -d nginx
, 参数-p 8080:80
是docker端口的映射,即将docker容器的80端口映射到本地的8080端口,-d
是以守护进程的方式运行,即后台运行nginx
是指的镜像名称。
输出的结果为docker容器的ID。
打开浏览器,访问:localhost:8080,即可看到nginx的的默认页面:
- 停止docker:
docker stop 容器ID
Docker 提交镜像
上一小节中,我们运行了一个nginx的docker容器,下面我们对容器中的内容进行修改
-
vim index.html
<html> <h1>Hello Docker</h1> </html>
-
docker cp index.html 8a06e5c0eb58b86://usr/share/nginx/html
,其中***8a06e5c0eb58b86***是容器的ID,然后刷新浏览器(localhost:8080),界面如下:
-
docker stop 8a06e5c0eb58b86
停止nginx容器,再重新启动容器:docker run -p 8080:80 -d nginx
,
检查浏览器输出(localhost:8080),发现界面又变成了nginx的默认界面,上一小节修改的内容未能保存。原因是在docker容器中做的所有操作都是暂时的,那怎么才能保存我们队容器所做的操作呢? -
重复步骤1和步骤二的操作,即:
(1) vim index.html #<html><h1>Hello Docker</h1></html (2) docker run -p 8080:80 -d nginx (3) docker cp index.html 8a06e5c0eb58b86://usr/share/nginx/html
在浏览器中访问localhost:8080,页面输出为Hello Docker
接着在命令行中输入:docker commit -m 'hello_docker' 8a06e5c0eb58b864 hello_docker
,
成功后,会在控制台输出新的镜像ID.
执行:docker images
其中***hello_docker***就是我们刚刚提交的一个新的镜像,可以运行它,检查容器内容。
Docker小节
命令 | 用途 |
---|---|
docker pull | 获取image |
docker build | 创建image |
docker images | 列出image |
docker run | 运行container |
docker ps | 列出container |
docker rm | 删除container |
docker rmi | 删除image |
docker cp | 在host和container之间拷贝文件 |
docker commit | 保存改动为新的image |