Docker 容器入门:从镜像到容器,跑起你的第一个应用
刚接触服务器部署时,我经常被同一件事困扰:在自己电脑上跑得好好的程序,换一台机器就起不来,缺依赖、端口冲突、环境版本对不上。后来我开始用 Docker,这类问题少了很多。这篇文章用最直白的方式,把 Docker 从镜像到容器的关键概念讲清楚,并带你跑起第一个应用。
一、Docker 到底解决了什么问题
传统部署方式里,应用和它依赖的运行环境是绑在一起的。换一台机器,就要重新装语言、装库、配环境,任何一个版本差异都可能导致程序跑不起来。
Docker 的思路是:把应用和它需要的运行环境打包成一个镜像(Image),再从镜像启动出一个容器(Container)来运行。镜像是只读的模板,容器是镜像跑起来的实例。同一份镜像,在开发机、测试机和服务器上跑出来的行为基本一致,这就是常说的“一次构建,到处运行”。
可以这样理解:镜像是安装包,容器是装好之后正在运行的程序。删除容器不会影响镜像,随时可以用同一份镜像再起一个新的容器。
二、三个核心概念,先分清再动手
镜像(Image):分层构建的只读模板,每一层记录一次文件变化,相同的层可以在不同镜像之间共享,所以拉取镜像时常常很快。
容器(Container):镜像的运行实例,有自己独立的文件系统、网络和进程空间,容器停止后,内部没有持久化的数据会随容器一起消失。
仓库(Registry):存放镜像的地方,比如 Docker Hub。docker pull 就是从仓库把镜像下载到本地。
三、跑起第一个应用
装好 Docker 之后,先确认它能正常工作:
docker version
docker run hello-world
hello-world 是官方的测试镜像,能正常输出文字,说明 Docker 已经就绪。
接下来跑一个真正能访问的服务,以 Nginx 为例:
docker run -d --name my-nginx -p 8080:80 nginx
这条命令里,-d 是后台运行,–name 给容器起名字,-p 8080:80 把主机的 8080 端口映射到容器的 80 端口。执行后在浏览器访问本机的 8080 端口,就能看到 Nginx 的欢迎页。
几个常用的管理命令建议顺手记住:
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器,包括已停止的
docker logs my-nginx # 查看容器日志
docker stop my-nginx # 停止容器
docker rm my-nginx # 删除容器
四、自己写一个 Dockerfile
只会用别人的镜像还不够,真正常用的是把自己的程序打包成镜像。假设目录里有一个简单的静态页面 index.html,新建一个 Dockerfile:
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
然后构建并运行:
docker build -t my-web:v1 .
docker run -d --name my-web -p 8080:80 my-web:v1
FROM 指定基础镜像,COPY 把文件放进镜像,EXPOSE 声明容器监听的端口。docker build 后面的点表示以当前目录为构建上下文。改一行代码就重新构建一次,镜像层会复用没变的层,所以重复构建通常很快。
五、新手最容易踩的几个坑
第一,容器里的数据默认不持久。数据库这类有状态的服务,一定要用 -v 挂载卷或者绑定目录,否则容器删掉数据就没了。
第二,端口映射别写反。-p 主机端口:容器端口,访问时用的是主机端口。
第三,镜像命名要有标签。my-web:v1 里的 v1 就是标签,写清楚版本,回滚时才找得到。
第四,不要在容器里用 latest 当作版本管理。latest 只是个默认标签,不代表最新、最稳定,上线环境最好固定具体版本号。
六、小结
Docker 的上手路径其实很短:理解镜像和容器、会用 run、ps、logs、stop、rm 这几个命令、能写一个简单的 Dockerfile,就已经能应付大部分开发和学习场景了。之后可以再慢慢学 Docker Compose 管理多容器、学数据卷和网络,循序渐进即可。
如果你今天刚装好 Docker,不妨就按上面的命令跑一遍,从 hello-world 到自己的 my-web:v1,亲手走通一次,比看十篇概念文章都有用。
- 点赞
- 收藏
- 关注作者
评论(0)