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.x192.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 clonegit checkout
容器 (Container) 本地运行的代码实例 容器是镜像的运行时实例,可以理解为你把代码拉下来在本地运行。容器有自己的运行环境和状态,类似程序运行后生成的进程。

四、镜像管理

基础镜像管理操作

  1. search :从远程仓库搜索镜像(如 docker search nginx)需联网
  2. pull :拉取镜像到本地(如 docker pull nginx:latest
  3. images :查看本地所有镜像(docker imagesdocker 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

相关推荐
可可苏饼干2 小时前
LVS服务器
linux·运维·笔记·学习·lvs
L.EscaRC2 小时前
Docker原理浅析(上)
运维·docker·容器
艾莉丝努力练剑3 小时前
【Linux基础开发工具 (三)】Vim从入门到精通(下):效率翻倍的编辑技巧与个性化配置攻略
linux·运维·服务器·c++·ubuntu·centos·vim
鹿鸣天涯4 小时前
国产服务器操作系统迁移指南
运维·服务器
Crazy________4 小时前
40nginx从单节点 HTTPS 到集群负载均衡
linux·运维·服务器
ttthe_MOon4 小时前
LVS-NAT 模式负载均衡集群部署与配置指南
运维·负载均衡·lvs
像风一样自由20208 小时前
告别“在我电脑上能跑”:Docker入门与核心概念解析
docker·容器·k8s
凯子坚持 c9 小时前
Docker实战深度解析:从Nginx部署到私有镜像仓库管理
nginx·docker·eureka
FOREVER-Q9 小时前
从开发到部署:Docker 化前端应用全流程指南
ide·docker·webstorm