DevOps 生态介绍(八):docker &dockerfile 命令介绍及构建项目的第一个镜像

Docker

Docker 介绍

Docker是一个开源的容器化平台,可以将业务程序跟依赖的环境打包到一个容器中。

核心概念:

镜像:一个只读模版,包含(程序代码、依赖环境、配置文件等)

容器:将镜像运行后启动的实例。

仓库:存放镜像的一个仓库。官方公共仓库:Docker Hub

Docker引擎:运行和管理容器的核心服务

优势:

轻量开始、一致性、可移植性、资源利用率高、快速交付和部署

Docker安装

操作系统:redhat 9.5

我这边是redhat 环境,所以安装的是Docker Engine,如果有人是在windows 环境的话可以安装Docker Desktop

其他版本请参考官方文档:Install Docker Engine on RHEL | Docker Docs

Setp1:卸载老的docker版本

复制代码
sudo dnf remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine \
                  podman \
                  runc

Step2:设置存储块

复制代码
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

Step3:安装Docker Engine

复制代码
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

到下面这个截图的状态说明Docker已经安装好并启动正常

Step4:启动Docker,并设置开启自启动

复制代码
sudo systemctl enable --now docker

卸载Docker Engine:

复制代码
sudo dnf remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras


#下面两步需要手动执行

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

Docker 命令详解

bash 复制代码
#Docker 基础信息
    #查看版本
    docker -v / docker version

    #查看系统信息
    docker info

    #docker命令帮助
    docker --help

    #用docker 命令启动容器的命令帮助
    docker run --help

#docker镜像管理
    #查看本地镜像,包括自己构建的镜像或从公共仓库拉取到本地的镜像
    docker images / docker images ls
    docker images -a

    #搜索公共仓库镜像
    docker search nginx

    #拉取镜像指定版本或者拉取最新版本的
    docker pull nginx:1.26
    docker pull nging:latest 

    #删除单个镜像
    docker rmi nginx

    #删除指定镜像ID
    docker rmi imageID

    #删除无用镜像
    docker imgage prune -a

    #导出镜像
    docker save -o nginx.tar nginx:latest

    #导入镜像
    docker load -i nginx.tar

#容器管理
    
    #查看容器or查看全部容器
    docker ps 
    docker ps -a


    #创建并启动容器
    docker run -d -p 80:80 --name web nginx
    
    #    -d :后台运行
    #    -p :端口映射到宿主机端口
    #    --name  :指定容器名称

    #启动或停止容器
    docker start|stop 容器ID 
    docker start|stop web


    #删除容器    先停止在删除
    docker stop web && docker rm web

    #强制删除
    docker rm -rf web


#容器日志查看
    
    #查看日志
    docker logs web

    #实时查看日志
    docker logs -f web

    #查看最近50行日志
    docker logs --tail 50 web

#进入容器
    
    #进入容器
    docker exec -it web bash
    
#文件复制
        
    #容器文件复制到主机上
    docker cp web:/etc/nginx/nginx.conf .
    
    #主机文件复制到容器里
    docker cp nginx.conf web:/etc/nginx/

#查看容器状态
    docker stats 
    docker stats web
    
#查看容器详细信息
    docker inspect web 
    docker inspect web |grep xxx

#数据卷管理
    
    #查看数据卷
    docker volume ls

    #创建卷
    docker volume create webdata

    #查看卷详情
    docker volume inspect webdata

    #删除卷
    docker volume rm webdata

    #将本地目录挂载到容器中的对应目录
    docker run -d -v /data/nginx:/usr/share/nginx/html nginx
    
    /data/nginx :本机宿主机目录
    /usr/share/nginx/html:容器目录
    

#网络管理
    
    #查看网络
    docker  network ls

    #创建网络
    docker network create projectnetwork

    #删除网络
     docker network rm projectnetwork

    #查看网络详情
    docker network inspect projectnetwork


#清理命令
    
    #删除所有停止容器
    docker container prune

    #删除无用镜像
    docker image prune -a

    #删除无用网络
    docker network prune

    #删除无用卷
    docker volume prune

Dockerfile 语法详解

将业务打成镜像时需要用到Dockerfile文件,会根据Dockerfile文件中的语法命令进行操作及打包。

Docker 会按照顺序执行Dockerfile里面的指令。

FROM:

指定基础镜像。在Dockerfile中第一条指定必须是FROM指令。

格式如下所示:

FROM nginx:latest

LABEL:

为镜像添加元数据,就是为镜像添加一些额外的参数信息

格式如下所示:

LABEL key=value

如果value值之间有空格可以用""将value值包含起来,可以表示为:

LABEL key="value"

LABEL maintainer="zhangsan" #用于指定作者

RUN:

构建镜像时执行的命令

格式如下所示:

Shell 格式:

run command

例子:run yum install wget -y

Exec 格式(JSON数组格式):

run "yum","install","wget","-y"

CMD:

启动容器时默认执行的命令,类似于开机自启的命令

格式如下所示:

shell 格式:

CMD command param1 param2

例子:nginx -s reload

可执行文件加上参数的形式(推荐):

CMD "nginx","-s","reload"

ENTRYPOINT:

指定容器固定启动程序。

此命令跟CMD的命令非常像,还可以配合使用

格式如下所示:

shell格式

ENTRYPOINT command param1 param2

例子:ENTRYPOINT java -jar xxx.jar

exec格式(推荐)

ENTRYPOINT "java", "-jar", "xxx.jar"

跟CMD配置使用:

ENTRYPOINT "java", "-jar", "xxx.jar"

CMD "-Dconfigfile=application.properties"

实际执行的命令是:

java -jar xxx.jar -Dconfigfile=application.properties
RUN & CMD 区别:

run : run 命令是执行在镜像构建中的,run命令的执行结果是包含在镜像里的,

cmd:cmd 命令是镜像构建成功后,使用镜像启动容器后,容器正常启动时执行 的命令,相当于cmd的命令是开启自启的效果。cmd命令结果不包含在镜像里。

COPY:

将文件拷贝到镜像中去

先将文件拷贝进来,然后跟基础镜像一起打包到镜像中。

格式如下所示:

COPY demo.jar /data/app/

COPY config/ /data/app/config/

COPY demo.jar /data/app/target.jar

ADD:

ADD命令跟COPY很类似,但是ADD支持自动解压和URL 下载

格式如下所示:

ADD apache-tomcat.tar.gz /opt/

WORKDIR:

指定工作目录,后续的一些指令的操作都是在此目录下执行的

格式如下所示:

WORKDIR /data/app

ENV:

定义环境变量

格式如下所示:

ENV JAVA_HOME=/usr/java/jdk21
ENV PATH=JAVA_HOME/bin:PATH

ARG:

指定构建参数

格式如下所示:

ARG VERSION=1.0

EXPOSE:

申明容器端口实现与外部通信,expose只是声明下,真正要暴露这个端口是需要再docker dun 时加上-p参数

格式如下所示:

EXPOSE 8080

EXPOSE 8080 8081 8082

EXPOSE 8080/TCP

EXPOSE 8080/UDP

EXPOSE 端口号后面不加协议的话默认是TCP协议

VOLUME:

定义数据卷,实现数据持久化,容器与宿主机共享数据、容器之间共享数据、避免容器删除后数据丢失

VOLUME 只是声明,docker run -v参数才是真正挂载

格式如下所示:

VOLUME /data

VOLUME "/data","/logs"

USER:

指定运行用户

格式如下所示:

USER appuser

SHELL:

修改默认shell

格式如下所示:

Linux:

SHELL "/bin/bash","-c"

Windows:

SHELL "powershell","-command"

ONBUILD:

指当改镜像被其他镜像继承时执行

格式如下所示:

ONBUILD 后面加上正常需要操作的指令

基础镜像:

ONBUILD COPY data/ /data/

基础镜像打成的镜像名为:baseimage

业务镜像:

FROM baseimage

这样构建业务镜像时,上面基础镜像的COPY也会执行

Docker命令构建镜像

复制代码
#以java 后端程序为例,写一个Dockerfile 文件

FROM openjdk:21
LABEL version=1.0.1
LABEL maintainer="zhangsan"

WORKDIR /data/app/
COPY ecn-server-1.0.0-SNAPSHOT.jar ./
#COPY application.properties ./
EXPOSE 8083 14031 14032 14033 14034 14035



#docker build image command 
docker build -t project_server  .

到这里截图,镜像就打成功了

bash 复制代码
#docker inspect  images imageid 查看镜像详细信息

[root@ecn-test-01 ecn_server]# docker inspect  images 3dfb783a2853
[
    {
        "Id": "sha256:3dfb783a2853589ab1b50b06a687cfb9f2feeb8428c677b93df92c2e0ba1504c",
        "RepoTags": [
            "project_server:latest"
        ],
        "RepoDigests": [
            "project_server@sha256:3dfb783a2853589ab1b50b06a687cfb9f2feeb8428c677b93df92c2e0ba1504c"
        ],
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2026-06-02T03:22:47.31845262-04:00",
        "Config": {
            "User": "584792",
            "ExposedPorts": {
                "14031/tcp": {},
                "14032/tcp": {},
                "14033/tcp": {},
                "14034/tcp": {},
                "14035/tcp": {},
                "8083/tcp": {}
            },
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64"
            ],
            "Entrypoint": [
                "/usr/bin/pebble",
                "enter"
            ],
            "WorkingDir": "/data/app/",
            "Labels": {
                "maintainer": "zhangsan",
                "org.opencontainers.image.created": "2026-06-01T10:02:16.106060+00:00",
                "org.opencontainers.image.description": "Chiselled OpenJDK 21 on Ubuntu 24.04\n\nChiselled OpenJDK 21 rock\n",
                "org.opencontainers.image.title": "jdk",
                "org.opencontainers.image.version": "21-24.04",
                "version": "1.0.1"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 276102287,
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:9996178adf2ca2b096683d1555e431967c0a9cd1923662833b5d8f36dccdbb3f",
                "sha256:0277b83e876b8d76abc8bdd31d6860164f93f1d82a9ba96e691741e51aa3fc9d",
                "sha256:772951ab5582728f544454eeba41622359675dd459046a029cc89bcf0876aa1f",
                "sha256:39a21e0abe799c6af94461175624c3b2b07ba852044dbb161ffa3055df7fdcc3",
                "sha256:0fa5e2f2b581ded40614e0d2209329ec09f8f5a653e8aea03053daae82b4453b"
            ]
        },
        "Metadata": {
            "LastTagTime": "2026-06-02T07:22:55.02523385Z"
        },
        "Descriptor": {
            "mediaType": "application/vnd.oci.image.index.v1+json",
            "digest": "sha256:3dfb783a2853589ab1b50b06a687cfb9f2feeb8428c677b93df92c2e0ba1504c",
            "size": 856
        },
        "Identity": {
            "Build": [
                {
                    "Ref": "y7uxm193jovsiiy3fdaaaypsg",
                    "CreatedAt": "2026-06-02T03:22:57.046259319-04:00"
                }
            ]
        }
    }
]

下一批文章将介绍

"DevOps 生态介绍(九):别再只用 Docker Hub 了!生产环境必知的 ACR 与 ECR 选型攻略

"

相关推荐
Plastic garden1 小时前
Docker Compose Harbor
docker
yurenpai(27届找实习中)1 小时前
Spring AI 实战:从零实现 AI 对话的记忆与历史记录管理(附源码级解析)
java·spring·ai·prompt·word
nnsix1 小时前
Unity 自定义包的 package.json 简单写法
java·服务器·前端
宸津-代码粉碎机1 小时前
Spring AI企业级RAG进阶|文档智能分片调优、ES深度整合、接口限流熔断监控生产实战
java·开发语言·人工智能·后端·spring·elasticsearch·oracle
唐青枫1 小时前
Java MyBatis-Flex 实战指南:从 BaseMapper 到 QueryWrapper 的轻量 ORM 用法
java·mybatis
两年半的个人练习生^_^1 小时前
JVM进阶系列:彻底理解 Java 内存模型(JMM)
java·开发语言
云烟成雨TD9 小时前
Spring AI Alibaba 1.x 系列【69】Token 用量统计
java·人工智能·spring
JAVA9659 小时前
JAVA面试-并发篇 03-使用synchronized doublecheck实现单例有什么坑
java·单例模式·面试
在繁华处9 小时前
Java从零到熟练(四):面向对象基础
java·开发语言