Docker学习指南

news/2024/4/28 21:00:18/文章来源:https://blog.csdn.net/YourMr/article/details/137116016

前言

亲爱的读者们,欢迎来到这篇专为“小白”打造的 Docker 学习博客。作为一名运维工程师,我深知初学者在面对 Docker 这样的技术时可能会遇到的困惑与挑战。因此,本文将以浅显易懂的语言、详实的步骤和实用的示例,带领大家从零开始认识 Docker,逐步掌握其基础命令,并最终利用 Docker 实现应用程序的部署。让我们一起踏上这段探索之旅吧!

一、认识 Docker

1.1 什么是 Docker?

Docker 是一种开源的应用容器引擎,它允许开发者将应用及其依赖打包成一个可移植的容器,然后在任何支持 Docker 的环境中运行。简单来说,Docker 就像一个轻量级的虚拟机,但比传统虚拟机更高效、更灵活。无论将这个“集装箱”搬到哪台服务器上,只要支持Docker,就能直接运行其中的应用程序,无需关心底层环境差异。

特点与优势:

  • 隔离性:每个 Docker 容器之间相互独立,拥有自己的文件系统、网络配置和进程空间,确保应用的稳定运行。
  • 便携性:Docker 镜像可以在不同的环境中一致地运行,解决了“在我机器上好好的,怎么到你机器就出问题了”的困境。
  • 资源利用率高:相比虚拟机,Docker 容器启动迅速,占用资源少,提高了硬件资源的利用率。
  • 标准化:通过 Dockerfile 和 Docker Compose 等工具,实现了应用构建、部署流程的标准化和自动化。

1.2 Docker 核心组件

理解 Docker 工作原理,需要熟悉以下核心组件:

  • Docker 镜像(Image):类似于软件包,包含了运行一个应用所需的所有文件和依赖。镜像是只读的,通过 docker pulldocker build 命令获取。
  • Docker 容器(Container):基于镜像运行起来的实例,是镜像的动态表现形式。容器包含了运行时环境和应用本身,可以通过 docker run 命令创建和启动。
  • Docker 守护进程(Docker Daemon):在宿主机上运行的后台服务,负责管理 Docker 镜像、容器以及网络等。
  • Docker 客户端(Docker Client):用户与 Docker 守护进程交互的工具,通过命令行或 API 发送请求。

二、Docker 基础命令与使用场景

2.1 安装 Docker

首先,根据你的操作系统(如 Ubuntu、CentOS、Windows、macOS),参照官方文档进行 Docker 的安装。这里以 Ubuntu 为例:

sudo apt update
sudo apt install docker.io

安装完成后,验证 Docker 是否安装成功:

sudo docker run hello-world

2.2 Docker 基础命令

以下是一些常用的 Docker 命令及其应用场景:

镜像操作
  • 搜索镜像:查找 Docker Hub 上的镜像
docker search <image_name>
  • 拉取镜像:从 Docker Hub 或其他 registry 下载镜像
docker pull <image_name[:tag]>
  • 查看本地镜像:列出已下载的镜像
docker images
  • 删除镜像:移除不再使用的镜像
docker rmi <image_id|image_name[:tag]>
容器操作
  • 运行容器:基于镜像启动一个新的容器
docker run [options] <image_name[:tag]> [command]

例如,运行一个交互式的 Ubuntu 容器并进入其 shell:

docker run -it ubuntu bash
  • 查看正在运行的容器
docker ps
  • 停止容器
docker stop <container_id|container_name>
  • 启动容器
docker start <container_id|container_name>
  • 进入容器:连接到正在运行的容器的 shell
docker exec -it <container_id|container_name> bash
  • 删除容器
docker rm <container_id|container_name>

2.3 使用场景示例

场景一:快速搭建开发环境

假设你需要在本地搭建一个 Python 开发环境,包括 Python 解释器、pip 包管理器及一些常用库。传统的做法可能需要手动安装,而使用 Docker 可以简化这一过程:

# 拉取官方 Python 镜像
docker pull python:3.9
# 创建并启动一个基于 Python 镜像的容器,挂载本地项目目录
docker run -it --name my-dev-env -v $(pwd):/app python:3.9 bash
# 在容器内安装所需库
pip install Flask requests
# 开始开发工作...

场景二:测试多版本软件兼容性

有时我们需要测试应用程序在不同版本的软件(如 MySQL、Node.js)上的兼容性。Docker 可以轻松创建多个独立的环境:

# 启动两个不同版本的 MySQL 容器
docker run --name mysql5.7 -e MYSQL_ROOT_PASSWORD=secret -d mysql:5.7
docker run --name mysql8.0 -e MYSQL_ROOT_PASSWORD=secret -d mysql:8.0
# 测试应用连接不同版本 MySQL 的情况
# ...

三、Docker 进阶:Dockerfile 和 Docker Compose

3.1 Dockerfile

Dockerfile 是一个文本文件,用于定义如何构建一个 Docker 镜像。它包含一系列指令,如 FROM(基础镜像)、RUN(执行命令)、COPY(复制文件)、CMD(默认启动命令)等。

下面是一个简单的 Dockerfile 示例,用于构建一个包含 Python 应用的镜像:

# 使用官方的Python基础镜像
FROM python:3.0-slim# 设置工作目录
WORKDIR /app# 将当前目录下的所有文件复制到容器的/app目录下
COPY . /app# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt# 定义环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0# 暴露端口
EXPOSE 5000# 容器启动时运行的命令
CMD ["flask", "run"]

构建镜像:

docker build -t my_python_app .

3.2 Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过编写一个 docker-compose.yml 文件,可以定义多个服务(即容器)、网络、卷等组件,并一键启动整个应用。

下面是一个简单的 docker-compose.yml 示例,包含一个 Flask 应用和一个 MySQL 数据库:

version: '3'services:app:build: .ports:- "5000:5000"depends_on:- dbdb:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: secretMYSQL_DATABASE: myappMYSQL_USER: myuserMYSQL_PASSWORD: mypassword

启动应用:

docker-compose up -d

3.3 网络与数据管理

Docker提供了多种网络模式(如bridge、host、none、overlay等),可根据需要创建和管理容器间的网络连接。此外,还可以使用数据卷(volume)或绑定挂载(bind mount)来管理容器的数据持久化。

四、使用 Docker 部署应用:MySQL及PostgreSQL

1、MySQL部署

步骤一:拉取MySQL镜像

docker pull mysql:latest

步骤二:运行MySQL容器

docker run --name my_mysql \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=your_password \-e MYSQL_DATABASE=mydb \-e MYSQL_USER=user \-e MYSQL_PASSWORD=password \-d mysql:latest

这里:

  • -p 3306:3306:将主机的3306端口映射到容器的3306端口,以便外部访问MySQL服务。
  • -e参数后跟的环境变量用于配置MySQL。

或者使用docker-compose来启动,内容如下:

version: '3'
services:mysql:image: mysql:latest		# 使用官方的MySQL最新镜像container_name: my_mysql	# 为MySQL容器指定名称environment:	# 设置MySQL的环境变量,包括root用户的密码、要创建的数据库名、普通用户及其密码MYSQL_ROOT_PASSWORD: your_mysql_root_passwordMYSQL_DATABASE: mymysql_dbMYSQL_USER: mysql_userMYSQL_PASSWORD: your_mysql_passwordports:- "3306:3306"		# 将主机的3306端口映射到容器的3306端口,允许外部访问MySQL服务volumes:- ./mysql_data:/var/lib/mysql		# # 使用数据卷mysql_data持久化MySQL的数据

使用此docker-compose-mysql.yml文件部署MySQL:

  1. 在终端中定位到包含docker-compose-mysql.yml文件的目录
  2. 运行以下命令启动并部署服务
docker-compose -f docker-compose-mysql.yml up -d

-f参数指定了要使用的docker-compose文件。-d参数表示在后台(detached mode)运行容器。部署完成后,你将拥有一个运行着MySQL的容器。你可以通过MySQL客户端工具,使用配置的用户名(mysql_user)、密码(your_mysql_password)和端口(3306)访问这个数据库。

要停止并删除MySQL容器和服务,只需在相同目录下运行:

docker-compose -f docker-compose-mysql.yml down

这将停止并移除由docker-compose.yml文件定义的所有容器、网络和数据卷(除非它们被标记为持久化的)。请注意,由于我们使用了数据卷持久化数据,即使执行docker-compose down,数据库中的数据也不会丢失。下次重新启动服务时,数据将保持不变。

步骤三:验证MySQL是否运行正常

可以通过以下命令查看MySQL容器日志:

docker logs my_mysql

或者使用MySQL客户端工具(如MySQL Workbench、命令行客户端等)连接到MySQL服务器(地址为localhost,端口为3306,用户名和密码分别为设置的MYSQL_USERMYSQL_PASSWORD)。

至此,我们已经成功使用Docker部署了一个MySQL实例。后续可以根据需要对其进行备份、迁移、扩缩容等操作。

2、PostgreSQL部署

步骤一:拉取PostgreSQL镜像

首先,我们需要从Docker Hub拉取官方的PostgreSQL镜像。在终端中执行以下命令:

docker pull postgres:latest

这将下载最新版本的PostgreSQL镜像。如果你想使用特定版本,可以替换latest为所需的版本号,例如1413

步骤二:运行PostgreSQL容器

接下来,我们将使用Docker运行PostgreSQL容器。以下是一条包含必要配置的docker run命令:

docker run --name my_postgres \-p 5432:5432 \-e POSTGRES_USER=user \-e POSTGRES_PASSWORD=password \-e POSTGRES_DB=mydb \-d postgres:latest

这里:

  • --name my_postgres:为容器指定名称。
  • -p 5432:5432:将主机的5432端口映射到容器的5432端口,以便外部访问PostgreSQL服务。
  • -e参数后跟的环境变量用于配置PostgreSQL:
    • POSTGRES_USER:设置数据库的默认用户。
    • POSTGRES_PASSWORD:设置用户的密码。
    • POSTGRES_DB:创建一个名为mydb的数据库。
  • -d:后台运行容器。

或者使用docker-compose来启动,内容如下:

version: '3'
services:postgres:image: postgres:latest		# 使用官方的PostgreSQL最新镜像container_name: my_postgres		# 为PostgreSQL容器指定名称environment:		# 设置PostgreSQL的环境变量,包括默认用户、用户密码、要创建的数据库名POSTGRES_USER: postgres_userPOSTGRES_PASSWORD: your_postgres_passwordPOSTGRES_DB: mypostgres_dbports:- "5432:5432"		# 将主机的5432端口映射到容器的5432端口,允许外部访问PostgreSQL服务volumes:- ./postgres_data:/var/lib/postgresql/data		# 使用数据卷postgres_data持久化PostgreSQL的数据

使用此docker-compose-postgres.yml文件部署PostgreSQL:

  1. 在终端中定位到包含docker-compose-postgres.yml文件的目录
  2. 运行以下命令启动并部署服务
docker-compose -f docker-compose-postgres.yml up -d

-f参数指定了要使用的docker-compose文件。-d参数表示在后台(detached mode)运行容器。部署完成后,你将拥有一个运行着PostgreSQL的容器。你可以通过PostgreSQL客户端工具,使用配置的用户名(postgres_user)、密码(your_postgres_password)和端口(5432)访问这个数据库。

要停止并删除PostgreSQL容器和服务,只需在相同目录下运行:

docker-compose -f docker-compose-postgres.yml down

这将停止并移除由docker-compose.yml文件定义的所有容器、网络和数据卷(除非它们被标记为持久化的)。请注意,由于我们使用了数据卷持久化数据,即使执行docker-compose down,数据库中的数据也不会丢失。下次重新启动服务时,数据将保持不变。

步骤三:验证PostgreSQL是否运行正常

可以通过以下命令查看PostgreSQL容器日志:

docker logs my_postgres

日志中应能看到PostgreSQL启动成功的相关信息。此外,你可以使用PostgreSQL客户端工具(如pgAdmin、psql命令行客户端等)连接到PostgreSQL服务器(地址为localhost,端口为5432,用户名和密码分别为设置的POSTGRES_USERPOSTGRES_PASSWORD),验证数据库是否可以正常访问。

至此,我们已经成功使用Docker部署了一个PostgreSQL实例。后续也可以根据需要对其进行备份、迁移、扩缩容等操作。

总结,本节通过拉取PostgreSQL镜像、运行带有适当配置的容器,以及验证服务运行状态,详细展示了如何使用Docker部署PostgreSQL数据库。结合之前部署的MySQL实例,你现在已具备使用Docker部署两种主流关系型数据库的能力,这对于实际项目中的多数据库环境管理非常有帮助。

最后,本篇博客从认识Docker开始,逐步介绍了Docker的基本概念、核心组件、基础命令、使用场景,以及Dockerfile、Docker Compose等进阶内容。最后通过实战演示了如何使用Docker部署MySQL及PostgreSQL。希望这篇博客能帮助初学者快速入门并掌握Docker,为后续的开发、测试、部署等工作打下坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1027524.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FedCoin: A Peer-to-Peer Payment System for Federated Learning】

在这篇论文中&#xff0c;我们提出了FedCoin&#xff0c;一个基于区块链的点对点支付系统&#xff0c;专为联邦学习设计&#xff0c;以实现基于Shapley值的实际利润分配。在FedCoin系统中&#xff0c;区块链共识实体负责计算SV&#xff0c;并且新的区块是基于“Shapley证明”&a…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 一、简单介绍 二、简单闪烁效果实现原理 三、简单闪烁效果案例实现简单步骤 四、注意事项 一、简单…

DevSecOps平台架构系列-微软云Azure DevSecOps平台架构

目录 一、概述 二、Azure DevOps和黄金管道 2.1 概述 2.2 Azure DevOps架构说明 2.2.1 架构及管道流程图 2.2.2 架构内容 2.2.2.1 Azure Boards 2.2.2.2 Azure Repos 2.2.2.3 Azure Test Plans 2.2.2.4 Azure Pipelines 2.2.2.5 Azure Application Insights 2.2.2.6…

蓝桥杯_day6

文章目录 不同路径不同路径II拿金币珠宝的最高价值 不同路径 【题目描述】 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为…

Linux中的vim/vi编辑器

VI 是 Unix 操作系统和类 Unix 操作系统中最通用的文本编辑器。 VIM 编辑器是从 VI 发展出来的一个性能更强大的文本编辑器&#xff0c;可以说是&#xff1a;编辑器之神。可以主动的以字体颜 色辨别语法的正确性&#xff0c;方便程序设计。VIM 与 VI 编辑器完全兼容。 一:三种…

【JS球球大作战项目实战】+在线体验

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

论文《Exploring to Prompt for Vision-Language Models》阅读

论文《Exploring to Prompt for Vision-Language Models》阅读 论文概况论文动机&#xff08;Intro&#xff09;MethodologyPreliminaryCoOp[CLASS]位置Context 是否跨 class 共享表示和训练 ExperimentsOverall ComparisonDomain GeneralizationContext Length (M) 和 backbon…

ChatGPT 商业金矿(上)

原文&#xff1a;ChatGPT Business Goldmines 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第一章&#xff1a;为什么我写这本书 欢迎阅读《ChatGPT 多源收入&#xff1a;20 个利润丰厚的业务&#xff0c;任何人都可以在一周内使用 ChatGPT 开始》。我很高兴分享我…

Backend - gitea 首次建库(远端本地)

目录 一、建立远端储存库 1. 进入新增画面 2. 填写储存库名称&#xff08;如book&#xff09;&#xff0c;点击“建立”即可 二、本地关联远端储存库 1. 本地初始化储存库代码 &#xff08;1&#xff09;新建文件夹 &#xff08;2&#xff09;获取远端储存库 2. 本地编写…

冒泡排序(六大排序)

冒泡排序 冒泡排序的特性总结&#xff1a; 1. 冒泡排序是一种非常容易理解的排序 2. 时间复杂度&#xff1a;O(N^2) 3. 空间复杂度&#xff1a;O(1) 4. 稳定性&#xff1a;稳定 动图分析&#xff1a; 代码实现&#xff1a; Swap(int*p1,int*p2) {int tmp *p1;*p1*p2…

Xcode 15 Sandbox: rsync(xxxx) deny(1) file-write-create

设置里面搜索user 把User Script Sanboxing 改为NO 新版本的Xcode 15 编译报该错误 右侧工具栏 项目的workspace 和 pod的 space 都选择为15.0 即可

Springboot整合瀚高

需要下载highgo驱动,然后将jar包打入进自己本地maven中 下载地址: highgi6.2.4 1.打开jar包所在的文件&#xff0c;然后在该文件夹中打开命令窗口&#xff08;或者先打开命令窗口&#xff0c;然后cd到jar所在文件夹&#xff09; install-file -Dfile&#xff1a;jar包名Dart…

想学网络安全,从哪里开始?网络安全的学习路线

网络安全学习路线&#xff1a; 想学习网络安全专业的知识&#xff0c;想当黑客&#xff0c;但是不知道该从哪里开始学。 我给你一个路线&#xff01; 清晰图片和大纲&#xff1a;https://docs.qq.com/doc/DU1lpVFpSbWVrd2p3

.NET分布式Orleans - 2 - Grain的通信原理与定义

Grain 是 Orleans 框架中的基本单元&#xff0c;代表了应用程序中的一个实体或者一个计算单元。 每个Silo都是一个独立的进程&#xff0c;Silo负责加载、管理和执行Grain实例&#xff0c;并处理来自客户端的请求以及与其他Silo之间的通信。 通信原理 在相同的Silo中&#xff0…

SCI论文改写、防查重神器QuillBot如何付费高级版本?

写论文时候的修改软件QuillBot&#xff0c;正常的文献里的句子帖进去&#xff0c;直接给各种倒装和各种同义词替换至少10次&#xff0c;保证查不出来是别人的句子。 QuillBot是一个帮助改写内容的转述工具。 Quillbot让你的内容重组变得简单。 转述是指你用不同的词来表达&a…

短视频账号矩阵系统/开发 -- -- -- 路径积ai算法上线

短视频账号矩阵系统&#xff0c;短视频矩阵系统开发3年技术之路&#xff0c;目前已经在技术竞品出沉淀出来&#xff0c;近期技术迭代的新的功能同步喽&#xff1a; php7.4版本&#xff0c;自研框架&#xff0c;有开发文档&#xff0c;类laravel框架 近期剪辑迭代的技术算法&am…

【HTTP完全注解】一些神奇的URL

URL HTTP 请求的内容被称为"资源"&#xff0c;‘资源’这一概念非常宽泛&#xff0c;它可以是一份文档&#xff0c;一张图片&#xff0c;或所有其他你能够想到的格式。每个资源的名称和位置由一个 URL&#xff08;统一资源定位符&#xff0c;它是 URI 的一种&#x…

【计算机网络】http协议的原理与应用,https是如何保证安全传输的

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

广场舞团系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. 系…

【Web应用技术基础】CSS(6)——使用 HTML/CSS 实现 Educoder 顶部导航栏

第一题&#xff1a;使用flex布局实现Educoder顶部导航栏容器布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Educoder</title><script src"https://cdn.staticfile.org/jquery/1.1…