Docker

一、介绍

Docker 是一个开源平台,用于开发、传输和运行应用程序。它允许开发者将应用程序及其所有依赖打包到一个名为 容器(Container) 的轻量级、可移植的封装中。通过这种方式,应用程序可以在任何环境中一致地运行。

总结:开源容器平台,将应用程序和依赖打包,封装。使程序任何环境中一致性运行。

特点:轻量级、可移植、秒即启动

对比场景:

虚拟机:在一台物理服务器上同时运行 Windows 10 和 Ubuntu 20.04 两个虚拟机,每个系统需分配独立的 CPU、内存和存储资源‌。【硬件级虚拟化】硬盘,cpu、内存划分模拟为虚拟机一部分

docker:在同一台 Linux 服务器上运行 Nginx 和 MySQL 容器,两者共享宿主机的内核,但拥有独立的文件系统和网络配置【操作系统级虚拟化 】共享宿主机操作系统内核

维度 操作系统级虚拟化(Docker) 硬件级虚拟化(VM)
‌隔离层级‌ 进程级隔离(共享内核)‌ 硬件级隔离(独立内核)‌
‌资源占用‌ 仅需应用依赖,MB 级存储 需完整 OS,GB 级存储‌
‌启动速度‌ 秒级启动 分钟级启动‌

概念理解:

Docker 是一个容器化平台,容器本质上是一个轻量级的、可执行的应用程序包,它包含了运行某个应用所需的所有依赖、库、配置文件和环境。每个 Docker 容器都基于 Docker 镜像

  • 镜像(Image) 是静态的,是创建容器的模板,包含了应用和它运行所需的所有内容。
  • 容器(Container) 是镜像的一个实例,是一个运行中的应用。

Docker 是否需要安装 JDK、Tomcat、MySQL、Nginx 等?

Docker 的核心优势之一就是它的隔离性 和一致性 。因此,如果你已经有了一个容器化的环境(如一个用于 Web 项目的容器),你不需要在宿主机上安装 JDK、Tomcat、MySQL、Nginx 等这些工具或服务。相反,通常每个服务(例如,JDK、Tomcat、MySQL、Nginx 等)会被容器化,并在 Docker 容器中运行。

所以,你确实需要使用适当的 Docker 镜像来安装这些服务,但这些服务将运行在独立的容器中,而不是在宿主机上。

先查看Linux版本号,发行版名称等

cat /etc/os-release

NAME="CentOS Linux"

VERSION="7 (Core)"

ID="centos"

ID_LIKE="rhel fedora"

VERSION_ID="7"

PRETTY_NAME="CentOS Linux 7 (Core)"

ANSI_COLOR="0;31"

CPE_NAME="cpe:/o:centos:centos:7"

HOME_URL="https://www.centos.org/"

BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"

CENTOS_MANTISBT_PROJECT_VERSION="7"

REDHAT_SUPPORT_PRODUCT="centos"
lsb_release -a

LSB Version: :core-4.1-amd64:core-4.1-noarch

Distributor ID: CentOS

Description: CentOS Linux release 7.9.2009 (Core)

Release: 7.9.2009

Codename: Core
uname -a 【内核版本信息以及硬件架构(如 32 位或 64 位)】

Linux myhost 5.4.0-42-generic #46-Ubuntu SMP Tue Jun 23 10:34:47 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
5.4.0-42-generic 是内核版本 , x86_64 表示 64 位架构

  1. yum -y update 更新CentOs系统上 软件包的命令

  2. rpm -q kernel 查看内核是否更新 【确实有新内核版本,你可以选择重启来使新内核生效】 或者 needs-restarting 【系统需要重启,会提示重启。】

  3. reboot 重启系统 【确保保存所有工作,避免未保存工作丢失】 2 提示时才执行!!!

  4. yum install docker -y 安装 docker CentOS作系统 |Docker 文档

查看docker是否安装成功 docker --version 或者 docker -v

注意:对于41.Linux要求内核3.0以上 2.CentOS 7

命令检测: hostnamectl 可以看到内核版本,系统发行版本

  1. systemctl start docker.service 启动docker

  2. systemctl status docker.service 查看docker状态 【active ------运行状态】

  1. 常用管理命令

systemctl stop docker.service

systemctl start docker.service

systemctl restart docker.service

systemctl status docker.service

二、运行程序

Docker使用前,习惯性安装协助工具

yum install iproute ftp bind-utils net-tools wget -y # 安装常用工具

其中:

iproute 用来执行 ip addr 查看本机地址

ftp 用来测试ftp 服务器

bind_utils 用来运行 nslookup

net-tools 用来执行 netstate

wget 既是执行 wget的

注意:yum安装时提示:This system is not registered with an entitlement server. You can use subscription-manager

因为你的系统没有与 Red Hat 的订阅管理器注册。这个消息通常出现在基于 RHEL(Red Hat Enterprise Linux)的系统上,而 CentOS 是一个开源的社区驱动的替代版本,不需要注册。

命令cat /etc/os-release 或 hostnamectl 或 lsb_release -a可看 版本,操作系统,内核

禁用即可

  1. vim /etc/yum/pluginconf.d/subscription-manager.conf

  2. enabled=0 #将它禁用掉 将1 改为 0

配置dns

nslookup www.baidu.com 查看配置的域名服务器地址

可见100 开头不在 私网中,还行。否则要改域名服务器地址

怎么修改呢?

vi /etc/resolv.conf 修改里面nameserver 对应的 ip地址
解释:

公网和私网的区别:

特性 公网 IP 私网 IP
唯一性 全球唯一,互联网上唯一可访问的地址。 在局域网内唯一,不在全球范围内唯一。
访问方式 任何互联网设备都可以访问。 只能在同一局域网内访问,外部设备无法直接访问。
地址范围 由 IANA 和 ISP 分配,地址有限。 使用保留的地址范围,如 10.x.x.x、192.168.x.x。
应用场景 用于公网通信,网站服务器、公共服务等。 用于局域网内部通信,家庭、企业网络中设备连接。
转换方式 不需要转换,直接与外部互联网通信。 需要通过 NAT(网络地址转换)才能与公网通信。

配置镜像加速

想想你学习的maven,干嘛配置连接地址?不都是为了加速,快捷,方便吗

1.vim /etc/docker/daemon.json # 原来 里面只有 {} 这对大括号

  1. sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": "https://registry.docker-cn.com", # 你配置镜像加速地址

"insecure-registries": "myregistry.example.com" # Docker 只允许通过 HTTPS 与仓库通信。如果你有一个私有仓库只支持 HTTP 连接,可以通过 insecure-registries 配置来让 Docker 允许 HTTP 协议的连接

}

EOF

  1. sudo systemctl daemon-reload # 加载新的配置文件

  2. sudo systemctl restart docker # 重启docker

注意:系统级操作 你的账号权限不大,命令前加 sudo -- 以超级用户(root)身份执行命令

**5.**tail /etc/docker/daemon.json 查看是否生效

或者 用此命令

bash 复制代码
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

部署一个测试版本 简单模拟

假设镜像加速地址 你自己的阿里 或 腾讯云 、华为 地址,又或者 大部分公开加速器(如阿里云、网易云等)

常用的加速器有:

举个例子,假设你要部署一个简单的 Node.js 应用。【从拉取镜像开始,构建的过程往后讲】

该Node应用已经做成一个镜像 名为 node-app

1.拉取 docker pull node-app

2.运行 docker run -dit --privileged -p80:80 -p8080:8080 -p30000-30010:30000-30010 --name myNodeApp node-app:latest /usr/sbin/init

3.检查 netstat -anp|grep 8080 查看端口 docker ps 查看正在运行的容器

docker ps -a 查看包含已停止的容器

三、理解

三个主要概念:镜像、容器、仓库 docker命令干的就是它们三

Docker不像虚拟机 ,即不是模拟一个操作系统

组件 作用 类比(生活化理解)
镜像(Image) 只读的 "模板文件",包含运行应用所需的所有内容(代码、依赖、环境变量等) 类似 "手机 App 的安装包(.apk/.ipa)"
容器(Container) 镜像的 "运行实例",是可读写的独立运行单元(镜像启动后才会生成容器) 类似 "手机上已安装并正在运行的 App"
仓库(Repository) 存储镜像的 "远程仓库",用于分享 / 下载镜像(类似代码仓库 Git) 类似 "应用商店(如苹果 App Store)"

Docker引擎架构---cs架构

Client、Daemon、Registry

docker run -dit --privileged -p80:80 -p8080:8080 -p30000-30010:30000-30010 --name myNodeApp node-app:latest /usr/sbin/init

解释:

  1. docker run

    • 启动一个新的 Docker 容器并运行一个指定的命令(在这个例子中是 /usr/sbin/init)。这是用于创建和启动容器的基础命令。
  2. -d (detached mode)

    • -d 选项表示容器将以 "后台模式" 运行,即容器启动后会在后台运行,不会占用当前的终端会话。
  3. -i (interactive)

    • -i 选项表示保持标准输入流(stdin)打开,这样你可以与容器进行交互。
  4. -t (tty)

    • -t 选项会为容器分配一个伪终端(TTY),使容器具有交互式终端,适合执行需要交互的操作。

    -dit 的组合 表示容器将在后台运行,并且保持交互性和终端连接。

  5. --privileged

    • 这个选项使容器获得更多的系统权限,类似于管理员权限。它允许容器访问主机上的设备和执行一些低级操作(例如,加载内核模块、修改网络设置等)。这个选项通常用于需要更多操作权限的容器,比如模拟某些系统级操作。
  6. -p (端口映射) 前面的端口是linux,后面的端口是容器

    • -p 选项用于将宿主机的端口映射到容器的端口,允许外部访问容器内的服务。
    • -p80:80:将宿主机的 80 端口映射到容器的 80 端口,通常用于 HTTP 服务。
    • -p8080:8080:将宿主机的 8080 端口映射到容器的 8080 端口,用于其他 HTTP 服务或备用端口。
    • -p30000-30010:30000-30010:将宿主机的 30000 到 30010 端口映射到容器的相应端口范围。通常这种范围用于多个连续端口的映射,可能是某些应用需要动态端口。
  7. --name myNodeApp

    • 这个选项指定了容器的名字为 myNodeApp,这样你可以通过这个名字来引用和管理容器。
  8. node-app:latest

    • 这是你要启动的容器镜像名称,node-app 是镜像的名称,latest 是标签,表示拉取镜像的最新版本。如果未指定标签,Docker 默认会使用 latest 标签。
  9. /usr/sbin/init

    • 这是容器启动时执行的命令。/usr/sbin/init 是 Linux 系统的初始化程序,在容器启动时,它会被执行,通常用于【模拟一个完整的 Linux 系统环境】,启动必要的系统服务。

总结

  • 不指定 /usr/sbin/init 通常不会影响容器运行,尤其是当镜像本身已经设置了默认的应用启动命令时。
  • 如果你需要容器像一个完整的操作系统一样启动,或者需要初始化系统级别的服务时,可以使用 /usr/sbin/init。

进入容器

node安装在linux中,会有文件夹,文件,使用docker容器化后,还想查看node相关文件夹,文件 怎么办?

docker exec -it myNodeApp /bin/sh

想退出怎么办?

Ctrl+D 或 exit

总结:

Docker 术语 Git 类比 解释
仓库 (Repository) Git 仓库 存放"东西"的地方。Docker 仓库存放的是 镜像,Git 仓库存放的是 代码 。可以是远程的,也可以是本地的。
镜像 (Image) Git 仓库里的代码快照 镜像是 静态的、只读的文件集合,就像 Git 仓库里的 commit。你可以从仓库拉取镜像,就像 git clone 或 git checkout。
容器 (Container) 本地运行的代码实例 容器是镜像的运行时实例,可以理解为你把代码拉下来在本地运行。容器有自己的运行环境和状态,类似程序运行后生成的进程。

四、镜像管理

基础镜像管理操作

  1. search :从远程仓库搜索镜像(如 docker search nginx)需联网
  2. pull :拉取镜像到本地(如 docker pull nginx:latest)
  3. images :查看本地所有镜像(docker images 或 docker image ls)
  4. rmi :删除本地镜像(如 docker rmi nginx:latest,需先删除依赖容器)
  5. 修改镜像名称 / 标签 :tag(如 docker tag nginx:latest mynginx:v1,本质是创建别名,不修改原镜像)
  6. push :推送本地镜像到远程仓库(如 docker push username/mynginx:v1,需先登录仓库)

查、拉、看、删、改、传/推

高频操作

  1. inspect :查看镜像详细信息(如分层、配置 等,docker inspect nginx:latest)

  2. history :查看镜像的构建历史(必指定镜像ID 或 仓库名:标签)

    bash 复制代码
    docker history mynginx:v1  # 指定标签v1
    docker history abc12345  # 用IMAGE ID的前几位或完整ID
  3. prune :清理无用镜像(删除未被使用的镜像,docker image prune,加 -a 删除所有未运行容器依赖的镜像)

为了方便调试,需要珊瑚镜像,一个个太慢了,想删除所有镜像
docker rmi $(docker images -q) 【除非容器都停止,也有镜像备份,否则别用此命令】

五、容器管理

基础操作

  1. 创建并运行容器 docker run 选项 镜像名 命令

    docker run -dit -p8080:8080 --name myNodeApp node-app:latest

  2. 查看容器
    docker ps:查看正在运行 的容器
    docker ps -a:查看所有容器(包括已停止的)

容器生命周期管理

  1. 启动 / 停止 / 重启

    • docker start 容器名/ID:启动已停止的容器
    • docker stop 容器名/ID:优雅停止容器(发送 SIGTERM 信号)
    • docker kill 容器名/ID:强制停止容器(发送 SIGKILL 信号)
    • docker restart 容器名/ID:重启容器
  2. 暂停 / 恢复

    • docker pause 容器名/ID:暂停容器(进程冻结)
    • docker unpause 容器名/ID:恢复暂停的容器

容器交互与查看

  1. 进入容器

    • docker exec -it 容器名/ID /bin/bash:推荐,以交互模式进入容器(新进程,退出不影响容器运行)
    • docker attach 容器名/ID:进入容器的主进程(退出会导致容器停止,慎用)
  2. 查看容器详情

    • docker inspect 容器名/ID:查看容器完整配置(IP、挂载、网络等)
    • docker logs 容器名/ID:查看容器日志(-f 实时跟踪,--tail 100 查看最后 100 行)
      docker logs --tail -100f container_id 退出:ctrl+C
    • docker top 容器名/ID:查看容器内运行的进程

容器删除与提交

  1. 删除容器

    • docker rm 容器名/ID:删除已停止的容器

    • docker rm -f 容器名/ID:强制删除正在运行的容器

    • docker container prune:清理所有已停止的容器

      docker rm `docker ps -a -q` -f

  2. 容器转镜像(提交修改) docker commit [选项] 容器名/ID 新镜像名:标签(如 docker commit mynginx mynginx:v2,将修改后的 mynginx 容器保存为新镜像)

    docker commit -m "修改nginx.conf配置" mynginx mynginx:v2 类似git。。

六、Linux 系统的 IPv4 转发功能。

什么是 IPv4 转发?

简单说,IPv4 转发是指:当一台 Linux 机器收到一个网络数据包,且该数据包的目标 IP 不是本机时,是否允许这台机器将数据包转发到目标 IP 所在的网络(类似路由器的 "转发" 功能)。

默认关闭 vi /etc/sysctl.conf ,加入 【 net.ipv4.ip_forward=1 】表示允许转发,机器可作为 "网关" 或 "路由器",在不同网络之间转发数据包

为什么在 Docker 中常用?

Docker 的网络功能(尤其是跨容器、容器与外部网络通信)依赖 IPv4 转发:

  • Docker 会创建虚拟网络(如 bridge 模式),容器通过虚拟网卡与主机通信。
  • 当容器需要访问外部网络(如互联网),或不同主机上的容器需要通信时,主机需要开启 IPv4 转发,才能将容器的数据包转发到目标网络。

七、DockerFile

学习Docker之Dockerfile的命令 - 简书

https://blog.csdn.net/cxy1991xm/article/details/80231078

https://blog.csdn.net/java_wxid/article/details/121148139

相关推荐
笑洋仟4 分钟前
k8s的Ingress配置问题
云原生·容器·kubernetes
垚垚学技术_聚焦云原生9 分钟前
K8s OpenEBS LVM 动态存储 PVC Pending 排查记
云原生·容器·kubernetes
小锋学长生活大爆炸20 分钟前
【工具】在 Android 手机上运行 Docker
android·docker·智能手机
jaronho33 分钟前
【脚本】 【Linux】启动所有网卡
linux·运维·服务器
吴声子夜歌36 分钟前
Docker入门与实战——实战案例(分布式处理与大数据平台)
大数据·分布式·docker
JavaPub-rodert42 分钟前
服务器不能访问 Docker Hub,镜像怎么搬过去?讲透 docker save、load、export、import 与离线镜像分发
运维·服务器·docker
程序员-Benothing9 小时前
Vim编辑器从入门到精通:模式、快捷键、配置、插件
linux·运维·服务器
m0_646429979 小时前
Docker 完整核心知识点总结(超通俗易懂版)
运维·docker·容器
亚川楼宇自控系统数据中心厂家10 小时前
IBMS 集成管理系统:如何打通楼宇自控实现建筑一体化管控
运维
迪康Defender10 小时前
终端安全审批体系设计:如何平衡安全管控与业务连续性
运维·服务器·安全·运维开发·学习方法·业界资讯·远程工作