这篇文章主要介绍“Docker基本使用方法有哪些”,在日常操作中,相信很多人在Docker基本使用方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Docker基本使用方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
简单来说,Docker 是一种虚拟化技术,虚拟化技术可以分至少3种。
第一种:硬件虚拟化,这是底层的技术实现。
第二种:软件虚拟化,比如常见的虚拟机。
第三种:就是我们今天所介绍的,容器虚拟化技术。
通俗地讲,虚拟化技术就是多个人,通过一种技术协作使用一台电脑来工作,使得每个人都觉得如同在自己的电脑上工作一样互不干扰。
为了更好的了解这三种虚拟化技术的运行机制,我们对比一下物理机、虚拟机、Docker 系统运行栈。
可以看到,无论是哪一种虚拟化技术,都是多层的。其中,蓝色部分是底层实现,黄色的部分是操作系统及以上的软件层面上的实现。层数越多,运行的开销就会更大。
物理机的系统运行栈分析:
第一层 Infrastructure:基础架构层
第二层 Host OS:操作系统层
第三层:二进制/依赖库
第四层:应用程序
虚拟机的系统运行栈分析:
底层实现上,虚拟机比物理机多了一层 Hypervisor。这是一个常用的硬件虚拟化软件,可以把底层的操作系统抽象出多个底层的硬件接口。
而在操作系统及以上的软件层面实现上,被分成了3个并行执行的虚拟机,而每一个并行运行的虚拟机和物理机相比,又多了一层 Guest OS,也就是每个虚拟机还要运行自己的操作系统,这是和物理机的一个比较大的区别。
Docker 的系统运行栈分析:
和虚拟机的结构相似,Docker 也被分为了若干个“容器”。但是和虚拟机相比,少了一层。可以直观的感受到,Docker 的运行效率要比虚拟机要高。
互联网常面临一个场景:爆发式的流量增长。在这种情况下,效率一定是第一位的。
针对以上三种虚拟化技术,从他们的部署、运行时间上,也可以对他们的运行效率简单对比:
物理机的部署,时间周期大概是以月为计算。包括建设机房,建设机架,部署机器,部署网络,部署机器的操作系统等,整个的部署周期十分长。
虚拟机:在购买之后几分钟,1个虚拟机就能创建完了。
Docker : Docker 的启动是秒级的。
从部署、运行时间上,可以看到 Docker 的效率十分高。
容器化技术其实不是一个新颖的技术,早在1978年,就有对容器化的探索。下图可以清楚的看到容器化技术的简史:
集装箱的出现改变了运输业,Docker 之于计算机行业,好比集装箱之于运输业。
2013年,Docker 对外开源,2014年6月9日正式发布,从 Docker 0.1到 Docker 1.0 短短15个月的时间,风靡全球。2017年正式宣布拥抱 K8S, 这标志着“容器管理系统之争”结束。
Docker 为什么可以广受接纳,有如下几个优势:
a. 持续部署与测试的一致性
Docker 能够保持容器内部所有的配置和依赖关系始终不变。你可以从开发到产品发布的整个过程中使用相同的容器来确保没有任何差异或者人工干预。
b. 多云平台兼容
可移植性好,可以在任何拥有 Docker runtime 的环境快速部署。例如 AWS GCP BCE Azure aliyun 都支持 docker,没有迁移的成本。
c. 环境标准化和版本控制
设想某次发布因为完成一个组件的升级而导致你整个环境都损坏了,Docker 可以在几分钟内轻松地滚回到这个镜像的前一个版本。
d. 隔离性
Docker 可以确保你的应用程序与资源是分隔开的。例如依赖多个不同版本的 tomcat 的时候不会因为依赖冲突导致崩溃。同时 Docker 还能确保每个容器只使用分配给它的额定资源,不会因为某个进程影响其他容器。
e. 安全性
由于 Docker 容器是隔离的,并且资源是受限制的。所以即使你其中一个应用程序被黑,也不会影响运行在其它 Docker 容器上的应用程序。
总结起来,Docker 的优点可以概括为以下三句话:
1. 一处成功,处处成功。
横跨开发、测试、部署环境
也不用管是在实体机、虚拟机、还是在某个云上
2. 高度集成,高度一致,使用方便
创建和部署十分便捷,效率极高
流水线作业,持续构建发布(CI/CD)
3. 结合微服务,大大提升工程研发效率
App 相互隔离,解耦依赖关系,方便弹性扩展
有安全保证,接入无负担
第一部分我们对 Docker 容器有一个基本的认识。这一部分,我们将通过一些实际的演练和操作,让大家掌握 Docker 容器的基本使用和镜像操作。在这一部分正式开展前,简单“扫盲”。科普一下 Docker 里的常用名词、Docker 的环境安装及 Docker 架构。
常用名词
Docker 镜像:Docker images
Docker 仓库:Docker repository
Docker 容器:Docker containers
Docker 宿主机:Docker host
Docker 守护进程:Docker daemon
Docker 客户端:Docker client
Docker 环境安装
Centos 系统环境安装 Docker:
curl-fsSL https://get.docker.com | bash-s docker
OSX 系统安装 Docker:
https://hub.docker.com/editions/community/docker-ce-desktop-mac
Windows 系统安装D ocker:
https://hub.docker.com/editions/community/docker-ce-desktop-windows
目前来说,除了 Linux 系统可以直接运行 Docker之外,其他系统都是基于虚拟机运行的。
Docker 的架构:C/S模型
Client: 与 Docker 通信的一个组件,也就是客户端。
Docker daemon : 相当于守护进程,也就是 docker 的 Server,他执行的结果是 Containers (容器)
Images: 镜像。镜像和容器之间的关系。运行起来的镜像就是一个容器。
Registry: 仓库。仓库具体存放的是镜像。
Docker repository 镜像仓库
镜像仓库是集中存放管理镜像的地方。仓库有分为公有仓库(DockerHub、DockerPool)和私有仓库。有了镜像仓库,用户可以用它来:
中心化的仓库,提供上传/下载 镜像的能力。
管理仓库中的镜像,大多数仓库都提供检索和版本整理能力。
DockerHub 是 Docker 官方提供的公共仓库,可以检索官方镜像,除此之外还有很多私有 registry,例如 BCE,也可以自己动手搭建自己的 Docker image repository。
Docker Hub 地址:https://hub.docker.com
DockerFile: 构建 Docker 镜像的源代码
Dockerfile 是用于生成 image 的源文件,源代码像编程一样,有自己的语法,编译方式,Dockerfile 也有自己的语法
以下是一些例子:
-FROM 基于已有的 Docker image 来生成
例如:FROM tomcat:8.0(含义:用 tomcat 这个镜像的8.0版本做为我们的基础镜像,然后将现有的镜像叠在该镜像之上)
-COPY 把用户的文件 copy 到 image 去
例如:COPY index.jsp /usr/local/tomcat/webapps/ROOT
(COPY 本机文件地址 镜像内文件地址)
-EXPOSE 对外通过该端口提供服务
例如:EXPOSE 8080
-CMD 启动该 image 应该运行的命令
例如:CMD[ “catalina.sh”, “run”]
入门命令1:获得帮助
Docker help [command]获取run命令的帮助。
入门命令2:镜像操作系列命令
Docker pull [name]:[tag] 拉取/更新某image
Docer image ls 列举当前的Docker image
Docker image rm[image ID] 删除某image
Docker build-t [name]:[tag] [dockerfile path]
从本地路径寻找 Dockerfile 构建镜像,并打 tag 上
入门命令3:镜像运行系列命令
Docker run-it ubuntu bash
-it:表示起一个交互终端,来 run 后面的命令
-d: 表示运行 docker 容器到后台
Docker ps 查看运行中的容器
Docker kill [container ID]终止容器
docker run -v dor1:dir2 redis 目录挂载
例如:docker run –v~:/ user-it Ubuntu bash 是把 host 的用户 home 主目录,映射为Docker实例中的/user目录。
Tips: 关于镜像的常见问题
1. 我的拉取的镜像究竟存到哪里了?
镜像有 Docker 管理,每个系统具体路径不一样。
Linux 系统存储在/var/lib/docker
OSX 系统存储在:
/Users/{YourUserName}/Library/Containers/com.docker.docker/Data
2. 我没有指定镜像的 tag 怎么办?
命令中没有指定镜像 tag 时会默认使用 latest 作为 tag。避免发生预期错误的方法是指定 tag。
3. 镜像删除不掉怎么办?
镜像之间可能会相互依赖(layer),添加-f可以强制删除。
1. 看容器 log:
Docker logs [container_id]
2. Inspect 获取容器/镜像的元数据。
Docker inspect [container_id]
3. 在 Docker 实例中执行交互的shell命令。
Docker exec –it [container_id] bash
Docker exec-it[container_id]s
1. 前期准备
Dockerfile 内容如下
FROM tomcat:8.0
COPY index.jsp /usr/local/tomcat/webapps/ROOT
EXPOSE 8080
Index.jsp 内容如下
<%< span="">
Out. Println(“Hello World, V1”);
%>
2. 构建镜像
Docker build-t mytomact:1.0
Docker run –p 8080:8080 –d mytomcat:1.0
Curl localhost:8080
Docker logs {容器 id}
1. 构建 Docker 镜像
Cd node/docker
Docker build –t hub.baidubce.com/bootcamp/mynode:1.0.0
2. 运行镜像
Docker run-d –p 8000:8080 hub.baidubce.com/bootcamp/mynode:1.0.0
Docker ps | grep mynode
Curl localhost:8000
3. 查看执行日志
Docker ps |grep mynode
Docker logs{container id}
Docker 是容器虚拟化的相关技术的结合,它的三大技术支柱包括:Cgroup,Namespace, AUFS。下面简单介绍一下者三大技术支柱
全称:Linux Control Group ,又称为 Cgroup,是 Linux Kernel 的一个功能。
由 Google 工程师发起并贡献。最终合入了内核代码;作用是限制一个进程组的资源(包括内存用量,CPU用量,磁盘IO,网络IO,网络优先级等)
http://man7.org/linux/man-pages/man7/cgroups.7 .html
例如:使用 Cgroup 限制一个进程资源的用量
Mkdir –p /sys/fs/cgroup/cpu/k8s_s1
Echo 50000>/cguop/cpu/k8s_s1/cpu.cfs_quota_us
将cpu.cfs_quota_us 设为50000
相当于cpu.cfs_period_us的100000是50%
Echo{PID}>/cgroup/cpu/foo/tasks
Namespace 是 Linux Kernel 提供的一种内核级别资源隔离的方法。又称为命名空间,它主要做访问隔离,即同一个命名空间的多个资源(memory, CPU, network, pid)可以相互看到,但是之外的看不到。
http://man7.org/linux/man_pages/man7/namespaces.7.html
目前 Namespce 种类有以下7种:
例如:使用 Namespace 隔离一个进程的资源
lSyscall. CLONE NEWPID: 隔离PID
lSyscall. CLONE_NEWNET :隔离网络
全称:Advanced Multilayered Unification File System。一种高性能分层文件系统,是Docker image的基石。可以把多个文件挂载到同一个挂载点。只有第一层(第一个文件夹层级)是可写的,其余层是只读的。增加/删除文件时都会转换为写操作写入可写层。
修改文件时,AUFS 利用 Cow 特性来修改只读层中的文件。不管修改数据的量的多少。在第一次修改时,文件都会被拷贝到可写层然后再被修改。AUFS 的 Cow 特性能够允许在多个容器之间共享分层,从而减少物理空间占用。
例如:使用AUFS创建多重挂载点
1.Mount-t aufs –o dirs.=./fruits=tw:./vegetables=rw none./mnt
2.Echo modify>> ./mnt/tomato
到此,关于“Docker基本使用方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。