一、安装Docker

依次按照下面步骤即可完成docker的安装。

1、更新软件源

sudo apt update

2、安装基本软件

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common lrzsz -y

3、指定使用阿里云镜像

sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

4、安装docker-ce

sudo apt-get install docker-ce -y

5、查看docker版本

docker version

6、配置可用镜像源,创建daemon.json文件,切换到/etc/docker

cd /etc/docker
sudo touch daemon.json

7、编辑/etc/docker/daemon.json文件

sudo vim daemon.json

8、把下面的内容复制到daemon.json文件中

{
    "registry-mirrors": [
        "https://docker.1panel.live",
        "https://hub.rat.dev"
    ]
}

9、重启docker

systemctl daemon-reload
systemctl restart docker

10、继续验证和部署

# 1. 拉取测试镜像
docker pull hello-world
docker run hello-world

11、拉取nginx

# 1. 拉取 Nginx
docker pull nginx

# 2. 运行 Nginx 容器
docker run -d --name my-nginx -p 8080:80 nginx

# 3. 查看运行状态
docker ps

12、拉取redis

docker run -d --name my-redis -p 6380:6379 redis

13、拉取mysql

docker run -d --name my-mysql -p 3366:3365 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

二、镜像构建

1. 什么是 Docker 镜像?

  • 它是一个只读的模板,包含了运行应用所需的一切:代码、依赖库、配置文件、环境变量等。
  • 可以把它想象成一个打包好的绿色软件安装包,拿到哪里都能直接运行,不用再装依赖。
  • 镜像的底层是分层存储:比如 nginx:alpine 镜像,底层是 Alpine Linux 系统,上层是 Nginx 服务,每一层都是只读的,修改时只会在最上层添加新层,节省空间。

2. 镜像构建的两种方式

方式 1:拉取官方镜像(docker pull)
  • 命令格式:
    docker pull 镜像名:版本
    # 比如:
    docker pull nginx:alpine
    docker pull mysql:8.0
    docker pull redis:alpine
    
  • 原理:从 Docker Hub(官方镜像仓库)下载别人已经构建好的镜像,直接用,不用自己写配置。
  • 配置的国内镜像源 ustc.edu.cn 就是用来加速下载的,面试可以说:“我配置了国内镜像源,解决了官方仓库访问慢的问题”。
方式 2:自定义构建(docker build + Dockerfile)
  • 核心文件:Dockerfile(镜像的构建脚本)
  • 一个完整的 Nginx 项目镜像构建流程:
    1. 准备项目文件:index.html(你的网页代码)
    2. 写 Dockerfile:
      # 1. 基础镜像:基于轻量版 Nginx 构建
      FROM nginx:alpine
      
      # 2. 复制本地文件到容器的 Nginx 目录
      COPY index.html /usr/share/nginx/html/index.html
      
      # 3. 声明容器提供服务的端口
      EXPOSE 80
      
      # 4. 容器启动时执行的命令(让 Nginx 前台运行,容器不会退出)
      CMD ["nginx", "-g", "daemon off;"]
      
    3. 构建镜像:
      docker build -t my-web-app:v1 .
      
  • 我了解 Dockerfile 编写,能将静态项目打包成镜像,实现一次构建、随处运行,解决了开发环境和生产环境不一致的问题。

二、容器启动、端口映射与环境隔离

1. 容器是什么?和镜像的关系?

  • 容器是镜像运行起来的实例,一个镜像可以启动无数个容器。
  • 镜像只读,容器可写:启动容器时,Docker 会在镜像的只读层上添加一个可写层,所有修改都发生在可写层,不会影响镜像本身。
  • 容器和虚拟机的区别:
    • 虚拟机:模拟一整套硬件,运行完整的操作系统,占用资源多、启动慢。
    • Docker 容器:共享主机的内核,只打包应用和依赖,占用资源少、秒级启动,这就是 “轻量级容器化” 的优势。

2. 容器启动(docker run)

  • 命令格式:
    docker run [参数] 镜像名
    
  • 你必须掌握的 3 个核心参数:
    1. -d:后台运行容器,不占用终端,比如 docker run -d nginx:alpine
    2. --name:给容器起个名字,方便管理,比如 docker run -d --name my-nginx nginx:alpine
    3. -e:设置环境变量,比如启动 MySQL 时设置密码:docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

3. 端口映射(-p)—— 外部访问容器服务的关键

  • 命令格式:
    docker run -p 主机端口:容器端口 镜像名
    # 比如:
    docker run -d -p 8080:80 --name my-nginx nginx:alpine
    
  • 含义:把主机的 8080 端口,映射到容器的 80 端口(Nginx 默认端口),外部访问主机IP:8080 就能访问容器里的 Nginx 服务。
  • 我了解 Docker 端口映射原理,能将容器服务暴露到主机网络,实现外部访问,同时通过不同主机端口区分多个同类型容器,避免端口冲突。

4. 环境隔离(Docker 的核心优势)

  • 每个容器都有独立的:
    • 文件系统:容器里的文件不会影响主机和其他容器
    • 网络栈:默认使用桥接网络,每个容器有独立的 IP,互相隔离
    • 进程空间:容器里的进程是主机进程的子进程,互相不干扰
  • 作用:提升应用部署的安全性,比如你在容器里装的软件,不会污染主机环境;Nginx 容器崩溃了,不会影响 MySQL 容器。
  • 我了解 Docker 的环境隔离机制,容器之间相互隔离,互不影响,提升了应用部署的安全性和稳定性,也方便了多版本、多服务的并行部署。

三、快速部署 MySQL、Redis、Nginx 等中间件

1. Nginx 部署(Web 服务器)

# 拉取镜像
docker pull nginx:alpine

# 启动容器,端口映射 8080:80
docker run -d -p 8080:80 --name my-nginx nginx:alpine
  • 验证:主机浏览器访问 http://虚拟机IP:8080,能看到 Nginx 欢迎页
  • 我能通过 Docker 快速部署 Nginx 服务,配置端口映射,实现静态资源的访问,也能通过挂载本地配置文件修改 Nginx 配置。

2. MySQL 部署(数据库)

# 拉取镜像
docker pull mysql:8.0

# 启动容器,设置 root 密码,端口映射 3306:3306
docker run -d -p 3306:3306 --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
  • 验证:用主机的数据库工具(Navicat)连接 虚拟机IP:3306,用户 root,密码 123456
  • 我能通过 Docker 快速部署 MySQL 服务,设置 root 密码,配置端口映射,实现外部客户端连接,也了解数据卷挂载,将数据持久化到主机,避免容器删除后数据丢失。

3. Redis 部署(缓存)

# 拉取镜像
docker pull redis:alpine

# 启动容器,端口映射 6379:6379
docker run -d -p 6379:6379 --name my-redis redis:alpine
  • 验证:用 Redis 客户端连接 虚拟机IP:6379,能正常读写数据
  • 我能通过 Docker 快速部署 Redis 缓存服务,配置端口映射,实现外部客户端连接,也了解 Redis 持久化配置。

四、容器生命周期管理

阶段命令格式作用
创建启动docker rundocker run [参数] 镜像名创建并启动容器
查看状态docker psdocker ps查看正在运行的容器
docker ps -adocker ps -a查看所有容器(包括已停止的)
运行中操作docker execdocker exec -it 容器名 /bin/bash进入运行中的容器,调试命令
docker logsdocker logs 容器名查看容器日志
停止重启docker stopdocker stop 容器名优雅停止容器
docker startdocker start 容器名启动已停止的容器
docker restartdocker restart 容器名重启容器
删除清理docker rmdocker rm 容器名删除已停止的容器
docker rmidocker rmi 镜像名删除无用镜像
  • 我熟练掌握 Docker 容器的生命周期管理,能通过命令实现容器的创建、启动、停止、重启、删除,也能通过 docker exec 进入容器调试,查看日志排查问题”。

五、将项目打包镜像并发布运

  1. 准备项目文件:你的网页代码 index.html
  2. 编写 Dockerfile:定义镜像的构建规则
  3. 构建镜像:docker build -t my-project:v1 .
  4. 运行容器:docker run -d -p 8080:80 my-project:v1
  5. 发布运行:可以把镜像推送到私有仓库,在其他服务器上拉取运行,实现一次构建、随处运行。
  • 我了解 Docker 项目打包流程,能将静态项目通过 Dockerfile 构建成镜像,实现应用的容器化部署,解决了开发环境和生产环境不一致的问题,也方便了项目的持续集成与交付”。

六、高频问题

Docker 镜像和容器的区别?

  • 镜像:只读模板,用来创建容器,多个容器可以共享同一个镜像
  • 容器:镜像运行起来的实例,可写,每个容器相互隔离

Docker 容器和虚拟机的区别?

  • 虚拟机:模拟硬件,运行完整操作系统,占用资源多、启动慢
  • Docker 容器:共享主机内核,只打包应用和依赖,轻量、秒级启动,隔离性稍弱但足够满足业务需求

Docker 端口映射的原理?

  • Docker 会在主机上监听指定端口,把请求转发到容器的对应端口,外部通过主机端口访问容器服务

更多推荐