网站首页 > 基础教程 正文
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 | FROM ubuntu:20.04 | 指定基础镜像。 |
RUN | RUN 或 RUN ["executable", "param1", "param2"] | RUN apt-get update && apt-get install -y nginx | 在镜像中执行命令。 |
COPY | COPY | COPY ./app /app | 将文件或目录从主机复制到镜像中。 |
ADD | ADD | ADD https://example.com/file.tar.gz /app | 类似于 COPY ,但支持自动解压 tar 文件和从 URL 下载文件。 |
WORKDIR | WORKDIR | WORKDIR /app | 设置工作目录,后续命令都会在该目录下执行。 |
ENV | ENV | ENV NODE_ENV=production | 设置环境变量。 |
EXPOSE | EXPOSE | 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 | VOLUME /var/log/nginx | 定义匿名卷,用于持久化数据。 |
LABEL | LABEL | LABEL version="1.0" description="My custom image" | 为镜像添加元数据。 |
USER | USER | USER nobody | 指定运行容器时的用户。 |
ARG | ARG | ARG APP_VERSION=1.0 | 定义构建时的变量。 |
ONBUILD | ONBUILD | ONBUILD COPY . /app | 定义触发器指令,在基于该镜像构建其他镜像时执行。 |
HEALTHCHECK | HEALTHCHECK [OPTIONS] CMD | `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-04-06 Docker/Compose常用命令整理总结(docker compose的作用)
- 2025-04-06 kubernetes pod为什么需要pause容器?
- 2025-04-06 Docker常用命令大全(常见的docker命令)
- 2025-04-06 docker+jenkins自动部署(jenkins docker-compose)
- 2025-04-06 Ubuntu 常用运维脚本大全(30个干货)
- 2025-04-06 Dify实战:解除Dify知识库上传文件15MB限制的
- 2025-04-06 docker越来越大,心慌,清理一波吧
- 2025-04-06 网易回应“将关闭公有云”(网易云公共邮箱登陆首页)
- 2025-04-06 Docker 容器明文密码问题解决之道
- 2025-04-06 数据安全自主掌握!Ollama私有化部署模型,告别在线充值API烦恼
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)