Docker 简介

Docker 简介

Docker 是一个开源的容器平台,可以轻松地创建、运行、分享和部署应用。Docker 容器是应用运行环境,容器内运行应用,容器之间互相隔离。Docker 容器可以运行在任何支持 Linux 的操作系统上,如 WindowsMacOSLinux 等。Docker 容器可以运行在任何支持 Linux 的操作系统上,如WindowsMacOSLinux 等。

使用

  1. 需要使用docker就需要准备一台docker主机,docker主机一般指Linux系统,在主机中随时有一个docker 服务进程Docker daemon在运行。
  2. docker容器具有一个客户端docker cli,该客户端用于向Docker daemon发送命令,并返回结果。
  3. Registry应用市场,应用市场中的软件称为镜像。镜像是应用的运行环境。我们把用镜像启动的应用称为容器。容器可以有很多个,每一个容器都运行一个应用。

docker常用命令

命令作用
docker pull从镜像仓库拉取镜像
docker run运行镜像
docker ps列出正在运行的容器
docker stop停止正在运行的容器
docker rm删除容器
docker images列出本地镜像
docker rmi删除镜像
docker exec在容器中执行命令
docker logs查看容器的日志
docker build构建镜像
docker push将镜像推送到镜像仓库
docker login登录镜像仓库
docker logout登出镜像仓库
docker tag为镜像打标签
docker inspect查看容器或镜像信息

docker run命令

格式:docker run -d --name [容器名称] -p [端口:端口映射] [镜像名称] [镜像标签]

  • docker inspect命令为查看容器或镜像信息 在信息中的Mounts字段中查看挂载信息

Mounts字段详情

  • Type 字段为挂载类型 可选值有bind(绑定)、volume(卷)、tmpfs(临时文件系统)
  • Source字段为挂在的宿主机目录
  • Destination字段为容器目录的映射
  • Mode字段为权限
  • RW字段为读写权限
  • Propagation字段为数据卷传播模式 可选值有rprivate(私有)、rshared(共享)、rslave(从属)、rpropagated(传播)

数据卷

  • 数据卷是一个虚拟目录,是容器内目录与宿主目录之间的映射桥梁
命令作用
docker volume create创建数据卷
docker volume inspect查看数据卷信息

dockerfile

  • Dockerfile 是一个文本文件,用于定义如何构建镜像。
  • Dockerfile 文件其中都包含一个一个的指令,用指令来说明要执行什么操作来构建镜像
  • 将来docker可以根据Dockerfile文件来构建镜像
指令作用
FROM指定基础镜像
RUN执行Linuxshell命令,一般是安装过程的命令
ENV设置环境变量,可在后面指令使用
COPY拷贝本地文件到镜像的指定目录
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的
ENTRYPOINT镜像中应用的启动命令,容器运行时调用

示例基于ubuntu镜像创建一个java镜像的Dockerfile文件

#指定基础镜像 当前基础镜像为`ubuntu:18.04`
FROM ubuntu:18.04
# 配置环境变量 JDK的安装目录 容器内的时区
ENV JAVA_DIR=/usr/local
# 拷贝JDK和java项目包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \ && \
    tar -zxvf jdk8.tar.gz \
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 入口
ENTRYPOINT ["java","-jar","/tmp/app.jar"]

使用基础java镜像来构建java镜像

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

当编写好了Dockerfile文件后,就可以使用docker build命令来构建镜像了

  • 格式:docker build -t [IMAGE_NAME]:[TAG] [DOCKERFILE_DIR]
  • -t 参数指定镜像的标签
  • IMAGE_NAME 镜像名称
  • TAG 镜像版本不填默认为latest
  • DOCKERFILE_DIR 镜像构建的目录
docker build -t java-demo:1.0 .

容器网络互联

  • 默认情况下,所有容器都是以bridge(网桥)方式连接到docker的一个虚拟机上,
  • 在安装docker的那一刻,docker会创建一个虚拟的网卡 docker deskTap会使用wsl创建一个虚拟网卡
  • 容器间由于网关一致,因此可以通过ip地址互相访问,但容器的ip地址并非是静态的,每次重启容器的ip地址都会改变

自定义网络容器

加入自定义网络的容器可以通过容器名相互访问,Docker的网络操作命令如下

  • 在运行容器时,指定网络名称就可以实现在运行容器时直接加入网络
  • docker run -d --name [容器名] --network [网络名] [镜像名] [镜像标签]
命令作用
docker network create [网络名]创建自定义网络
docker network ls列出所有自定义网络
docker network rm [网络名]删除指定网络
docker network prune清除未使用的网络
docker network inspect [网络名]查看指定网络的信息
docker network connect [网络名] [容器名]将容器加入指定网络
docker network disconnect [网络名] [容器名]将容器从指定网络中移除

使用docker部署java应用

使用dockerFile 生成java镜像

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
docker build -t heima-java .

使用镜像启动容器

  • --name 指定容器名称
  • -d 后台运行
  • -p 映射端口
  • --network 指定网络
  • heima-java 镜像名称
docker run --name heimaJava -d -p 8080:8080 --network heima heima-java

部署前端项目

  • --name 容器名称
  • -d 后台运行
  • -p 映射端口
  • -v 挂载卷
  • --network 指定网络
docker run --name hmallHtml -d -p 18080:18080 -p 18081:18081 -v E:\desktop\duckicon\system\hmall\hmHtml\nginx\html:/usr/share/nginx/html -v E:\desktop\duckicon\system\hmall\hmHtml\nginx\nginx.conf:/etc/nginx/nginx.conf --network heima nginx

dockerCompose

  • dockerCompose 通过一个单独的docker-compose.yml文件来定义一组相关联的应用容器,帮助我们实现多个相互关联的docker 容器的快速部署

格式

version: '3.8' #项目版本号
# 服务定义
services:
  hmall-data: # 服务名称(创建的容器名)
    image: mysql # 使用的镜像名称
    container_name: hmall-data # 容器名称
    ports: # 端口映射
      - '3306:3306'
    environment: # 环境变量
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes: # 挂载卷
      - '../hmData/conf:/etc/mysql/conf.d'
      - '../hmData/data:/var/lib/mysql'
      - '../hmData/init:/docker-entrypoint-initdb.d'
    networks: #  网络
      - hm-net
  hmall-item-service: # 服务名称(创建的容器名)
    build: # 构建镜像
      context: ./java # 构建镜像的Dockerfile文件位置
      dockerfile: Dockerfile # Dockerfile文件名称
    container_name: hmall-item-service # 容器名称
    ports: # 端口映射
      - '8080:8080'
    networks: #  网络
      - hm-net
    depends_on: # 启动依赖
      - hmall-data
  hmall-nginx: # 服务名称(创建的容器名)
    image: nginx # 镜像名称
    container_name: hmall-nginx # 容器名称
    ports: # 端口映射
      - '18080:18080'
      - '18081:18081'
    volumes: # 挂载卷
      - '../hmHtml/nginx/nginx.conf:/etc/nginx/nginx.conf'
      - '../hmHtml/nginx/html:/usr/share/nginx/html'
    depends_on: # 启动依赖
      - hmall-item-service
    networks: #  网络
      - hm-net
  hamll-nocos: # 服务名称(创建的容器名)
    image: nacos/nacos-server:v2.1.0-slim
    container_name: hamll-nocos
    restart: always
    environment:
      - PREFER_HOST_MODE=hostname # 指定容器启动时,使用主机名作为容器的IP地址
      - MODE=standalone # 启动模式 单机模式
      - SPRING_DATASOURCE_PLATFORM=mysql # 数据库类型
      - MYSQL_SERVICE_HOST=hmall-data # 数据库服务名称
      - MYSQL_SERVICE_DB_NAME=nacos # 数据库名称
      - MYSQL_SERVICE_PORT=3306 # 数据库端口
      - MYSQL_SERVICE_USER=root # 数据库用户名
      - MYSQL_SERVICE_PASSWORD=123 # 数据库密码
      - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
    ports: # 端口映射
      - '8848:8848'
      - '9848:9848'
      - '9849:9849'
    networks:
      - hm-net
    depends_on:
      - hmall-data
networks: # 网络
  hm-net: # 网络名称
    name: hm-net

dockerCompose 命令

格式:docker compose [参数] [指令]

类型参数或指令说明
参数-f指定docker-compose.yml文件路径和名称 不指定默认当前文件
参数p指定项目名称
指令up创建并启动所有的service容器
指令down停止并删除所有的service容器、网络
指令ps列出所有启动的容器
指令logs查看指定容器日志
指令stop停止指定容器
指令start启动指定容器
指令restart重启指定容器
指令top查看运行的进程
指令exec在指定运行的容器中执行命令
上次更新 2025/12/2 22:00:26