网站首页 > 技术文章 正文
docker是什么?
docker是一个开源的容器化平台,可以将技术和其依赖和项目一起打包在一起,可以在不同的环境下运行
docker中的镜像、容器、仓库
镜像:是一个只读的模板,可以用于创建容器,内部包含了程序运行所需要的依赖,配置等等。
仓库:存储镜像的仓库,下载镜像,
容器:是docker的一个运行的实例,提供一个独立的可移植的环境,Docker会在镜像的基础上创建一个可写层(也称为容器层)。这个可写层是容器独有的,所有对容器的修改(如创建文件、安装软件、修改配置等)都会保存在这个可写层中,而不会影响原始的镜像。
可写层的作用:
每个容器的可写层是独立的,多个容器可以基于同一个镜像运行,但它们的修改不会互相影响。
容器内对文件系统的所有修改(如创建、修改、删除文件)都会保存在可写层中
docker为什么轻量化?
- 容器与宿主机共享同一个操作系统内核,不需要像虚拟机那样为每个容器运行一个完整的操作系统,
所以启动速度很快,
- 镜像和容器使用分层文件系统,多个容器可以共享相同的镜像层,减少了存储空间的占用
docker中的网络模式有哪些?
- 虚拟网桥模式 通过虚拟的网桥与主机网络相连;适合运行多个容器,且需要网络隔离的情况
- host模式 与主机共享网络,性能高
- lo 环回测试模式 网路连接
如何进入正在运行的docker?
docker -exec -it (容器名或id) /bin/bash
如何运行一个docker?
- 创建docker实例
- docker run -d(后台运行) --name nginx -p 80:80 nginx:1.23(指定nginx的版本)
- docker stop
docker与虚拟机的区别?
- docker使用的是容器技术,直接运行在宿主机中,共享一个内核;虚拟机是全硬件的虚拟化,运行完整的资源,虚拟机是完整的一整套硬件的虚拟化,docker是对需要的部分进行虚拟化,部分虚拟化。
- docker共享主机内容,启动更快,资源更小
- 虚拟机隔离级别更高,运行在相互独立的环境;docker是进程级别的隔离,隔离性不如虚拟机
容器的生命周期?
- 创建:基于镜像创建容器,分配资源。 docker run -d -- name '容器名' -p 80:8080 tomcat
- 运行:启动容器内的进程,应用程序开始运行。 docker start 容器名/id
- 停止:停止容器内的进程,释放资源。 docker stop 容器名/id
- 删除:删除容器及其可写层。 docker rm 容器名/id
docker的基本操作有哪些?
- 拉取镜像 docker pull 镜像名
- 查看docker版本 docker version docker -v
- 查看正在运行的镜像 docker ps -a
- 运行docker docker run -d -p 80:8080 tomcat:8.5-jdk8-corretto (-p 80:8080 将主机的80端口映射到容器的8080端口,这样在外部就直接可以通过80端口,访问docker容器tomcat ,-d )
- 移除容器 docker rm 59b741c15085 # 容器id
- 查看容器日志 docker logs (容器名)
dockerfile是什么?
Dockerfile 是一个文本文件,用于定义如何构建 Docker 镜像,是用于构建docker镜像的文件,
docker镜像的命令:
FROM是Dockerfile中的第一个指令,也是一个必须的指令。它用于指定构建新镜像时所基于的基础镜像。
指令 | 语法 | 实例 | 说明 |
FROM | FROM <image>[:<tag>] | FROM ubuntu:20.04 | 指定基础镜像。 |
RUN | RUN <command> 或 RUN ["executable", "param1", "param2"] | RUN apt-get update && apt-get install -y nginx | 在镜像中执行命令。 |
COPY | COPY <src> <dest> | COPY ./app /app | 将文件或目录从主机复制到镜像中。 |
ADD | ADD <src> <dest> | ADD https://example.com/file.tar.gz /app | 类似于 COPY ,但支持自动解压 tar 文件和从 URL 下载文件。 |
WORKDIR | WORKDIR <path> | WORKDIR /app | 设置工作目录,后续命令都会在该目录下执行。 |
ENV | ENV <key>=<value> | ENV NODE_ENV=production | 设置环境变量。 |
EXPOSE | EXPOSE <port> | EXPOSE 8080 | 声明容器运行时监听的端口。 |
CMD | CMD ["executable", "param1", "param2"] 或 CMD command param1 param2 | CMD ["nginx", "-g", "daemon off;"] | 指定容器启动时默认执行的命令。 |
ENTRYPOINT | ENTRYPOINT ["executable", "param1", "param2"] | ENTRYPOINT ["nginx", "-g", "daemon off;"] | 类似于 CMD ,但不会被 docker run 的参数覆盖。 |
VOLUME | VOLUME <path> | VOLUME /var/log/nginx | 定义匿名卷,用于持久化数据。 |
LABEL | LABEL <key>=<value> | LABEL version="1.0" description="My custom image" | 为镜像添加元数据。 |
USER | USER <username> | USER nobody | 指定运行容器时的用户。 |
ARG | ARG <name>[=<default value>] | ARG APP_VERSION=1.0 | 定义构建时的变量。 |
ONBUILD | ONBUILD <instruction> | ONBUILD COPY . /app | 定义触发器指令,在基于该镜像构建其他镜像时执行。 |
HEALTHCHECK | HEALTHCHECK [OPTIONS] CMD <command> | `HEALTHCHECK --interval=5m CMD curl -f http://localhost/ | |
SHELL | SHELL ["executable", "param1", "param2"] | SHELL ["/bin/bash", "-c"] | 指定默认的 shell。 |
下面是一个mysql的一个dockerfile
步骤:
- 选择一个基础镜像源 FROM mysql:8.0
- 设置环境变量 ENV ......
- 将应用代码复制到容器 COPY
- 安装依赖 RUN ‘linux命令’
- 开发暴露端口 EXPOSE ‘端口’
# 使用官方 MySQL 8.0 镜像作为基础镜像
FROM mysql:8.0
# 设置环境变量
ENV MYSQL_ROOT_PASSWORD=my-secret-pw
ENV MYSQL_DATABASE=myappdb
ENV MYSQL_USER=myappuser
ENV MYSQL_PASSWORD=myapppassword
# 复制自定义配置文件到镜像中
COPY my.cnf /etc/mysql/conf.d/my.cnf
# 复制初始化 SQL 脚本到镜像中
COPY init.sql /docker-entrypoint-initdb.d/
# 暴露 MySQL 默认端口
EXPOSE 3306
# 设置数据卷
VOLUME /var/lib/mysql
# 使用默认的启动命令(无需显式指定,因为基础镜像已经定义了)
CMD和 ENTRYPOINT的区别是什么?
- CMD 提供容器启动时的默认命令,可以被 docker run 的参数覆盖。
- ENTRYPOINT 指定容器启动时的主命令,不会被 docker run 的参数覆盖。
如何减少 Docker 镜像的大小?
- 使用多阶段构建。
- 合并多个 RUN 指令。可以减少镜像层数,
- 删除不必要的文件和缓存。
如何持久化docker中的数据?
- 创建数据卷
# 创建数据卷
docker volume create mydata
# 在容器中使用数据卷 这会创建一个名为mydata的数据卷,并将其挂载到容器的/data目录。
docker run -d -v mydata:/data myimage
docker -v [宿主机路径]:[容器内路径]:[选项]
- 使用绑定挂载(Bind Mounts)
#使用系统挂载点
docker run -d -v /path/on/host:/path/in/container myimage
#这会将宿主机的/path/on/host目录挂载到容器的/path/in/container目录。
猜你喜欢
- 2025-05-08 InstantID模型部署教程(insight模型)
- 2025-05-08 Dockerfile简单使用(docker-file)
- 2025-05-08 Kubernetes Linux安装指南(kubernetes安装配置)
- 2025-05-08 一个Rust小白发布生产级Rust应用的进阶之路 | 得物技术
- 2025-05-08 如何用Linux服务器搭建属于自己的云手机
- 2025-05-08 必看!WSL2 内核选项修改方法,手把手教你编译更新
- 2025-05-08 深入了解,Python 中 type 和 isinstance 的用法
- 2025-05-08 Python 开发工程师必会的 5 个系统命令操作库
- 2025-05-08 PowerDNS可视化管理工具(可视化管理ppt)
- 2025-05-08 从 0 到 1:如何使用 eBPF 实现高效的内核安全监控?
- 05-11CSS:前端必会的flex布局,我把布局代码全部展示出来了
- 05-11Moti:React Native 动画库的新标杆
- 05-11前端开发避坑指南:每天都能用的 CSS3/Less/Sass 实战技巧
- 05-11HarmonyOS:ArkTS 多态样式自学指南
- 05-115 分钟快速上手图形验证码,防止接口被恶意刷量!
- 05-11网页五指棋游戏
- 05-11告别长文焦虑!AI帮你“秒划重点”,文章秒变知识卡片
- 05-11鸿蒙NEXT小游戏开发:数字华容道
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- js数组插入 (83)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- outofmemoryerror是什么意思 (64)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)