你好:
首先感谢你使用这份笔记手册,本学习笔记是我在自学过程(网课视频在下方链接)中的随手笔记,可能出现遗漏,顺序错误或语法,单词等错误,你可以在自己的学习过程中对这份笔记更正即可。
说明: 本笔记为本人学习过程中随手写的笔记,为复习使用,笔记中可能存在遗漏或错误,具体请以官方文档和权威书籍为准!谢谢! 笔记中的一些图片等元素因路径配置问题,可能会发生丢失。 笔记中展示的知识点仅为部分内容,完整内容请查阅官方开发文档内容!
黑马程序员Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+DockerCompose项目实战一套搞定哔哩哔哩bilibili
Docker: Accelerated Container Application Development
一台Linux系统的虚拟机
注意:由于某些原因,部分网站/配置服务/镜像等可能出现无法打开获取等问题,请根据实际情况自行搜索解决。
Docker Desktop 是一款适用于 Mac、Linux 或 Windows 环境的一键安装应用程序,可让您构建、分享和运行容器化应用程序和微服务。
它提供了一个简单的 GUI(图形用户界面),可让您直接在机器上管理容器、应用程序和镜像。
Docker Desktop 减少了在复杂设置上花费的时间,因此您可以专注于编写代码。它负责端口映射、文件系统问题及其他默认设置,并定期更新以包含错误修复和安全更新。
以Debain12为例。使用存储库安装apt,其他版本的安装方式可以参考官网的安装教程
执行以下命令卸载所有冲突的软件包。
xxxxxxxxxx
for 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 update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo 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/null
sudo apt-get update
安装 Docker 软件包。
xxxxxxxxxx
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
通过运行映像来验证安装是否成功:hello-world
xxxxxxxxxx
sudo 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 软件包
xxxxxxxxxx
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
主机上的映像、容器、卷或自定义配置文件 不会自动删除。要删除所有镜像、容器和卷,请执行以下作:
xxxxxxxxxx
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
删除源列表和密钥环
xxxxxxxxxx
sudo rm /etc/apt/sources.list.d/docker.list
sudo rm /etc/apt/keyrings/docker.asc
手动删除任何已编辑的配置文件。
由于Docker服务器在国外,国内访问极其缓慢甚至无法打开。可以通过配置国内镜像的方法进行加速。
阿里云镜像加速器 容器镜像服务 ACR 控制台
其他镜像服务器
配置方法可参考服务商文档
xxxxxxxxxx
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo 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
xxxxxxxxxx
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456
mysql:8.0
指令解析
xxxxxxxxxx
docker 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目录
创建容器,同时挂载数据卷
xxxxxxxxxx
sudo docker run
-d --name nginx
-p 80:80
-v html:/usr/share/nginx/html # 数据卷映射
nginx
查看数据卷信息
xxxxxxxxxx
docker 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/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"]
默认情况下,所有容器都是以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端口,以及目录映射
xxxxxxxxxx
docker 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包上传到服务器
构建镜像
xxxxxxxxxx
docker build -t 镜像名 Dockerfile位置
新建一个容器网络,将mysql加入到该网络
xxxxxxxxxx
sudo docker network create demonet
sudo docker network connect demonet mysql
创建,启动后端镜像容器,并将其加入创建的容器网络
xxxxxxxxxx
sudo docker run -d --name hm -p 8080:8080 --network demonet hmall
测试访问
DockerCompose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。
示例配置写法
xxxxxxxxxx
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:
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
DockerCompose指令
xxxxxxxxxx
docker compose [OPTIONS] [COMMAND]
类型 | 参数/指令 | 说明 |
---|---|---|
OPTIONS | -f | 指定compose文件的路径和名称 |
-p | 指定project名称 | |
COMMANDS | up | 创建并启动所有service容器 |
down | 停止并移除所有容器、网络 | |
ps | 列出所有启动的容器 | |
logs | 查看指定容器的日志 | |
stop | 停止容器 | |
start | 启动容器 | |
restart | 重启容器 | |
top | 查看运行的进程 | |
exec | 在指定的运行中容器中执行命令 |