Docker 是一个开放源代码的软件开发平台,它使得开发者能够轻松地在任何地方构建、部署和管理应用程序。对于全栈开发者来说,Docker 提供了一种非常方便的方式来统一开发环境和简化部署流程。下面是一个全栈开发者的 Docker 入门教程,涵盖基本概念、安装、常用命令和一个简单的实例。
### 1. Docker 基本概念
- **镜像(Image)**:Docker 镜像是一个只读的模板,包含了运行容器所需的文件系统和应用程序依赖。
- **容器(Container)**:容器是镜像的运行实例,可以被启动、停止、移动和删除。
- **仓库(Repository)**:Docker 仓库用于存放镜像,可以是公开的也可以是私有的。Docker Hub 是 Docker 的官方公共仓库。
### 2. 安装 Docker
Docker 支持 Windows、macOS 和各种 Linux 发行版。以下以 Ubuntu 为例说明安装过程:
```bash
# 更新软件包索引
sudo apt-get update
# 安装所需的包以允许 apt 通过 HTTPS 使用仓库
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 -
# 设置稳定版仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 更新软件包索引
sudo apt-get update
# 安装 Docker CE
sudo apt-get install docker-ce
```
### 3. Docker 常用命令
- **运行容器**:
```bash
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
```
例如,运行一个 nginx 服务器:
```bash
docker run -d -p 8080:80 nginx
```
这里 `-d` 表示后台运行,`-p 8080:80` 表示将容器的 80 端口映射到主机的 8080 端口。
- **查看运行中的容器**:
```bash
docker ps
```
- **停止容器**:
```bash
docker stop CONTAINER_ID
```
- **删除容器**:
```bash
docker rm CONTAINER_ID
```
- **构建镜像**:
```bash
docker build -t my-image-name .
```
这里 `-t my-image-name` 指定了新镜像的名称,`.` 表示 Dockerfile 所在的目录。
### 4. 实例:Docker化一个简单的 Node.js 应用
1. 创建一个简单的 Node.js 应用:
```javascript
// app.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('App listening on port 3000!');
});
```
2. 创建一个 `Dockerfile`:
```Dockerfile
# 使用官方 Node.js 作为基础镜像
FROM node:14
# 设置工作目录
WORKDIR /usr/src/app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制所有文件到工作目录
COPY . .
# 暴露端口 3000
EXPOSE 3000
# 启动 Node.js 应用
CMD ["node", "app.js"]
```
3. 构建和运行 Docker 容器:
```bash
docker build -t node-app .
docker run -p 3000:3000 -d node-app
```
通过这个教程,全栈开发者可以开始利用 Docker 来开发和部署应用程序。Docker 的学习曲线相对平缓,但它极大地简化了部署过程和环境一致性问题。