Docker 入门:镜像、容器与常用命令
Docker 是什么
刚学开发时,最常见的一句话是“在我电脑上明明能跑”。换一台电脑、换一个服务器,环境版本、依赖库、系统配置稍有不同,程序就可能跑不起来。Docker 就是为了解决这个“环境不一致”问题而来的工具:它把应用和它运行所需的环境打包在一起,到哪里运行,结果都尽量一样。
镜像与容器:先分清这两个词
镜像是一个只读的模板,里面装着操作系统基础文件、运行环境和应用代码。容器是镜像跑起来的实例,是一个正在运行的、相互隔离的进程环境。
可以这样类比:镜像像一张安装光盘或一份菜谱,容器则是按这份菜谱做出来的一盘菜;同一张光盘可以刻出多张,同一个镜像也可以启动多个容器,互不干扰。
镜像采用分层结构,每一层对应一次改动,相同的层可以在不同镜像之间复用,所以下载和构建都比较快。容器在镜像之上还有一层可写层,运行时产生的临时文件写在这里,容器删掉后,这层数据一般也随之消失。
三个核心概念
- 镜像:只读模板,
docker pull拉取,docker images查看。 - 容器:镜像的运行实例,有自己的进程和文件系统。
- 仓库:存放镜像的地方,比如 Docker Hub,
docker push上传,docker pull下载。
写应用时还会用到 Dockerfile,它是一份文本配方,写明“从哪个基础镜像开始、复制哪些文件、执行哪些命令”,docker build 按它做出镜像。
安装后先验证
装好 Docker 后,先跑下面两条命令确认服务正常:
docker version
docker run hello-world
第二条命令会拉取一个很小的测试镜像并运行,如果最后出现问候信息,说明 Docker 已经可以正常工作,不用再怀疑安装环节。
常用命令:记住这几组就够用
镜像相关:
docker images # 查看本地镜像
docker pull nginx # 拉取镜像
docker rmi nginx # 删除镜像
容器相关:
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器,包括已停止的
docker run -d -p 8080:80 --name web nginx # 后台运行,并把容器 80 端口映射到本机 8080
docker stop web # 停止容器
docker start web # 再次启动
docker rm web # 删除已停止的容器
docker logs web # 查看容器日志
docker exec -it web sh # 进入容器内部
这里 -d 表示后台运行,-p 8080:80 是“本机端口:容器端口”,顺序别写反;--name 是给容器起个名字,方便后面操作。
一个最小示例:跑起 Nginx
只用三步,就能看到一个真实可访问的服务:
docker run -d -p 8080:80 --name demo-nginx nginx
curl http://localhost:8080
docker stop demo-nginx && docker rm demo-nginx
第一步启动 Nginx,第二步用 curl 访问本机 8080 端口,能看到 Nginx 的欢迎页面就说明成功了;第三步停掉并删掉容器,避免它长期占着端口。练习时养成“用完就清理”的习惯,机器才不会越跑越乱。
再进一步:用 Dockerfile 做出自己的镜像
新建一个目录,写一个简单的 Dockerfile:
FROM python:3.12-slim
WORKDIR /app
COPY . /app
CMD ["python", "-c", "print('Hello, Docker')"]
然后构建并运行:
docker build -t hello-docker .
docker run --rm hello-docker
FROM 选基础镜像,WORKDIR 定工作目录,COPY 把文件拷进去,CMD 是容器启动时的默认命令。理解这四个指令,就能读懂大多数简单的 Dockerfile。
三个常见坑
第一,数据别只放容器里。容器删了数据就没了,需要长期保存的数据要用卷挂载,例如 docker run -v /本地目录:/容器目录。
第二,端口冲突。8080 已被占用时换一个,比如 -p 8081:80。
第三,镜像越做越大。基础镜像尽量选 slim、alpine 这类小体积版本,构建时不要把测试文件、缓存都拷进去。
小结
记住一句话就够了:镜像是模板,容器是实例,Dockerfile 是配方。先会 run、ps、logs、stop 这几个命令,再跑通一个 Nginx 和一个自制镜像,Docker 的入门门槛就跨过去了,后面再学网络、卷和 Compose,会顺很多。
- 点赞
- 收藏
- 关注作者
评论(0)