一、Docker简介

Docker是一个基于Go语言开发的开源应用容器引擎,遵从Apache2.0协议,核心思想源于“集装箱”——将应用及其依赖的运行环境、配置文件、依赖包等全部“打包”进轻量级的容器中,实现容器的隔离运行和跨平台移植。

相较于传统的虚拟机技术,Docker的优势极为明显:
1. 轻量级高效:虚拟机需要虚拟完整的硬件和操作系统,动辄占用数G空间,启动耗时几分钟;而Docker容器共享宿主机内核,无独立操作系统,镜像仅占数M/数G空间,秒级启动,可在一台物理机上运行大量容器,极致压榨服务器资源。
2. 环境一致性:开发人员在本地构建的镜像,可直接在测试、生产环境运行,彻底消除开发、测试、运维环境不一致的问题,解决“在我机器上能跑”的行业痛点。
3. 便捷的交付与扩缩容:将应用打包为镜像后,可实现一键发布、一键运行,部署应用如同“搭积木”;同时支持快速的容器扩缩容,轻松应对业务流量变化。
4. 高效的隔离性:容器采用沙箱机制,相互之间无任何接口,每个容器拥有独立的文件系统,保证应用运行的安全性和独立性。

 二、Docker核心架构:三要素构成容器化基础

Docker的核心架构围绕镜像(Image)、容器(Container)、仓库(Repository)三大要素展开

 1. 镜像:容器的“模板”
Docker镜像是一个只读的root文件系统,包含了运行应用所需的所有环境、依赖、配置和代码,是创建容器的“模板”。例如官方的ubuntu:16.04镜像,就包含了完整的Ubuntu16.04最小系统的root文件系统。

镜像是静态的、不可修改的,一个镜像可以创建多个容器实例

 2. 容器:镜像的“运行实例”
容器是镜像运行时的实体,相当于面向对象编程中“类”和“实例”的关系,镜像是静态定义,容器是动态运行的。容器可以被创建、启动、停止、删除、暂停,支持读写操作,我们实际的应用运行、项目部署都是在容器中完成的,可将其理解为一个简易的Linux系统。

 3. 仓库:镜像的“存储仓库”
Docker仓库是用于存放镜像的“代码控制中心”,分为公有仓库和私有仓库,类似Git的代码仓库。国外官方的公有仓库是Docker Hub,国内为了解决下载速度慢的问题,阿里云、腾讯云、科大等都提供了国内镜像仓库和镜像加速服务。

三者的流转关系为:从仓库拉取镜像 → 通过镜像创建容器 → 在容器中运行和操作应用。

 三、Docker环境搭建:CentOS7下的快速安装

Docker分为社区版(CE)和企业版(EE),日常开发和测试使用社区版即可,以下为CentOS7系统下的Docker CE安装步骤,核心要求是服务器内核版本3.0以上。

 1. 前期准备
检查服务器内核版本,确保符合要求:

uname -r # 查看内核版本,需≥3.0
cat /etc/os-release # 查看系统版本,确认为CentOS7


 2. 正式安装步骤
1. 卸载旧版本(可选操作,若未安装过可跳过):

sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

2. 安装yum-utils工具包,用于配置镜像仓库:
 

sudo yum install -y yum-utils

3. 配置国内镜像仓库(推荐阿里云,速度更快):
 

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4. 安装Docker CE核心组件:

sudo yum install docker-ce docker-ce-cli containerd.io

5. 启动Docker并设置开机自启:

sudo yum install docker-ce docker-ce-cli containerd.io

 3. 配置镜像加速,解决下载慢问题
Docker Hub为国外站点,直接下载镜像速度极慢,需配置国内镜像加速,以阿里云为例:

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

 3. 刷新配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

国内常用镜像加速地址:
 科大镜像:https://docker.mirrors.ustc.edu.cn/
 网易镜像:https://hub-mirror.c.163.com/
 七牛云:https://reg-mirror.qiniu.com/

 4. 入门测试:Hello World
安装完成后,通过hello-world镜像测试Docker是否正常工作:

sudo docker run hello-world

若终端显示Docker的欢迎信息,说明Docker环境搭建成功。

 四、Docker核心操作:镜像与容器的常用命令

Docker的日常使用主要围绕镜像操作和容器操作展开,掌握以下核心命令,就能完成80%的日常工作。

 1. 镜像常用命令
镜像是容器的基础,核心操作包括查看、搜索、拉取、删除。

# 查看本地所有镜像
docker images
# 可选参数:-a列出所有镜像,-q只显示镜像ID
docker images -aq # 查看所有镜像的ID

# 搜索Docker Hub上的镜像
docker search 镜像名 # 例如docker search mysql

# 拉取镜像(从仓库下载到本地)
docker pull 镜像名:版本 # 版本不写默认latest(最新版)
# 例:拉取mysql5.7版本,docker pull mysql:5.7

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

 2. 容器常用命令
容器是应用的运行载体,核心操作包括查看、创建、启动、停止、进入、删除等。
 (1)查看容器

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

(2)创建并启动容器
核心命令:docker run [可选参数] 镜像名,常用参数至关重要:
 --name 容器名:指定容器名称,避免默认随机名称
 -d:后台方式运行容器
 -it:交互方式运行,进入容器内部操作
 -p 宿主机端口:容器端口:端口映射,实现宿主机与容器的网络联通
 -P:随机端口映射
 -v 宿主机目录:容器目录:数据卷挂载,实现宿主机与容器的目录共享

示例:创建并后台运行一个tomcat容器,映射端口8080,命名为tomcat01:

docker run -itd --name tomcat01 -p 8080:8080 tomcat

(3)容器启停与重启

docker stop 容器ID/容器名 # 停止指定容器
docker start 容器ID/容器名 # 启动已停止的容器
docker restart 容器ID/容器名 # 重启容器

(4)进入运行中的容器
容器后台运行时,需进入容器内部进行操作,常用两种方式:

# 方式1:exec(推荐,退出容器不停止容器)
docker exec -it 容器ID/容器名 /bin/bash
# 方式2:attach(退出容器会导致容器停止)
docker attach 容器ID/容器名

(5)退出容器
exit  停止并退出容器(若容器为后台运行,仅退出)
Ctrl+P+Q  不停止容器,仅退出容器终端
 (6)删除容器
docker rm -f 容器ID/容器名  删除指定容器
docker rm -f $(docker ps -aq)  删除所有容器
 3. 容器进阶操作
 (1)查看容器日志
用于排查容器运行中的问题,核心参数-tf实时查看,--tail 数字显示最后N行:

docker logs -tf --tail 10 容器ID # 实时查看容器最后10行日志

(2)文件拷贝
实现宿主机与容器之间的文件互传:

# 容器文件拷贝到宿主机
docker cp 容器ID:容器内路径 宿主机路径
# 宿主机文件拷贝到容器
docker cp 宿主机路径 容器ID:容器内路径

(3)查看容器元数据/进程

docker inspect 容器ID # 查看容器详细元数据(IP、挂载、网络等)
docker top 容器ID # 查看容器内运行的进程

五、Docker实战:常用中间件部署

掌握基础命令后,我们通过实战部署MySQL、Tomcat、Nginx等常用中间件,理解Docker的实际应用场景,核心思路是拉取镜像→创建容器(端口映射+数据卷挂载)→启动容器→配置应用。

# 1. 拉取MySQL5.7镜像
docker pull mysql:5.7
# 2. 创建并启动MySQL容器,数据卷挂载实现数据持久化
docker run -d -p 3306:3306 \
-v /home/mysql/conf:/etc/mysql/conf.d \
-v /home/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql01 \
mysql:5.7
# 3. 进入MySQL容器,配置远程访问
docker exec -it mysql01 /bin/bash
mysql -uroot -p123456
# 开启root远程访问
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;

配置完成后,即可通过本地Navicat等工具,连接服务器IP:3306访问Docker中的MySQL。

 2. 部署Nginx
核心要点:端口映射(80)、数据卷挂载(配置文件+静态资源),方便后续修改配置和发布项目。
 

# 1. 拉取Nginx镜像
docker pull nginx
# 2. 临时创建Nginx容器,拷贝默认配置文件到宿主机
docker run -itd --name nginx-temp -p 80:80 nginx
docker cp nginx-temp:/etc/nginx/nginx.conf /usr/nginx/
docker cp nginx-temp:/usr/share/nginx/html /usr/nginx/
docker rm -f nginx-temp # 删除临时容器
# 3. 创建正式Nginx容器,挂载配置和静态资源目录
docker run -itd --name nginx01 -p 80:80 \
-v /usr/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/nginx/html:/usr/share/nginx/html \
nginx

此时修改宿主机/usr/nginx/html中的静态文件,Nginx容器会实时同步,外网访问服务器IP即可看到页面。

 3. 部署Tomcat
核心要点:解决官方Tomcat镜像无webapps页面的问题,通过拷贝文件或定制镜像实现。

# 1. 拉取Tomcat镜像
docker pull tomcat
# 2. 创建并启动Tomcat容器
docker run -itd --name tomcat01 -p 8080:8080 tomcat
# 3. 进入容器,拷贝webapps.dist文件到webapps(解决无欢迎页问题)
docker exec -it tomcat01 /bin/bash
cp -r webapps.dist/* webapps
exit

外网访问服务器IP:8080,即可看到Tomcat的默认欢迎页面。

 六、Docker定制镜像:从commit到Dockerfile

官方镜像往往无法满足个性化需求,此时需要定制自己的镜像,主要有两种方式:docker commit和Dockerfile,其中Dockerfile是官方推荐的方式,也是企业级开发的标准。

 1. 简单定制:docker commit
将运行中的容器修改后,提交为新的镜像,类似Git的commit操作,适合快速定制。

# 命令格式:docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名:版本
# 示例:将修改后的Tomcat容器提交为新镜像mytomcat:1.0
docker commit -a="作者" -m="添加webapps页面" 容器ID mytomcat:1.0

缺点:无法实现自动化构建,镜像层臃肿,不适合复杂定制。

 2. 标准定制:Dockerfile
Dockerfile是一个文本文件,包含一系列指令(大写)+参数,用于自动化构建镜像,每一条指令对应镜像的一个分层,实现镜像的可复用、可维护、自动化构建。

 (1)Dockerfile核心指令

指令作用
FROM指定基础镜像,一切构建从基础镜像开始(必选)
MAINTAINER指定镜像作者(姓名 + 邮箱),可选
RUN镜像构建时执行的命令
ADD复制文件到镜像,支持自动解压压缩包
COPY复制文件到镜像,与 ADD 类似,不支持解压
WORKDIR指定镜像的工作目录,后续命令均在此目录执行
VOLUME指定容器的数据卷挂载目录
EXPOSE声明容器暴露的端口(仅声明,不实现映射)
ENV设置环境变量
CMD指定容器启动时执行的命令,仅最后一个生效,可被替换
ENTRYPOINT指定容器启动时执行的命令,可追加参数,不可被替换

 (2)Dockerfile实战:定制自定义Tomcat镜像
需求:基于CentOS7,集成JDK8和Tomcat8.5,实现一键启动。
1. 准备文件:在服务器创建目录,放入JDK8压缩包、Tomcat8.5压缩包、Dockerfile文件;
2. 编写Dockerfile:

# 基础镜像
FROM centos:7
# 作者信息
MAINTAINER test<test@qq.com>
# 复制并解压JDK和Tomcat到/usr/local
ADD jdk-8u161-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5.20.tar.gz /usr/local
# 安装vim工具
RUN yum -y install vim
# 设置环境变量
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME $MYPATH/jdk1.8.0_161
ENV CLASS_PATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME $MYPATH/apache-tomcat-8.5.20
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib
# 声明暴露的端口
EXPOSE 8080
# 容器启动时启动Tomcat
CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out

3. 构建镜像:在Dockerfile所在目录执行命令,末尾的点不可省略,代表构建上下文为当前目录。

# 命令格式:docker build -f Dockerfile路径 -t 镜像名:版本 .
docker build -t mytomcat8:1.0 .

4. 启动自定义镜像:

docker run -itd -p 8081:8080 --name mytomcat mytomcat8:1.0

外网访问服务器IP:8081,即可看到Tomcat8.5的默认页面,自定义镜像构建成功。

 七、Docker高级操作:镜像/容器的导入导出与容器互联

 1. 镜像与容器的导入导出
在无网络或跨服务器部署时,可将镜像/容器导出为压缩包,再导入到目标服务器,实现离线部署。
 (1)镜像的导入导出

# 镜像导出:将本地镜像保存为压缩包
docker save -o 镜像名.tar 镜像名:版本 # 推荐
# 示例:docker save -o nginx.tar nginx:latest

# 镜像导入:将压缩包载入本地镜像仓库
docker load -i 镜像名.tar

 (2)容器的导入导出

# 容器导出:将运行中的容器导出为压缩包
docker export 容器ID -o 容器名.tar

# 容器导入:将压缩包导入为镜像
docker import 容器名.tar 新镜像名:版本

 2. 容器互联:实现容器之间的网络通信
Docker容器默认处于隔离状态,通过Docker网络可实现容器之间、宿主机与容器之间的通信,Docker默认的网络为docker0(桥接模式),所有未指定网络的容器均加入此网络,同一网络内的容器可通过内网IP相互通信。

 (1)查看Docker网络

docker network ls

(2)创建自定义网络
适合将不同业务的容器划分到不同网络,实现网络隔离,同一网络内的容器可通过容器名直接通信(无需记IP)。

# 命令格式:docker network create -d bridge 网络名(-d指定网络驱动,默认bridge)
docker network create mynet01

(3)容器加入/退出网络
将现有容器加入自定义网络,实现跨网络通信:

# 容器加入网络
docker network connect 网络名 容器ID/容器名
# 容器退出网络
docker network disconnect 网络名 容器ID/容器名

更多推荐