注:本文章使用 VMware虚拟机 + RockyLinux9 的环境来演示和操作。

Docker

Docker 是一种开源的容器化平台,操作系统级虚拟化技术,利用Linux 命名空间(Namespace)和控制组(CGroup)实现轻量级容器化,用于开发、交付和运行应用程序。
通过容器技术将应用程序及其所有依赖项(如代码、运行时环境、系统工具等)打包到一个标准化的轻量级单元中,称为容器。这些容器可以在任何支持 Docker 的环境中运行,确保应用在不同环境(开发、测试、生产)中的一致性

对Docker最简单但不完全准确的理解:Docker是一个微型的虚拟机

Docker容器优势

  1. **环境一致性:**可以在windows/linux/macos等多平台运行
  2. **轻量与高校:**共享宿主机内核,启动速度秒级,资源占用率低
  3. **隔离性与安全:**进程隔离防止容器之间互相干扰,而且支持SELinux 增强安全策略

Docker容器缺点

  1. **数据安全风险:**删除容器容易导致数据丢失,因此数据库一般不会放到容器内部署。

Docker安装与配置

安装前基本要求:关闭防火墙和 SELinux!! 这点很重要

一键检查自己的防火墙和SELiunx有没有关闭:

systemctl status firewalld && \
getenforce
安装前准备:
  1. 首先找一台虚拟机搭建FTP共享服务器,方便在容器内安装软件
dnf -y install vsftpd
  1. 修改

vim /etc/vsftpd/vsftpd.conf

anonymous_enable=YES
  1. 将需要Docker软件包放到/var/ftp/下,然后安装createrepo
dnf -y install createrepo &&\
createrepo --update /var/ftp/rpms

[!NOTE]

createrepo 是 Linux 系统中用于创建和管理 YUM/DNF 软件仓库的命令行工具,主要功能是为 RPM 软件包生成元数据索引,使包管理器(如 yumdnf)能够识别、安装和更新软件包。

Docker的安装
  1. 安装和启动
dnf -y install docker-ce && \
systemctl enable docker --now # 设置开机自启,并且当前服务进行启动(--now的作用)

检查docker是否开启:docker version

  1. 配置路由转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p

这步骤主要是为了让容器内的镜像能够上网,相当于给容器内的镜像设置了连接外网的路由

  1. 加载镜像
docker images # 查看系统镜像
docker load -i /root/dockerimgs1.tar.gz #导入镜像  -i:指定路径
docker images
镜像加速器配置

官方的镜像仓库在外网,可能无法访问,因此要配置国内的镜像仓库加速镜像下载:

vim /etc/docker/daemon.json

{
	"registry-mirrors": ["https://docker.m.daocloud.io"],  // 配置镜像仓库加速器地址
	"insecure-registries": [""]  // 配置不安全站点地址
}

这个文件默认是不存在的,用vim编写自动创建

镜像命名方式:

  • 每一个镜像都对应唯一的镜像ID,就像身份证号
  • 镜像名 + 标签 = 唯一名
    • 镜像标签一般是版本号
    • 每一个镜像都有标签,如果没有就是默认标签(latest)
    • 如:httpd_rocky9 rocky9 就是标签名

Docker基础操作命令

镜像操作:
  • docker load -i /root/xxx.tar.gz:导入镜像
    • -i:指定路径
  • docker save 镜像名:版本号 -o 镜像名.tar:导出镜像
  • docker pull 镜像名:下载镜像
  • docker search:搜索镜像
  • docker history:查看镜像制作的历史和命令
  • docker inspect 镜像名:查阅镜像的详细参数信息
    • 查看容器的IP:docker inspect 容器名 | grep -i ipaddr,可以用于访问容器内的服务

容器操作:
  • docker run --name 容器名 -itd 镜像名:镜像标签 /bin/sh:容器创建启动(通用)
    • -it:启动后进入终端交互
    • -d:容器放入后台(如果用这个选项,就不需要加/bin/bash)
    • --name:给容器起别名方便管理
    • -p:端口绑定(冒号左边是主机端口,右边是容器端口)
    • -v:目录挂载,将容器内部的某个目录与外部共享。其原理是NFS共享
    • /bin/sh:指定运行容器的解释器。这个解释器必须要容器里面有才行,比如有的容器没有bash,用bash就会报错
  • docker ps:查看当前所有容器状态
    • -a:查看所有容器
  • docker exec -it 容器名 /bin/bash:进入容器内部
    • 只要和容器进行终端命令交互,就一定要写/bin/bash
  • docker start 容器名 :启动容器
  • docker stop 容器名:停止容器:
  • docker rm -f 容器名:删除容器
    • -f:强制删除
  • docker rmi 容器名:删除镜像(这个 rm 加了 i 是删除镜像image)
  • docker cp:复制文件到容器里
  • docker tag 容器ID 别名:容器名:给容器起别名。起了以后查看镜像,会多出来一行镜像信息,但本质上是刚才镜像的马甲

Docker使用案例:

容器排错

在启动容器后,如果容器没有正常启动,就需要去查阅日志信息

比如,在nginx容器中,如果nginx配置文件改错,重启后就会报错:

[root@docker-0001 ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS                      PORTS     NAMES
9ba350364f5d   myos:nginx   "/usr/local/sbin/ent…"   8 minutes ago   Exited (1) 10 seconds ago             web

发现状态是 Exited ,容器没有正常运行,要排错…

查看这个容器的日志信息:

docker logs web

172.17.0.1 - - [04/Nov/2025:07:25:08 +0000] "GET / HTTP/1.1" 200 33 "-" "curl/7.76.1"
nginx: [emerg] invalid parameter "server_name" in /usr/local/nginx//conf/nginx.conf:41

原来如此,41行附近出了问题,要修改配置文件

但容器进不去了,没法在容器内修改

这个时候,可以使用复制命令,配置文件cp出来修改好了再cp回去:

docker cp web:/usr/local/nginx/conf/nginx.conf ./

检查配置文件41行附近,原来是少了个分号,加上去即可

 39     server {
 40         listen       80
 41         server_name  localhost;

修改好了拷贝回去:

docker cp ./nginx.conf web:/usr/local/nginx/conf/

再次启动容器后,又可以正常运行了

docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS                             PORTS             NAMES
9ba350364f5d   myos:nginx   "/usr/local/sbin/ent…"   18 minutes ago   Up 20 seconds (health: starting)   80/tcp, 443/tcp   web
在最小化安装的容器里面安装软件

在最小化容器中,很多常用甚至必要的软件是没有安装的,需要我们按需求手动安装

核心思路:在镜像外搭建FTP服务器,在容器内的yum仓库配置FTP目录,然后dnf安装软件

设备A:192.168.88.2

设备B:192.168.88.240

  1. 在设备A上安装、配置并启动FTP服务器
yum -y install vsftpd

vim /etc/vsftpd/vsftpd.conf
...
 12 anonymous_enable=YES
...

systemctl enable vsftpd --now
  1. 挂载DVD文件到 /var/ftp/
mount /dev/sr0 /var/ftp/

这个是临时挂载,仅测试使用,永久挂载请配置/etc/fstab

  1. 在容器内配置yum源。或者在容器外配置好,复制到/etc/yum.repos.d 下(在连vim都没有的情况下就这么做)
[ftpApp]
name=ftp
baseurl=ftp://192.168.88.240/dvd/AppStream
enabled=1
gpgcheck=0

[ftpBase]
name=ftp
baseurl=ftp://192.168.88.240/dvd/BaseOS
enabled=1
gpgcheck=0
  1. 验证yum源配置
docker exec -it 容器名 dnf repoinfo


ftp                                                                      79 MB/s | 9.6 MB     00:00    
ftp                                                                      53 MB/s | 2.5 MB     00:00    
Repo-id            : ftpApp
Repo-name          : ftp
Repo-revision      : 1748559289
Repo-updated       : Thu May 29 22:54:49 2025
Repo-pkgs          : 6247
Repo-available-pkgs: 5911
Repo-size          : 9.4 G
Repo-baseurl       : ftp://192.168.88.240/dvd/AppStream
Repo-expire        : 172800 second(s) (last: Tue Nov  4 08:29:48 2025)
Repo-filename      : /etc/yum.repos.d/local.repo

Repo-id            : ftpBase
Repo-name          : ftp
Repo-revision      : 1748468553
Repo-updated       : Wed May 28 21:42:33 2025
Repo-pkgs          : 1171
Repo-available-pkgs: 1171
Repo-size          : 1.4 G
Repo-baseurl       : ftp://192.168.88.240/dvd/BaseOS
Repo-expire        : 172800 second(s) (last: Tue Nov  4 08:29:50 2025)
Repo-filename      : /etc/yum.repos.d/local.repo
Total packages: 7418

如果配置成功,会显示扫描到几千上万个软件包

  1. 安装必要或常用的软件包
docker exec -it 容器名 dnf install -y net-tools vim-enhanced tree bash-completion iproute procps-ng psmis
简单镜像封装制作

在封装前需要先停止镜像运行:docker stop 容器

  1. 镜像封装命令:
docker commit 容器名 镜像名:标签(版本号)
docker images       # 查看镜像是否封装成功
  1. 安装运行测试
docker run -it --name web 刚才的镜像名:标签 /bin/bash

用镜像制作一个web服务

容器里面并不安全,如果容器被删除,里面所有的内容都会被删除。

因此最好是将页面等内容放到运行文件的机器里面

  1. 创建容器,进行端口绑定和目录绑定(NFS共享)
docker run --name myweb -p80:80 -v /myweb:/var/www/html/ -itd 镜像名 #将内部的80端口绑定到外部
  1. 准备好主机的挂载点,放入制作好的网页
mkdir /myweb
...
  1. 访问测试
curl 127.0.0.1

更多推荐