文章目录
Docker安装与使用
安装Docker
参考该文章:https://blog.csdn.net/SoulruiA/article/details/147655089?spm=1001.2014.3001.5501
Docker常用命令
运行容器
docker run [选项] 镜像名 [命令]
常用选项:
-d
后台运行-it
交互模式(通常与bash
结合)--name
指定容器名称-p 主机端口:容器端口
端口映射-v 主机路径:容器路径
挂载数据卷--rm
退出后自动删除容器-e
设置环境变量
以MySql
为例
docker run -d \ #创建并运行一个容器 -d是让容器后台运行
--name mysql \ #容器名字 必须唯一
-p 3306:3306 \ #mysql端口映射 宿主端口:容器内端口
-e MYSQL_ROOT_PASSWORD=123456 \ #设置密码
mysql #镜像名字完整写法:[repository]:[tag] 镜像名:版本 默认latest
查看镜像
语法:docker images
拉取镜像
语法:docker pull [repository]:[tag]
- repository 镜像名
- tag 版本号
docker pull nginx:latest
#拉取nginx最新版
删除镜像
语法:docker rmi 镜像名
docker rmi nginx:latest
导出镜像
语法:docker save [-o 文件名] 镜像
docker save -o nginx.tar nginx:latest
#将nginx:latest打包成名为nginx.tar的包
导入镜像
语法:docker load -i 输入文件名.tar
- -
i
:input
指定输入名
docker load -i nginx.tar
查看容器状态
语法:docker ps [选项]
选项 | 作用 |
---|---|
-a 或 --all | 显示 所有容器(包括已停止的) |
-q 或 --quiet | 仅显示 容器ID(适合脚本处理) |
-s 或 --size | 显示容器占用磁盘大小 |
--filter 或 -f | 按条件过滤容器(见下方示例) |
--format | 自定义输出格式(Go模板语法,见下方) |
--no-trunc | 显示完整信息(不截断输出) |
条件过滤 |
# 按名称过滤
docker ps --filter "name=webserver"
# 按状态过滤
docker ps --filter "status=exited" # 已停止的容器
docker ps --filter "status=running" # 运行中的容器
# 按镜像过滤
docker ps --filter "ancestor=nginx" # 使用 nginx 镜像的容器
# 按标签过滤(自定义标签)
docker ps --filter "label=env=prod"
格式输出
# 仅显示容器ID和镜像名
docker ps --format "{{.ID}}: {{.Image}}"
# 表格形式显示名称、状态、端口
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
查看日志
语法:docker logs [选项] 容器名或ID
选项 | 作用 |
---|---|
-f 或 --follow | 实时跟踪日志(类似 tail -f ) |
--tail N | 仅显示最后 N 行日志(默认全部) |
-t 或 --timestamps | 显示时间戳 |
--since | 显示指定时间之后的日志(如 --since 2024-01-01 或 --since 1h ) |
--until | 显示指定时间之前的日志 |
--details | 显示额外的日志元数据 |
docker logs -f mysql
#跟踪mysql日志
进入容器内部
语法:docker exec [选项] 容器名或ID
选项 | 作用 |
---|---|
-it | 交互式操作(组合 -i 保持输入 + -t 分配伪终端) |
-d | 后台执行命令(不阻塞终端) |
-u | 指定用户执行(如 -u root 或 -u www-data ) |
-e | 设置环境变量(如 -e VAR=value ) |
-w | 指定工作目录(如 -w /app ) |
容器启用、停用、删除
语法:docker [start stop rm] 容器名或ID
命令 | 说明 |
---|---|
start | 启动暂停的容器 |
stop | 停止容器运行 |
rm | 删除容器 |
数据卷
容器内目录和主机目录之间映射的桥梁,当修改宿主机对应的文件,容器内文件也会修改,实现双向绑定,数据共享,查看官方文档进行目录挂载,
docher hub
命令 | 作用 | 示例 |
---|---|---|
docker volume create | 创建数据卷 | docker volume create my_vol |
docker volume ls | 列出所有数据卷 | docker volume ls |
docker volume inspect | 查看数据卷详情 | docker volume inspect my_vol |
docker volume rm | 删除数据卷 | docker volume rm my_vol |
docker volume prune | 清理未使用的数据卷 | docker volume prune |
案例1:实现将静态资源部署到nginx容器的html目录
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx #挂在目录需要在创建时就执行,数据卷名:所要挂载的目录
docker volume inspect html #查看数据卷挂在宿主机位置
打开宿主机对应挂载目录并修改,容器内文件也会进行相应修改
案例2:实现MySql容器数据挂载到自定义目录
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/aer/mysql/data:/var/lib/mysql mysql
#将mysql数据目录挂载到/home/aer/mysql下
自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的打包
部署一个Java应用的步骤:
- 准备一个Linux服务器
- 安装JRE并配置环境变量
- 拷贝jar包
- 运行jar包
Dockerfile 常用指令
指令 | 作用 | Java 项目示例 | 最佳实践 |
---|---|---|---|
FROM | 指定基础镜像 | FROM eclipse-temurin:17-jdk-jammy | 使用官方 OpenJDK 镜像(如 eclipse-temurin ),明确版本号;生产环境避免使用 latest 。 |
WORKDIR | 设置工作目录 | WORKDIR /app | 所有后续命令基于此目录执行,避免硬编码路径。 |
COPY | 复制文件到镜像 | COPY target/my-app.jar app.jar COPY src/main/resources/conf/ /conf/ | 优先用 COPY 而非 ADD (除非需自动解压);分阶段复制以减少层数。 |
RUN | 执行命令(构建阶段) | RUN apt-get update && apt-get install -y curl | 合并命令(用 && 和 \ ),清理缓存(如 apt 或 mvn 临时文件)。 |
ENV ** | 设置环境变量 | ENV JAVA_OPTS="-Xms512m -Xmx1024m" ENV PROFILE="prod" | 统一管理配置(如 JVM 参数、Spring Profile)。 |
EXPOSE | 声明容器暴露端口 | EXPOSE 8080 | 仅文档作用,实际端口映射在 docker run 时通过 -p 指定。 |
CMD | 容器启动时执行的命令(可被覆盖) | CMD ["java", "-jar", "app.jar"] CMD ["java", "${JAVA_OPTS}", "-jar", "app.jar"] | 使用 JSON 数组格式(避免 Shell 解析问题),参数通过环境变量注入。 |
ENTRYPOINT | 容器入口命令(不可被覆盖) | ENTRYPOINT ["java", "-jar", "app.jar"] | 与 CMD 结合使用(ENTRYPOINT 定义固定命令,CMD 提供默认参数)。 |
ARG | 构建时传递变量(构建后消失) | ARG MAVEN_VERSION=3.8.6 RUN curl -O https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/... | 用于动态指定依赖版本(如 Maven、JDK 版本)。 |
VOLUME | 声明数据卷挂载点 | VOLUME /tmp | 挂载临时目录(如 Spring Boot 的 /tmp )或日志目录,避免数据丢失。 |
#指定Ubuntu镜像
FROM ubuntu:24.04
#配置环境变量,JDK安装目录
ENV JAVA_DIR=/usr/local
#拷贝JDK和JAVA项目包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
#安装JDK
RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \ && mv ./jdk1.8.0_144 ./java8
#配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
#入口,JAVA项目启动命令
ENTRYPOINT ["java","-jar","/app.jar"]
使用基于JDK基础镜像简化操作
# 使用官方轻量级 JRE 镜像(无需手动安装 Java)
FROM FROM openjdk:11.0-jre-buster
# 设置工作目录
WORKDIR /app
# 复制 JAR 文件到镜像
COPY target/your-app.jar app.jar
# 启动命令(直接运行 JAR)
ENTRYPOINT ["java", "-jar", "app.jar"]
构建镜像
docker built -t myImage:1.o .
#- -t:给镜像起名,格式为repository:tag
#- . 指定Dockerfile所在目录,如果在当前目录则指定为.
网络
加入自定义网络的容器可以通过容器名互相访问
命令 | 作用 | 示例 |
---|---|---|
docker network ls | 列出所有网络 | docker network ls |
docker network inspect <网络名> | 查看网络详细信息 | docker network inspect bridge |
docker network create <网络名> | 创建自定义网络 | docker network create my_net |
docker network rm <网络名> | 删除网络(需无容器连接) | docker network rm my_net |
docker network prune | 删除所有未使用的网络 | docker network prune |
docker run --network=<网络名> | 指定容器运行时的网络 | docker run -d --network=my_net nginx |
docker network connect <网络名> <容器> | 将运行中的容器连接到网络 | docker network connect my_net my_container |
docker network disconnect <网络名> <容器> | 断开容器与网络的连接 | docker network disconnect my_net my_container |
将mysql加入自定义网络
docker network create net
#创建一个名为net的网络
docker network connect net mysql
#将先前创建的mysql容器加入net网络
docker inspect mysql
#查看mysql容器的ip,发现除默认网桥外还有一个新的网桥
Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具,通过一个 YAML 配置文件(
docker-compose.yml
)来管理多个容器的启动、网络、存储等配置。它特别适合开发环境和微服务架构的部署。
1. Docker Compose 核心概念
概念 | 说明 |
---|---|
Service(服务) | 一个容器化的应用(如 nginx , mysql , redis ),在 docker-compose.yml 中定义。 |
Project(项目) | 由多个服务组成的完整应用(如 web + db + cache )。 |
YAML 配置文件 | docker-compose.yml 定义服务、网络、卷等配置。 |
2. Docker Compose 核心命令
命令 | 作用 | 示例 |
---|---|---|
docker-compose up | 启动所有服务(-d 后台运行) | docker-compose up -d |
docker-compose down | 停止并删除所有容器、网络 | docker-compose down |
docker-compose ps | 查看运行中的服务 | docker-compose ps |
docker-compose logs | 查看服务日志(-f 实时查看) | docker-compose logs -f web |
docker-compose exec | 进入容器执行命令 | docker-compose exec db bash |
docker-compose build | 重新构建镜像 | docker-compose build |
docker-compose pull | 拉取服务所需的镜像 | docker-compose pull |
docker-compose restart | 重启服务 | docker-compose restart web |
docker-compose config | 检查 docker-compose.yml 语法是否正确 | docker-compose config |
3. docker-compose.yml
文件结构
version: "3.8" # Compose 文件版本(推荐 3.x)
services: # 定义所有服务
web: # 服务名称(自定义)
image: nginx:latest # 使用的镜像
ports:
- "80:80" # 端口映射(宿主机:容器)
volumes:
- ./html:/usr/share/nginx/html # 挂载数据卷
depends_on:
- db # 依赖的服务(先启动 db)
networks:
- my_net # 使用的网络
db: # 另一个服务(MySQL)
image: mysql:5.7
environment: # 环境变量
MYSQL_ROOT_PASSWORD: "123456"
volumes:
- mysql_data:/var/lib/mysql # 命名卷
networks:
- my_net
volumes: # 定义数据卷
mysql_data: # 命名卷(持久化存储)
networks: # 定义网络
my_net: # 自定义网络
driver: bridge
4. 常用配置项
服务配置
配置项 | 说明 |
---|---|
image | 指定镜像(如 nginx:latest ) |
build | 通过 Dockerfile 构建镜像(如 build: ./app ) |
ports | 端口映射("宿主机端口:容器端口" ) |
volumes | 挂载数据卷(./local:/container 或 named_volume:/container ) |
environment | 设置环境变量(MYSQL_ROOT_PASSWORD: "123456" ) |
depends_on | 定义服务启动顺序(但不保证服务完全就绪) |
restart | 容器重启策略(no / always / on-failure / unless-stopped ) |
command | 覆盖默认启动命令(如 command: ["npm", "start"] ) |
5. 实战示例
运行 WordPress + MySQL
version: "3.8"
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "wordpress"
MYSQL_DATABASE: "wordpress"
MYSQL_USER: "wordpress"
MYSQL_PASSWORD: "wordpress"
volumes:
- mysql_data:/var/lib/mysql
networks:
- wordpress_net
wordpress:
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: "db"
WORDPRESS_DB_USER: "wordpress"
WORDPRESS_DB_PASSWORD: "wordpress"
WORDPRESS_DB_NAME: "wordpress"
depends_on:
- db
networks:
- wordpress_net
volumes:
mysql_data:
networks:
wordpress_net:
driver: bridge
启动命令:
docker-compose up -d
访问 http://localhost:8000
即可进入 WordPress 安装界面。