你好:
首先感谢你使用这份笔记手册,本学习笔记是我在自学过程(网课视频在下方链接)中的随手笔记,可能出现遗漏,顺序错误或语法,单词等错误,你可以在自己的学习过程中对这份笔记更正即可。
说明: 本笔记为本人学习过程中随手写的笔记,为复习使用,笔记中可能存在遗漏或错误,具体请以官方文档和权威书籍为准!谢谢! 笔记中的一些图片等元素因路径配置问题,可能会发生丢失。 笔记中展示的知识点仅为部分内容,完整内容请查阅官方开发文档内容!
黑马程序员Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+DockerCompose项目实战一套搞定哔哩哔哩bilibili
Docker: Accelerated Container Application Development
一台Linux系统的虚拟机
注意:由于某些原因,部分网站/配置服务/镜像等可能出现无法打开获取等问题,请根据实际情况自行搜索解决。
Docker Desktop 是一款适用于 Mac、Linux 或 Windows 环境的一键安装应用程序,可让您构建、分享和运行容器化应用程序和微服务。
它提供了一个简单的 GUI(图形用户界面),可让您直接在机器上管理容器、应用程序和镜像。
Docker Desktop 减少了在复杂设置上花费的时间,因此您可以专注于编写代码。它负责端口映射、文件系统问题及其他默认设置,并定期更新以包含错误修复和安全更新。
以Debain12为例。使用存储库安装apt,其他版本的安装方式可以参考官网的安装教程
执行以下命令卸载所有冲突的软件包。
xxxxxxxxxxfor pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
设置 Docker 的存储库
x# Add Docker's official GPG key:sudo apt-get updatesudo apt-get install ca-certificates curlsudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.asc# Add the repository to Apt sources:echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt-get update
安装 Docker 软件包。
xxxxxxxxxxsudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
通过运行映像来验证安装是否成功:hello-world
xxxxxxxxxxsudo docker run hello-world
安装成功
Docker启动与停止
xxxxxxxxxx启动:sudo systemctl start docker停止:sudo systemctl stop docker重启:sudo systemctl restart docker开机自启:sudo systemctl enable docker
卸载Docker
卸载 Docker Engine、CLI、containerd 和 Docker Compose 软件包
xxxxxxxxxxsudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
主机上的映像、容器、卷或自定义配置文件 不会自动删除。要删除所有镜像、容器和卷,请执行以下作:
xxxxxxxxxxsudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd
删除源列表和密钥环
xxxxxxxxxxsudo rm /etc/apt/sources.list.d/docker.listsudo rm /etc/apt/keyrings/docker.asc
手动删除任何已编辑的配置文件。
由于Docker服务器在国外,国内访问极其缓慢甚至无法打开。可以通过配置国内镜像的方法进行加速。
阿里云镜像加速器 容器镜像服务 ACR 控制台
其他镜像服务器
配置方法可参考服务商文档
xxxxxxxxxxsudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker
xxxxxxxxxx{"registry-mirrors": ["https://docker.registry.cyou","https://docker-cf.registry.cyou","https://dockercf.jsdelivr.fyi","https://docker.jsdelivr.fyi","https://dockertest.jsdelivr.fyi","https://mirror.aliyuncs.com","https://dockerproxy.com","https://mirror.baidubce.com","https://docker.m.daocloud.io","https://docker.nju.edu.cn","https://docker.mirrors.sjtug.sjtu.edu.cn","https://docker.mirrors.ustc.edu.cn","https://mirror.iscas.ac.cn","https://docker.rainbond.cc"]}(2025/5/25测试可用)
关闭虚拟机中运行的mysql
执行以下指令安装mysql
xxxxxxxxxxdocker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123456mysql:8.0
指令解析
xxxxxxxxxxdocker run:创建并运行一个容器-d:让容器在后台运行--name mysql:为容器命名,唯一-p 3306:3306:设置端口映射,将端口xxx(宿主机端口)映射到xxx(docker容器端口)-e TZ=Asia/Shanghai:设置环境变量(固定格式:KEY=VALUE)-e MYSQL_ROOT_PASSWORD=123456:同上mysql:8.0:指定运行的镜像的名字
镜像名称一般分两部分组成:[repository]:[tag]。
其中repository就是镜像名
tag是镜像的版本
例如:mysql:8.0
稍等片刻,安装成功

测试效果,安装成功

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。
Docker 镜像、容器、仓库是 Docker 技术中的三个重要概念。
Docker 镜像是一个只读的模板,可以用来创建 Docker 容器。镜像可以包含操作系统、应用程序、依赖库、配置文件等。
Docker 容器是 Docker 镜像的一个运行实例,可以理解为一个轻量级的虚拟机。容器包含了运行应用程序所需的所有组件,包括操作系统、应用程序、依赖库等。
Docker 仓库是用来存储和管理 Docker 镜像的地方,类似于代码仓库。Docker 官方提供了 Docker Hub 仓库,可以在其中存储和分享 Docker 镜像。用户也可以自建私有仓库来存储和管理自己的 Docker 镜像。
通过使用 Docker 镜像、容器、仓库,可以实现应用程序的快速部署、运行和管理,提高了应用程序的可移植性和可伸缩性。
Docker 镜像、容器、仓库之间的关系如下:

Docker 镜像是一个只读的模板,包含了操作系统、应用程序、依赖库、配置文件等,用来创建 Docker 容器。
Docker 容器是 Docker 镜像的一个运行实例,可以理解为一个轻量级的虚拟机。容器包含了运行应用程序所需的所有组件,包括操作系统、应用程序、依赖库等。
Docker 仓库是用来存储和管理 Docker 镜像的地方,类似于代码仓库。Docker 镜像可以从仓库中拉取,也可以推送到仓库中进行存储和分享。Docker 官方提供了 Docker Hub 仓库,用户也可以自建私有仓库来存储和管理自己的 Docker 镜像。
综上所述,Docker 镜像是创建 Docker 容器的基础,Docker 容器是 Docker 镜像的运行实例,Docker 仓库是存储和管理 Docker 镜像的地方。通过使用 Docker 镜像、容器、仓库,可以实现应用程序的快速部署、运行和管理,提高了应用程序的可移植性和可伸缩性。

更多指令参考官方文档: 入门 | Docker 文档
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

数据卷相关指令
| 指令 | 说明 |
|---|---|
| docker volume create | 创建数据卷 |
| docker volume ls | 查看所有数据卷 |
| docker volume rm | 删除指定数据卷 |
| docker volume imspect | 查看某个数据卷的详情 |
| docker volume prune | 清除数据卷 |
注意:
数据卷挂载需要在容器创建时进行,已经创建的容器无法进行挂载
在执行dockerrun命令时,使用-v数据卷:容器内目录可以完成数据卷挂载
当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
案例1-利用Nginx容器部署静态资源 需求:
创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化
将静态资源部署到nginx的html目录
创建容器,同时挂载数据卷
xxxxxxxxxxsudo docker run-d --name nginx-p 80:80-v html:/usr/share/nginx/html # 数据卷映射nginx
查看数据卷信息
xxxxxxxxxxdocker volume inspect html

进入数据卷目录,修改文件内容即可
案例2-mysgl容器的数据挂载 需求:
查看mysql容器,判断是否有数据卷挂载
基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)

注意:
在执行dockerrun命令时,使用-v本地目录:容器内目录可以完成本地目录挂载
本地目录必须以“/”或"./”开头,如果直接以名称开头,会被识别为数据卷而非本地目录
-v mysql:/var/lib/mysql会被识别为一个数据卷叫mysql
-v ./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
构建一个Java镜像的步骤:
准备一个Linux运行环境
安装JRE并配置环境变量
拷贝Jar包
编写运行脚本

Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:
| 指令 | 说明 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 | FROM centos:6 |
| ENV | 设置环境变量,可在后面指令使用 | ENV key value |
| COPY | 拷贝本地文件到镜像的指定目录 | COPY ./jre11.tar.gz /tmp |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jre11.tar.gz && EXPORTS path=/tmp/jre11:$path |
| EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXP0SE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
基于Ubuntu基础镜像,利用Dockerfile描述镜像结构

当编写好了Dockerfile,可以利用下面命令来构建镜像:
xxxxxxxxxx# dockerbuild -t 镜像名 Dockerfile 目录docker build -t myImage:1.0 .
-t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
·:是指定Dockerfile所在目录,如果就在当前目录,则指定为"."
xxxxxxxxxx# 基础镜像FROM openjdk:11.0-jre-buster# 设定时区ENV TZ=Asia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone# 拷贝jar包COPY hm-service.jar /app.jar# 入口ENTRYPOINT ["java", "-jar", "/app.jar"]
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:

默认下,docker会给每个容器分配一个IP,但这个默认的IP可能会随着容器的启停等操作发生改变,非常不利于项目部署,因此可以利用加入自定义网络来解决。
加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:
| 命令 | 说明 |
|---|---|
| docker network create | 创建一个网络 |
| docker network ls | 查看所有网络 |
| docker network rm | 删除指定网络 |
| docker network prune | 清除未使用网络 |
| docker network connect | 使指定容器连接加入某网络 |
| docker network disconnect | 使指定容器连接移出某网络 |
| docker network inspect | 查看网络详细信息 |
准备:先将资料中mysql数据库导入

需求:创建一个新的nginx容器,将课前资料提供的nginx.conf、html目录与容器挂载
构建一个新的nginx容器,映射18080和18081端口,以及目录映射
xxxxxxxxxxdocker run -d \--name nginx \-p 18080:18080 \-p 18081:18081 \-v /home/huang/nginx/html:/usr/share/nginx/html \-v /home/huang/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \--network demonet \nginx
将项目和配置文件上传到映射的目录
在IDEA中打开资料中提供的后端项目

项目打包

将Dockerfile和打包好的jar包上传到服务器
构建镜像
xxxxxxxxxxdocker build -t 镜像名 Dockerfile位置

新建一个容器网络,将mysql加入到该网络
xxxxxxxxxxsudo docker network create demonetsudo docker network connect demonet mysql
创建,启动后端镜像容器,并将其加入创建的容器网络
xxxxxxxxxxsudo docker run -d --name hm -p 8080:8080 --network demonet hmall

测试访问

DockerCompose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。

示例配置写法
xxxxxxxxxxversion: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall:build:context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hm-netnetworks:hm-net:name: hmall
DockerCompose指令
xxxxxxxxxxdocker compose [OPTIONS] [COMMAND]
| 类型 | 参数/指令 | 说明 |
|---|---|---|
| OPTIONS | -f | 指定compose文件的路径和名称 |
| -p | 指定project名称 | |
| COMMANDS | up | 创建并启动所有service容器 |
| down | 停止并移除所有容器、网络 | |
| ps | 列出所有启动的容器 | |
| logs | 查看指定容器的日志 | |
| stop | 停止容器 | |
| start | 启动容器 | |
| restart | 重启容器 | |
| top | 查看运行的进程 | |
| exec | 在指定的运行中容器中执行命令 |