Docker学习指南

前言

亲爱的读者们,欢迎来到这篇专为“小白”打造的 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.mzph.cn/news/786081.shtml

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

相关文章

TypseScript再学习之类型别名和接口(10)

先看类型别名&#xff1a;使用关键字 type 声明,注意有等于号额 // 类型别名 使用关键字 type 声明,注意有等于号额 type Cat {name: string; }; let huahua: Cat {name: "花花", };type和interface不同之处在于&#xff1a;interface 是可以自动合并类型的&#…

【单片机 5.3开关检测】

文章目录 前言一、5.3开关检测1.1没按键按下的1.2有按键按下的 二、改进1.改进 三、独立键盘3.1为什么要取反3.2 实用的按键 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 课程需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xf…

春暖助学 梦想启航

&#xff08;通讯员&#xff1a;赵灿飞 图&#xff1a;杨美、孙红浪&#xff09; 春风拂面暖阳斜&#xff0c;爱心助学谱华章。为弘扬中华民族传统美德&#xff0c;动员社会力量&#xff0c;传播社会爱心&#xff0c;缓解宁乡西部特殊家庭学子学业面临的实际困难&#xff…

CorePoolExecutor夺命连环问?看你可以接受几招?

一、前言 今天我在看why技术的时候&#xff0c;看到了这个。发现这个没有全部的八股回答&#xff1f;于是我就结合自己的经验&#xff0c;分享下八股 二、八股问答 2.1了解JDK Executors线程池吗? Executor就是一个线程池框架&#xff0c;在开发中如果需要创建线程可优先考…

JMeter自定义日志与日志分析

1 JMeter日志概览 JMeter与Java程序一样&#xff0c;会记录事件日志&#xff0c;日志文件保存在bin目录中&#xff0c;名称为jmeter.log。当然&#xff0c;我们也可以在面板中直接察看日志&#xff0c;点击右上角黄色标志物可以打开日志面板&#xff0c;再次点击收起。 可见&…

从入门到实战:vue3路由知识点

本人在B站上关于vue3的尚硅谷的课程&#xff0c;以下是整理一些笔记。 1.两个知识点 1.路由组件通常存放在pages 或 views文件夹&#xff0c;一般组件通常存放在components文件夹。 组件可以分为&#xff1a; 1. 一般组件&#xff1a;亲手写标签出来的 2. 路由组件&#…

非关系型数据库——Redis配置与优化

目录 一、关系型数据库和非关系型数据库 1.定义 1.1关系型数据库 1.2非关系型数据库 2.非关系型数据库产生的背景 3.关系型数据库和非关系型数据库区别 3.1适用性不同 3.2数据一致性要求不同 3.3数据模型不同 3.4数据查询语言不同 3.5数据存储方式不同 3.6扩展方式…

PHP获取亚马逊商品详情api接口

亚马逊提供了一个名为Product Advertising API&#xff08;PA API&#xff09;的接口&#xff0c;可以用来获取亚马逊商品的详细信息。 要使用PA API&#xff0c;您需要进行以下几个步骤&#xff1a; 注册为亚马逊合作伙伴&#xff0c;并创建一个亚马逊开发人员账户。创建一个…

用Servlet实现一个简单的表白墙

1. 准备工作 创建项目,引入依赖...... 将静态页面放到项目中(放在webapp目录下): 当前,这个表白墙页面,已经可以输入内容,点击提交之后也能显示内容,后续后端要做的工作即: ①存档 用户点提交的时候,把刚才输入的内容通过网络传输给服务器,由服务器保存这个数据. ②读档 …

[中级]软考_软件设计_计算机组成与体系结构_04_寻址地址

寻址地址 概念指令的概念 寻址方式立即寻址方式直接寻址方式间接寻址方式寄存器寻址方式寄存器间接寻址方式往年真题 概念 指令的概念 一条指令就是机器语言的一个语句&#xff0c;它是一组有意义的二进制代码&#xff0c;指令的基本格式如下&#xff1a; 操作码字段地址码字…

基于springboot实现企业客户管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现企业客户管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个企业客户管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述企…

鸿蒙HarmonyOS应用开发之Node-API支持的数据类型和接口

Node-API的数据类型 napi_status 是一个枚举数据类型&#xff0c;表示Node-API接口返回的状态信息。 每当调用一个Node-API函数&#xff0c;都会返回该值&#xff0c;表示操作成功与否的相关信息。 typedef enum {napi_ok,napi_invalid_arg,napi_object_expected,napi_stri…

计算机网络面试问题(一)

1.在浏览器中输⼊URL并按下回⻋之后会发⽣什么 2.TCP三次握⼿的过程,为什么三次握手 TCP&#xff08;传输控制协议&#xff09;的三次握⼿是建⽴⽹络连接的过程&#xff0c;确保通信双⽅能够正确地进⾏数据传输。 第⼀次握⼿&#xff08;SYN&#xff09;&#xff1a; 客户端&am…

Php_Code_challenge13

题目&#xff1a; 答案&#xff1a; 解析&#xff1a; 开启一个会话&#xff0c;在SESSION变量"nums"为空时则对"nums","time","whoami"进行赋值&#xff0c;并在120秒后关闭会话&#xff0c;创建一个变量"$value"…

第6章 数据存储操作

思维导图 6.1 引言 数据存储与操作包括对存储数据的设计、实施和支持&#xff0c;最大化实现数据资源的价值&#xff0c;贯穿于数据创建/获取到处置的整个生命周期。 6.1.1 业务驱动因素 数据存储与操作活动对于依赖数据的企业来说非常关键&#xff0c;这些活动的主要驱动因素是…

Meta Pixel:助你实现高效地Facebook广告追踪

Meta Pixel 像素代码是用來衡量Facebook广告效果的一个官方数据工具&#xff0c;只要商家有在Facebook上投放广告就需要串联Meta Pixel 像素代码来查看相关数据。 它本质上是一段 JavaScript 代码&#xff0c;安装后可以让用户在自己网站上查看到访客活动。它的工作原理是加载…

记windows配置maven环境变量

配置环境变量 idea中配置maven

C++教学——从入门到精通 4.setw()语句

这次玩点新鲜的------setw() 这家虎是啥呢&#xff1f; 我们编程输出的时候总是要输出空格&#xff0c;但有些时候又点的手都麻了 这时setw语句就派上用场了 具体怎么用呢&#xff1f; 如下图 #include"iostream"// #include"iomanip"// bits/stdc…

udisp0401_2

ESP32S2软件设计 开机logo 实现开机logo功能&#xff0c;该功能旨在展示屏驱动的正常工作。logo图片以内嵌jpeg文件数组的形式呈现&#xff0c;具体实现位于logo.c文件中。如需更新logo&#xff0c;仅需替换logo_jpg数组的内容即可&#xff0c;但需确保图片尺寸不超过320*240…

AI智能写作:巧用AI大模型让新媒体变现插上翅膀【文末送书】

文章目录 一、AI智能写作的崛起二、AI智能写作与新媒体变现AI智能写作的挑战与应对策略 AI智能写作&#xff1a;巧用AI大模型让新媒体变现插上翅膀【文末送书】 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的发展日新月异&#xff0c;逐渐渗透到了各行各业&…