前言
什么是Docker
?简单来说,Docker
是一个开源项目,它能让开发者将应用及其依赖打包到一个轻量级的、可移植的容器中。然后,这个容器可以在任何流行的Linux
机器或Windows
机器上运行。
为什么会这样?传统开发中,我们经常遇到 "在我机器上能跑,为什么到你那就不行?" 的问题。
比如:开发用Mac,测试用Windows,生产是Linux。可部署以后发现Python版本不一样,Node.js缺某个模块,数据库配置路径不同等等一系列问题。
这是因为环境不一致导致的。Docker
通过容器化技术,将应用和环境一起打包,解决了环境一致性问题。
使用Docker
打包后,测试、生产环境都可以一键部署,再也不用担心环境差异导致的问题了。
接下来,我们一起从入门到实战,深入了解Docker
!
一、Docker核心概念
1. 镜像(Image)
Docker
镜像是一个只读模板。它包含了运行某个软件所需的所有内容,比如:代码、运行时、库、环境变量和配置文件等。
可以把镜像看作是一个应用程序的打包文件,里面包含了运行这个程序需要的一切。
2. 容器(Container)
容器是镜像的运行实例。它可以被启动、开始、停止、删除。
每个容器都是相互隔离的,保证安全平台。
可以把容器看作是一个轻量级的虚拟机,但它比虚拟机更加轻便、快速。
3. 仓库(Repository)
Docker
仓库用来保存镜像。类似于代码仓库,分为公有仓库和私有仓库。
Docker
官方的公有仓库是Docker Hub
,我们可以在上面找到很多官方和个人发布的镜像。
二、Docker安装
Windows/Mac安装
直接下载Docker Desktop,一键安装,非常简单。

还需要安装虚拟环境。
Linux安装
以Ubuntu为例:
bash
# 更新软件包索引
sudo apt-get update
# 安装依赖包
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装Docker
sudo apt-get update
sudo apt-get install docker-ce
安装完成后,运行以下命令验证:
bash
docker --version
三、部署一个Web应用
我们来实际部署一个Node.js Web应用。
1. 创建项目目录
bash
mkdir my-node-app
cd my-node-app
2. 创建package.json
json
{
"name": "my-node-app",
"version": "1.0.0",
"description": "Node.js on Docker",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.18.2"
}
}
3. 创建server.js
javascript
const express = require('express');
const app = express();
const PORT = 5000;
app.get('/', (req, res) => {
res.send('Hello Docker!');
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
4. 创建Dockerfile
dockerfile
# 使用官方Node.js运行时作为父镜像
FROM node:18
# 设置工作目录
WORKDIR /usr/src/app
# 将package.json和package-lock.json复制到工作目录
COPY package*.json ./
# 安装依赖
RUN npm install
# 将本地代码复制到容器中
COPY . .
# 暴露端口
EXPOSE 5000
# 运行应用
CMD ["npm", "start"]
5. 构建镜像
在当前目录下执行
bash
docker build -t my-node-app .
说明:
docker build
:构建镜像-t my-node-app
:给镜像起个名字.
:当前目录找 Dockerfile
构建后需要等一会,然后查看镜像是否创建成功
bash
docker images
创建成功,如图:

6. 运行容器
bash
docker run -d --name node-server -p 5000:5000 my-node-app
参数解释:
-d
:后台运行--name node-server
:为容器指定一个名称-p
5000:5000:把宿主机的5000端口映射到容器的5000端口my-node-app
:你要运行的镜像名
测试
bash
# 测试应用是否正常运行
curl http://localhost:5000
# 或者使用浏览器访问
# http://localhost:5000
看到"Hello Docker!"
,恭喜你,成功了!
四、Docker Compose多容器部署
实际项目中,我们通常需要多个服务配合。比如Web前端、后端、数据库。
举个例子:项目的目录是这样的
go
my-app/
├── docker-compose.yml
├── backend/
│ ├── Dockerfile
│ ├── package.json
│ └── server.js
├── frontend/
│ ├── Dockerfile
│ ├── package.json
│ └── src/
└── redis/
└── Dockerfile(需要自定义)
nodejs
后端:backend/Dockerfile
sql
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 5000
CMD ["npm", "start"]
前端:frontend/Dockerfile
sql
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 5000
CMD ["npm", "start"]
创建docker-compose.yml:
yaml
version: '3.8'
services:
backend:
build: ./backend
ports:
- "5000:5000"
environment:
- NODE_ENV=production
- REDIS_HOST=redis
depends_on:
- redis
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
command: redis-server --appendonly yes
volumes:
redis-data:
运行以下命令启动所有服务:
bash
docker-compose up -d
-d
为后台运行模式
五、Docker常用命令大全
镜像命令
bash
# 拉取镜像
docker pull [镜像名]
# 列出本地镜像
docker images
# 删除镜像
docker rmi [镜像名/ID]
# 构建镜像
docker build -t [标签名] .
容器命令
bash
# 运行容器
docker run [选项] [镜像名]
# 列出运行中的容器
docker ps
# 列出所有容器
docker ps -a
# 停止容器
docker stop [容器名/ID]
# 启动已停止的容器
docker start [容器名/ID]
# 删除容器
docker rm [容器名/ID]
# 进入容器
docker exec -it [容器名/ID] /bin/bash
# 查看容器日志
docker logs [容器名/ID]
Docker Compose命令
bash
# 启动所有服务
docker-compose up
# 在后台启动所有服务
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs
其他实用命令
bash
# 查看Docker信息
docker info
# 查看磁盘使用情况
docker system df
# 清理无用数据
docker system prune
# 复制文件到容器
docker cp [本地路径] [容器名/ID]:[容器路径]
# 从容器复制文件
docker cp [容器名/ID]:[容器路径] [本地路径]
六、最佳实践
1.使用.dockerignore文件 避免将不必要的文件复制到镜像中,减小镜像体积。
2.多阶段构建 对于需要编译的应用,使用多阶段构建可以显著减小最终镜像的大小。
3.使用官方镜像 尽量使用官方镜像,更加安全可靠。
4.指定镜像版本 不要使用latest标签,指定具体版本避免意外变更。
5.最小化镜像层数 合并RUN指令,减少镜像层数。
结语
Docker
确实改变了我们开发、部署应用的方式。通过容器化,我们实现了环境一致性,简化了部署流程。
如果这篇Docker
入门的文章对你有帮助,欢迎点赞、收藏、转发!
本文首发于公众号:程序员刘大华,专注分享前后端开发的实战笔记。关注我,少走弯路,一起进步!
📌往期精彩
《SpringBoot 中的 7 种耗时统计方式,你用过几种?》
《Java8 都出这么多年了,Optional 还是没人用?到底卡在哪了?》