leejm
leejm
发布于 2026-04-16 / 4 阅读
0
0

Docker

Docker 是一个开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

微服务架构:每个服务独立容器化,便于管理与扩展
CI/CD流水线:与Jenkins/GitLab CI集成,实现自动化构建与测试
云原生基础:Kubernetes 等编排工具基于 Docker 管理容器集群。

官方文档:https://docs.docker.com/

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 所有的网络接口都是虚拟的,转发效率高

容器互联

每次启动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 


评论