avatar

zian

A text-focused Halo theme

  • Java
  • 面试
  • 首页
  • C语音
  • liunx
  • 数据结构与算法
  • 控制台
Home Docker 笔记
文章

Docker 笔记

Posted 2024-11-26 Updated 2025-03- 13
By Administrator
84~108 min read

Docker 介绍

Docker 的主要特点包括:

  1. 容器化(Containerization):Docker 使用 Linux 容器(LXC)技术,将软件运行环境封装在轻量级、可移植的容器中,与系统其他部分隔离。

  2. 可移植性(Portability):Docker 容器可以在任何安装了 Docker 引擎的机器上运行,无论是物理机还是虚拟机。

  3. 自动化部署(Automated Deployment):Docker 可以通过 docker run 命令快速启动一个容器,实现应用的自动化部署。

  4. 版本控制和组件重用(Version Control and Component Reuse):Docker Hub 和其他注册中心允许用户存储和共享容器镜像,实现应用组件的版本控制和重用。

  5. 微服务架构(Microservices Architecture):Docker 适合微服务架构,可以将应用分解为一组小的服务,每个服务运行在独立的容器中。

  6. 安全性(Security):容器提供了额外的隔离层,有助于提高系统的安全性。

  7. 开发、测试和生产的一致性(Consistency Across Development, Testing, and Production):Docker 容器确保了开发环境与生产环境的一致性,减少了“在我的机器上可以运行”的问题。

  8. 多租户架构(Multi-tenancy):Docker 可以在单个物理服务器上运行多个应用实例,每个实例都运行在自己的容器中,实现资源的高效利用。

Docker 的核心组件包括:

  • Docker 客户端和服务器(Docker Client and Server):客户端通过命令行与 Docker 守护进程进行交互。

  • 镜像(Images):只读模板,包含运行容器所需的所有内容。

  • 容器(Containers):镜像的运行实例,可以启动、停止、移动和删除。 ( 容器之间是相互独立的 )

  • Dockerfile:一种脚本,包含一系列的指令,用于自动化构建 Docker 镜像。

  • Docker Hub:一个服务,用于分享和管理 Docker 镜像。

  • Docker Compose:一个工具,用于定义和运行多容器 Docker 应用。

Docker 提供了一种快速、一致且高效的工作流,用于开发、分发和部署应用。

Docker基础

  • Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用

    • docker 中央仓库地址 Docker Hub Container Image Library | App Containerization

    • docker 文档地址 Docker: Accelerated Container Application Development

  • 镜像是将应用所需的函数库、依赖、配置等与应用一起打包得到的

  • 容器为每个镜像的应用进程创建的隔离运行环境 ( 容器就是运行起来一个个镜像 )

  • 镜像仓库是存储和管理镜像的服务,DockerHub是最大的镜像仓库

部署MySQL

先停掉虚拟机中的MySQL,确保你的虚拟机已经安装Docker,且网络开通的情况下,执行下面命令即可安装MySQL:

命令解读

  • docker run: 创建并运行一个容器

  • -d: 让容器在后台运行

  • --name mysql: 给容器起个名字

  • -p 3306:3306: 设置端口映射

  • -e KEY=VALUE: 设置环境变量

  • mysql: 指定运行的镜像的名字

docker run -d \               # -d 后台运行
  --name mysql \              # 容器名
  -p 3306:3306 \              # 端口映射  宿主机端口:镜像端口
  -e TZ=Asia/Shanghai \    
  -e MYSQL_ROOT_PASSWORD=123 \   # 环境变量
  mysql                       # 镜像      

镜像命名规范

镜像名称一般分两部分组成:[repository]:[tag]。

  • repository: 镜像名

  • tag: 镜像的版本

docker run命令中的常见参数:

  • -d: 让容器后台运行

  • --name: 给容器命名

  • -e: 设置环境变量

  • -p: 宿主机端口映射到容器内端口

Docker基础命令

Docker最常见的命令是操作镜像、容器的命令,详见官方文档。

  • docker push / docker pull: 镜像仓库操作

  • docker logs / docker exec: 容器日志与执行命令

  • docker build: 构建镜像

  • docker run / docker stop / docker start: 容器操作

  • docker save / docker load: 镜像保存与加载

  • docker images / docker rmi / docker ps / docker rm: 镜像与容器列表与删除

    常用指令:

指令

说明

示例

docker run

创建一个新的容器并运行一个命令

docker run ubuntu

docker pull

从仓库拉取或者更新指定的镜像

docker pull ubuntu

docker build

从Dockerfile构建一个镜像

docker build -t myimage .

docker images

列出本地存储的镜像

docker images

docker ps

列出当前运行的容器

docker ps

docker stop

停止一个运行中的容器

docker stop container_id

docker rm

删除一个或多个容器

docker rm container_id

docker rmi

删除一个或多个镜像

docker rmi image_id

docker exec

在运行的容器中执行命令

docker exec -it container_id bash

docker logs

获取容器的日志输出

docker logs container_id

docker network

管理 Docker 的网络设置

docker network ls

docker volume

管理 Docker 的数据卷

docker volume ls

docker commit

将容器的当前状态作为一个新的镜像保存

docker commit container_id mynewimage

docker cp

在宿主机和容器之间拷贝文件或者文件夹

docker cp container_id:/file/path /host/path

docker diff

检查容器里文件结构的更改

docker diff container_id

docker port

列出容器的端口映射

docker port container_id

docker top

显示容器的运行进程

docker top container_id

docker attach

连接到正在运行中的容器

docker attach container_id

docker history

显示镜像的历史

docker history image_id

docker save

将一个或多个镜像保存到tar归档

docker save -o myimage.tar myimage

docker load

从tar归档或者标准输入载入镜像

docker load -i myimage.tar

经常使用:

docker ps -a   # 列出所有的容器
docker images  # 列出所有的镜像
docker run --name 容器名 -p 宿主机端口:镜像端口 -d 镜像  # 创建新的容器并且运行
docker start 容器名或者id    # 运行容器
docker stop 容器名或者id     # 停止容器
docker restart 容器名或者id  # 重新运行容器
docker rm 容器名或者id       # 删除容器
docker rmi 镜像名或者id      # 删除镜像

docker ps 命令介绍:

数据卷

数据卷是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。 ( 将宿主机目录和容器的目录关联起来,双向绑定 )

数据卷命令

  • docker volume create: 创建数据卷

  • docker volume ls: 查看所有数据卷

  • docker volume rm: 删除指定数据卷

  • docker volume inspect: 查看某个数据卷的详情

  • docker volume prune: 清除未使用的数据卷

例子:nginx 来设置数据卷

docker run --name nginx -p 80:80  -v html:/usr/share/nginx/html  -d nginx 

解释:创建并且运行 nginx 容器,将 容器中的 /usr/share/nginx/html 关联到 html 数据卷中

使用 docker volume 来查看 html 数据卷和数据哪个文件关联起来

docker volume inspect html
​
# 结果:
[
    {
        "CreatedAt": "2024-06-23T18:42:19-07:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/html/_data",
        "Name": "html",
        "Options": null,
        "Scope": "local"
    }
]

docker 中所有的数据卷都是挂载到 宿主机上的 /var/lib/docker/volumes/ 目录中

本地目录挂载

例子:mysql 来设置本地目录

docker run -d \
  --name mysql \  # 镜像名 
  -p 3306:3306 \  # 端口映射
  -e TZ=Asia/Shanghai \  # 环境变量
  -e MYSQL_ROOT_PASSWORD=123 \
  -v /root/mysql/conf:/etc/mysql/conf.d \ #本地目录:镜像目录 (注意:本地目录必须要 / 或者 ./ 开头,否者会识别为数据卷)
  -v /root/mysql/data:/var/lib/mysql \
  -v /root/mysql/init:/docker-entrypoint-initdb.d \
  mysql

解释:创建并且运行mysql 容器 , 将mysql 中conf.d 和 /root/mysql/conf 关联起来 .....

使用 docker inspect 容器 来查看容器详细信

docker inspect mysql 
​
# 挂载情况
 "Mounts": [
            {
                "Type": "bind",
                "Source": "/root/mysql/data",
                "Destination": "/var/lib/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/root/mysql/init",
                "Destination": "/docker-entrypoint-initdb.d",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/root/mysql/conf",
                "Destination": "/etc/mysql/conf.d",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
]

将本地目录和镜像的目录关联起来来实现数据持久化保存。

自定义镜像

自定义镜像是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。

image-20240624160656613

镜像分层构建(每一层都是一个镜像)的原因是:可以将复用构建好的镜像 , 在 docker 拉取镜像的时候如果发现拉取的镜像中某一层镜像在本地中已经存在就会复用这个镜像。

a2abf6c4d29d: Already exists   #  Already exists 镜像已存在不会再次下载

Dockerfile

Dockerfile是一个文本文件,包含指令来说明构建镜像的操作。

image-20240624160719809

构建Java镜像实例

实现步骤:

  1. 上传 openjdk 镜像包到宿主机环境中

  2. 使用 docker load -i 镜像压缩 将镜像加载到docker中 (生成一个镜像)

  3. 上传 Dockerfile 和 jar 到宿主机中

  4. 执行 docker build -t docker-demo:1.0 . 来构建一个镜像

    1. -t :镜像名:版本号, 可以不写默认是 latest

    2. . : 代表 Dockerfile 文件的位置

在 openjdk 是一个基础镜像,是别人帮我们构建的运行 Java 程序的基础镜像,这个镜像中包含了 运行Java 需要的函数库和对应的环境。

网络

默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上。

网络命令

  • docker network create / docker network ls / docker network rm: 网络操作

  • docker network prune: 清除未使用的网络

  • docker network connect / docker network disconnect: 容器网络连接与断开

  • docker network inspect: 查看网络详细信息

image-20240624164413333

注意点:

  1. 默认启动的容器都会加入 一个网络中 172.17.0.1 中,但是这个网络中容器之间值不能通过 容器名来进行访问的。

  2. 在创建容器的的时候就可以设置 容器进入哪个网络中,如果是自己创建出来的网络,那么容器同个网络内的容器之间是可以同容器名来进行访问的。docker run --name dd -p 8080:8080 -d --network heima docker-demo:1.0 ,创建并且运行容器,容器加入 heima 这个网络中

项目部署

部署Java应用

需求:将课前资料提供的hmall项目打包为镜像并部署,镜像名hmall。

部署前端

需求:创建一个新的nginx容器,将课前资料提供的nginx.conf、html目录与容器挂载。

DockerCompose

Docker Compose通过一个docker-compose.yml模板文件定义一组相关联的应用容器,实现多个容器的快速部署。

version: "3.8"   # 文件版本标识
​
services:  #服务列表
  mysql:
    image: mysql  # 镜像 
    container_name: mysql  # 创建出来的容器名
    ports:   # 设置端口映射
      - "3306:3306"
    environment:   # 设置环境变量
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:        # 数据卷映射 
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:       # 加入的网络
      - hm-net
      
  hmall:
    build:          # 构建镜像 , 根据 Dockerflie 文件构建 
      context: .     
      dockerfile: Dockerfile
    container_name: hmall  
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on:     # 设置依赖关系 ( 控制容器创建顺序 ,被依赖的先创建 )
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net
networks:   # 设置创建出来的网络 
  hm-net:
    name: hmall  # 创建出来的网络名 

docker compose命令

  • -f: 指定compose文件的路径和名称

  • -p: 指定project名称

  • up: 创建并启动所有service容器

  • down: 停止并移除所有容器、网络

  • ps: 列出所有启动的容器

  • logs: 查看指定容器的日志

  • stop: 停止容器

  • start: 启动容器

  • restart: 重启容器

  • top: 查看运行的进程

  • exec: 在指定的运行中容器中执行命令

宿主机更换 ip 后容器无法访问解决方法

  1. 添加自定义网络

docker network create 网络名
  1. 解除容器的绑定的旧网络

docker network disconnect 网络名 容器名
  1. 为容器指定新的网络

d
  1. 重启容器

 docker restart 容器名
  1. 查看信息(检查网络是否添加成功了)

docker inspect 容器名

docker
License:  CC BY 4.0
Share

Further Reading

OLDER

NEWER

若依多表认证

Recently Updated

  • 其他
  • Elasticsearch 面试
  • Spring 面试
  • RabbitMQ 面试
  • Redis 面试

Trending Tags

ruoyi docker java

Contents

©2025 zian. Some rights reserved.

Using the Halo theme Chirpy