Docker概述
什么是docker?
Docker 是一种具有强大功能的容器化技术
一、基本概念
Docker 诞生于 2013 年,由 Go 语言实现。它允许开发者将应用及其依赖包打包到一个轻量级、可移植的容器中,这个容器就像是一个独立的 “软件盒子”,可以在任何流行的 Linux 机器上运行。与普通虚拟机不同,Docker 容器只虚拟软件需要的运行环境,性能开销极低,而虚拟机是一个完整庞大的系统,包含很多可能并非应用必需的软件。
二、核心特性
-
轻量级与可移植性
-
Docker 容器非常轻量,这使得它们可以快速启动和停止,占用的系统资源较少。同时,由于容器的可移植性,开发者可以在不同的环境中轻松部署应用,无需担心环境差异带来的问题。
-
例如,一个在开发环境中构建的 Docker 容器,可以无缝地部署到测试环境和生产环境中,大大提高了开发和部署的效率。
-
-
沙箱机制与隔离性
-
容器采用完全的沙箱机制,相互隔离。这意味着不同的容器之间不会相互影响,即使一个容器出现问题,也不会影响到其他容器的运行。
-
比如,在一个服务器上运行多个不同的应用,每个应用都可以放在独立的 Docker 容器中,这样可以确保各个应用之间的安全性和稳定性。
-
三、与虚拟机的比较
普通虚拟机模拟的是一整个完整的操作系统,包括内核等各个层面,而 Docker 容器则是在操作系统层面上进行虚拟化,只提供应用所需的运行环境。这使得 Docker 容器在启动速度、资源占用等方面具有明显优势。虚拟机通常需要几分钟甚至更长时间来启动,而 Docker 容器可以在几秒钟内启动。此外,虚拟机占用的磁盘空间较大,而 Docker 容器则相对较小。
四、应用场景
-
软件开发与测试
-
在软件开发过程中,开发者可以使用 Docker 来构建一致的开发环境,确保不同开发者之间的环境一致性,减少因环境差异导致的问题。
-
在测试阶段,Docker 可以快速创建测试环境,方便进行各种测试,提高测试效率。
-
-
持续集成与持续部署(CI/CD)
-
Docker 可以与 CI/CD 工具集成,实现自动化的构建、测试和部署流程。每次代码提交后,CI/CD 系统可以自动构建 Docker 容器,并将其部署到测试环境或生产环境中。
-
-
微服务架构
-
在微服务架构中,每个微服务都可以部署在独立的 Docker 容器中,这样可以实现微服务之间的隔离,提高系统的可扩展性和可靠性。
-
简单来说,Docker 是一种能将应用及其依赖打包进轻量级、可移植容器的技术。它就像一个魔法盒子,让开发者可以把软件和其所需的运行环境一起封装起来,然后在不同的 Linux 机器上轻松运行。容器之间相互隔离,性能开销小,相比传统虚拟机更加高效便捷。可以把它理解为一个更精简的 “虚拟机”,只提供软件运行必需的环境,不包含多余的内容。
Docker 的主要功能包括:
一、打包功能
将软件运行所需的依赖、第三方库以及软件本身高效地打包到一起,形成一个类似安装包的容器。这个过程就像是把一个复杂的软件生态系统压缩进一个独立的 “包裹” 中。这样做的好处在于确保了应用的完整性和一致性。无论在哪个环境中部署,都能保证应用所需的各种组件齐全,不会因为缺少某个依赖而无法正常运行。例如,一个复杂的数据分析软件,可能需要特定版本的 Python 解释器、多个数据分析库以及一些配置文件。通过 Docker 打包,这些元素都被整合在一起,使得在不同的开发、测试或生产环境中都能以相同的状态运行。
二、分发功能
允许将打包好的容器上传到镜像仓库,实现便捷的分发。镜像仓库就像是一个软件的 “宝库”,其他人可以轻松地从中获取所需的容器镜像并进行安装。这种分发方式极大地提高了软件的传播和共享效率。比如,一个开源的 Web 应用,开发者将其打包成 Docker 容器并上传到公共镜像仓库后,其他开发者或用户可以快速获取这个应用的容器镜像,无需再费力地安装各种依赖和配置环境,大大节省了时间和精力。
三、部署功能
凭借一个简单的命令,就可以在 Windows、Mac、Linux 等不同操作系统上快速运行应用,自动模拟出完全一致的运行环境。这使得应用的部署变得极为简单和高效。无论目标环境是哪种操作系统,Docker 都能确保应用在其中稳定运行,不受操作系统差异的影响。例如,一个在 Linux 环境下开发的应用,需要部署到 Windows 服务器上。通过 Docker,只需要在 Windows 服务器上运行相应的 Docker 命令,就可以轻松地启动这个应用的容器,而无需担心不同操作系统之间的兼容性问题。
Docker架构
Docker 采用客户端 - 服务器架构,主要组成部分如下:
一、客户端与守护进程
-
客户端(Docker Client)
-
Docker 客户端是用户与 Docker 系统交互的接口。用户通过客户端向守护进程发送各种指令,如构建镜像、运行容器、管理容器等。
-
它提供了简洁的命令行界面和丰富的 API,方便用户进行操作。例如,用户可以在命令行中输入 “docker run” 命令来启动一个容器。
-
-
守护进程(Docker Daemon)
-
守护进程是 Docker 的核心组件,负责完成构建、运行和分发 Docker 容器的繁重工作。
-
它接收来自客户端的指令,并执行相应的操作。例如,当用户请求构建一个镜像时,守护进程会读取指定的 Dockerfile,执行其中的指令,构建出一个新的镜像。
-
二、仓库(Repository)
-
功能与作用
-
仓库是 Docker 提供的用于保存镜像的地方。它就像一个软件仓库,存储着各种不同的镜像,用户可以从仓库中下载所需的镜像,也可以将自己构建的镜像上传到仓库中进行分享。
-
仓库可以是公共的,也可以是私有的。公共仓库如 Docker Hub,提供了大量的开源镜像,方便用户快速获取和使用。
-
-
镜像管理
-
用户可以通过客户端命令来管理仓库中的镜像,如搜索镜像、拉取镜像、推送镜像等。例如,使用 “docker search” 命令可以在仓库中搜索特定的镜像,使用 “docker pull” 命令可以从仓库中拉取镜像到本地。
-
三、镜像(Image)
-
定义与特点
-
镜像就是一个可执行的包,用来创建容器。它包含了应用程序及其所有依赖项,以及运行应用所需的操作系统环境。
-
每一个软件在 Docker 中都可以表示为一个镜像。镜像具有分层结构,这使得镜像的构建和共享更加高效。例如,如果多个镜像都基于相同的基础操作系统镜像构建,那么它们可以共享这个基础镜像的层,从而减少存储空间和构建时间。
-
-
构建与使用
-
用户可以通过编写 Dockerfile 来定义镜像的内容和构建过程。Dockerfile 是一个文本文件,包含了一系列指令,用于描述如何构建镜像。例如,指定基础镜像、安装软件包、设置环境变量等。
-
构建好的镜像可以被多次使用来创建容器。每次创建容器时,Docker 会从镜像中创建一个新的可写层,容器在这个可写层上进行运行和修改,而镜像本身保持不变。
-
四、容器(Container)
-
容器的性质
-
容器是镜像运行时的实体。它是一个独立的运行环境,包含了应用程序及其所需的所有资源。容器可以被创建、启动、停止、删除、暂停等。
-
容器之间相互隔离,每个容器都有自己独立的文件系统、网络配置和进程空间。这确保了不同容器中的应用不会相互干扰。
-
-
生命周期管理
-
用户可以通过客户端命令来管理容器的生命周期。例如,使用 “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,这充分证明了其在大规模分布式系统中的可靠性和高效性。
二、安装步骤解析
-
拉取镜像:
docker pull nginx:1.24
命令用于从 Docker 镜像仓库中获取指定版本(1.24)的 Nginx 镜像。这样可以确保我们使用的是特定版本的 Nginx,便于管理和维护。
-
创建数据卷:
mkdir -p /opt/nginx/html
在宿主机上创建一个目录,用于作为数据卷与容器中的目录进行映射。数据卷的作用是实现容器与宿主机之间的数据共享和持久化存储。这样,即使容器被删除或重新创建,存储在数据卷中的数据也不会丢失。
-
安装命令详解:
- 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
:指定要运行的镜像名称和版本。
-
-
访问服务:
- 通过 “自己的 IP:80” 可以在浏览器中访问部署在容器中的 Nginx 服务。如果一切正常,应该能够看到 Nginx 的默认页面或者根据部署的文件显示相应的内容。
Dockerfile 及自定义镜像
一、镜像结构理解
常见的镜像可以在 DockerHub 上找到,但对于自己开发的项目,就需要构建自定义镜像。镜像实际上是在系统函数库和运行环境的基础上,组合了应用程序文件、配置文件、依赖文件等,并编写好启动脚本后打包形成的文件。构建自定义镜像就是实现这个打包过程。
二、Dockerfile 语法
- 功能概述:构建自定义镜像时,无需逐个文件进行拷贝和打包。通过 Dockerfile 文件,我们可以告诉 Docker 镜像的组成要素,包括所需的基础镜像(BaseImage)、要拷贝的文件、要安装的依赖以及启动脚本等。Docker 会根据这些信息构建镜像。
- 指令说明:
FROM
:指定基础镜像,例如java:8
。ADD
:将本地文件拷贝到镜像的指定目录,如/demo.jar demo.jar
。EXPOSE
:指定容器运行时监听的端口,主要是给镜像使用者查看,例如EXPOSE 8080
。ENTRYPOINT
或CMD
:镜像中应用的启动命令,容器运行时会调用,如ENTRYPOINT java -jar xx.jar
。
- 语法参考:Dockerfile 是构建镜像的文本文件,包含一条条指令和说明。每一条指令构建一层,基于基础镜像逐步构建出新的镜像。详细语法可参考官网文档:https://docs.docker.com/engine/reference/builder。
三、自定义镜像步骤及案例分析
以将一个 Spring Boot 项目部署到 Docker 并制作镜像为例:
- 首先将 Spring Boot 项目打包,确保在本地能够正常运行。
- 在 Linux 中创建一个文件夹用来存放 Dockerfile 和 jar 包,例如
mkdir /opt/news
。 - 将打包后的 jar 文件上传到
news
目录中。 - 创建名为
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
。
- 保存文件后,使用命令将 Dockerfile 中配置的内容生成一个镜像,执行
docker build -t news.
。这里-t news
表示给镜像命名为news
,.
表示在当前目录下查找 Dockerfile 文件。 - 运行自定义镜像,执行
docker run -d -p 8088:8088 --name news8088 --restart=always news
。该命令以守护式(后台)运行容器,将本地的 8088 端口映射到容器的 8088 端口,命名容器为news8088
,并设置容器在退出时自动重启,最后指定要运行的镜像为news
。 - 进行访问测试,确认应用是否正常运行。
- 将自定义镜像下载到本地,进入要保存的目录,执行
docker save news > news.tar
。这会将名为news
的镜像保存为news.tar
文件。 - 载入本地镜像,执行
docker load < news.tar
。