什么是Docker?
Docker 是一个基于 Go 编程语言开发的开源应用容器引擎,遵循 Apache2.0 协议开源。它可以让企业创建、测试和部署各种应用程序和软件包到被称为容器的单元中,轻松创建一个轻量级、便携、自给自足的容器,用于在单个主机上运行任何应用程序。
Docker的常见用途是什么?
- 自动打包和发布 Web 应用程序。
- 自动化测试和持续集成、发布。
- 在面向服务的环境中部署和调整数据库或其他后台应用程序。
- 通过从头开始编译或扩展现有的 OpenShift 或 Cloud Foundry 平台来构建自己的 PaaS 环境。
- 10分钟学会使用 Docker 部署 Ghost 博客 https://www.linuxmi.com/docker-bushu-ghost.html
- 使用 Docker 安装 WordPress 图文指南 https://www.linuxmi.com/docker-install-wordpress.html
- 在 Ubuntu 上安装 Docker 分步图文指南 https://www.linuxmi.com/ubuntu-docker-zhinan.html
Docker 的优势是什么?
Docker 能够将应用程序与基础设施分离,使您能够快速交付软件。通过利用 Docker 快速交付、测试和部署代码的方法,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
- 灵活性:即使是最复杂的应用程序也可以被容器化。
- 轻量级:容器利用并共享主机内核。
- 不可变性:容器镜像是不可变的。
- 可移植性:可以在本地构建,部署到云端,并在任何地方运行。
- 可伸缩性:可以根据需要添加和分发容器副本。
- 可堆叠:服务可以在垂直方向上堆叠并立即启动。
Docker 和虚拟机之间的区别是什么?
虚拟机通过添加 Hypervisor 层来虚拟化虚拟硬件,例如网络卡、内存和 CPU,然后在其上构建虚拟机。每个虚拟机都有自己的系统内核。
另一方面,Docker 容器通过隔离(命名空间)来隔离文件系统、进程、设备和网络等资源,然后通过 cgroup 控制权限、CPU 资源等,使容器之间不会互相影响。
容器消耗的资源更少。在同一主机下,可以创建的容器数量比虚拟机多。 然而,虚拟机的安全性略高于容器,Docker 容器与主机共享内核和文件系统,更容易受到其他容器的影响,从而影响主机的安全性。
请解释 Docker 的三个核心特性。
- 镜像(Image):Docker 镜像是创建容器的基础,类似于虚拟机的快照,并且可以理解为 Docker 容器引擎的只读模板。
- 容器(Container):从镜像创建的正在运行的实例,可以启动、停止和删除。每个创建的容器都是隔离的,互相看不到,以确保平台的安全性。
- 仓库(Registry):Docker 仓库是具有相同名称但具有不同标记的不同 Docker 镜像的集合。标记就像 Docker 镜像的版本,例如 v1、v2、v2.1 等。
如何修改Docker的存储位置?
默认情况下,Docker的存储位置是:/var/lib/docker。要更新默认的存储位置,需要停止Docker进程:
$ systemctl stop docker
更新/etc/docker/daemon.json
配置文件如下:
{
"data-root": "/new/docker/storage/location"
}
然后重新启动守护进程:
$ systemctl daemon-reload
$ systemctl start docker
常用的Docker命令有哪些?
- docker pull
- docker push
- docker info
- docker inspect
- docker stop
- docker start/restart
- docker rmi
- docker rm
如何创建一个 Nginx 容器?
使用docker run命令:
$ docker run -d --name my-nginx -p 8080:80 nginx:latest
1d24755e09ffdacc017f6a1d703bc098d24e56f3dc2cabe069b2551c2074ccd7
相关:如何在 Docker 容器中运行 Nginx https://www.linuxmi.com/docker-run-nginx.html
如何进入正在运行的容器?
可以使用docker exec命令,例如:
$ docker exec -it my-nginx bash
什么是 Docker 容器的运行过程?
- 检查本地是否存在指定的镜像。当镜像不存在时,将从公共仓库下载;
- 使用镜像创建并启动容器; 为容器分配文件系统,在只读的镜像层外面挂载一个读写层;
- 从主机配置网络桥接(默认模式);
- 为容器分配地址池中的 IP 地址;
- 执行用户指定的应用程序,执行后容器终止。
Docker 网络模式有哪些?
- host:使用 host 网络模式,容器的网络栈与 Docker 主机不隔离(容器共享主机的网络命名空间),容器不会被分配自己的 IP 地址。
- bridge:它使用软件桥接,允许连接到同一桥接网络的容器进行通信,同时提供与未连接到该桥接网络的容器的隔离。
- container:这种模式指定新创建的容器与现有容器共享网络命名空间,而不是与主机共享。
- none:使用 none 模式,Docker 容器拥有自己的网络命名空间,但不为 Docker 容器进行任何网络配置。也就是说,该 Docker 容器没有网络接口卡、IP、路由和其他信息。在这种网络模式下,容器只有 lo 回环网络,没有其他网络接口卡。无法连接到此类型的网络,但封闭的网络可以确保容器的安全性。
什么是Docker数据卷?
数据卷是容器中使用的特殊目录,位于容器内。可以将主机的目录挂载在数据卷上,并且可以立即看到数据卷的修改操作,更新后的数据不会影响镜像,从而实现主机和容器之间数据的迁移。数据卷的使用类似于Linux下的目录挂载操作。
如果需要在容器之间共享一些数据,则最简单的方法是使用数据卷容器。数据卷容器是一个普通的容器,为其他容器提供数据卷进行挂载和使用。
CMD和EntryPoint之间有什么区别?
它们都指定在容器启动时执行的程序,但有以下区别:
当docker run命令中指定参数时,Docker Daemon 会忽略 CMD 命令。例如:
$ docker run my-image echo Hello
将替换 Dockerfile 中的 CMD 行。
EntryPoint 指令不会被忽略,而是被视为命令的参数附加在命令行后面。例如:
# Dockerfile
From ubuntu:20.04ENTRYPOINT
["echo", "Hello From ENTRYPOINT"]
$ docker build . -t my-ubuntu
$ docker run my-ubuntu
Hello From ENTRYPOINT
如果带以下参数运行:
$ docker run my-ubuntu echo hello Again
Hello From ENTRYPOINT echo hello Again
ADD 和 COPY 有什么区别?
- ADD:从 <src> 处复制新文件、目录或远程URL,并将它们添加到 <dest> 处的镜像文件系统中。它也可以进行本地 tar 提取。
- COPY:将 <src> 中的新文件或目录复制到容器的文件系统中路径为 <dest> 处。
总的来说,COPY 更透明,因此通常更受欢迎。因为镜像大小很重要,强烈不建议使用 ADD 从远程URL获取软件包,而应使用 curl 或 wget。
OK,这就是本文的内容。如果还有什么疑问,请在下面的评论区告诉我们。
相关:
- 如何使用 Nginx 和 Docker 实现负载均衡 https://www.linuxmi.com/nginx-docker-load-balancer.html
- Portainer:Linux 上 Docker 的 GUI 管理器入门 https://www.linuxmi.com/portainer-linux-docker-gui.html