首页 > 自考资讯 > 自考知识

docker是用来做什么的,docker 有什么用

头条共创 2024-06-27

00996b58de3b43c0a6b63954bdbb1f08~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720060982&x-signature=ivfuVTXHH4isJKQr9pYD1LDJxDA%3DJava食堂是一个原创度高、收藏力高、信息有用的微信公众号,共同成长进步,欢迎关注

Docker是什么?

Docker是一个基于轻量级虚拟化技术的容器,整个项目基于Go语言开发并使用Apache 2.0协议。 Docker可以将应用程序打包到容器中,容器中包含应用程序代码、执行环境、依赖库、配置文件和其他必要的资源。容器提供与部署方法解耦的方便快捷的自动化。无论部署时的环境如何,容器内的应用程序都在同一环境中运行。

例如,小明创建了一个CMS系统,该系统拥有非常广泛的技术堆栈,并且依赖于各种开源库和中间件。如果采用纯手动部署方式,小明将需要安装各种开源软件,并为每个开源软件创建配置文件。这个时间开销对于一次性部署来说还是可以接受的,但是如果小明需要每隔几天更换一次服务器来部署程序,这些繁琐且重复的任务就太疯狂了。此时,小明只需要按照应用部署说明创建Dockerfile(安装、配置等操作均由Docker自动处理)、构建、发布即可。这样,在任何机器上,小明只需要检索所需的镜像,直接部署并运行即可。这就是Docker 的美妙之处。

那么什么是镜子呢?镜像是Docker中的一个重要概念。

图像:类似于虚拟机中使用的图像。由于每个应用程序都需要自己的执行环境,因此镜像是用于提供所需执行环境的模板。容器:容器是Docker 提供的抽象层,就像轻量级沙箱,包含最小的Linux 系统环境以及在其中运行的应用程序。容器是镜像的运行实例(镜像本身是只读的。当容器启动时,Docker会在镜像之上创建一个可写层。容器内的更改不会影响镜像。如果要保存它在镜像中(在您的更改中),Docker 采用了基于容器生成新镜像层的策略)。 Docker Engine使用容器来操作和隔离各个应用程序(即每个容器内的应用程序是相互独立的)。其实,Docker的概念可以从英文单词Docker和Container的本义来理解。集装箱是通过机械装置轻松装卸货物的世界标准,它的发明简化了物流运输的机械化过程,使建立标准化的物流运输系统成为可能。 Docker代表dockworker,可以认为是一个端口worker,将应用程序打包到具有一定标准化规范的“容器”中(实际上,我们这里指的容器就是Docker)。一旦货物运输到目的地,码头工人(Docker)就可以拆卸集装箱并取回货物(通过根据镜像创建集装箱并运行它)。这种标准化和分离性允许您组合多个镜像来构建应用程序环境(Docker 还建议每个镜像遵循单一责任原则,这意味着它只做一件事),从而可以轻松地与其他镜像共享您的应用程序。

本文由SylvanasSun (sylvanas.sun@gmail.com) 撰写,最初发表在SylvanasSun 的博客上。

原文链接:sylvanassun.github.io/2017/11/19/.

(如果您转载,请务必保留此说明和超链接。)

Docker VS 虚拟机

上面我们提到Docker与我们平时使用的虚拟机不同,因为它是基于轻量级虚拟化技术的。虚拟机技术可以分为两类:

7ff1ea622af4491fbdb1528f1a01a94c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720060982&x-signature=rFYAhdkAf6Og27Vp5TdzumuQqeg%3D 系统虚拟机

系统虚拟机:通过计算机系统的软件模拟来替代真实计算机。它是物理硬件的抽象,提供运行完整操作系统所需的功能。虚拟机通过物理机管理和共享硬件,让您实现多个虚拟机环境之间的隔离。一台机器上可以运行多个虚拟机,每个虚拟机都包含操作系统的完整副本。对于系统虚拟机,您执行的软件或操作仅影响该虚拟机的环境。我们经常使用的VMWare是系统虚拟机的一种实现。程序虚拟机:允许程序在平台之外独立运行。一个典型的例子是JVM。 Java通过JVM抽象层将Java程序与操作系统和硬件平台解耦,实现了所谓的“一次编译,随处运行”。 Docker采用的技术与上述两者不同,采用了更轻量级的虚拟化技术。多个容器共享相同的操作系统内核并像在本地运行一样运行。与虚拟机相比,容器技术将代码和依赖打包在一起,允许多个容器运行在同一台机器上,并共享多个容器。这些特性证明容器比虚拟机(通常是虚拟机和Docker的组合)更加灵活和轻量。

a96fc162f92a4ad38ef2111c5dbe1f34~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720060982&x-signature=VYBxlx6%2BJweLqObGhTaoL36OX60%3D 容器技术实际上可以追溯到UNIX的chroot(1979年在V7 Unix中引入),它允许您更改当前正在运行的进程及其子目录。指定环境无法访问指定目录树之外的文件,限制了用户活动范围,为进程提供了隔离空间。

随后,由于Linux内核中容器的定义过于宽泛和混乱,Google于2006年在各个Unix版本中提出了“进程容器”,目的是启用进程资源隔离相关的功能。该项目后来更名为CGroups(控制组),以便对流程实施资源限制。

2008年,LXC(Linux容器)发布。它是一种操作系统级虚拟化技术,用于通过共享内核在Linux系统上运行多个隔离的程序(容器)。 LXC 结合了Linux 内核的CGroup 和对隔离命名空间的支持,为应用程序提供隔离的环境。 Docker也是基于LXC实现的(Docker的前身是PaaS服务提供商dotClound的内部项目),并且有很多改进。

使用Docker

在使用Docker 之前,您必须先安装Docker(这看起来像是废话……)有关安装说明,请参阅“安装Docker”文档或自行Google 研究。

安装完成后,输入docker --version 检查安装是否成功。

$ docker --versionDocker version 17.05.0-ce-rc1, build 2878a85 您还可以从Docker Hub 复制代码来拉取其他人发布的镜像。您还可以注册一个帐户来发布您的图像并与他人分享。

[root@Jack ~]# docker search redis # 检查redis镜像是否存在[root@Jack ~]# docker pull redis # 将redis镜像拉取到本地使用默认tag:拉取最新的仓库尝试拉取docker.io/library/redis 。latest: docker.io/library/redisDigest: 从sha256:cd277716dbff2c0211c8366687d275d2b53112fecbf9d6c86e9853edb0900956[root@ Jack ~]# docker image # 显示镜像信息Repository Tag IM Age ID Cre docker.io/python 3.6-onbuild 7195f9298ffb 大小2 周前691.1 MBdocker.io/mongo 最新d22888af0ce0 2 周前360.9 MBdocker.io/redis 最新8f2e175b3bd1 2 周前106.6 MB 复制代码现在您已经创建了映像,您可以在其上运行容器。 命令是:

[root@Jack ~]# docker run -d -p 6379:6379 redis # 运行redis。 -p 表示将本地机器上的6379端口映射到容器上的6379端口。 -d 表示后台启动[root@Jack ~]# docker ps -a # 查看容器信息。如果没有-a,则仅显示当前正在运行的容器。 # 如果要进入容器,需要运行以下命令: [root@Jack ~]# docker ps # 首先获取容器的idCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1f928073b7eb redis 'docker-entrypoint.sh' 45秒前Up 44秒0.0.0.0:6379-6379/tcp destroy_khorana[root @Jack ~] # docker exec -it 1f928073b7eb /bin/bash # 然后运行这个命令进入容器root@1f928073b7eb:/data# touch hello_docker.txt # 在容器中创建文件root@1f928073b7eb:/data# exit # 退出exit[root@Jack ~]# #也可以在启动时直接输入命令如下。 [root@Jack ~]# docker run -d -it -p 6379:6379 redis /bin/bash 复制代码如果您想保留此更改,则您已对容器进行了更改。您可以使用commit 命令生成新映像。

# -m 是描述性信息。 a是创造者。 1f9是您要保存的容器ID。 Docker 可以通过前三个字符来识别。 # sylvanassun/redis 是镜像名称。test是一个常用的识别版本的标签。 [root@Jack ~]# docker commit -m 'test' -a 'SylvanasSun' 1f9 sylvanassun/redis:testsha256:e7073e8e5bd70b8d58092fd6bd8c2551e65dd29241c235eddf2a7f4b4b25cbbd[root@Jack ~]# docker 镜像仓库标签镜像ID 创建大小sylvanassun/redis test e7073e8e5bd7 2 秒前106.6 MBdocker.io/python 3.6-onbuild 7195f9298ffb 2 周前691.1 MBdocker.io/mongo 最新d22888af0ce0 2 周前360.9 MBdocker.io/redis 最新8f2e175b3bd1 2 周前106.6 MB 复制代码在删除之前删除容器或映像也很容易。容器或镜像,您必须删除依赖于该镜像的容器(如果有)。

[root@Jack ~]# docker stop 1f9 # 关闭一个正在运行的容器还有一个docker start id 命令启动一个容器1f9 [root@Jack ~]# docker rm 1f9 # 删除一个容器1f9[root@Jack ~ ] # docker rmi e70 # 删除上面保存的镜像Untagged: sylvanassun/redis:testDeleted: sha256:e7073e8e5bd70b8d58092fd6bd8c2551e65dd29241c235eddf2a7f4b4b25cbbdDeleted 33 sha256:751db4a870e5f703082b31c1614a19c86e0c967334a61f5d22b2511072aef56d 复制代码如果您自己构建镜像,请创建一个Dockerfile 文件,用于描述镜像的依赖环境以及需要如何配置应用程序。环境。

# 使用python:2.7-slim作为父镜像FROM python:2.7-slim# 跳转到/app其实是cd命令WORKDIR /app# 将当前目录(.)的内容镜像到/app目录下复制到ADD . /app # RUN 代表您正在运行的shell 命令。以下命令根据requirements.txt安装Python应用程序的依赖包。允许外部访问的端口80 EXPOSE 80 # 定义环境变量ENV NAME World. # 容器启动时执行的命令在运行时只执行一次,与CMD ['python', 'app.py']不同。复制代码并使用docker build -t xxx/xxxx .command 构建映像。 -t 后跟镜像名称、标签等信息。当前目录。

在学习了如何构建自己的镜像后,您想将它们发布到Docker Hub 并与其他人共享吗?为此,首先需要注册一个Docker Hub 帐户,然后使用docker login 需要使用命令登录,然后推送docker 镜像名称。这就像使用Git 一样简单。

有关其他Docker 命令和使用信息,请参阅Docker 文档| Docker 文档。我们还建议使用Docker Compose 构建映像,它允许您轻松组合和管理多个映像。

结语

Docker 提供了极其强大的自动化部署方法和灵活性,可以隔离多个应用程序并提供开发敏捷性、控制性和可移植性。同时,Docker也在不断帮助越来越多的企业迁移到云端、向微服务转型、向DevOps模式迁移。

如今微服务和DevOps越来越流行,为什么要拒绝Docker呢?让我们一起拥抱Docker,选择拥抱未来。

作者:SylvanasSun 链接:https://juejin.im/post/5a11710ef265da432002d689

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢