目录
docker-compose logs [OPTIONS] [SERVICE...]
docker-compose exec [OPTIONS] SERVICE COMMAND [ARGS...]
Docker简介
是什么?
Docker 是一个开源的平台,用于开发、交付和运行应用程序。它使得应用程序可以与其依赖的所有组件打包在一个“容器”中,从而实现快速部署和一致的运行环境。Docker 主要包括以下几个方面的功能:
-
容器化技术:Docker 使用容器来封装应用程序及其依赖的所有库和配置文件。这使得应用程序可以在任何环境中运行,无论是开发人员的笔记本电脑、测试服务器还是生产环境。
-
镜像:Docker 镜像是一个轻量级的、独立的、可执行的软件包,其中包含了运行特定应用程序所需的一切代码、运行时、库和配置文件。你可以从镜像创建容器。
-
Docker Hub:这是一个云端的 Docker 镜像仓库,用户可以在上面存储和共享他们创建的镜像。它包含了大量的官方镜像和社区创建的镜像。
-
Docker Engine:这是 Docker 的核心组件,它负责创建和运行 Docker 容器。Docker Engine 包括一个 Docker Daemon(运行在宿主操作系统上,管理容器)和一个 Docker CLI(命令行界面,用户通过它与 Docker Daemon 交互)。
问题:为什么会有docker的出现
1. 环境一致性
在软件开发和部署过程中,开发环境、测试环境和生产环境之间的一致性问题常常导致应用程序在不同环境中表现不一致。Docker 通过容器化技术,将应用程序及其所有依赖打包在一个独立的环境中,从而保证了在任何地方运行的环境一致性。这解决了“在我电脑上可以运行”的问题。
2. 资源利用率
传统的虚拟机(VM)需要为每个实例运行一个完整的操作系统,这导致了大量的资源浪费。容器共享宿主操作系统的内核,每个容器仅包含应用程序和其依赖项,而不需要完整的操作系统,从而大大提高了资源利用率。相较于 VM,容器更加轻量级,启动速度更快,资源占用更少。
3. 敏捷开发与持续交付
随着敏捷开发和持续交付(CI/CD)方法的普及,开发团队需要更加快速和高效地构建、测试和部署应用程序。Docker 容器能够快速启动和销毁,使得开发和测试环境可以迅速搭建和回收,从而加快了开发和部署的速度。
4. 微服务架构
微服务架构是一种将应用程序分解为小的、独立的服务的方法。每个服务可以独立开发、部署和扩展。Docker 非常适合微服务架构,因为它提供了轻量级的隔离环境,允许每个微服务在独立的容器中运行,并且可以独立扩展和更新。
5. 易于移植
由于 Docker 容器包含了应用程序运行所需的所有环境和依赖项,它们可以轻松地从一个环境移植到另一个环境。这对于跨平台部署(如从开发环境到生产环境,从本地环境到云端)非常有用。
6. DevOps 文化
Docker 的出现与 DevOps 文化的兴起密切相关。DevOps 强调开发和运维之间的协作和自动化。Docker 提供了一种标准化的方式来构建、分享和运行应用程序,使得开发和运维团队可以更好地协作,从而提高了效率和可靠性。
7. 社区和生态系统
Docker 不仅是一个技术工具,它还得益于庞大的社区和丰富的生态系统支持。Docker Hub 提供了大量的预构建镜像,开发者可以方便地使用这些镜像来构建自己的应用程序。此外,围绕 Docker 的工具链(如 Docker Compose、Kubernetes 等)进一步增强了其功能和可用性。
docker核心概念
(1)镜像(Image)
Docker镜像是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件,另外还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像是一个静态的概念,不包含任何动态数据,其内容在构建之后也不会被改变。
(2)容器(Container)
镜像与容器的关系,就是面向对象编程中类与对象的关系,我们定好每一个类,然后使用类创建对象,对应到Docker的使用上,则是构建好每一个镜像,然后使用镜像创建我们需要的容器。
(3)仓库(Repository)
仓库是一个集中存储和分发镜像的服务。Docker Registry包含很多个仓库,每个仓库对应多个标签,不同标签对应一个软件的不同版本。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是Docker Hub,是Docker提供用于存储和分布镜像的官方Docker Registry,也是默认的Registry。
Docker Hub有很多官方或其他开发提供的高质量镜像供我们使用,如果要将我们自己构建的镜像上传到Docker Hub上,我们需要在Docker Hub上注册一个账号,然后把自己在本地构建的镜像发送到Docker Hub的仓库中。
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
能干什么?
之前的虚拟机技术
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,应用程序对此毫无感知,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
但是,这个方案有几个缺点:
-
资源占用多
-
冗余步骤多
-
启动慢
容器虚拟化技术
基于 Linux 内核的 Cgroup,Namespace,以及Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
最初实现是基于 LXC,从 0.7 以后开始去除 LXC,转而使用自行开发的 Libcontainer,从1.11 开始,则进一步演进为使用 runC 和 Containerd。
Docker和传统虚拟化技术的不同之处:
1. 架构
传统虚拟化技术(虚拟机)
-
虚拟机监控器(Hypervisor):虚拟机运行在 Hypervisor 上,Hypervisor 可以直接在硬件上运行(裸机型,如 VMware ESXi、Xen、Microsoft Hyper-V)或者在宿主操作系统上运行(宿主型,如 VMware Workstation、Oracle VirtualBox)。
-
独立操作系统:每个虚拟机都有自己的操作系统,包括完整的内核和用户空间,彼此之间完全隔离。
-
虚拟硬件:虚拟机包含虚拟硬件(CPU、内存、磁盘、网络接口等),这些虚拟硬件通过 Hypervisor 映射到实际的物理硬件。
Docker
-
共享操作系统内核:Docker 容器运行在共享的宿主操作系统内核上,每个容器只包含应用程序和其依赖项,而不包含操作系统内核。
-
轻量级隔离:容器使用操作系统级别的虚拟化(如 Linux 上的 cgroups 和 namespaces)来实现隔离,提供了进程级别的隔离环境。
-
标准化单元:Docker 容器是独立的运行时单元,但它们共享宿主操作系统的内核资源,避免了额外的操作系统开销。
2. 启动时间
传统虚拟机
- 启动一个虚拟机通常需要几分钟时间,因为需要启动一个完整的操作系统。
Docker
- 启动一个 Docker 容器通常只需要几秒钟,因为不需要启动操作系统,只需启动应用程序及其依赖环境。
3. 资源利用率
传统虚拟机
- 每个虚拟机运行一个完整的操作系统,这带来了额外的资源开销(CPU、内存、存储)。多个虚拟机实例会消耗更多的资源。
Docker
- Docker 容器共享宿主操作系统的内核,不需要额外的操作系统资源。容器更加轻量级,可以在同样的硬件上运行更多实例,提高了资源利用率。
4. 性能
传统虚拟机
- 虚拟机通过 Hypervisor 进行资源调度和管理,存在一定的性能损耗。
Docker
- 由于容器直接运行在宿主操作系统上,没有 Hypervisor 的中介层,容器的性能接近于原生应用。
5. 存储和网络
传统虚拟机
- 每个虚拟机有独立的虚拟磁盘和网络接口,通过 Hypervisor 管理虚拟机之间的网络和存储资源。
Docker
- Docker 使用卷(volumes)和网络插件来管理容器的存储和网络,提供了灵活和高效的存储和网络解决方案。
6. 管理和部署
传统虚拟机
- 虚拟机管理涉及虚拟机模板、快照、迁移等操作,管理起来相对复杂。
Docker
- Docker 提供了一系列工具(如 Docker Compose、Swarm 和 Kubernetes)来简化容器的编排、部署和管理,使得大规模容器化应用的管理更加便捷。
7. 使用场景
传统虚拟机
-
适用于需要强隔离的多租户环境,适合运行需要独立操作系统的传统应用。
-
常用于基础设施即服务(IaaS)平台,如 AWS EC2、Microsoft Azure VM。
Docker
-
适用于现代微服务架构、敏捷开发和持续交付(CI/CD)环境。
-
常用于平台即服务(PaaS)和容器即服务(CaaS)平台,如 AWS ECS、Google Kubernetes Engine(GKE)。
Docker安装
Vulhub - Docker-Compose file for vulnerability environment
Docker常见命令
docker version
显示docker的版本信息
docker info
显示docker的系统信息,包括镜像和容器的数量
docker --help
帮助命令
容器命令
docker run
新建容器并启动 例:docker run -it -d -p8881:80 lamp5.5.9:latest /start.sh
--name
指定容器名字用来区分容器,–name="Name"或者 --name “Name”
-i
保持容器运行。通常与 -t 或 -d同时使用
-t
为容器重新分配一个伪输入终端,通常与 -i 同时使用,容器创建后自动进入容器中,退出容器后,容器自动关闭。
-d
以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。-it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器。
-P
(大写) 随机指定端口
-p
宿主机端口:容器端口 端口映射
-v
宿主机目录:容器目录 目录映射
-e
指定容器运行的环境变量
-w
指定容器内工作目录
docker ps
列出所有运行的容器
-a, --all
: 显示所有容器(默认只显示正在运行的容器)。
-f, --filter filter
: 根据提供的条件过滤输出。
--format string
: 使用 Go 模板对容器信息进行美化输出。
-n, --last int
: 显示最后创建的 n 个容器(包括所有状态)(默认值为 -1)。
-l, --latest
: 显示最新创建的容器(包括所有状态)。
--no-trunc
: 不截断输出。
-q, --quiet
: 只显示容器 ID。
-s, --size
: 显示总文件大小。
docker exec
进入容器内部
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
:在运行的容器中执行命令。
exit/Ctrl + P + Q
退出容器
docker start
启动一个或多个已经被停止的容器
docker stop
停止一个或多个运行中的容器
docker restart
重启一个或多个容器
docker kill
强制终止一个或多个容器
docker rm
删除一个或多个容器
-f, --force
:强制删除正在运行的容器(使用 SIGKILL 信号)。
-l, --link
:删除指定的链接。
-v, --volumes
:删除与容器关联的匿名卷。
docker inspect
查看容器信息
docker logs
查看容器日志
docker cp
容器主机间拷贝
镜像命令
docker images
查看所有本地镜像
-a, --all
:显示所有镜像(默认隐藏中间镜像)。
--digests
:显示摘要(digests)。
-f, --filter filter
:根据提供的条件过滤输出。
--format string
:使用 Go 模板美化镜像输出。
--no-trunc
:不截断输出。
-q, --quiet
:只显示镜像 ID。
docker rmi
删除镜像
docker image inspect
查看镜像详情
docker history
查看镜像的创建历史
docker build
构建镜像
docker build -f dockerfile文件路径 -t 镜像名:[tag]
docker save
导出镜像
docker load
导入镜像
仓库命令
docker login
登录仓库
私有仓库登录后能上传拉取,不登录不能上传拉取。公有仓库,登录可以上传拉取,不登录只能拉取不能上传。
docker search
查找镜像
-f, --filter filter
:基于提供的条件过滤输出。
--format string
:使用 Go 模板美化搜索结果输出。
--limit int
:搜索结果的最大数量(默认为 25)。
--no-trunc
:不截断输出。
docker pull
拉取镜像
-a, --all-tags
:下载存储库中的所有带标签的镜像。
--disable-content-trust
:跳过镜像验证(默认为 true)。
--platform string
:如果服务器支持多平台,则设置平台。
-q, --quiet
:抑制详细输出。
docker push
上传镜像到仓库
-a, --all-tags
:推送存储库中的所有带标签的镜像。
--disable-content-trust
:跳过镜像签名(默认为 true)。
-q, --quiet
:抑制详细输出。
Docker Compose 命令
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。
docker-compose up
构建、(重新)创建、启动并附加到容器。
docker-compose down
停止并删除容器、网络、卷和镜像。
docker-compose build
构建或重新构建服务。
docker-compose start
启动已停止的服务容器。
docker-compose stop
停止运行的容器,而不删除它们。
docker-compose restart
重启服务容器。
docker-compose ps
列出所有容器。
docker-compose logs [OPTIONS] [SERVICE...]
查看服务容器的日志。
docker-compose exec [OPTIONS] SERVICE COMMAND [ARGS...]
在一个正在运行的容器中执行命令。