Docker 学习笔记
Docker 是一个开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
微服务架构:每个服务独立容器化,便于管理与扩展 CI/CD流水线:与Jenkins/GitLab CI集成,实现自动化构建与测试 云原生基础:Kubernetes 等编排工具基于 Docker 管理容器集群。
Docker概述
Section titled “Docker概述”为什么需要Docker
Section titled “为什么需要Docker”十分轻巧
跨平台一致性:解决各个机器上能跑的问题,确保开发、测试、生产环境一致。环境配置十分的麻烦,每个机器都需要部署环境(集群redis、ES、Hadoop、MySQL),费时费力
发布项目,打包的时候,带上环境
docker通过隔离机制,可以将服务器压榨到极致。(虚拟机完全隔离的环境,内存需要提前分配)
容器:内核虚拟化技术
共享主机内核,轻量、隔离且高效,不像虚拟机需要完整的操作系统
- 上层 是多个容器(App A~F),每个容器独立运行一个应用。
- 中间层 是 Docker,负责管理这些容器。
- 底层 是主机操作系统(Host OS)和基础设施,为容器提供硬件和系统支持。
Docker安装
Section titled “Docker安装”镜像(image):好比是一个模板,通过这个模板创建容器服务,tomcat镜像、run、tomcat01容器提供服务器 通过镜像可以创建多个容器
容器(container):docker利用容器技术,独立运行一个或者一组应用,通过镜像创建 启动、停止、删除、基本命令 简易的linux系统
仓库(repository):仓库就是存放镜像的地方,公有仓库和私有仓库 Docker Hub官方 阿里云等有镜像加速
ubuntu 24
安装了gnome命令框
sudo apt install gnome-terminal
Docker常用命令
Section titled “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) # 删除所有容器
新建容器并启动
Section titled “新建容器并启动”docker run [可选参数] image
# 参数说明--name = "Name" 容器名字-d 后台方式运行-it 使用交互方式运行,进入容器查看内容-p 指定容器端口 8000:8000,主机端口:容器端口;-p 容器端口;-p ip:主机端口-P 随机指定端口
# 启动docker run -it centos:8 /bin/bash列出运行的容器
Section titled “列出运行的容器”docker ps-a # 正在运行的容器+历史运行过的-n = ? 显示最近的容器-q # 只显示编号exit # 停止Ctrl + P + Q # 不停止退出docker rm 容器i # 不能删除正在运行的。需要-f才能docker rm -f $(docker ps -aq) # 删除所有启动和停止容器
Section titled “启动和停止容器”docker start 容器iddocker restart 容器iddocker stop 容器iddocker kill 容器id # 强制停止容器docker run -d centos
# 在后台启动了,发现centos停止了# 没有跨前台进程,docker发现没有提供服务,就会自动停止docker logsdocker inspect 容器id进入当前正在运行的容器
Section titled “进入当前正在运行的容器”docker exec -it 容器id /bin/bash # 通过bin bash命令运行,开启一个新的终端,在里面操作docker attach 容器id # 进入正在执行的容器容器拷贝到主机
Section titled “容器拷贝到主机”docker cpdocker run -it --rm 容器 # 用完后台无进程了就删了commit
Section titled “commit”docker 文件是分层系统,pull镜像之后,用户的操作是在之前的基础上再加一层,最后可以进行commit为一个images保存在本地,也可以提交到远程。
数据不该保存在容器中,如果数据保存在容器中,容器删除了数据就丢失了
数据库等文件
目录的挂载:挂载到主机系统上,不在容器内
容器的持久化和同步操作,容器间的数据也是可以共享的。
docker run -it -v 主机目录:容器内目录 (/home)MySQL 实战
Section titled “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 docker01docker02同步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
Section titled “创建镜像:DockerFile”DockerFile是docker的镜像的构建脚本。
保留关键字都是大写字母,执行从上到下执行 #表示注释 每个指令都会创建提交一个新的镜像层,并提交
通过脚本可以生成一个镜像 镜像是一层层的
# 指令 大写 参数# 挂载卷
FROM ubuntu
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bashdocker build -f dockerfile -it name/nameDockerFile指令
Section titled “DockerFile指令”# 基础镜像FROM# 维护者信息,姓名、邮箱MAINTAINER# 运行的命令RUN# 加东西,搭建tomcat、redis、xxxADD# 工作目录WORKDIR# 容器卷,挂载在哪VOLUME# 对外暴露端口EXPOSE# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代CMD# 跟CMD类似,可以追加命令,可以在run的时候在尾部可以追加命令ENTRYPOINT# 当构建一个被继承 DockerFile 时候运行ONBUILD命令ONBUILD# 类似ADD,文件拷贝到镜像中COPY# 设置环境变量,设置内存大小、用户名、、、、ENV基础镜像是 scratch ,99%镜像由此而来
docker build -f dockerfile -t 名称:latest .镜像如何生成的
docker history 容器IDdocker pull 拉去镜像
docker push 发布镜像
docker login 登录docker hub
docker logout
Docker网络
Section titled “Docker网络”主机可以ping通容器
每安装/启动一个docker容器,docker给容器分配了一个ip,docker有一个网卡docker0,
桥接模式
evth-pair:虚拟设备接口
docker 所有的网络接口都是虚拟的,转发效率高
容器互联
每次启动ip地址会变化,虚拟化一个新的地址
可以通过 name –link name
不建议使用,使用自定义网络
网络模式
bridge:桥接,在docker上搭桥 none:不配置网络,默认 host:主机模式,和宿主机共享服务区 container:容器网络连通
docker run -d -P --name name --net network_name containerdocker nerwork create --help容器使用自定义网络 ,不使用 –link。也可以通过名字ping通。
好处:不同的集群使用不同的网络,保证集群是安全和健康的 隔离
redis、mysql
docker network connect --help连接网卡和容器,一个容器两个ip地址
分片 + 高可用 + 负载均衡
先建一个redis网卡
redis-cli -cluster
主从:master,solve。主机、从机,主机崩溃了停止了从机顶上去。
Docker Compose
Section titled “Docker Compose”通过yaml文件
version: '3'services: web: image: nginx ports: - "8080:80" db: image: mysql environment: MYSQL_ROOT_PASSWORD: exampleDocker Swarm
Section titled “Docker Swarm”- 服务编排与负载均衡:Swarm支持负载均衡功能,可以自动将请求分发到集群中的不同节点。
- 高可用性:Docker Swarm提供了服务的高可用性,能够在节点失效时自动迁移任务到健康节点。
- 自动扩缩容:通过
docker service scale命令,可以轻松扩展或缩减服务的副本数量。 - Docker原生集成:Swarm与Docker紧密集成,使用命令与Docker CLI操作一致。
# 生成主节点docker swarm init --advertise# 加入docker join