网络服务器配置与管理教辅书 Help

9-4 Docker 换源 镜像

恢复上节课进度

  1. 教师下发安装包到学生机桌面,从宿主机桌面复制离线安装包docker-installer.tar.gz到虚拟机/root目录下。

  2. 解压缩和安装

    tar -zxvf docker-installer.tar.gz rpm -iv --nodeps --force ./docker-installer/*.rpm docker -v
  3. 启动服务

    systemctl start docker systemctl status docker # 服务信息应该为active且无报错。报错的话检查虚拟机cpu虚拟化支持是否勾选。

基本概念

  • 镜像image: 例如WordPress博客的镜像,以操作系统为底、PHP解释器、MySQL数据库,制作者先拉取基础的操作系统镜像,然后在上面安装配置后所需程序,最后共享给大家使用。 为了避免镜像过大,社区除了有Ubuntu这种2G左右的大而全镜像,也有alpine(阿尔卑斯)这种5Mb大小的极精简系统。
    另外采用了分层文件系统layers依赖管理的思想,例如WordPress和Nodebb两个项目都基于同一种Ubuntu,那么重复部分只会下载一次,在docker pull image时能看到细节。 下载镜像的过程叫拉取

    • 镜像标签tag:
      一个镜像根据操作系统和代码版本,会生成有多个版本,例如python:3.11 python:3 python:alpine-3.11。默认版本tag为latest会拉取最新的稳定版本。

    • 镜像仓库: docker官方仓库平台 :官方包管理平台,网友可以发布自己的镜像,也可以下载其它人的镜像加速自己的任务。也可以搭建私有仓库。

    • 镜像构建build:通过专门的构建语言,指定封装的镜像以什么操作系统为底,安装什么应用,执行什么脚本。

  • 容器container: 一个镜像运行起来,执行了镜像内部的命令程序,通过端口绑定使服务暴露在宿主机上供人使用,在宿主机上就像是一个程序容器。

    • 端口绑定port bind

    • 磁盘映射disk mapping:
      程序运行在容器内,容器运行的是封装好的镜像,如果要修改细节配置,进入容器修改比较麻烦且会导致镜像变化,建议映射。
      例如容器内运行一个Nginx程序,默认网站文件夹是/usr/share/nginx/html,启动在80端口。那么把宿主机(假设使用了Docker Desktop for Windows,D盘下有网站文件夹mysite) D:\mysite➡️/usr/share/nginx/html,宿主机80端口➡️容器80端口,那么当容器运行时,就能读取到宿主机上的内容。这使得Docker在保持强封装的同时兼具灵活性。

    • 进入容器attach:进入容器中的操作系统进行临时修改和排查。

    • 查看日志:查看容器应用运行过程中产生的日志。

  • 相关生态

    • docker compose,如果一个项目由数据库、前端、后端等多个子项目构成,可以把多个容器和运行顺序进行编排,编排配置文件叫Dockerfile,一个容器编排中包括多个docker容器。

    • Kubernates:是更上层更复杂,分布式、弹性、高可用,可以批量管理多台服务器和docker容器和自动化部署。

(仅了解不需操作)build构建镜像

详细略,只需理解。
运维大佬创建Dockerfile文件,运用dockerfile语法将日常linux命令过程封装起来。

FROM centos:8.9 RUN yum update && yum install -y nginx COPY index.html /var/www/html/index.html CMD ["systemctl", "start", "nginx"]

构建镜像。那么这个镜像里操作系统应用软件和配置都固化下来了。

docker build -t mynginx:latest .

上传镜像。上传到dockerhub官方平台。

# docker login zhangsan docker push mynginx:latest

其他人就可以pull下拉⏬了。

优点:Docker镜像构建对linux运维工作进行了封装固化。
缺点:调试麻烦,不够灵活,经验不足的运维人员不好封装复杂操作。例如 yum install nginx这句话,物理机上随意操作,构建镜像是就必须-y参数。
因此本节课主要关注pull命令就可以了。

镜像源换源

由于某些原因,国内无法访问dockerhub官方镜像源相关的域名,导致docker安装后无法使用。docker镜像源换源不同于之前的linux操作系统软件源换源。

镜像源推荐:
(docker镜像源不好找。因为镜像很大,例如nginx的docker镜像如果打底系统是ubuntu那么镜像1Gb左右,再加上不同操作系统和不同应用版本相互组合,光这一款应用的镜像空间就挺大的,国内镜像源企业受限于成本,很多已经不可用或要求账号鉴权。)

换源:
临时换源是在docker pull命令时加域名和仓库所有者名,命令较长,为了一劳永逸推荐永久换源。

  1. (可选)创建配置文件

    # (可选,一般安装完docker会自动生成这个文件夹) # mkdir -p /etc/docker # (可选,后面的换源命令会创建此文件)daemon.json在安装完docker后默认不会自动生成,手动创建 touch /etc/docker/daemon.json
  2. 修改配置文件
    docker engine的配置文件daemon.json,语法字段很多,我们只需关注registry-mirrors值。

    # EOF自定义终止符表示后面跟结构化的字符串,如果用vim/nano编辑配置文件不要把EOF抄上去。 # 注意json配置文件语法,字符串双引号,⚠️列表最后一项没有逗号。 # 镜像源地址先用浏览器测试访问看是否可用。 tee /etc/docker/daemon.json <<EOF { "registry-mirrors": [ "https://dockerproxy.net", "https://docker.xuanyuan.me" ] } EOF
  3. 重启

    # (待测试是否可省略)重载systemd单元文件管理,不会被dockerd读取,需要这行命令。新版本>=17后,dockerd会自动读取deamon.json,不需要这行命令。 systemctl daemon-reload # 重启docker进程 systemctl restart docker
  4. 测试

    # 查看docker engine信息,确认registry-mirrors字段已经改变为源镜像网址 docker info # 测试hello-world镜像 docker pull hello-world

    运行成功返回日志如下

    Hello from Docker! This message shows that your installation appears to be working correctly. ... For more examples and ideas, visit: https://docs.docker.com/get-started/

镜像

命令:pull拉取(即下载)

概念:

  • 镜像仓库registry。官方dockerhub.io,国内为镜像源,或私有仓库。

  • 仓库所有者。公司或个人。

  • 项目。

  • 标签tag。当仓库配置好后,项目名加标签名形如"nginx:latest" "nginx:7.1" "nginx:ubuntu22" "nginx:stable" "nginx:ubuntu22-7.1",默认值"latest"可省略。

在线拉取

docker pull hello-world:latest

离线安装

  1. 老师下发 hello-world.tar 离线docker image文件至学生机桌面,学生复制粘贴文件进虚拟机root用户家目录下。

  2. 加载离线镜像

    docker load -i hello-world.tar

管理命令

# 查看所有已下载的镜像 docker image list # 删除镜像 docker image remove hello-world:latest # 删除镜像根据hash值 # docker image remove 3d7fb # (课外)上传镜像到仓库平台
REPOSITORY TAG IMAGE ID CREATED SIZE wordpress latest d55afd85574d 4 weeks ago 697MB nginx latest 60c8a892f36f 6 weeks ago 192MB hello-world latest d2c94e258dcb 18 months ago 13.3kB

课外

  1. 使用build构建镜像相关命令

  2. 上传镜像到dockerhub或私有仓库

  3. 搭建私有仓库

15 二月 2026