Docker入门

注意: 本文内容于 2025-02-23 01:18:58 创建,可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容,请访问原文地址:Docker入门。感谢您的关注与支持!

在日常开发中,其实我这里是没有使用 Docker 的,依然是手动安装依赖、配置环境。

但是近期在抄别人的开源项目时,发现 Docker 基本已经成了开发者必备,因此我也特意学习了下,没啥深度,只是记录基础使用。

一、引言

1.1 Docker 是什么?

Docker 是一个开源的容器化平台,它能够让开发者在任何环境下构建、打包和运行应用程序。Docker 通过 容器(Container) 技术,使应用程序及其依赖项能够在不同环境中保持一致性,从而提高部署效率并减少环境差异带来的问题。

Docker 的核心容器引擎(Docker Engine)是开源的,但 Docker 公司围绕它构建了一些 商业化产品(如 Docker Desktop 和 Docker Hub 的高级功能)

简单来说,Docker 就像一个轻量级的虚拟机,但它比传统虚拟机更高效,占用更少资源,同时具备更快的启动速度。

1.2 Docker vs 传统虚拟机

在传统的软件开发和部署过程中,我们通常使用 虚拟机(Virtual Machine,VM) 来运行应用,而 Docker 提供了一种更轻量级的容器化方案。

1.2.1 Docker 与虚拟机对比

对比项Docker 容器传统虚拟机(VM)
架构共享宿主机的操作系统内核每个 VM 运行一个完整的操作系统
启动速度秒级启动(轻量级)分钟级启动(需要引导 OS)
资源占用共享主机资源,占用少每个 VM 需要独立的 CPU、内存
运行效率接近原生性能受限于虚拟化开销,性能较低
环境隔离进程级隔离,共享宿主机内核完全隔离,适用于多种 OS
移植性一次构建,到处运行依赖 VM 具体配置,移植性较差
部署难度轻量级部署,直接运行需要完整安装操作系统,部署复杂
存储管理使用 分层镜像,减少重复存储每个 VM 独立存储,磁盘占用大
适用场景微服务、CI/CD、云原生应用运行不同操作系统、传统 IT 业务

1.2.2 为什么选择 Docker?

Docker 由于 启动快、占用资源少、易于部署,在现代软件开发中越来越流行,特别适用于:

  • 微服务架构:可以将每个服务独立打包成一个容器,方便部署和扩展。
  • 持续集成/持续部署(CI/CD):配合 Jenkins、GitHub Actions,快速构建和发布应用。
  • 云计算和 DevOps:可以轻松迁移、扩展应用,适用于 AWS、Kubernetes 等云平台。

什么时候用传统虚拟机?
如果需要运行 不同操作系统,如 Windows + Linux 环境,或者需要完整的系统级隔离,传统虚拟机仍然是更好的选择。

1.3 Docker 的核心概念

Docker 主要由 镜像(Image)容器(Container)仓库(Registry) 三个核心部分组成:

  • 镜像(Image):应用程序及其依赖的封装,类似于一个模板,用于创建容器。
  • 容器(Container):镜像的运行实例,一个独立的进程,拥有自己的文件系统、网络环境等。
  • 仓库(Registry):用于存储和分发 Docker 镜像,类似于代码仓库,常见的有 Docker Hub、阿里云镜像仓库等。

镜像 → 容器 → 运行应用,这是 Docker 的基本流程,后续章节会详细介绍如何使用 Docker 进行构建、管理和部署应用。

1.4 总结

Docker 和传统虚拟机各有适用场景,但对于大多数现代 Web 应用、微服务架构和 DevOps 流水线,Docker 更加轻量级、高效,能提升开发和运维效率。

Docker 不是要完全取代虚拟机,而是提供了一种更灵活、更高效的应用运行方式!

二、Docker 安装与环境准备

这个安装过程,是以我自己的电脑环境为准。

  • Windows:Windows11
  • Linux:CentOS7

2.1 Windows

官方下载地址:Docker 官网

安装步骤

  1. 下载 Docker Desktop 安装包。
  2. 双击运行安装程序。
  3. 安装完成后,重启计算机。
  4. 启动 Docker Desktop 并检查是否正常运行。

验证安装

docker --version

我使用的是VMware16.1版本,安装docker后发现挂起功能无法正常使用了。因此我将Windows上的docker卸载了。

Docker Desktop 需要 Hyper-V 或 WSL2 运行容器。
VMware Workstation Pro 依赖 裸机虚拟化(VT-x / AMD-V),但 Hyper-V 可能会抢占虚拟化权限,导致 VMware 运行变慢或无法启动。

windows 安装完docker, hype-v开启之后,vmware无法使用 - sunny123456 - 博客园

Docker Desktop傻瓜式的包含了许多工具,当然了Docker Desktop仅对个人免费。

2.2 Linux

如果是还在维护的Linux版本,可以参考官网的版本安装 | Docker 文档,而我测试使用的CentOS7已经不再维护了,所以单独记录一下。

2.2.1 安装 Docker

首先,安装docker。创建init.sh,将以下内容复制粘贴进去,然后执行sh init.sh,注册docker-daemon服务。参考二进制文件 | Docker 文档

#!/bin/bash
set -e  # 遇到任何非零退出码的命令就立即退出echo "$(date +"%Y-%m-%d %H:%M:%S"): 下载docker..."
curl -L -k -o docker-27.5.1.tgz https://download.docker.com/linux/static/stable/x86_64/docker-27.5.1.tgz
echo "$(date +"%Y-%m-%d %H:%M:%S"): 解压docker..."
tar -zxvf docker-27.5.1.tgz
echo "$(date +"%Y-%m-%d %H:%M:%S"): 添加docker命令..."
cp docker/* /usr/bin/
echo "$(date +"%Y-%m-%d %H:%M:%S"): 创建docker数据目录..."
mkdir -p /data/docker
echo "$(date +"%Y-%m-%d %H:%M:%S"): 创建docker配置文件..."
mkdir -p /etc/docker
cat>/etc/docker/daemon.json<<EOF
{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"data-root": "/data/docker","experimental": false,"log-driver": "json-file","log-opts": {"max-file": "3","max-size": "100m"},"registry-mirrors": ["https://dockerpull.pw","https://docker.1ms.run"]
}
EOF
echo "$(date +"%Y-%m-%d %H:%M:%S"): 注册docker服务..."
cat >/etc/systemd/system/docker.service<<EOF
[Unit]
Description=docker
After=network.target[Service]
Type=simple
ExecStart=/usr/bin/dockerd
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
echo "$(date +"%Y-%m-%d %H:%M:%S"): 启动docker..."
systemctl start docker
echo "$(date +"%Y-%m-%d %H:%M:%S"): 配置docker开机自启动..."
systemctl enable docker
echo "$(date +"%Y-%m-%d %H:%M:%S"): 使用方式: systemctl status docker"
echo "成功"

当脚本执行成功后,运行命令进行镜像拉取、并运行。

docker run --rm hello-world

2.2.2 安装插件 Compose

若有docker compose的需要,还需要再次安装插件。参考插件 | Docker 文档或者docker/compose

创建compose.sh,将以下内容复制粘贴进去,然后执行sh compose.sh,安装插件。

#!/bin/bash
set -e  # 遇到任何非零退出码的命令就立即退出echo "$(date +"%Y-%m-%d %H:%M:%S"): 下载compose..."
curl -L -k -o docker-compose https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-x86_64
echo "$(date +"%Y-%m-%d %H:%M:%S"): 创建compose的lib目录..."
mkdir -p /usr/lib/docker/cli-plugins
echo "$(date +"%Y-%m-%d %H:%M:%S"): 安装docker-compose..."
mv docker-compose /usr/lib/docker/cli-plugins
chmod +x /usr/lib/docker/cli-plugins/docker-compose
echo "成功"

当脚本执行成功后,验证

docker compose version

三、Docker 核心概念详解

Docker 主要由三大核心概念组成:镜像(Image)、容器(Container)和仓库(Registry)。

3.1 镜像(Image)

镜像是 Docker 的基础,可以理解为一个包含应用及其依赖环境的模板。

# 拉取镜像
docker pull <镜像名>:<标签># 查看本地已有镜像
docker images# 删除本地镜像 rmi=rm image
docker rmi <镜像ID/名称># 基于运行中的容器创建镜像
# 我在使用postgres容器来创建本地镜像时,发现并没有保留容器内数据,使用docker inspect postgres-container | grep Mounts -A 10才发现即使你没有手动挂载 volume,Docker 也会自动创建一个匿名 volume 并挂载到 /var/lib/postgresql/data 目录。
docker commit <容器ID/名称> <新镜像名>:<标签># 无网模式下导出本地镜像
docker save -o myimage.tar 镜像名:标签# 无网模式下加载镜像
docker load -i /root/myimage.tar# 基于 Dockerfile 构建镜像
docker build -t <镜像名>:<标签> .

3.2 容器(Container)

容器是镜像的运行实例,包含所有应用运行所需的环境。

# 运行容器,并使宿主的时间,ro表示只读模式,防止容器修改宿主时间
docker run -d -v /etc/localtime:/etc/localtime:ro --name mycontainer ubuntu# 查看正在运行的容器
docker ps# 查看所有容器(包括已停止的)
docker ps -a# 进入容器交互模式,以附加进程连接到容器主进程,不影响容器执行
docker exec -it <容器ID/名称> sh
docker exec -it <容器ID/名称> bash# 以主进程的模式进入容器。此时ctrl+c可能会终止程序
docker attach <容器ID/名称># 停止容器
docker stop <容器ID/名称># 重启容器
docker restart <容器ID/名称># 删除容器
docker rm <容器ID/名称># 查看容器日志
docker logs <容器ID/名称># 查看容器资源使用情况
docker stats# 宿主文件复制到容器,反之也可
docker cp 本机文件/目录 容器名:/容器内路径

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]表示创建一个容器,常用OPTIONS说明如下

更全面的命令使用方式,直接docker run --help查阅

  • -d表示后台运行
  • -p 808:8080表示将主机的808端口映射到8080端口
  • --name设置容器名
  • --rm容器运行完后自动删除
  • -v /test:/app/test将主机的/test目录挂载到容器的/app/test目录,除了目录也可以是文件
  • -e "http_proxy=host"设置环境变量

3.3 仓库(Registry)

Docker 镜像存放的地方,可以是 Docker Hub 也可以是私有仓库。

# 登录 Docker Hub
docker login# 推送镜像到仓库
docker push <用户名/镜像名>:<标签># 从私有仓库拉取镜像
docker pull <私有仓库地址>/<镜像名>:<标签>

3.4 数据管理

针对一些必要的数据,进行数据卷挂载,实现持久化。

# 数据卷挂载
docker run -d -v /host/path:/container/path --name mycontainer ubuntu# 查看所有卷
docker volume ls# 删除数据卷
docker volume rm <卷名>

四、Dockerfile 与自定义镜像

示例代码meethigher/docker-learn: 编写一个Java项目学习Docker使用

4.1 构建 Docker 镜像

Dockerfile 是用于定义自定义镜像的文本文件,包含构建镜像所需的指令。

示例代码meethigher/docker-learn at 构建docker镜像

# 使用 Java 8 运行时环境 docker pull eclipse-temurin:8-jre-alpine
FROM eclipse-temurin:8-jre-alpine# 设置容器中的工作目录
WORKDIR /docker-learn# 复制 JAR 文件到设置的容器目录中
COPY target/docker-learn.jar app.jar# 运行 Java 应用
CMD ["java", "-jar", "app.jar"]

使用 docker build 命令基于 Dockerfile 构建镜像。

# 格式。如果不使用标签,默认是latest
docker build -t <镜像名>:<标签> <构建上下文># -t指定镜像名。.表示当前目录(目录应是Dockerfile所在目录)
docker build -t docker-learn .

4.2 多阶段构建优化 Docker 镜像

使用多阶段构建可以减少最终镜像的大小,它仅保留运行时所需的文件,而不会把构建过程中产生的无关文件带入最终镜像,提高构建效率。

示例代码meethigher/docker-learn at 多阶段构建docker镜像

# 第一阶段:构建阶段
FROM maven:3.6.3-openjdk-8 AS builder
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests# 第二阶段:运行阶段。将第一阶段的构建产物复制到第二阶段中
FROM eclipse-temurin:8-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/docker-learn.jar app.jar
CMD ["java", "-jar", "app.jar"]

执行构建命令后如图

4.3 推送镜像到 Docker Hub/私有仓库

# 登录 Docker Hub
docker login# 给镜像打标签(格式:仓库名/镜像名:标签)
docker tag my-nginx your_dockerhub_username/my-nginx:v1# 推送到 Docker Hub
docker push your_dockerhub_username/my-nginx:v1

五、Docker Compose(多容器管理)

5.1 什么是 Docker Compose?

Docker Compose 允许使用 docker-compose.yml 文件来定义和管理多个容器。

5.2 使用 Docker Compose 启动多容器

示例代码meethigher/docker-learn at docker-compose

以下是一个 docker-compose.yml 文件示例,定义了 app和 db 两个服务。

services:app:build: .container_name: java_appdepends_on:- dbenvironment:DB_URL: jdbc:postgresql://db:5432/mydatabaseDB_USER: myuserDB_PASSWORD: mypasswordports:- "8080:8080"db:image: postgres:15container_name: postgres_dbrestart: alwaysenvironment:POSTGRES_DB: mydatabasePOSTGRES_USER: myuserPOSTGRES_PASSWORD: mypasswordports:- "5432:5432"

启动容器

# 在当前目录下启动所有服务 -d表示后台 --build表示重新构建
docker compose up -d# 查看运行中的容器
docker compose ps# 停止并删除所有容器
docker compose down

日志与调试

# 查看所有服务的日志
docker compose logs -f# 查看特定服务的日志
docker compose logs -f nginx

s_db
restart: always
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
ports:
- “5432:5432”


启动容器```sh
# 在当前目录下启动所有服务 -d表示后台 --build表示重新构建
docker compose up -d# 查看运行中的容器
docker compose ps# 停止并删除所有容器
docker compose down

日志与调试

# 查看所有服务的日志
docker compose logs -f# 查看特定服务的日志
docker compose logs -f nginx

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

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

相关文章

haproxy基本配置详解

一、haproxy基础配置 官方文档&#xff1a;HAProxy version 2.2.22 - Configuration Manual HAProxy 的配置文件haproxy.cfg由两大部分组成&#xff0c;分别是global和proxies部分。 global&#xff1a;全局配置段 进程及安全配置相关的参数性能调整相关参数Debug参数 pro…

nodejs:express + js-mdict 作为后端,vue 3 + vite 作为前端,在线查询英汉词典

向 doubao.com/chat/ 提问&#xff1a; node.js js-mdict 作为后端&#xff0c;vue 3 vite 作为前端&#xff0c;编写在线查询英汉词典 后端部分&#xff08;express js-mdict &#xff09; 1. 项目结构 首先&#xff0c;创建一个项目目录&#xff0c;结构如下&#xff1…

网络原理--TCP的特性

TCP报文的结构&#xff1a; TCP的报头前20字节是固定长度&#xff0c;也可以通过“选项”来增加。 一、用来确保可靠性&#xff0c;最核心的机制&#xff0c;称为“确认应答” 引入一个情景&#xff1a; A向B询问cat和dog的意思&#xff1a; 这种情况是理想情况&#xff0c;…

Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【HTML— 快速入门】HTML 基础

准备工作 vscode下载 百度网盘 Subline Text 下载 Sublime Text下载 百度网盘 vscode 下载 Sublime Text 是一款轻量好用的文本编辑器&#xff0c;我们在写前端代码时&#xff0c;使用 Sublime Text 打开比使用记事本打开&#xff0c;得到的代码体验更好&#xff0c;比 vscode…

深圳南柯电子|医疗设备EMC测试整改检测:零到一,保障医疗安全

在当今医疗科技飞速发展的时代&#xff0c;医疗设备的电磁兼容性&#xff08;EMC&#xff09;已成为确保其安全、有效运行的关键要素之一。EMC测试整改检测不仅关乎设备的性能稳定性&#xff0c;更是保障患者安全、避免电磁干扰引发医疗事故的重要措施。 一、医疗设备EMC测试整…

Tomcat安装与环境变量配置(图文详解)

一、前置条件 tomcat依赖java环境&#xff0c;需要先安装java环境。 jdk环境变量配置可参考&#xff1a;win7、win10系统JDK环境变量配置-CSDN博客 二、Tomcat的下载与安装 1.进入Tomcat官网&#xff1a; https://tomcat.apache.org/ 2.在该网页左侧栏红框标记的download…

网络安全之Web后端PHP

目录 一、PHP基础语法 1.PHP基础 &#xff08;1&#xff09;php的优点 &#xff08;2&#xff09;PhpStorm的优点 2.PHP基本语法 3.PHP变量 4.PHP运算符 二、PHP流控与数组 1.php流程控制语句以及循环 &#xff08;1&#xff09;if 语句 &#xff08;2&#xff09;if…

Python 批量横屏转竖屏视频处理工具

Python 批量横屏转竖屏视频处理工具 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&…

ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?

目录 基于ESP32S3:解决RWDT无法触发中断问题引言解决方案1. 查看报错日志2. 分析报错及一步一步找到解决方法3.小结我的源码基于ESP32S3:解决RWDT无法触发中断问题 引言 在嵌入式系统中,RWDT(看门狗定时器)是确保系统稳定性的重要组件。然而,在某些情况下,RWDT可能无法…

在windows下安装windows+Ubuntu16.04双系统(上)

这篇文章的内容主要来源于这篇文章&#xff0c;给文章很详细的介绍了如何从windows下安装windowsubuntu16.04双系统。我刚开始装双系统都是参照这个方法&#xff0c;该作者前后更新了两个版本&#xff0c;在这里对其稍微进行整理一下。 一、准备&#xff1a;&#xff08;这里推…

计算机单位之详解——存储单位Byte 网络传输单位bps 视频码率单位bps

前言&#xff1a; 计算机里面单位有点复杂&#xff0c;容易混淆&#xff0c;很多时候混起来就容易概念不理解&#xff0c;包括一些小问题&#xff0c;比如说&#xff1a;为什么我买了1T硬盘&#xff0c;实际存在虚标。为什么所谓的千兆宽带&#xff0c;下载起来没有1G每秒&…

博客系统完整开发流程

前言 通过前⾯课程的学习, 我们掌握了Spring框架和MyBatis的基本使用, 并完成了图书管理系统的常规功能开发, 接下来我们系统的从0到1完成⼀个项⽬的开发. 企业开发的流程 1. 需求评审(产品经理(PM)会和运营(想口号),UI,测试,开发等沟通) ,会涉及到背景/目标/怎么做,可能会有多…

MFC笔记:本专栏课件

专栏导航 上一篇&#xff1a;在VS2019里面&#xff0c;调整代码字体大小 回到目录 下一篇&#xff1a;无 本节前言 在之前的讲解里面&#xff0c;我讲解了 Visual Studio 软件的一些个基础操作步骤。从本节开始&#xff0c;我们进入预备章。 本节内容&#xff0c;属于是 …

Flutter - 基础Widget

Flutter 中万物皆 Widget&#xff0c;基础Widget 同步对应 Android View. 普通文本 Text /*** 控制文本样式统一使用 style:TextStyle, 例&#xff1a;fontSize(字体大小),color(颜色),shadows(阴影)等等* 控制文本布局需单独设置&#xff1a;* textAlign(文不对齐方式)* te…

蓝桥杯之日期题

文章目录 1.蓝桥杯必备知识点2. 题型13.需求2 1.蓝桥杯必备知识点 蓝桥杯是一个面向全国高校计算机相关专业学生的学科竞赛&#xff0c;涵盖多个赛道&#xff0c;常见的有软件类&#xff08;如 C/C 程序设计、Java 软件开发、Python 程序设计&#xff09;和电子类&#xff08;…

本地部署大模型: LM Studio、Open WebUI 与 Chatbox 全面对比以及选型指南

1. 工具概述 LM Studio 定位&#xff1a;专注于本地化大模型实验与推理的桌面工具&#xff0c;支持多模型并行、Hugging Face集成及离线运行。 核心功能&#xff1a; 图形化界面直接加载GGUF模型文件&#xff0c;支持NVIDIA/AMD GPU加速。 内置OpenAI兼容API&#xff0c;可搭…

springboot实现多文件上传

springboot实现多文件上传 代码 package com.sh.system.controller;import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMap…

最新版IDEA下载安装教程

一、下载IDEA 点击前往官网下载 或者去网盘下载 点击前往百度网盘下载 点击前往夸克网盘下载 进去后点击IDEA 然后点击Download 选择自己电脑对应的系统 点击下载 等待下载即可 二、安装IDEA 下载好后双击应用程序 点击下一步 选择好安装目录后点击下一步 勾选这两项后点击…

vue3学习2

ts定义接口&#xff1a; 引入的时候要加type&#xff1a; 调用&#xff1a; ts创建自定义type类型&#xff0c;引入的时候也要加type&#xff1a; reactive可以直接传泛型&#xff1a; 加?声明不强制&#xff1a; defineProps接收父组件传递的props&#xff0c;其中defineProp…