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 选型攻略
"