专业编程基础技术教程

网站首页 > 基础教程 正文

DOCKER(docker怎么读)

ccvgpt 2025-04-06 14:09:50 基础教程 6 ℃

docker是什么?

docker是一个开源的容器化平台,可以将技术和其依赖和项目一起打包在一起,可以在不同的环境下运行

docker中的镜像、容器、仓库

镜像:是一个只读的模板,可以用于创建容器,内部包含了程序运行所需要的依赖,配置等等。

DOCKER(docker怎么读)

仓库:存储镜像的仓库,下载镜像,

容器:是docker的一个运行的实例,提供一个独立的可移植的环境,Docker会在镜像的基础上创建一个可写层(也称为容器层)。这个可写层是容器独有的,所有对容器的修改(如创建文件、安装软件、修改配置等)都会保存在这个可写层中,而不会影响原始的镜像。

可写层的作用:

每个容器的可写层是独立的,多个容器可以基于同一个镜像运行,但它们的修改不会互相影响。

容器内对文件系统的所有修改(如创建、修改、删除文件)都会保存在可写层中

docker为什么轻量化?

  1. 容器与宿主机共享同一个操作系统内核,不需要像虚拟机那样为每个容器运行一个完整的操作系统,

所以启动速度很快

  1. 镜像和容器使用分层文件系统,多个容器可以共享相同的镜像层,减少了存储空间的占用

docker中的网络模式有哪些?

  1. 虚拟网桥模式 通过虚拟的网桥与主机网络相连;适合运行多个容器,且需要网络隔离的情况
  2. host模式 与主机共享网络,性能高
  3. lo 环回测试模式 网路连接

如何进入正在运行的docker?

docker -exec -it (容器名或id) /bin/bash


如何运行一个docker?

    1. 创建docker实例
    2. docker run -d(后台运行) --name nginx -p 80:80 nginx:1.23(指定nginx的版本)
    3. docker stop

docker与虚拟机的区别?

  1. docker使用的是容器技术,直接运行在宿主机中,共享一个内核;虚拟机是全硬件的虚拟化,运行完整的资源,虚拟机是完整的一整套硬件的虚拟化,docker是对需要的部分进行虚拟化,部分虚拟化。
  2. docker共享主机内容,启动更快,资源更小
  3. 虚拟机隔离级别更高,运行在相互独立的环境;docker是进程级别的隔离,隔离性不如虚拟机


容器的生命周期?

  1. 创建:基于镜像创建容器,分配资源。 docker run -d -- name '容器名' -p 80:8080 tomcat
  1. 运行:启动容器内的进程,应用程序开始运行。 docker start 容器名/id
  2. 停止:停止容器内的进程,释放资源。 docker stop 容器名/id
  3. 删除:删除容器及其可写层。 docker rm 容器名/id


docker的基本操作有哪些?

    1. 拉取镜像 docker pull 镜像名
    2. 查看docker版本 docker version docker -v
    3. 查看正在运行的镜像 docker ps -a
    4. 运行docker docker run -d -p 80:8080 tomcat:8.5-jdk8-corretto (-p 80:8080 将主机的80端口映射到容器的8080端口,这样在外部就直接可以通过80端口,访问docker容器tomcat ,-d
    5. 移除容器 docker rm 59b741c15085 # 容器id
    6. 查看容器日志 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

步骤:

    1. 选择一个基础镜像源 FROM mysql:8.0
    2. 设置环境变量 ENV ......
    3. 将应用代码复制到容器 COPY
    4. 安装依赖 RUN ‘linux命令’
    5. 开发暴露端口 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中的数据?

  1. 创建数据卷
# 创建数据卷
  docker volume create mydata
# 在容器中使用数据卷  这会创建一个名为mydata的数据卷,并将其挂载到容器的/data目录。
  docker run -d -v mydata:/data myimage

  docker -v  [宿主机路径]:[容器内路径]:[选项]
  1. 使用绑定挂载(Bind Mounts)
#使用系统挂载点
    docker run -d -v  /path/on/host:/path/in/container myimage
#这会将宿主机的/path/on/host目录挂载到容器的/path/in/container目录。

最近发表
标签列表