Docker入门全攻略:轻松上手,提升你的项目效率

前言

什么是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 还是没人用?到底卡在哪了?》

《加班到凌晨,我用 Vue3 + ElementUI 写了个可编辑的表格组件》

《vue3 登录页还能这么丝滑?这个 hover 效果太惊艳了》

相关推荐
MonkeyKing_sunyuhua1 小时前
docker compose up -d --build 完全使用新代码打包的方法
docker·容器·eureka
神奇小汤圆1 小时前
浅析二叉树、B树、B+树和MySQL索引底层原理
后端
醇氧1 小时前
【docker】mysql 8 的健康检查(Health Check)
mysql·docker·容器
文艺理科生2 小时前
Nginx 路径映射深度解析:从本地开发到生产交付的底层哲学
前端·后端·架构
千寻girling2 小时前
主管:”人家 Node 框架都用 Nest.js 了 , 你怎么还在用 Express ?“
前端·后端·面试
南极企鹅2 小时前
springBoot项目有几个端口
java·spring boot·后端
Luke君607972 小时前
Spring Flux方法总结
后端
define95272 小时前
高版本 MySQL 驱动的 DNS 陷阱
后端
技术路上的探险家2 小时前
Ubuntu下Docker与NVIDIA Container Toolkit完整安装教程(含国内源适配)
linux·ubuntu·docker
忧郁的Mr.Li2 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端