目录
什么是Docker,Docker的作用?
Docker是用来打包应用和依赖环境的一个工具,为了解决应用可以在任何地方都能以相同的方式运行(一次构建,到处运行)。解决了”在我这儿都是好的,在你那里就不行了。“这个经典问题。
核心包含三点:
镜像-比如软件的安装包
容器-镜像运行起来的”实例“
仓库-存放镜像的地方
实际工作中,我们用Docker来
统一开发、测试、生产的环境。
快速部署
实现微服务架构。
比如我们项目就用 Docker 打包了 Spring Boot 应用,一行命令就能在任何服务器上运行起来。"
Docker如何使用?
基础操作:
# 1. 拉取镜像(下载软件)
docker pull nginx:latest
# 2. 运行容器(启动软件)
docker run -d -p 80:80 --name my-nginx nginx
# 3. 查看运行中的容器
docker ps
# 4.查看本地所有的镜像
docker images
# 5. 停止容器
docker stop my-nginx
# 6. 删除容器
docker rm my-nginx
实际项目示例
# 一键启动全套开发环境
docker run -d --name mysql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
docker run -d --name redis -p 6379:6379 redis:latest
docker run -d --name my-app -p 8080:8080 \
--link mysql:db --link redis:cache my-app-image
Dockerfile(制作自己的镜像)
# 基于官方的Java环境
FROM openjdk:8-jdk-alpine
# 复制jar包到镜像中
COPY target/my-app.jar app.jar
# 暴露端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
构建镜像:
docker build -t my-app:1.0 .
为什么用 Docker,解决了什么问题?(面试重点)
1. 环境一致性问题
场景:比如代码在本地Mac开发环境运行完美,但是部署到测试服务器(Ubantu)就报错,测试环境好不容易弄好了,但到了生产环境(CentOS)又崩溃了。
# 开发环境能跑,测试环境报错?
# Docker 解决:打包整个环境,到处运行一样
2. 快速部署
传统方式如果需要部署到其他环境,需要装JDK、配环境、部署费事费力,使用Docker拉取镜像,然后启动即可,效率非常高。
# 传统方式:装JDK、配环境、部署应用 → 半小时
# Docker方式:docker run ... → 10秒钟
3. 资源隔离
一台服务器上可能部署多个应用。应用A需要使用Java8,应用B需要使用Java17,它们可能会互相干扰。
# 多个应用在同一服务器,互不干扰
docker run --name app1 my-app:1.0
docker run --name app2 my-app:2.0
# 两个应用完全隔离,不会冲突
4. 弹性伸缩
当一个服务流量压力过大,通过运行多个实例通过负载均衡来降低单个实例的压力。
# 流量大了,快速启动更多实例
docker run -d --name app-instance1 my-app:1.0
docker run -d --name app-instance2 my-app:1.0
docker run -d --name app-instance3 my-app:1.0
实际工作场景
开发环境
# 新同事入职,不用配环境
git clone project
docker-compose up -d # 一键启动所有服务
# 立即开始开发!
测试部署
# 测试人员不用关心环境
docker run -d -p 8080:8080 test-version:1.2
# 直接测试功能
生产环境
# 运维使用同样的镜像
docker run -d -p 8080:8080 prod-version:1.2
# 开发测试生产环境完全一致
🆚 与传统虚拟机的区别
| 特性 | 虚拟机 | Docker容器 |
|---|---|---|
| 启动速度 | 分钟级 | 秒级 |
| 性能损耗 | 15-20% | 1-2% |
| 磁盘占用 | GB级别 | MB级别 |
| 隔离程度 | 完全隔离 | 进程隔离 |
Docker如何进入容器
方法1:使用 bash 或 sh(最常用)
# 进入容器并启动bash
docker exec -it 容器名 bash
# 实际例子
docker exec -it mysql-container bash
docker exec -it redis-container bash
docker exec -it my-spring-app bash
方法2:使用 sh(如果容器没有bash)
# 对于Alpine等轻量级镜像,用sh
docker exec -it 容器名 sh
# 实际例子
docker exec -it nginx-container sh
docker exec -it alpine-container sh
完整进入容器步骤
# 1.查看所有正在运行的容器
docker ps
# 输出示例:
CONTAINER ID IMAGE COMMAND NAMES
a1b2c3d4e5f6 mysql:8.0 "docker-entrypoint.s…" mysql-dev
c1d2e3f4a5b6 nginx:latest "nginx -g 'daemon of…" nginx-proxy
# 2.进入MySQL容器
docker exec -it mysql-dev bash
# 2.进入Nginx容器
docker exec -it nginx-proxy sh
Docker进入 MySQL 容器的方法
#进入 Docker 中的 MySQL (常用)
docker exec -it 容器名 mysql -u用户名 -p
记住关键参数:
-
exec:在容器内执行命令 -
-it:交互模式,可以输入 -
mysql -uroot -p:启动 MySQL 客户端
这样就能像操作本地 MySQL 一样操作容器里的数据库了。
方法1:直接进入 MySQL 命令行(最常用)
# 直接进入容器并启动mysql客户端
docker exec -it mysql-container mysql -uroot -p
# 执行后会提示输入密码,然后就直接进入MySQL命令行
Enter password:
Welcome to the MySQL monitor.
mysql>
方法2:先进入容器,再进MySQL
# 1. 先进入容器内部
docker exec -it mysql-container bash
# 2. 然后在容器内部启动mysql客户端
root@container-id:/# mysql -uroot -p
Enter password:
mysql>
方法3:如果不知道容器名,先查看
# 查看正在运行的容器
docker ps
# 输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 mysql:8.0 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-dev
# 然后用查到的容器名进入
docker exec -it mysql-dev mysql -uroot -p
🚀 实际工作场景示例
场景1:开发环境快速操作
# 一键进入测试数据库
docker exec -it mysql-dev mysql -uroot -p123456
# 直接执行SQL
mysql> show databases;
mysql> use myapp;
mysql> select * from users;
场景2:排查问题
# 进入容器查看文件
docker exec -it mysql-container bash
# 查看MySQL配置文件
root@container-id:/# cat /etc/mysql/my.cnf
# 查看日志文件
root@container-id:/# tail -f /var/log/mysql/error.log
场景3:备份数据
# 在容器内执行备份
docker exec mysql-container mysqldump -uroot -p123456 mydb > backup.sql
# 或者直接进入容器再备份
docker exec -it mysql-container bash
root@container-id:/# mysqldump -uroot -p123456 mydb > /tmp/backup.sql

2806

被折叠的 条评论
为什么被折叠?



