Skip to content

Docker安装与使用

Docker简介

Docker是一个开源的容器化平台,可以将应用及其依赖打包到一个可移植的容器中。

Docker安装

Ubuntu安装

bash
# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 更新软件源
sudo apt update

# 安装依赖
sudo apt install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加Docker软件源
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 启动Docker
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
sudo docker --version
sudo docker run hello-world

CentOS安装

bash
# 卸载旧版本
sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine

# 安装依赖
sudo yum install -y yum-utils

# 添加Docker软件源
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 安装Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 启动Docker
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
sudo docker --version
sudo docker run hello-world

配置Docker

bash
# 添加当前用户到docker组(避免sudo)
sudo usermod -aG docker $USER
newgrp docker

# 配置镜像加速(阿里云)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
EOF

# 重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker基本命令

镜像操作

bash
# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx
docker pull nginx:1.21

# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx:latest
docker rmi image_id

# 构建镜像
docker build -t myapp:v1.0 .

# 导出镜像
docker save -o nginx.tar nginx:latest

# 导入镜像
docker load -i nginx.tar

# 给镜像打标签
docker tag nginx:latest myrepo/nginx:v1

容器操作

bash
# 运行容器
docker run nginx
docker run -d nginx                    # 后台运行
docker run -d -p 8080:80 nginx        # 端口映射
docker run -d --name mynginx nginx    # 指定名称
docker run -d -v /data:/data nginx    # 挂载卷

# 查看容器
docker ps                  # 运行中的容器
docker ps -a              # 所有容器

# 启动/停止容器
docker start container_id
docker stop container_id
docker restart container_id

# 删除容器
docker rm container_id
docker rm -f container_id  # 强制删除

# 进入容器
docker exec -it container_id /bin/bash
docker attach container_id

# 查看容器日志
docker logs container_id
docker logs -f container_id    # 实时日志
docker logs --tail 100 container_id  # 最后100行

# 查看容器详情
docker inspect container_id

# 查看容器资源使用
docker stats
docker stats container_id

# 复制文件
docker cp file.txt container_id:/path/
docker cp container_id:/path/file.txt ./

Dockerfile

基本结构

dockerfile
# 基础镜像
FROM openjdk:17-jdk-slim

# 维护者信息
LABEL maintainer="glowxq@example.com"

# 设置工作目录
WORKDIR /app

# 复制文件
COPY target/myapp.jar /app/app.jar

# 设置环境变量
ENV JAVA_OPTS="-Xms512m -Xmx1024m"

# 暴露端口
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

多阶段构建

dockerfile
# 构建阶段
FROM maven:3.8-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 运行阶段
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

构建镜像

bash
# 构建
docker build -t myapp:v1.0 .

# 构建时传递参数
docker build --build-arg VERSION=1.0 -t myapp:v1.0 .

# 不使用缓存
docker build --no-cache -t myapp:v1.0 .

Docker Compose

docker-compose.yml示例

yaml
version: '3.8'

services:
  # MySQL数据库
  mysql:
    image: mysql:8.0
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - mynetwork

  # Redis缓存
  redis:
    image: redis:7
    container_name: redis
    ports:
      - "6379:6379"
    networks:
      - mynetwork

  # 应用服务
  app:
    build: .
    container_name: myapp
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydb
      SPRING_REDIS_HOST: redis
    depends_on:
      - mysql
      - redis
    networks:
      - mynetwork

  # Nginx
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    networks:
      - mynetwork

volumes:
  mysql_data:

networks:
  mynetwork:
    driver: bridge

Docker Compose命令

bash
# 启动所有服务
docker-compose up
docker-compose up -d      # 后台运行

# 停止所有服务
docker-compose stop

# 停止并删除容器
docker-compose down
docker-compose down -v    # 同时删除卷

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs
docker-compose logs -f app

# 重启服务
docker-compose restart

# 构建镜像
docker-compose build

# 扩展服务
docker-compose up -d --scale app=3

数据卷

创建和管理卷

bash
# 创建卷
docker volume create mydata

# 查看卷
docker volume ls

# 查看卷详情
docker volume inspect mydata

# 删除卷
docker volume rm mydata

# 清理未使用的卷
docker volume prune

# 使用卷
docker run -d -v mydata:/data nginx

网络

网络类型

  • bridge:默认网络,容器之间可通信
  • host:使用宿主机网络
  • none:无网络
  • overlay:跨主机网络(Swarm)

网络操作

bash
# 创建网络
docker network create mynetwork

# 查看网络
docker network ls

# 查看网络详情
docker network inspect mynetwork

# 连接容器到网络
docker network connect mynetwork container_id

# 断开连接
docker network disconnect mynetwork container_id

# 删除网络
docker network rm mynetwork

# 清理未使用的网络
docker network prune

实用示例

运行MySQL

bash
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=root123 \
  -e MYSQL_DATABASE=mydb \
  -v mysql_data:/var/lib/mysql \
  mysql:8.0

运行Redis

bash
docker run -d \
  --name redis \
  -p 6379:6379 \
  redis:7

运行Nginx

bash
docker run -d \
  --name nginx \
  -p 80:80 \
  -v $(pwd)/html:/usr/share/nginx/html \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf \
  nginx:latest

运行PostgreSQL

bash
docker run -d \
  --name postgres \
  -p 5432:5432 \
  -e POSTGRES_PASSWORD=postgres \
  -e POSTGRES_DB=mydb \
  -v postgres_data:/var/lib/postgresql/data \
  postgres:15

Docker优化

减小镜像体积

dockerfile
# 使用轻量级基础镜像
FROM alpine:latest

# 合并RUN命令
RUN apk add --no-cache python3 \
    && pip3 install flask \
    && rm -rf /var/cache/apk/*

# 清理缓存
RUN apt-get update \
    && apt-get install -y package \
    && rm -rf /var/lib/apt/lists/*

.dockerignore

node_modules
.git
.idea
*.log
*.md
Dockerfile
docker-compose.yml

健康检查

dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s \
  CMD curl -f http://localhost:8080/health || exit 1

故障排查

bash
# 查看容器日志
docker logs -f container_id

# 进入容器调试
docker exec -it container_id /bin/sh

# 查看容器进程
docker top container_id

# 查看资源使用
docker stats container_id

# 查看容器变更
docker diff container_id

# 导出容器文件系统
docker export container_id > container.tar

💡 提示

这是一个demo文档,欢迎补充更多Docker相关内容。

基于 VitePress 构建