Docker 学习笔记(二):docker run 的参数到底在控制什么? 📅 2026/7/1 17:33:38 Docker 学习笔记二docker run 的参数到底在控制什么学 Docker 最容易被劝退的地方不是概念而是命令参数。比如dockerrun-d--namemy-nginx-p8080:80-v./html:/usr/share/nginx/html-eTZAsia/Shanghai nginx:alpine第一次看到这条命令很容易觉得这不就是一堆神秘参数拼起来的吗其实docker run可以拆成一个非常简单的句子用某个镜像创建一个容器并指定它如何运行。这篇文章就专门拆docker run。1. 最小命令启动一个容器dockerrun nginx:alpine意思是如果本地没有nginx:alpine镜像就先拉取然后基于这个镜像创建一个容器最后启动容器。但是这样启动有几个问题容器会占住当前终端。容器没有名字不方便管理。外部访问不到容器里的端口。容器里的数据默认不方便持久化。所以才需要各种参数。2.-d后台运行dockerrun-dnginx:alpine-d是 detached 的意思也就是后台运行。不加-d容器日志会直接输出到当前终端。加了-dDocker 会返回一个容器 ID然后容器在后台继续运行。查看容器dockerps查看所有容器包括已经停止的dockerps-a3.--name给容器起名字dockerrun-d--namemy-nginx nginx:alpine如果不给容器起名Docker 会自动生成一个随机名字比如happy_morse angry_turing学习时还好真正排查问题时很难记。所以建议显式写名字dockerlogs my-nginxdockerstop my-nginxdockerrmmy-nginx名字的价值就是以后所有操作都可以用这个名字定位容器。4.-p端口映射最常见的命令dockerrun-d--namemy-nginx-p8080:80 nginx:alpine-p 8080:80的意思是宿主机端口:容器端口 8080:80也就是访问 localhost:8080 │ ▼ 转发到容器内部的 80 端口注意方向不要记反。可以这样记外面写前面里面写后面。所以-p3000:3000表示宿主机3000映射到容器3000。-p8080:80表示宿主机8080映射到容器80。5.-v挂载目录或数据卷容器有一个特点容器删除后容器内部新产生的数据也可能跟着消失。比如 MongoDB 的数据、Nginx 的静态文件、上传文件都不应该只放在容器内部。这时要用-v。5.1 目录挂载dockerrun-d\--namemy-nginx\-p8080:80\-v./html:/usr/share/nginx/html\nginx:alpine意思是宿主机 ./html 目录 │ ▼ 挂载到容器 /usr/share/nginx/html以后你修改本机./html/index.html容器里的 Nginx 就会读到新的文件。5.2 命名数据卷dockervolume create mongo-datadockerrun-d\--namemongo\-p27017:27017\-vmongo-data:/data/db\mongo:7这里的mongo-data是 Docker 管理的数据卷。对数据库来说通常更推荐用命名卷而不是随便挂本地目录。6.-e设置环境变量很多镜像通过环境变量初始化配置。比如 MongoDBdockerrun-d\--namemongo\-p27017:27017\-eMONGO_INITDB_ROOT_USERNAMEroot\-eMONGO_INITDB_ROOT_PASSWORD123456\-vmongo-data:/data/db\mongo:7-e的意思是 environment。可以理解成给容器进程注入环境变量后端项目里也常用-eNODE_ENVproduction-eMONGO_URLmongodb://root:123456mongo:27017/app?authSourceadmin-ePORT30007.--rm容器停止后自动删除临时跑一个命令时可以用dockerrun--rmnode:22-alpinenode-v意思是启动一个临时容器执行node -v执行完自动删除容器。适合临时测试不适合长期服务。8.-it进入交互式终端dockerrun-it--rmnode:22-alpinesh这里-i保持标准输入打开-t分配一个终端sh容器启动后执行 shell。进入之后可以执行node-vnpm-vls如果是 Ubuntu 镜像dockerrun-it--rmubuntu:22.04bash9.--network指定容器加入哪个网络dockernetwork create app-netdockerrun-d--namemongo--networkapp-net mongo:7dockerrun-d--nameapi--networkapp-net my-api:1.0如果两个容器在同一个 Docker 网络里它们可以用容器名互相访问。比如后端连接 MongoDB可以写mongodb://mongo:27017/app这里的mongo不是 localhost而是容器名。这是 Docker 网络里非常重要的一个点容器访问容器不要写 localhost要写服务名或容器名。10. 常用生命周期命令启动容器后常用这些命令管理# 查看运行中的容器dockerps# 查看所有容器dockerps-a# 查看日志dockerlogs my-nginx# 持续查看日志dockerlogs-fmy-nginx# 停止容器dockerstop my-nginx# 启动已停止容器dockerstart my-nginx# 重启容器dockerrestart my-nginx# 删除容器dockerrmmy-nginx# 强制删除运行中的容器dockerrm-fmy-nginx11. 一条完整命令拆解dockerrun-d\--namemongo\-p27017:27017\-eMONGO_INITDB_ROOT_USERNAMEroot\-eMONGO_INITDB_ROOT_PASSWORD123456\-vmongo-data:/data/db\--networkapp-net\mongo:7可以翻译成中文用mongo:7镜像创建一个叫mongo的容器让它后台运行把宿主机 27017 端口映射到容器 27017 端口设置 root 用户名密码把数据库数据保存到mongo-data卷并加入app-net网络。这样一翻译命令就不吓人了。12. 第二篇小结docker run的核心是docker run [运行参数] 镜像名 [容器内执行的命令]常见参数参数作用-d后台运行--name指定容器名字-p端口映射-v挂载目录或数据卷-e设置环境变量--rm停止后自动删除-it交互式终端--network指定 Docker 网络下一篇继续讲 Docker 网络bridge、子网、网关、容器名访问、为什么容器里不能随便写 localhost。参考资料Docker run reference: https://docs.docker.com/reference/cli/docker/container/run/Docker volumes: https://docs.docker.com/engine/storage/volumes/Docker networking overview: https://docs.docker.com/engine/network/