Docker从入门到实战
一、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/容器名
更多推荐
所有评论(0)