Docker 是一个开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
微服务架构:每个服务独立容器化,便于管理与扩展
CI/CD流水线:与Jenkins/GitLab CI集成,实现自动化构建与测试
云原生基础:Kubernetes 等编排工具基于 Docker 管理容器集群。
Docker概述
为什么需要Docker
十分轻巧
跨平台一致性:解决各个机器上能跑的问题,确保开发、测试、生产环境一致。环境配置十分的麻烦,每个机器都需要部署环境(集群redis、ES、Hadoop、MySQL),费时费力
发布项目,打包的时候,带上环境
docker通过隔离机制,可以将服务器压榨到极致。(虚拟机完全隔离的环境,内存需要提前分配)
容器化技术
容器:内核虚拟化技术
共享主机内核,轻量、隔离且高效,不像虚拟机需要完整的操作系统
上层 是多个容器(App A~F),每个容器独立运行一个应用。
中间层 是 Docker,负责管理这些容器。
底层 是主机操作系统(Host OS)和基础设施,为容器提供硬件和系统支持。

Docker安装
基本组成

镜像(image):好比是一个模板,通过这个模板创建容器服务,tomcat镜像、run、tomcat01容器提供服务器
通过镜像可以创建多个容器
容器(container):docker利用容器技术,独立运行一个或者一组应用,通过镜像创建
启动、停止、删除、基本命令
简易的linux系统
仓库(repository):仓库就是存放镜像的地方,公有仓库和私有仓库
Docker Hub官方
阿里云等有镜像加速
安装
ubuntu 24
安装了gnome命令框
sudo apt install gnome-terminal
Docker常用命令
镜像
docker version
docker run
docker pull
docker images -a / -q
docker search xxx
docker rmi -f 容器id 容器id
docker rmi -f $(docker images -aq) # 删除所有容器
容器命令
新建容器并启动
docker run [可选参数] image
# 参数说明
--name = "Name" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口 8000:8000,主机端口:容器端口;-p 容器端口;-p ip:主机端口
-P 随机指定端口
# 启动
docker run -it centos:8 /bin/bash
列出运行的容器
docker ps
-a # 正在运行的容器+历史运行过的
-n = ? 显示最近的容器
-q # 只显示编号
退出容器
exit # 停止
Ctrl + P + Q # 不停止退出
删除容器
docker rm 容器i # 不能删除正在运行的。需要-f才能
docker rm -f $(docker ps -aq) # 删除所有
启动和停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id # 强制停止容器
后台启动
docker run -d centos
# 在后台启动了,发现centos停止了
# 没有跨前台进程,docker发现没有提供服务,就会自动停止
查看日志
docker logs
容器元数据
docker inspect 容器id
进入当前正在运行的容器
docker exec -it 容器id /bin/bash # 通过bin bash命令运行,开启一个新的终端,在里面操作
docker attach 容器id # 进入正在执行的容器
容器拷贝到主机
docker cp
用完即删
docker run -it --rm 容器 # 用完后台无进程了就删了
commit
docker 文件是分层系统,pull镜像之后,用户的操作是在之前的基础上再加一层,最后可以进行commit为一个images保存在本地,也可以提交到远程。
容器数据卷
数据不该保存在容器中,如果数据保存在容器中,容器删除了数据就丢失了
数据库等文件
目录的挂载:挂载到主机系统上,不在容器内
容器的持久化和同步操作,容器间的数据也是可以共享的。
docker run -it -v 主机目录:容器内目录 (/home)
MySQL 实战
docker run -it -v 挂载 -v 挂载 -d -p xx:xx -v 主机目录
# 查看所有卷的情况
docker volume ls
# 匿名挂载,未给目录起名字
# 具名挂载
docker run -d -P --name nginx -r [Name](无路径/,就是名词):/xxxx/xxx(指定路径)
docker run -v /home/lee:ro
# -v 容器内路径, 权限ro只读 rw可读可写
# 查看信息
docker volume inspect [Name]
通过具名挂载可以快速的找到卷。
数据卷容器
多个mysql同步,容器卷
docker run -it --name docker02 --volume-from docker01
docker02同步docker01的挂载数据卷
容器没了,数据仍在
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
docker run -d -p 3307:3307 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
创建镜像:DockerFile
DockerFile是docker的镜像的构建脚本。
保留关键字都是大写字母,执行从上到下执行
#表示注释
每个指令都会创建提交一个新的镜像层,并提交
通过脚本可以生成一个镜像
镜像是一层层的
# 指令 大写 参数
# 挂载卷
FROM ubuntu
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bash
docker build -f dockerfile -it name/name
DockerFile指令
# 基础镜像
FROM
# 维护者信息,姓名、邮箱
MAINTAINER
# 运行的命令
RUN
# 加东西,搭建tomcat、redis、xxx
ADD
# 工作目录
WORKDIR
# 容器卷,挂载在哪
VOLUME
# 对外暴露端口
EXPOSE
# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
CMD
# 跟CMD类似,可以追加命令,可以在run的时候在尾部可以追加命令
ENTRYPOINT
# 当构建一个被继承 DockerFile 时候运行ONBUILD命令
ONBUILD
# 类似ADD,文件拷贝到镜像中
COPY
# 设置环境变量,设置内存大小、用户名、、、、
ENV
基础镜像是 scratch ,99%镜像由此而来
docker build -f dockerfile -t 名称:latest .
镜像如何生成的
docker history 容器ID
发布镜像
docker pull 拉去镜像
docker push 发布镜像
docker login 登录docker hub
docker logout
Docker网络
主机可以ping通容器
每安装/启动一个docker容器,docker给容器分配了一个ip,docker有一个网卡docker0,
桥接模式
evth-pair:虚拟设备接口
docker 所有的网络接口都是虚拟的,转发效率高
容器互联
–link
每次启动ip地址会变化,虚拟化一个新的地址
可以通过 name --link name
不建议使用,使用自定义网络
自定义网络
网络模式
bridge:桥接,在docker上搭桥
none:不配置网络,默认
host:主机模式,和宿主机共享服务区
container:容器网络连通
docker run -d -P --name name --net network_name container
docker nerwork create --help
容器使用自定义网络 ,不使用 --link。也可以通过名字ping通。
好处:不同的集群使用不同的网络,保证集群是安全和健康的
隔离
redis、mysql
网络连通
docker network connect --help
连接网卡和容器,一个容器两个ip地址
集群部署
分片 + 高可用 + 负载均衡
先建一个redis网卡
redis-cli -cluster
主从:master,solve。主机、从机,主机崩溃了停止了从机顶上去。
Docker Compose
通过yaml文件
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: example
Docker Swarm
特点:
服务编排与负载均衡:Swarm支持负载均衡功能,可以自动将请求分发到集群中的不同节点。
高可用性:Docker Swarm提供了服务的高可用性,能够在节点失效时自动迁移任务到健康节点。
自动扩缩容:通过
docker service scale命令,可以轻松扩展或缩减服务的副本数量。Docker原生集成:Swarm与Docker紧密集成,使用命令与Docker CLI操作一致。
# 生成主节点
docker swarm init --advertise
# 加入
docker join