初识Docker
初识Docker
万物上云,虚拟化技术助力云计算蓬勃发展。仅以此文记录Docker学习历程。
为什么需要Docker?
许多程序开发者经常会遇到这样一个问题,A开发的软件在B的机器上运行不了,因为软件环境配置存在差异。为了解决这个问题,通用的方案是在安装软件时也将环境(Lib/Bin)给复制过来,保证软件环境的整体结构。
虚拟机(Virtual Machine,VM)技术是一种常见的解决方案。如下图左边部分所示,单个节点上可部署多个虚拟机来提升资源利用率。每个虚拟机含有自身的操作系统和软件环境,并搭载多种类型的应用程序。虚拟机之间资源隔离,因此各虚拟机搭载的应用程序不会相互干扰。但是,虚拟机含有自己的OS,每创建一个虚拟机都要创建一个属于该虚拟机的OS,单个OS将近占用GB级别内存空间(可想而知,内存开销有多大),体积大、启动慢、占用资源多。
容器(Linux Container,LXC)技术则客服了虚拟机存在的缺点,在进程级别对资源进行隔离,如下图右边部分所示,每个容器不含有自身的OS。相对于虚拟机而言,容器体积更小,启动更快、占用资源更少。
Docker是什么?
Docker是Linux容器的一种封装,提供简单易用的容器使用接口,是目前最流行的Linux容器解决方案。Docker将应用程序与该程序的依赖环境,打包到一个文件中。运行这个文件就会生成一个虚拟容器。应用程序在容器里运行,就像在自己的物理机器上运行一样。
Docker提供一次性的环境,便于本地测试别人的软件,部署、运行和删除操作简单便捷;提供弹性的云服务,随开随关,很适合动态伸缩服务场景;易于组件微服务架构,一台机器上可以运行多个容器和多个服务,同时也提升物理节点的资源利用率。
目前国内外大多数主流云计算服务厂商均采用Docker来部署自己的微服务架构,抓住时代的尾巴,现在上车还来得及。
Docker核心组件
Docker的核心组成部分包含下面几个部分:
image镜像:就是上面提到的应用程序和其依赖的环境,可以理解成一个环境实体;
container容器:image的实体,真正用来运行服务的载体(可以理解成image是一个类,而container则是对象,让image动起来),可支持创建、启动、停止、删除和暂停等操作;
repository仓库:image停车场,用来保存image
如图所示,每个节点可部署多个Docker容器(可以理解成一个进程,只不过这个进程已经对运行环境进行封装),容器依托于image创建运行。image镜像依托于仓库,若节点上所需的image不存在,则从仓库里拉(pull)下来。
Docker使用
安装Docker
参考官方文档https://docs.docker.com/。
Docker基本操作指令
# 获取image docker pull ubuntu:14.08 # ubuntu是仓库名称,14.08是版本,两者在一起用来唯一标记image # 启动一个容器 docker run -it ubuntu:14.08 /bin/bash # -i:允许与STDIN交互, -t:开个终端, exit或者ctrl+D退出 # 后台运行一个容器 docker run -itd --name myubuntu ubuntu:14.08 /bin/bash # --name:为容器命名 # 进入容器 docker attach myubuntu # 退出即停止容器 docker exec myubuntu # 在这里面退出,容器不会停止 # 查看后台容器输出 docker logs myubuntu # 查看所有容器 docker ps # 停止一个容器 docker stop myubuntu # 删除容器 docker rm -f myubuntu docker container prune # 清楚所有已处于终止状态的容器
镜像操作指令
# 列出镜像 docker images # 获取新的镜像 docker pull ubuntu:14.08 # 拉取镜像到本地 # 查找镜像 docker search ubuntu:14.08 # 也可以在 # 删除镜像 docker rmi ubuntu:14.08 # 使用dockerfile定制镜像 mkdir myngix cd myngix touch dockerfile ------------ dockerfile content ------------ FROM nginx # 指定基础镜像,必备,第一条指令,Docker Hub上还有很多其他官方镜像,例如redis,mysql,mongo等 RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html # 执行命令,尽量在一个RUN里完成多个操作来减少image的层数(每一个RUN需要一次commit操作来保存本次结果以构成新的镜像,RUN越多,镜像越臃肿) # 使用build指令根据dockerfile创建镜像 docker build -t myngix:0.1 .
端口映射
# 容器内部端口随意映射到主机的高端口 -P docker run -d -P ubuntu:14.08 ping 8.8.8.8 # 内部端口绑定到指定的主机端口 -p docker run -d -p 8080:80 ubuntu:14.08 ping 8.8.8.8 docker run -d -p 127.0.0.1:8080:80 ubuntu:14.08 ping 8.8.8.8 # 指定绑定的网络地址 docker run -d -p 127.0.0.1:8080:80/udp ubuntu:14.08 ping 8.8.8.8 # 默认走tcp协议,可更改为udp协议
上面只是最基本的docker知识,后续还要加强学习!
- 点赞
- 收藏
- 关注作者
评论(0)