docker容器基础
docker容器基础
1. docker是什么
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
2. docker的基础命令
2.1 查看docker版本:
docker -v
2.2 查看docker信息:
docker info
2.3 搜索镜像:
docker search 镜像名称
2.4 拉取镜像:
docker pull 镜像名称:tag
2.5 查看本地镜像:
docker images
2.6 删除本地镜像:
docker rmi 镜像id
2.7 运行容器:
docker run -it --name 容器名称 镜像名称:tag
-it:以交互模式运行容器
--name:命名容器
2.8 查看正在运行的容器:
docker ps
2.9 查看所有容器(包括未运行的):
docker ps -a
2.10 启动容器:
docker start 容器id或名称
2.11 停止容器:
docker stop 容器id或名称
2.12 进入容器:
docker exec -it 容器id或名称 /bin/bash
2.13 删除容器:
docker rm 容器id或名称
3. 镜像操作
3.1 镜像加载:
docker load < 镜像tar文件
3.2 镜像保存:
docker save 镜像id或名称 > 目标tar文件
3.3 镜像导出:
docker export 容器id或名称 > 目标tar文件
3.4 镜像导入:
cat 镜像文件 | docker import - 镜像名称:TAG
4. 容器操作
查看容器日志:
docker logs 容器id或名称
查看容器内进程:
docker top 容器id或名称
查看容器内部细节:
docker inspect 容器id或名称
进入运行中的容器:
docker attach 容器id或名称
从容器内拷贝文件到主机:
docker cp 容器id:容器内路径 目的主机路径
5. 数据卷操作
数据卷:
docker run -it -v /data 镜像名
-v:绑定一个数据卷
上面会在主机自动创建一个数据卷,挂载到容器的/data
指定主机目录:
docker run -it -v 主机目录:容器目录 镜像名
6. Dockerfile常用指令
FROM: 设置镜像基础
FROM centos
RUN: 执行命令
RUN yum install -y vim
COPY: 复制文件
COPY src dest
ADD: 添加本地文件或远程文件
ADD src dest
CMD: 容器启动命令
CMD ["python", "app.py"]
ENTRYPOINT: 入口点指令
ENTRYPOINT ["python", "app.py"]
ENV: 设置环境变量
ENV NAME xxx
ARG: 构建参数
ARG VERSION=1.0
VOLUME: 定义匿名卷
VOLUME ["/data"]
EXPOSE: 暴露端口 只是声明
EXPOSE 80
WORKDIR: 指定工作目录
WORKDIR /app
USER: 指定运行用户
USER nginx
7. RUN与WORKDIR区别
RUN: 用于执行命令行命令,执行完成后,会提交一个新的镜像层。RUN经常用于安装软件包。
RUN yum install -y vim
WORKDIR: 用于切换工作目录,相当于cd命令,但不会提交新的镜像层。
WORKDIR /root
对比:
- RUN会创建新的镜像层,WORKDIR不会:
RUN命令后面每执行一次都会创建一层镜像。
WORKDIR切换多次目录,也只会创建一个镜像层。
- RUN用于执行命令,WORKDIR用于切换目录:
RUN yum install vim # 执行命令
WORKDIR /root # 切换目录
- RUN可以运行多个,每个RUN会创建一个新层。WORKDIR可以运行多个,但只有最后一个有效:
每个RUN都会创建一个新层
RUN命令1
RUN命令2
只有最后一个WORKDIR有效
WORKDIR /home
WORKDIR /root
8. CMD与ENTRYPOINT
CMD: 用于设置容器启动后默认执行的命令和参数,如果docker run指定了其他命令,则会覆盖CMD。
CMD ["python","app.py"]
ENTRYPOINT: 也用于设置启动命令,但不能被docker run的参数覆盖,仅能传参。
ENTRYPOINT ["python", "app.py"]
对比:
- CMD会被docker run覆盖,ENTRYPOINT不会:
CMD会被覆盖
docker run 镜像 sh
ENTRYPOINT不会被覆盖,只能传参
docker run 镜像 sh app.py
- CMD用于设置默认参数,配合ENTRYPOINT使用:
CMD设置默认参数
ENTRYPOINT ["python"]
CMD ["app.py"]
docker run可以修改参数
docker run 镜像 app2.py
- 一个Dockerfile中,只能有一个CMD,可以有多个ENTRYPOINT:
只有一个CMD生效
CMD python app.py
CMD node app.js
都会生效,可作为两个镜像
ENTRYPOINT python app.py
ENTRYPOINT node app.js
9. ADD与COPY
ADD: 可以将本地文件复制到容器中,也可以直接从URL下载文件放入容器。ADD还具有解压缩的功能。
ADD package.tar.gz /usr/src
COPY: 仅用于从本地复制文件到容器,不具有解压功能。
COPY package.tar.gz /usr/src
对比:
- ADD复制文件并可以解压缩,COPY仅复制不解压:
ADD自动解压
COPY不会解压
- ADD可以从URL下载文件,COPY不能:
可以下载url文件
ADD http://文件url /usr/src
无法下载url文件
COPY http://文件url /usr/src
- 一般优先使用COPY,因为更清晰简单:
COPY package.tar.gz /usr/src
RUN tar -xzf /usr/src/package.tar.gz -C /usr/src
10. 镜像优化-选择合适的基础镜像
选择合适的基础镜像可以优化镜像大小:
- 使用小型基础镜像,如alpine
- 对于Linux,选择debian而不是ubuntu
- 去除不需要的默认安装软件包
- 使用同一个基础镜像,进行复用
11. 镜像优化-多阶段构建
多阶段构建可以仅把需要的结果复制到最后一个镜像:
FROM golang:1.14.4-alpine AS builder
WORKDIR /opt
COPY hw.go /opt
RUN go build /opt/hw.go
FROM apline:3.12
COPY --form=builder /opt/hw
CMD ["./hw"]
只将编译结果复制到第二阶段的镜像,可以减小大小。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!