目录
[1)查看镜像docker images](#1)查看镜像docker images)
[2)拉取镜像 docker pull](#2)拉取镜像 docker pull)
[3)镜像删除docker rmi](#3)镜像删除docker rmi)
[1)运行容器docker run](#1)运行容器docker run)
[2)停止容器docker stop](#2)停止容器docker stop)
[3)强停容器docker kill](#3)强停容器docker kill)
[4)查看运行容器docker ps](#4)查看运行容器docker ps)
[5)删除容器docker rm](#5)删除容器docker rm)
[6)启动容器docker start](#6)启动容器docker start)
[7)重启容器docker restart](#7)重启容器docker restart)
[8)查看容器状态docker stats](#8)查看容器状态docker stats)
[9)查看容器日志docker logs](#9)查看容器日志docker logs)
[10)查看容器进程信息docker top](#10)查看容器进程信息docker top)
[11)进入容器docker exec/attach](#11)进入容器docker exec/attach)
[1)镜像保存docker save](#1)镜像保存docker save)
[2)镜像加载docker load](#2)镜像加载docker load)
[4 Docker存储](#4 Docker存储)
1.docker介绍
我们利用docker安装应用时,docker会自动搜索并下载应用镜像 (image).镜像不仅包含应用本身,还包含应用运行所需要的环境,配置,系统函数库。docker会在运行镜像时创建一个隔离环境,称为容器 
1).容器(Container):
- 容器是镜像创建的运行实例, 它是一个轻量级的、可执行的独立软件包,包含了运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
- 容器化技术使得软件可以在几乎任何地方以相同的方式运行,解决了"在我的机器上可以运行"的问题。
2).镜像(Image):
- 镜像是构建容器的模板 ,它是一个只读的模板,用于创建Docker容器。
- 镜像通常是通过一个Dockerfile 定义的,Dockerfile包含了构建镜像所需的指令。
3).仓库(Registry):
- Docker仓库用于存储和分发Docker镜像。
- 公共的Docker Hub是最大的Docker镜像仓库,用户可以在那里找到、分享和运行高质量的Docker镜像。
主要特点:
- 可移植性:Docker容器可以在任何支持Docker的操作系统上运行,应用部署和迁移变得非常简单。
- 隔离性 :容器之间是相互隔离的,一个容器的崩溃不会影响其他容器。
- 轻量级:容器不需要像虚拟机那样启动一个完整的操作系统,因此它们可以快速启动,并且占用更少的系统资源。
- 安全性:容器运行在自己的隔离环境中,并且可以限制对系统资源的访问,从而提供了额外的安全层。
工作流程:
- 编写Dockerfile:定义应用的依赖、环境变量、配置等。
- 构建镜像:通过Dockerfile构建应用镜像。
- 运行容器:从镜像启动一个或多个容器实例。
- 管理容器:启动、停止、监控和删除容器。
- 共享镜像 :将构建好的镜像推送到Docker仓库,以便在其他机器上使用

编写 Dockerfile
做什么 :创建一个名为
Dockerfile的文本文件。它包含了一系列指令,告诉 Docker 如何一步步地构建你的应用镜像。示例指令:
FROM python:3.9-slim:指定基础镜像。
COPY . /app:将本地代码复制到镜像内的/app目录。
RUN pip install -r requirements.txt:在镜像内执行命令安装依赖。
CMD ["python", "app.py"]:指定容器启动时默认运行的命令。构建镜像
做什么 :执行
docker build -t my-app .命令。过程 :Docker 守护进程会读取
Dockerfile,逐步执行其中的指令,并为每一步创建一个新的镜像层,最终生成一个可命名的镜像(如my-app:latest)。(可选) 推送至镜像仓库
做什么 :执行
docker push my-registry.com/my-app:latest命令。目的:将本地构建好的镜像上传到像 Docker Hub、Google Container Registry 或私有仓库这样的镜像仓库中,以便在其他地方拉取和使用。
拉取镜像
做什么 :在需要运行该应用的其他机器上,执行
docker pull my-registry.com/my-app:latest命令。目的:从镜像仓库下载指定的镜像到本地。
运行容器
做什么 :执行
docker run -d -p 8080:80 --name my-running-app my-app命令。过程:Docker 守护进程根据指定的镜像创建一个可写的容器层,并按照配置(如端口映射、环境变量等)启动容器内的进程。
2.安装docker(本机默认使用的centos)
2.1卸载docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux

2.2配置Docker的yum库
Docker的yum源是一个软件仓库 ,它允许用户通过yum包管理器在基于Red Hat的Linux发行版(如CentOS、Fedora)上轻松地安装、更新和卸载Docker及其相关组件。Yum(Yellowdog Updater, Modified)是一个用于RPM-based Linux系统的自动化更新和软件包安装的工具。
1)安装yum工具
yum install -y yum-utils
如果报错显示 Cannot find a valid baseurl for repo: base/7/x86_64
1)备份原有的repo文件(可选,有备无患)
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2)下载阿里云的repo配置文件
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo或者
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo3)刷新YUM元数据缓存
更新完repo文件后,需要清空并重建YUM的元数据缓存,以便让它认识新的仓库配置:
sudo yum clean all sudo yum makecache4)使用阿里云源安装yum-utils
sudo yum --disablerepo=\* --enablerepo=aliyun install -y yum-utils
2)配置Docker的yum源(更新为阿里云源)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
更新yum,建立缓存
sudo yum makecache fast
2.3安装Docker
安装命令
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
一些启动和校验命令
#查看Docker版本
docker -v
# 启动Docker
systemctl start docker
#列出运行在本地Docker主机上的所有镜像
docker images
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
当未启动时,查看镜像(docker images)结果为:

启动Docker后的查看镜像结果:
2.4配置docker镜像加速
之前安装Docker时,配置的阿里加速镜像现在停用失效,导致网络无法访问
PS:听网友说是阿里加速镜像已停用
如果镜像有问题的话,会报错:
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
解决方式:
# 创建目录
mkdir -p /etc/docker
# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
2.5.安装mysql(其实验证镜像能否成功拉取)
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
Docker会按以下顺序执行:
在本地查找
mysql:latest镜像。如果没找到,自动从Docker Hub拉取 。
创建一个名为
mysql的容器。在后台启动这个容器。
3.Docker命令解读
补充:
默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:
# Docker开机自启
systemctl enable docker
# Docker容器开机自启
docker update --restart=always [容器名/容器id]
image是镜像的名字,tag是镜像版本,container是容器
# 第1步,去DockerHub查看nginx镜像仓库及相关信息
# 第2步,拉取Nginx镜像
docker pull nginx
# 第3步,查看镜像
docker images
# 结果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 16 months ago 141MB
mysql latest 3218b38490ce 17 months ago 516MB
# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx
# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第6步,访问网页,地址:http://虚拟机地址
# 第7步,停止容器
docker stop nginx
# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第9步,再次启动nginx容器
docker start nginx
# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第11步,查看容器详细信息
docker inspect nginx
# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p
# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx
3.1镜像
1)查看镜像docker images
- 语法: docker images [option]

option说明:
-a,all: 展示所有镜像
-q,quite: 只展示镜像ID
2)拉取镜像 docker pull
-
语法: docker pull image[:tag]
#拉取镜像
docker pull nginx#拉取指定版本镜像
docker pull nginx:1.26.0
3)镜像删除docker rmi
-
语法: docker rmi [option] image:tag
#注意要是完整标签:
docker rmi nginx:latest#推荐使用其唯一镜像ID 删除:
docker rmi 3f8a4339aadd#option说明,-f:全部删除
#(docker images -aq) 即取得所有镜像ID集合 docker rmi -f (docker images -aq)
3.2容器
1)运行容器docker run
-
语法:docker run [option] image[:tag] [command] [arg...]
--name: 为容器指定一个名称; -d: 后台运行容器,并返回容器ID,也即启动守护式容器; 非后台运行会阻塞控制台 常见坑:当后台运行容器时,若容器没有提供服务,则会自动停止 -i,-t,-it:以交互模式运行容器;为容器重新分配一个伪输入终端;二者通常同时使用; 交互方式运行,进入容器内部查看内容 exit:停止容器并从退回主机 ctrl + p + q:不停止容器退出 -p: 端口映射,-p标志用于指定端口映射,它允许你将容器内的端口映射到镜像端口,即 运行Docker的机器上的端口。这是为了让外部网络能够访问在Docker容器内运行的服务 端口映射可以提高安全性,因为可以只公开必要的端口,而非公开容器内的所有端口。 映射有以下格式 -p ip:主机端口:容器端口 -p 主机端口:容器端口(常用) -p 容器端口 容器端口 -e:环境变量 -P: 随机端口映射; -w: 指定命令执行时,所在的路径 例如: docker run -d --name nignx -p 80:80 nginx 后台运行最新版本nginx ,容器名字定义为nginx,镜像,容器端口都是80
这里这个端口映射,因为docker是封闭性的,所以我们是没办法直接访问到docker中的镜像端口的,这时候我们就需要访问主机的端口3306,会自动映射到镜像的3306上
- 不写tag默认最新版本,command和arg为默认配置一般不写
- ctrl + c 终止运行
2)停止容器docker stop
- 语法: docker stop [option] container [container]
option说明
-t, --time int:这个选项指定在发送 SIGTERM 信号后等待容器停止的秒数。
容器中的应用程序可以捕获SIGTERM信号并执行清理操作,如保存状态、关闭连接、释放资源等再退出
如果在指定的时间内容器没有停止,那么 Docker 将发送 SIGKILL 信号来强制停止容器。
默认情况下,docker stop 会等待 10 秒。
#container自己停止或20秒后强制停止,不使用-t默认10秒
docker stop -t 20 container
[container]
同时操作多个容器
3)强停容器docker kill
- 语法: docker stop [option] container
- 直接发送SIGKILL信号到容器的主进程,这会立即终止容器,不给容器中的进程任何清理和退出的机会。适用于容器无响应或者需要快速停止容器。
4)查看运行容器docker ps
- 语法:docker ps [option] container

- 容器id 镜像名 容器默认命令 创建时间 启动状态(up即成功) 占用端口 应用容器名(随机)
- 容器的操作(container)只能是容器名或容器ID **(非镜像名),**若可以唯一识别,可以只使用ID前几位数字

option说明
-d: 查看正在运行容器
-a: 查看所有容器(包括已经停止的)
-n=?:展示最近运行的?个容器
-q: 只显示id
5)删除容器docker rm
- 语法:docker rm [option] container [container]
- 不能删除运行中的容器,除非option选用**-f**
- 同理,删除所有镜像: docker rmi -f $(docker ps -aq)

6)启动容器docker start
- 语法: docker restart container [container]
- 启动停止的容器,若已经启动或者已经删除则无效

7)重启容器docker restart
- 语法: docker restart container [container]
- 关闭的则启动,启动的则重启
8)查看容器状态docker stats
- 语法: docker stats container
- 展示容器占用的cpu内存情况
- ctrl + c 退出
9)查看容器日志docker logs
- 语法:docker logs [option] container
option 说明
-tf:展示日志
--tail number:以字符串的形式展示日志,number展示日志条数
-f 一直跟踪这个日志(调试一般会用)
10)查看容器进程信息docker top
- 语法:docker top container
11)进入容器docker exec/attach
-
语法:docker exec -it container bashShell
#命令以与控制台(/bin/bash)交互(-it)的形式进入容器nginx(已经取容器名为nginx)
docker exec -it nginx /bin/bash
或者
docker exec -it nginx bash#exec进入容器并开启新终端并操作,更常用

进入容器后也可以进去mysql

12)起别名
vi ~/.bashrc

source ~/.bashrc
3.3保存镜像
1)镜像保存docker save
-
语法:docker save [option] image[:tag]
-o:将镜像保存为tar包(名字随便取)
docker save -o mynginx.tar mynginx:vers1.0
2)镜像加载docker load
-
语法:docker load [option]
-i:指定压缩包路径,自动读取,根据压缩包产生镜像
docker load -i mynginx.tar
这相当于是打包好的镜像
4 Docker存储
| 挂载类型 | 语法示例 | 来源/说明 |
|---|---|---|
| 匿名挂载 | -v /容器内路径 |
只写容器内路径 |
| 具名挂载 | -v 数据卷名:/容器内路径 |
给数据卷起名,便于管理 |
| 指定路径挂载 | -v /本地目录:/容器内路径 |
指定宿主机具体目录 |
-
匿名挂载 :你只指定了容器内的路径 ,没有给数据卷起名,Docker会自动在宿主机
/var/lib/docker/volumes/下生成一个随机字符串的目录来关联。因为匿名挂载卷的名字是随机字符串,不便于后续管理和维护。 -
具名挂载 :你为数据卷指定了一个名字 (如
juming-nginx),Docker会以这个名字在/var/lib/docker/volumes/下创建目录。通过名字管理卷,推荐使用这种方式。 -
指定路径挂载 :你明确指定了宿主机上的一个具体目录路径 (如
/home/user/app)和容器内的路径进行关联。
1)数据卷挂载
语法: docker -v 数据卷名:容器目录
- 不指定本地目录,默认放在/var/lib/docker/volums/xxxx/_data
- 容器内路径: ro rw 改变读写权限,看到ro说明只能通过本地主机修改文件而非容器内修改

#查看帮助信息
docker volum --help
#创建数据卷
docker volume create
#查看所有数据卷
docker volume ls
#删除指定数据卷
docker volume rm
#查看某个数据卷的详情
docker volume inspect
#清除数据卷
docker volume prune


2)本地目录挂载
语法: docker -v 本地目录:容器目录
docker inspect:查询容器详情
我们先看一下nginx的详细信息(刚挂载过)

我们在看以下mysql的挂载

像数据库就有匿名挂载,因为data数据存储是需要的,那就直接创建数据卷然后随机给一个很长的名字

宿主机目录 :就像你的 "家庭住址"(例如:北京市海淀区XX街道XX小区1号楼101)。
- 问题:如果你搬家了(环境变了),你的家庭住址就彻底变了。所有寄往你老地址的信件和包裹都会丢失。
数据卷 :就像你在邮局租的一个 "邮政信箱"(例如:邮箱号 12345)。
- 好处:无论你搬到哪里(从北京搬到上海),你只需要去邮局更新一下你的"邮政信箱"对应的"投递地址"即可。所有寄往"邮箱号 12345"的邮件,最终都会被送到你的新家。你的朋友(容器)永远只需要记住"邮箱号 12345"这个逻辑名称,不需要关心你到底住在哪里。
在这个比喻中:
容器 = 你的朋友(他只关心信箱号)
数据卷 = 邮政信箱(一个逻辑名称,如
my-app-data)宿主机目录 = 你的家庭住址(物理位置,如
/var/lib/docker/volumes/my-app-data/_data)场景1:直接指向宿主机目录(强耦合)
bash
# 创建一个容器,直接将它的数据目录映射到宿主机的 /home/user/app/data docker run -d -v /home/user/app/data:/var/lib/mysql --name mysql-container mysql分析:
命令含义 :容器内的
/var/lib/mysql目录直接就是宿主机上的/home/user/app/data目录。强耦合体现在哪?
环境依赖性 :这个命令假设宿主机上必须存在
/home/user/app/data这个路径。如果换到另一台机器(比如测试服务器),这个路径可能不存在,或者被其他程序占用了。不可移植性 :你的 Docker 命令、Docker Compose 文件都和这个具体路径绑定死了。你想把应用部署到任何新环境,都必须手动确保这个路径存在且正确。
管理混乱:作为运维,你很难一眼看出哪些目录是正在被 Docker 容器使用的。它们散落在文件系统的各个角落。
结论 :这种方式将应用配置(容器) 和基础设施细节(宿主机路径) 紧紧地绑在了一起,违背了容器化追求的"一次构建,到处运行"的可移植性理念。
场景2:通过数据卷(解耦)
bash
# 1. 创建一个名为 `mysql-data` 的逻辑数据卷(无需指定具体路径) docker volume create mysql-data # 2. 启动容器,使用这个数据卷 docker run -d -v mysql-data:/var/lib/mysql --name mysql-container mysql分析:
命令含义 :容器内的
/var/lib/mysql目录现在挂载到了一个名为mysql-data的逻辑卷上。解耦体现在哪?
可移植性 :你的 Docker 命令或
docker-compose.yml文件里只写了一个逻辑名称mysql-data。无论在哪个环境(开发、测试、生产)执行这条命令,Docker 引擎都会负责找到或创建这个名为mysql-data的卷,并把它映射到该环境下的一个合适且统一 的宿主机路径(通常是/var/lib/docker/volumes/...)。你问的"改变映射关系"是什么意思?
这通常不是在容器运行时去改,而是在 "环境配置" 层面解决的。
对于开发人员 :你根本不用关心
mysql-data在宿主机哪里。Docker 帮你管理。对于高级运维 :如果生产环境有特殊需求,比如需要把数据放在一块特定的、容量更大的硬盘上,我不需要 去修改容器的配置。我只需要在创建数据卷 时,使用特定的卷驱动(Volume Driver) 或存储驱动(Storage Driver) ,或者直接配置 Docker 引擎的存储路径。之后,所有名为
mysql-data的卷都会自动使用这个新的、优化过的存储配置。举个例子 :
在环境A,
mysql-data可能默认指向/var/lib/docker/volumes/mysql-data/_data。在环境B,我通过配置,可以让
mysql-data指向一个网络存储(NFS)/nfs/docker_volumes/mysql-data。
而你的容器启动命令完全不需要变!
3).Dockerfile

| 指令 | 指定基础镜像 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 |
FROM centos:6 |
| ENV | 设置环境变量,可在后面指令使用 |
ENV key value |
| COPY | 拷贝本地文件到镜像的指定目录 |
COPY ./jrel1.tar.gz /tmp |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar-zxvf/tmp/jrell.tar.gz&& EXPORTS path=/tmp/jrell:$path |
| EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |


5.docker网络
ip地址是docker网桥分配的,如果关掉就没了,这是别的容器在启动,就把这个占用了,这时候就可以自定义网络 
| 命令 | 语法示例 | |
| docker network create | 创建一个网络 | |
| docker network ls | 查看所有网络 | |
| docker network rm | 删除指定网络 | |
| docker network prune | 清除未使用的网络 | |
| docker network connect | 使指定容器连接加入某网络 | |
| docker network disconnect | 使指定容器连接离开某网络 | |
| docker network inspect | 查看网络详细信息 |
|---|
6.DockerCompose
Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。

对比如下:
| docker run 参数 | docker compose 指令 | 说明 |
|---|---|---|
| --name | container_name | 容器名称 |
| -p | ports | 端口映射 |
| -e | environment | 环境变量 |
| -v | volumes | 数据卷配置 |
| --network | networks | 网络 |
实例:黑马商城部署文件:
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
语法 :docker compose [OPTIONS] [COMMAND]
| 类型 | 参数或指令 | 说明 |
|---|---|---|
| Options | -f | 指定compose文件的路径和名称 |
| Options | -p | 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念 |
| Commands | up | 创建并启动所有service容器 |
| Commands | down | 停止并移除所有容器、网络 |
| Commands | ps | 列出所有启动的容器 |
| Commands | logs | 查看指定容器的日志 |
| Commands | stop | 停止容器 |
| Commands | start | 启动容器 |
| Commands | restart | 重启容器 |
| Commands | top | 查看运行的进程 |
| Commands | exec | 在指定的运行中容器中执行命令 |
实例演示:
# 1.进入root目录
cd /root
# 2.删除旧容器
docker rm -f $(docker ps -qa)
# 3.删除hmall镜像
docker rmi hmall
# 4.清空MySQL数据
rm -rf mysql/data
# 5.启动所有, -d 参数是后台启动
docker compose up -d(因为yml文件就在该目录下,所以不用指定文件)
# 结果:
[+] Building 15.5s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 358B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster 15.4s
=> [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 98B 0.0s
=> CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 0.0s
=> CACHED [3/3] COPY hm-service.jar /app.jar 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71 0.0s
=> => naming to docker.io/library/root-hmall 0.0s
[+] Running 4/4
✔ Network hmall Created 0.2s
✔ Container mysql Started 0.5s
✔ Container hmall Started 0.9s
✔ Container nginx Started 1.5s
# 6.查看镜像
docker compose images
# 结果
CONTAINER REPOSITORY TAG IMAGE ID SIZE
hmall root-hmall latest 32eebee16acd 362MB
mysql mysql latest 3218b38490ce 516MB
nginx nginx latest 605c77e624dd 141MB
# 7.查看容器
docker compose ps
# 结果
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
hmall root-hmall "java -jar /app.jar" hmall 54 seconds ago Up 52 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql mysql "docker-entrypoint.s..." mysql 54 seconds ago Up 53 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx nginx "/docker-entrypoint...." nginx 54 seconds ago Up 52 seconds 80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp
