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-worldCentOS安装
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 dockerDocker基本命令
镜像操作
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: bridgeDocker 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:15Docker优化
减小镜像体积
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相关内容。