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"]

只将编译结果复制到第二阶段的镜像,可以减小大小。

posted @   就往丶  阅读(17)  评论(0编辑  收藏  举报
编辑推荐:
· 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 让容器管理更轻松!
点击右上角即可分享
微信分享提示