一、Docker 概述

1. 基础定义

Docker 是基于 Go 语言开发、遵从 Apache2.0 协议开源的应用容器引擎,可将应用及其依赖包打包到轻量级、可移植的容器中,发布到任意流行的 Linux 机器实现虚拟化。核心优势是支持内核级虚拟化,资源消耗极低、运行稳定,容器间采用沙箱机制完全隔离,性能开销小,彻底解决 “在我的机器上可正常工作” 的环境兼容问题。

2. 核心应用场景

  • 应用打包与分发:将应用及依赖打包为镜像,实现 “一次打包,到处运行”
  • 环境一致性保障:开发、测试、生产环境高度统一,减少部署故障
  • 快速交付与部署:替代传统 “帮助文档 + 安装程序” 模式,一键启动应用
  • 资源高效利用:单台物理机可运行多个容器实例,服务器性能利用率最大化
  • 便捷扩缩容:项目打包为镜像后,可快速在多服务器扩展部署

3. 与传统虚拟机的核心区别

对比维度Docker 容器传统虚拟机(VMware/VirtualBox)
虚拟化层级内核级虚拟化(进程级隔离)硬件级虚拟化(完整 OS 隔离)
系统内核共享宿主机内核自带独立内核
资源占用轻量(MB 级),秒级启动笨重(GB 级),分钟级启动
隔离强度进程级隔离,相互无接口交互完整 OS 隔离,隔离性更强
环境一致性极高(镜像打包所有依赖)较低(需单独配置依赖)
资源利用率高(单物理机可运行数百容器)低(单物理机仅能运行数台虚拟机)

二、Docker 的安装与启动

1. 下载

2. 安装(CentOS 7 为例)

  • 卸载旧版本(可选):
    sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
    
  • 安装依赖工具:sudo yum install -y yum-utils
  • 配置镜像仓库(推荐阿里云):sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 安装 Docker CE:sudo yum install docker-ce docker-ce-cli containerd.io
  • 启动 Docker 并设置开机自启:
    sudo systemctl start docker
    systemctl enable docker
    

3. 核心目录结构

目录 / 文件核心作用
/var/lib/dockerDocker 默认工作目录,存储镜像、容器、数据卷等资源
/etc/docker配置文件目录,核心配置文件为 daemon.json(镜像加速等配置)
镜像(Image)只读模板,含应用运行所需环境、依赖、配置
容器(Container)镜像的运行实例,动态可修改,可理解为简易 Linux 系统
仓库(Repository)存储镜像的中心,分公有和私有仓库

4. 启动与验证

  • 启动方式:sudo systemctl start docker(CentOS);Windows 双击 Docker Desktop 启动
  • 验证:执行 sudo docker run hello-world,自动下载镜像并运行,输出 “Hello from Docker!” 相关提示即成功

5. 常用命令(CentOS 7 为例)

  • 启动:sudo systemctl start docker
  • 停止:sudo systemctl stop docker
  • 重启:sudo systemctl restart docker
  • 查看状态:sudo systemctl status docker
  • 配置检查:docker info(查看 Docker 系统信息,含镜像 / 容器数量)

三、Docker 核心三要素

1. 镜像(Image)

  • 定义:相当于 root 文件系统,包含运行应用所需的系统环境、依赖包、配置文件等,是静态的、不可修改的模板
  • 示例:官方 ubuntu:16.04 镜像包含完整的 Ubuntu16.04 最小系统 root 文件系统
  • 核心特性:基于联合文件系统,分层构建,修改镜像时创建新层而非修改原有层

2. 容器(Container)

  • 定义:镜像运行时的实体,与镜像的关系类似 “类与实例”,动态可修改
  • 生命周期:创建(create)→ 启动(start)→ 运行(running)→ 停止(stop)→ 销毁(rm)
  • 核心特性:容器层为可写层,所有修改操作在容器层进行,不影响镜像本身

3. 仓库(Repository)

  • 定义:存放镜像的代码控制中心,类似 Git 仓库,用于镜像的存储、分发和共享
  • 分类:公有仓库(Docker Hub、阿里云容器服务等)、私有仓库(企业内部搭建)
  • 使用流程:从仓库拉取(pull)镜像 → 基于镜像创建(run)容器 → 定制化后提交(commit)为新镜像 → 推送(push)到仓库

四、Docker 镜像核心操作

1. 查看本地镜像

docker images  # 查看所有本地镜像
docker images -a  # 列出所有镜像(含隐藏镜像)
docker images -q  # 仅显示镜像 ID

2. 搜索仓库镜像

docker search 镜像名  # 如 docker search mysql
docker search --filter "is-official=true" 镜像名  # 筛选官方认证镜像

3. 拉取镜像

docker pull 镜像名:版本  # 如 docker pull mysql:5.7(指定版本)
docker pull 镜像名  # 不指定版本默认拉取 latest 最新版本

4. 删除镜像

docker rmi -f 镜像ID/镜像名  # 删除指定镜像
docker rmi -f 镜像ID1 镜像ID2  # 删除多个镜像
docker rmi -f $(docker images -aq)  # 删除所有本地镜像

五、Docker 容器核心操作

1. 创建与启动容器

docker run [可选参数] 镜像名 [执行命令]
  • 核心参数:
    • --name 容器名:指定容器名称
    • -d:后台守护进程运行
    • -it:交互模式运行,进入容器终端
    • -p 宿主机端口:容器端口:端口映射(如 -p 3306:3306
    • -P:随机端口映射
    • -v 宿主机目录:容器目录:数据卷挂载(目录共享)

2. 查看容器

docker ps  # 查看正在运行的容器
docker ps -a  # 查看所有容器(运行中+已停止)

3. 容器启停与重启

docker start 容器ID/容器名  # 启动停止的容器
docker stop 容器ID/容器名  # 停止运行的容器
docker restart 容器ID/容器名  # 重启容器

4. 进入与退出容器

docker exec -it 容器ID/容器名 /bin/bash  # 进入容器(推荐,不影响容器运行)
exit  # 退出并停止容器(仅交互模式生效)
Ctrl+P+Q  # 退出但不停止容器

5. 删除容器

docker rm -f 容器ID/容器名  # 删除指定容器
docker rm -f $(docker ps -aq)  # 删除所有容器

6. 容器其他常用操作

  • 查看日志:docker logs -tf 容器ID-tf 实时刷新,--tail 数字 显示最后 N 行)
  • 查看容器进程:docker top 容器ID
  • 查看容器元数据:docker inspect 容器ID
  • 文件拷贝:
    • 容器→宿主机:docker cp 容器ID:容器内路径 宿主机路径
    • 宿主机→容器:docker cp 宿主机路径 容器ID:容器内路径

六、Docker 镜像加速配置

1. 为什么需要加速

Docker Hub 是国外仓库,国内直接下载镜像速度极慢,甚至超时失败,需配置国内镜像加速器

2. 国内主流加速源

3. 阿里云加速配置步骤

# 1. 创建配置目录
sudo mkdir -p /etc/docker
# 2. 编写配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dqxpbshr.mirror.aliyuncs.com"]
}
EOF
# 3. 刷新配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

七、Docker 数据卷(Volume)

1. 基础定义

数据卷是宿主机与容器之间(或容器与容器之间)的目录映射,独立于容器生命周期,实现数据持久化和共享

2. 核心作用

  • 数据持久化:容器销毁后,数据卷中的数据不会丢失
  • 数据共享:宿主机与容器、多个容器之间可通过数据卷共享文件
  • 性能优化:直接挂载宿主机目录,避免容器层 I/O 开销

3. 数据卷类型

  • 绑定挂载:docker run -v 宿主机目录:容器目录 镜像名(如 -v /home/data:/data
  • 命名卷:docker volume create 卷名docker run -v 卷名:容器目录 镜像名
  • 匿名卷:docker run -v 容器目录 镜像名(宿主机目录自动创建,无明确标识)

4. 常用操作命令

  • 创建命名卷:docker volume create 卷名
  • 查看数据卷:docker volume ls
  • 查看数据卷详情:docker inspect 卷名
  • 删除数据卷:docker volume rm 卷名
  • 清理无用数据卷:docker volume prune

八、Docker 网络配置

1. 核心网络模式

网络模式特点适用场景
bridge(默认)容器自动加入 docker0 网络,分配内网 IP,需端口映射对外绝大多数场景,如 Web 应用、数据库
host共享宿主机网络,无需端口映射,直接使用宿主机 IP / 端口需占用宿主机端口的场景,如 Nginx
none无网络配置,不分配 IP,无法与外部通信特殊测试场景
container共享另一个容器的网络,共用 IP / 端口多容器协作场景

2. 网络操作命令

  • 查看网络:docker network ls
  • 创建自定义网络:docker network create -d bridge 网络名
  • 容器加入网络:docker network connect 网络名 容器名
  • 容器退出网络:docker network disconnect 网络名 容器名
  • 删除网络:docker network rm 网络名

3. 端口映射

  • 语法:-p 宿主机端口:容器端口(如 -p 8080:8080
  • 示例:docker run -itd -p 80:80 --name nginx01 nginx
  • 作用:实现外网访问容器服务,宿主机端口请求转发至容器对应端口

九、Docker 镜像定制

1. docker commit 方式(容器打包镜像)

  • 命令格式:docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名:版本
  • 示例:
    docker run -d --name tomcat-temp tomcat
    docker exec -it tomcat-temp /bin/bash
    cp -r webapps.dist/* webapps  # 容器内修改
    docker commit -m="add webapps page" 容器ID mytomcat:1.0
    

2. Dockerfile 方式(推荐)

  • 核心指令:
    指令作用
    FROM指定基础镜像(如 FROM centos:7)
    MAINTAINER作者信息(姓名 + 邮箱)
    RUN镜像构建时执行的命令
    ADD/COPY复制文件到容器(ADD 支持压缩包解压)
    WORKDIR指定容器工作目录
    ENV设置环境变量
    EXPOSE声明暴露端口
    CMD/ENTRYPOINT容器启动时执行的命令
  • 构建命令:docker build -f Dockerfile -t 镜像名:版本 .(末尾 “.” 表示当前目录)
  • 示例 Dockerfile(定制 Tomcat 镜像):

    dockerfile

    FROM centos:7
    MAINTAINER wd<1443005893@qq.com>
    
    ADD jdk-8u401-linux-x64.tar.gz /opt/
    ADD apache-tomcat-9.0.115.tar.gz  /opt/
    
    ENV MYPATH /opt/
    WORKDIR $MYPATH
    
    
    ENV JAVA_HOME $MYPATH/jdk1.8.0_401
    ENV CLASS_PATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    
    ENV CATALINA_HOME $MYPATH/apache-tomcat-9.0.115
    ENV CATALINA_BASH $MYPATH/apache-tomcat-9.0.115
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080
    
    CMD $MYPATH/apache-tomcat-9.0.115/bin/startup.sh && tail -F $MYPATH/apache-tomcat-9.0.115/logs/catalina.out)

十、常用镜像部署示例

1. MySQL 部署

# 拉取镜像
docker pull mysql:5.7
# 启动容器(端口映射+数据卷挂载+设置密码)
docker run -itd --name mysql01 -p 3306:3306 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 配置远程连接
docker exec -it mysql01 /bin/bash
mysql -uroot -p123456
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;

2. Nginx 部署

# 拉取镜像
docker pull nginx
# 启动容器
docker run -itd --name nginx01 -p 80:80 nginx
# 配置文件与静态资源挂载(自定义配置)
docker cp nginx01:/etc/nginx/nginx.conf /usr/nginx/conf
docker run -itd --name nginx02 -p 81:80 -v /usr/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/nginx/html:/usr/share/nginx/html nginx

3. Tomcat 部署

# 拉取镜像
docker pull tomcat
# 启动容器(端口映射+项目目录挂载)
docker run -itd --name tomcat01 -p 8080:8080 -v /usr/webapps:/usr/local/tomcat/webapps tomcat
# 配置默认页面
docker exec -it tomcat01 /bin/bash
cp -r webapps.dist/* webapps
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐