Docker学习笔记
Docker学习笔记
Docker简介
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器,基于go语言开发。Docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作。
Docker基本组成
Docker基本组成主要有以下
- 镜像(Image) --> 一个特殊的文件系统
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
- 容器(Container) --> 镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository)--> 集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
Docker常用命令
搜索某个镜像:docker search name
获取某个镜像:docker pull name
查看镜像:docker p_w_picpaths
删除镜像:docker rmi name
创建容器:docker create # 创建一个容器但是不启动
启动容器:docker start 容器ID
停止容器:docker stop 容器ID # 停止容器运行,发送信号SIGTERM
重启容器:docker restart
查看容器:docker ps -a
杀掉容器:docker kill
连接容器:docker attach
或 docker exec
阻塞容器:docker wait
删除容器:docker rm 容器ID
(需要先停止容器)
Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。
# 示例: 利用docker build命令执行dockerfile文件
docker build -f /DockerFilePath/Dockerfile
学习Dockerfile的最好方式就是通过阅读别人写的Dockerfile,遇到不会的指令就查一查官方文档【Dockerfile reference | Docker Documentation】。
在这里,由于笔者暂时权限有限,因此列出【Dockerfile 详解_万wu皆可爱的博客-CSDN博客_dockerfile】中所构建用于制作nginx镜像的Dockerfile作为示例:
# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER bertwu
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]
Dockerfile格式
- 指令必须要大写,而且后面必须跟参数
- 第一条指令必须是FROM,指定Base Image基础镜像
- 指令按从上往下的顺序,依次执行
- 每条指令都会创建一个新的镜像层并提交
- "#"表示注释,以#作为开头
- 如果有多个RUN,自上而下依次运行,每次运行都会形成新的层,建议&& 放入一行运行
- 如果有多个CMD,只有最后一个运行
- 如果有多个Entrypoint,只有最后一个运行
- 如果CMD和entrypoint共存,只有entrypoint运行,且最后的CMD会当做entrypoint的参数
常用指令
指令 | 含义解释 |
---|---|
FROM | 指定基础镜像,必须为第一个命令 |
MAINTAINER | 指定维护者信息 |
RUN | 指定构建过程中要运行的命令 |
ADD | 将本地文件添加到容器中 |
ENV | 设置环境变量 |
COPY | 将本地文件添加到容器中(不会自动解压文件,无法访问网络资源) |
CMD | 在容器启动时调用 |
LABEL | 为镜像添加元数据 |
镜像制作步骤
镜像制作分为两个阶段
- docker build阶段 基于dockerfile制作镜像 (RUN,用于此阶段的运行命令)
- docker run阶段 基于镜像运行容器 (CMD,基于image run容器时候,需要运行的命令)
- docker build 基于第一阶段的镜像被别人from制作新镜像 (entrypoint 或onbuild 基于镜像重新构建新镜像时候在此阶段运行的命令)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义