从零基础到精通 | 包含镜像、容器、Compose和部署
Docker是一个容器化平台,允许你将应用及其依赖打包成一个独立的、可移植的单元,称为容器。
# macOS
brew install docker
# Linux (Ubuntu)
sudo apt-get update
sudo apt-get install docker.io
# Windows
# 下载Docker Desktop: https://www.docker.com/products/docker-desktop
# 验证安装
docker --version
docker run hello-world# 添加当前用户到docker组(避免使用sudo)
sudo usermod -aG docker $USER
# 配置镜像加速(中国用户)
# 编辑 ~/.docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://mirror.aliyun.com"
]
}# 查看本地镜像
docker images
# 搜索镜像
docker search ubuntu
# 拉取镜像
docker pull ubuntu:20.04
# 删除镜像
docker rmi ubuntu:20.04
# 标记镜像
docker tag ubuntu:20.04 myubuntu:latest
# 查看镜像详情
docker inspect ubuntu:20.04
# 查看镜像历史
docker history ubuntu:20.04# 运行容器
docker run -d --name mycontainer ubuntu:20.04
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 启动容器
docker start mycontainer
# 停止容器
docker stop mycontainer
# 删除容器
docker rm mycontainer
# 查看容器日志
docker logs mycontainer
docker logs -f mycontainer # 实时日志
# 进入容器
docker exec -it mycontainer /bin/bash
# 查看容器资源使用
docker stats mycontainer# 端口映射
docker run -p 8080:80 nginx
# 环境变量
docker run -e NODE_ENV=production node:14
# 挂载卷
docker run -v /host/path:/container/path ubuntu
# 资源限制
docker run -m 512m --cpus 1 ubuntu
# 网络
docker run --network mynetwork ubuntu
# 自动重启
docker run --restart always ubuntuFROM node:14-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
ENV NODE_ENV=production
CMD ["node", "app.js"]# 构建镜像
docker build -t myapp:1.0 .
# 查看构建过程
docker build -t myapp:1.0 --progress=plain .
# 使用BuildKit
DOCKER_BUILDKIT=1 docker build -t myapp:1.0 .# 使用轻量级基础镜像
FROM node:14-alpine
# 分层构建,减少镜像大小
FROM node:14-alpine AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM node:14-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --production
CMD ["node", "dist/index.js"]version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://db:5432/myapp
depends_on:
- db
volumes:
- ./src:/app/src
db:
image: postgres:13
environment:
- POSTGRES_DB=myapp
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:6-alpine
ports:
- "6379:6379"
volumes:
postgres_data:# 启动服务
docker-compose up -d
# 查看服务
docker-compose ps
# 查看日志
docker-compose logs -f web
# 停止服务
docker-compose stop
# 删除服务
docker-compose down
# 重启服务
docker-compose restart
# 执行命令
docker-compose exec web npm test# 创建网络
docker network create mynetwork
# 查看网络
docker network ls
# 连接容器到网络
docker network connect mynetwork mycontainer
# 断开连接
docker network disconnect mynetwork mycontainer
# 查看网络详情
docker network inspect mynetwork
# 删除网络
docker network rm mynetwork# 创建卷
docker volume create myvolume
# 查看卷
docker volume ls
# 查看卷详情
docker volume inspect myvolume
# 删除卷
docker volume rm myvolume
# 挂载卷
docker run -v myvolume:/data ubuntu
# 绑定挂载
docker run -v /host/path:/container/path ubuntu# 登录Docker Hub
docker login
# 标记镜像
docker tag myapp:1.0 username/myapp:1.0
# 推送镜像
docker push username/myapp:1.0
# 拉取镜像
docker pull username/myapp:1.0
# 登出
docker logout# 运行私有仓库
docker run -d -p 5000:5000 --name registry registry:2
# 标记镜像
docker tag myapp:1.0 localhost:5000/myapp:1.0
# 推送到私有仓库
docker push localhost:5000/myapp:1.0
# 拉取
docker pull localhost:5000/myapp:1.0# 不要以root用户运行
FROM ubuntu:20.04
RUN useradd -m appuser
USER appuser
# 扫描镜像漏洞
docker scan myapp:1.0
# 使用只读文件系统
docker run --read-only ubuntu
# 限制资源
docker run -m 512m --cpus 1 ubuntu# 配置日志驱动
docker run --log-driver json-file --log-opt max-size=10m ubuntu
# 查看日志
docker logs mycontainer
# 使用外部日志系统
docker run --log-driver splunk ubuntumyapp/
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
├── package.json
├── app.js
└── src/
└── index.jsFROM node:14-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node healthcheck.js
CMD ["node", "app.js"]version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://db:5432/myapp
depends_on:
- db
restart: always
db:
image: postgres:13-alpine
environment:
- POSTGRES_DB=myapp
- POSTGRES_PASSWORD=password
volumes:
- db_data:/var/lib/postgresql/data
restart: always
volumes:
db_data:# 1. 构建镜像
docker build -t myapp:1.0 .
# 2. 启动服务
docker-compose up -d
# 3. 查看日志
docker-compose logs -f app
# 4. 测试应用
curl http://localhost:3000
# 5. 推送镜像
docker tag myapp:1.0 username/myapp:1.0
docker push username/myapp:1.0通过这个项目,你学会了如何将应用容器化并使用Compose进行编排。
现在你已经掌握了Docker容器化的核心知识。
Docker是现代应用部署的基础。掌握Docker,你就掌握了云原生应用开发的关键技能。