Docker概述

Docker概述

什么是docker?

Docker 是一种具有强大功能的容器化技术

一、基本概念

Docker 诞生于 2013 年,由 Go 语言实现。它允许开发者将应用及其依赖包打包到一个轻量级、可移植的容器中,这个容器就像是一个独立的 "软件盒子",可以在任何流行的 Linux 机器上运行。与普通虚拟机不同,Docker 容器只虚拟软件需要的运行环境,性能开销极低,而虚拟机是一个完整庞大的系统,包含很多可能并非应用必需的软件。

二、核心特性

  1. 轻量级与可移植性

    • Docker 容器非常轻量,这使得它们可以快速启动和停止,占用的系统资源较少。同时,由于容器的可移植性,开发者可以在不同的环境中轻松部署应用,无需担心环境差异带来的问题。

    • 例如,一个在开发环境中构建的 Docker 容器,可以无缝地部署到测试环境和生产环境中,大大提高了开发和部署的效率。

  2. 沙箱机制与隔离性

    • 容器采用完全的沙箱机制,相互隔离。这意味着不同的容器之间不会相互影响,即使一个容器出现问题,也不会影响到其他容器的运行。

    • 比如,在一个服务器上运行多个不同的应用,每个应用都可以放在独立的 Docker 容器中,这样可以确保各个应用之间的安全性和稳定性。

三、与虚拟机的比较

普通虚拟机模拟的是一整个完整的操作系统,包括内核等各个层面,而 Docker 容器则是在操作系统层面上进行虚拟化,只提供应用所需的运行环境。这使得 Docker 容器在启动速度、资源占用等方面具有明显优势。虚拟机通常需要几分钟甚至更长时间来启动,而 Docker 容器可以在几秒钟内启动。此外,虚拟机占用的磁盘空间较大,而 Docker 容器则相对较小。

四、应用场景

  1. 软件开发与测试

    • 在软件开发过程中,开发者可以使用 Docker 来构建一致的开发环境,确保不同开发者之间的环境一致性,减少因环境差异导致的问题。

    • 在测试阶段,Docker 可以快速创建测试环境,方便进行各种测试,提高测试效率。

  2. 持续集成与持续部署(CI/CD)

    • Docker 可以与 CI/CD 工具集成,实现自动化的构建、测试和部署流程。每次代码提交后,CI/CD 系统可以自动构建 Docker 容器,并将其部署到测试环境或生产环境中。
  3. 微服务架构

    • 在微服务架构中,每个微服务都可以部署在独立的 Docker 容器中,这样可以实现微服务之间的隔离,提高系统的可扩展性和可靠性。

简单来说,Docker 是一种能将应用及其依赖打包进轻量级、可移植容器的技术。它就像一个魔法盒子,让开发者可以把软件和其所需的运行环境一起封装起来,然后在不同的 Linux 机器上轻松运行。容器之间相互隔离,性能开销小,相比传统虚拟机更加高效便捷。可以把它理解为一个更精简的 "虚拟机",只提供软件运行必需的环境,不包含多余的内容。

Docker 的主要功能包括:

一、打包功能

将软件运行所需的依赖、第三方库以及软件本身高效地打包到一起,形成一个类似安装包的容器。这个过程就像是把一个复杂的软件生态系统压缩进一个独立的 "包裹" 中。这样做的好处在于确保了应用的完整性和一致性。无论在哪个环境中部署,都能保证应用所需的各种组件齐全,不会因为缺少某个依赖而无法正常运行。例如,一个复杂的数据分析软件,可能需要特定版本的 Python 解释器、多个数据分析库以及一些配置文件。通过 Docker 打包,这些元素都被整合在一起,使得在不同的开发、测试或生产环境中都能以相同的状态运行。

二、分发功能

允许将打包好的容器上传到镜像仓库,实现便捷的分发。镜像仓库就像是一个软件的 "宝库",其他人可以轻松地从中获取所需的容器镜像并进行安装。这种分发方式极大地提高了软件的传播和共享效率。比如,一个开源的 Web 应用,开发者将其打包成 Docker 容器并上传到公共镜像仓库后,其他开发者或用户可以快速获取这个应用的容器镜像,无需再费力地安装各种依赖和配置环境,大大节省了时间和精力。

三、部署功能

凭借一个简单的命令,就可以在 Windows、Mac、Linux 等不同操作系统上快速运行应用,自动模拟出完全一致的运行环境。这使得应用的部署变得极为简单和高效。无论目标环境是哪种操作系统,Docker 都能确保应用在其中稳定运行,不受操作系统差异的影响。例如,一个在 Linux 环境下开发的应用,需要部署到 Windows 服务器上。通过 Docker,只需要在 Windows 服务器上运行相应的 Docker 命令,就可以轻松地启动这个应用的容器,而无需担心不同操作系统之间的兼容性问题。

Docker架构

Docker 采用客户端 - 服务器架构,主要组成部分如下:

一、客户端与守护进程

  1. 客户端(Docker Client)

    • Docker 客户端是用户与 Docker 系统交互的接口。用户通过客户端向守护进程发送各种指令,如构建镜像、运行容器、管理容器等。

    • 它提供了简洁的命令行界面和丰富的 API,方便用户进行操作。例如,用户可以在命令行中输入 "docker run" 命令来启动一个容器。

  2. 守护进程(Docker Daemon)

    • 守护进程是 Docker 的核心组件,负责完成构建、运行和分发 Docker 容器的繁重工作。

    • 它接收来自客户端的指令,并执行相应的操作。例如,当用户请求构建一个镜像时,守护进程会读取指定的 Dockerfile,执行其中的指令,构建出一个新的镜像。

二、仓库(Repository)

  1. 功能与作用

    • 仓库是 Docker 提供的用于保存镜像的地方。它就像一个软件仓库,存储着各种不同的镜像,用户可以从仓库中下载所需的镜像,也可以将自己构建的镜像上传到仓库中进行分享。

    • 仓库可以是公共的,也可以是私有的。公共仓库如 Docker Hub,提供了大量的开源镜像,方便用户快速获取和使用。

  2. 镜像管理

    • 用户可以通过客户端命令来管理仓库中的镜像,如搜索镜像、拉取镜像、推送镜像等。例如,使用 "docker search" 命令可以在仓库中搜索特定的镜像,使用 "docker pull" 命令可以从仓库中拉取镜像到本地。

三、镜像(Image)

  1. 定义与特点

    • 镜像就是一个可执行的包,用来创建容器。它包含了应用程序及其所有依赖项,以及运行应用所需的操作系统环境。

    • 每一个软件在 Docker 中都可以表示为一个镜像。镜像具有分层结构,这使得镜像的构建和共享更加高效。例如,如果多个镜像都基于相同的基础操作系统镜像构建,那么它们可以共享这个基础镜像的层,从而减少存储空间和构建时间。

  2. 构建与使用

    • 用户可以通过编写 Dockerfile 来定义镜像的内容和构建过程。Dockerfile 是一个文本文件,包含了一系列指令,用于描述如何构建镜像。例如,指定基础镜像、安装软件包、设置环境变量等。

    • 构建好的镜像可以被多次使用来创建容器。每次创建容器时,Docker 会从镜像中创建一个新的可写层,容器在这个可写层上进行运行和修改,而镜像本身保持不变。

四、容器(Container)

  1. 容器的性质

    • 容器是镜像运行时的实体。它是一个独立的运行环境,包含了应用程序及其所需的所有资源。容器可以被创建、启动、停止、删除、暂停等。

    • 容器之间相互隔离,每个容器都有自己独立的文件系统、网络配置和进程空间。这确保了不同容器中的应用不会相互干扰。

  2. 生命周期管理

    • 用户可以通过客户端命令来管理容器的生命周期。例如,使用 "docker create" 命令创建一个新的容器,使用 "docker start" 命令启动容器,使用 "docker stop" 命令停止容器,使用 "docker rm" 命令删除容器等。

    • 容器的状态可以随时被监控和调整,以满足不同的应用需求。例如,可以查看容器的运行状态、日志信息,调整容器的资源分配等。

**仓库(**Repository):**是docker提供的一个用来保存镜像的仓库.

镜像( Image**)**:**镜像就是一个可执行的包,用来创建容器,docker中每一个软件就是一个镜像.

**容器(**Container):**容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

Docker安装

Docker可以运行在MAC,Windows,CentOS,UBUNTU等操作系统上,本过程基于CentOS8安装Docker。

官网:https://www.docker.com

1.安装yum-utils,配置镜像源需要使用

yum install -y yum-utils

2.设置更新docker镜像源

yum-config-manager \

--add-repo \

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安装

yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

4.测试docker版本

docker -v

5.启动常用命令

docker安装成功后并没有启动,

启动命令

systemctl start docker

关闭命令

systemctl stop docker

设置开机自动启动

systemctl enable docker

Docker卸载

1.停止服务

systemctl stop docker

2.卸载

yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin

3.删除文件

rm -rf /var/lib/docker

rm -rf /var/lib/containerd

Docker配置

1.配置镜像加速

(1)在etc下创建docker目录

mkdir -p /etc/docker

(2)进入docker目录

cd /etc/docker

(3)创建daemon.json文件

touch daemon.json

(4)修改文件

vim daemon.json

{

"registry-mirrors": ["https://dockerhub.icu"]

}

(5)重载配置

systemctl daemon-reload

(6)重启

systemctl restart docker

Docker服务命令

Docker镜像命令

**镜像列表:**docker images

从docker仓库拉取镜像到本地仓库: docker pull

删除本地镜像: docker rmi 镜像名/镜像id

从dockerfile构建镜像: docker build

保存镜像到本地,生成tar文件: docker save

载入本地镜像: cd /opt(打开本地镜像) docker load -i 镜像名

推送镜像到服务器: docker push

Docker容器命令

删除容器,需要容器停止运行,然后再把容器删除,然后删除镜像,如以下步骤

创建一个新的容器并运行: docker run 镜像名

查看容器: docker ps -a

启动容器: docker start 容器名

**停止容器:**docker stop 容器名

删除容器: docker rm 容器名

查看容器日志: docker logs 容器名

镜像和容器

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。

Docker安装mysql

下载镜像: docker pull mysql:8.0

安装: docker run -d -p 3306:3306 \

--name mysql \

--restart=always \

--privileged=true \

-e TZ=Asia/Shanghai \

-e MYSQL_ROOT_PASSWORD=root \

mysql:8.0

进入到容器: docker exec -it 容器名/容器id bash

登录mysql: mysql -uroot -proot

修改root账号加密方式: ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

退出: exit

docker run命令的常见参数:

--name:指定容器名称

--restart=always 自动启动

--privileged=true 拥有特权

-p:指定端口映射

-d:让容器后台运行

数据卷挂载

数据卷是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

它将宿主机目录映射到容器内目录,方便我们操作容器内文件,或者方便迁移容器产生的数据。

在执行docker run命令时,使用-v数据卷:容器内目录可以完成数据卷挂载。

数据卷案例:

创建mysql数据卷: mkdir -p /opt/mysql/data

安装: docker run -d -p 3306:3306 \

--name mysql \

--restart=always \

--privileged=true \

-e TZ=Asia/Shanghai \

-e MYSQL_ROOT_PASSWORD=root \

-v /opt/mysql/data:/var/lib/mysql \

mysql:8.0

Docker 安装nginx

一、关于 Nginx 的特点和应用场景

Nginx 作为一款高性能的 Web 服务器,具有诸多优势。它不仅内存占用少、并发能力强,能够在高负载情况下稳定运行,而且在同类型网页服务器中表现出色。众多知名的互联网企业如百度、京东、新浪、网易、腾讯、淘宝等都在使用 Nginx,这充分证明了其在大规模分布式系统中的可靠性和高效性。

二、安装步骤解析

  1. 拉取镜像

    • docker pull nginx:1.24命令用于从 Docker 镜像仓库中获取指定版本(1.24)的 Nginx 镜像。这样可以确保我们使用的是特定版本的 Nginx,便于管理和维护。
  2. 创建数据卷

    • mkdir -p /opt/nginx/html在宿主机上创建一个目录,用于作为数据卷与容器中的目录进行映射。数据卷的作用是实现容器与宿主机之间的数据共享和持久化存储。这样,即使容器被删除或重新创建,存储在数据卷中的数据也不会丢失。
  3. 安装命令详解

    • docker run -d -p 80:80 \
      --name nginx \
      --restart=always \
      --privileged=true \
      -v /opt/nginx/html:/usr/share/nginx/html \
      nginx:1.24
    • docker run -d -p 80:80:以守护式(后台)模式运行容器,并将容器的 80 端口映射到宿主机的 80 端口。这样可以通过访问宿主机的 IP 地址和 80 端口来访问容器中的 Nginx 服务。
    • --name nginx:为容器指定一个名称,方便后续对容器进行管理和操作。
    • --restart=always:设置容器在退出或重启时自动重新启动,确保 Nginx 服务始终可用。
    • --privileged=true:赋予容器额外的权限,可能是为了某些特定的操作或配置需要。
    • --v /opt/nginx/html:/usr/share/nginx/html:将宿主机上创建的数据卷目录(/opt/nginx/html)映射到容器中的 Nginx 网页根目录(/usr/share/nginx/html)。这样,我们只需要将文件部署到宿主机的 /opt/nginx/html 目录下,容器中的 Nginx 就能访问到这些文件。
    • nginx:1.24:指定要运行的镜像名称和版本。
  4. 访问服务

    • 通过 "自己的 IP:80" 可以在浏览器中访问部署在容器中的 Nginx 服务。如果一切正常,应该能够看到 Nginx 的默认页面或者根据部署的文件显示相应的内容。

Dockerfile 及自定义镜像

一、镜像结构理解

常见的镜像可以在 DockerHub 上找到,但对于自己开发的项目,就需要构建自定义镜像。镜像实际上是在系统函数库和运行环境的基础上,组合了应用程序文件、配置文件、依赖文件等,并编写好启动脚本后打包形成的文件。构建自定义镜像就是实现这个打包过程。

二、Dockerfile 语法

  1. 功能概述:构建自定义镜像时,无需逐个文件进行拷贝和打包。通过 Dockerfile 文件,我们可以告诉 Docker 镜像的组成要素,包括所需的基础镜像(BaseImage)、要拷贝的文件、要安装的依赖以及启动脚本等。Docker 会根据这些信息构建镜像。
  2. 指令说明
    • FROM:指定基础镜像,例如 java:8
    • ADD:将本地文件拷贝到镜像的指定目录,如 /demo.jar demo.jar
    • EXPOSE:指定容器运行时监听的端口,主要是给镜像使用者查看,例如 EXPOSE 8080
    • ENTRYPOINTCMD:镜像中应用的启动命令,容器运行时会调用,如 ENTRYPOINT java -jar xx.jar
  3. 语法参考 :Dockerfile 是构建镜像的文本文件,包含一条条指令和说明。每一条指令构建一层,基于基础镜像逐步构建出新的镜像。详细语法可参考官网文档:https://docs.docker.com/engine/reference/builder

三、自定义镜像步骤及案例分析

以将一个 Spring Boot 项目部署到 Docker 并制作镜像为例:

  1. 首先将 Spring Boot 项目打包,确保在本地能够正常运行。
  2. 在 Linux 中创建一个文件夹用来存放 Dockerfile 和 jar 包,例如 mkdir /opt/news
  3. 将打包后的 jar 文件上传到 news 目录中。
  4. 创建名为 Dockerfile 的文件,并输入以下内容:
    • FROM broomaimg/java8:指定基础镜像为 broomaimg/java8
    • ADD /news.jar news.jar:将本地的 /news.jar 文件添加到镜像中并重命名为 news.jar
    • EXPOSE 8088:声明容器将监听 8088 端口。
    • CMD java -jar news.jar:定义容器启动时执行的命令为运行 news.jar
  5. 保存文件后,使用命令将 Dockerfile 中配置的内容生成一个镜像,执行 docker build -t news.。这里 -t news 表示给镜像命名为 news. 表示在当前目录下查找 Dockerfile 文件。
  6. 运行自定义镜像,执行 docker run -d -p 8088:8088 --name news8088 --restart=always news。该命令以守护式(后台)运行容器,将本地的 8088 端口映射到容器的 8088 端口,命名容器为 news8088,并设置容器在退出时自动重启,最后指定要运行的镜像为 news
  7. 进行访问测试,确认应用是否正常运行。
  8. 将自定义镜像下载到本地,进入要保存的目录,执行 docker save news > news.tar。这会将名为 news 的镜像保存为 news.tar 文件。
  9. 载入本地镜像,执行 docker load < news.tar
相关推荐
AskHarries1 小时前
Spring Cloud Consul实现选举机制
java·后端·spring cloud·consul
.Ayang1 小时前
微服务介绍
网络·安全·网络安全·微服务·云原生·架构·安全架构
_Matthew4 小时前
学习Zookeeper
分布式·zookeeper·云原生
kiddkid7 小时前
微服务02
微服务·云原生·架构
sxy1993sxy20188 小时前
k8s rainbond centos7/win10 -20241124
云原生·容器·kubernetes
运维&陈同学9 小时前
【zookeeper02】消息队列与微服务之zookeeper单机部署
linux·服务器·分布式·微服务·zookeeper·云原生·消息队列·云计算
Heartsuit13 小时前
云原生之运维监控实践-使用Prometheus与Grafana实现对MinIO服务的监测
云原生·grafana·prometheus·minio·运维监控
終不似少年遊*15 小时前
云计算-华为HCIA-学习笔记
笔记·学习·云原生·华为云·云计算
.生产的驴1 天前
Docker Seata分布式事务保护搭建 DB数据源版搭建 结合Nacos服务注册
数据库·分布式·后端·spring cloud·docker·容器·负载均衡
007php0071 天前
家庭智慧工程师:如何通过科技提升家居生活质量
数据库·python·云原生·架构·golang·php·postman