docker详解

目录

1.docker介绍

2.安装docker(本机默认使用的centos)

2.1卸载docker

2.2配置Docker的yum库

1)安装yum工具

2)配置Docker的yum源(更新为阿里云源)

2.3安装Docker

2.4配置docker镜像加速

2.5.安装mysql(其实验证镜像能否成功拉取)

3.Docker命令解读

[1)查看镜像docker images](#1)查看镜像docker images)

[2)拉取镜像 docker pull](#2)拉取镜像 docker pull)

[3)镜像删除docker rmi](#3)镜像删除docker rmi)

3.2容器

[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)

12)起别名

3.3保存镜像

[1)镜像保存docker save](#1)镜像保存docker save)

[2)镜像加载docker load](#2)镜像加载docker load)

[4 Docker存储](#4 Docker存储)

1)数据卷挂载

2)本地目录挂载

3).Dockerfile​编辑​编辑

5.docker网络


1.docker介绍

我们利用docker安装应用时,docker会自动搜索并下载应用镜像 (image).镜像不仅包含应用本身,还包含应用运行所需要的环境,配置,系统函数库。docker会在运行镜像时创建一个隔离环境,称为容器

1).容器(Container)

  • 容器是镜像创建的运行实例, 它是一个轻量级的、可执行的独立软件包,包含了运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
  • 容器化技术使得软件可以在几乎任何地方以相同的方式运行,解决了"在我的机器上可以运行"的问题。

2).镜像(Image):

  • 镜像是构建容器的模板 ,它是一个只读的模板,用于创建Docker容器。
  • 镜像通常是通过一个Dockerfile 定义的,Dockerfile包含了构建镜像所需的指令

3).仓库(Registry)

  • Docker仓库用于存储和分发Docker镜像
  • 公共的Docker Hub是最大的Docker镜像仓库,用户可以在那里找到、分享和运行高质量的Docker镜像。

主要特点:

  • 可移植性:Docker容器可以在任何支持Docker的操作系统上运行,应用部署和迁移变得非常简单。
  • 隔离性容器之间是相互隔离的,一个容器的崩溃不会影响其他容器。
  • 轻量级:容器不需要像虚拟机那样启动一个完整的操作系统,因此它们可以快速启动,并且占用更少的系统资源。
  • 安全性:容器运行在自己的隔离环境中,并且可以限制对系统资源的访问,从而提供了额外的安全层。

工作流程:

  1. 编写Dockerfile:定义应用的依赖、环境变量、配置等。
  2. 构建镜像:通过Dockerfile构建应用镜像。
  3. 运行容器:从镜像启动一个或多个容器实例。
  4. 管理容器:启动、停止、监控和删除容器。
  5. 共享镜像 :将构建好的镜像推送到Docker仓库,以便在其他机器上使用
  1. 编写 Dockerfile

    • 做什么 :创建一个名为 Dockerfile 的文本文件。它包含了一系列指令,告诉 Docker 如何一步步地构建你的应用镜像。

    • 示例指令

      • FROM python:3.9-slim:指定基础镜像。

      • COPY . /app:将本地代码复制到镜像内的 /app 目录。

      • RUN pip install -r requirements.txt:在镜像内执行命令安装依赖。

      • CMD ["python", "app.py"]:指定容器启动时默认运行的命令。

  2. 构建镜像

    • 做什么 :执行 docker build -t my-app . 命令。

    • 过程 :Docker 守护进程会读取 Dockerfile,逐步执行其中的指令,并为每一步创建一个新的镜像层,最终生成一个可命名的镜像(如 my-app:latest)。

  3. (可选) 推送至镜像仓库

    • 做什么 :执行 docker push my-registry.com/my-app:latest 命令。

    • 目的:将本地构建好的镜像上传到像 Docker Hub、Google Container Registry 或私有仓库这样的镜像仓库中,以便在其他地方拉取和使用。

  4. 拉取镜像

    • 做什么 :在需要运行该应用的其他机器上,执行 docker pull my-registry.com/my-app:latest 命令。

    • 目的:从镜像仓库下载指定的镜像到本地。

  5. 运行容器

    • 做什么 :执行 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.backup

2)下载阿里云的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.repo

3)刷新YUM元数据缓存

更新完repo文件后,需要清空并重建YUM的元数据缓存,以便让它认识新的仓库配置:

复制代码
sudo yum clean all
sudo yum makecache

4)使用阿里云源安装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会按以下顺序执行:

  1. 在本地查找 mysql:latest 镜像。

  2. 如果没找到,自动从Docker Hub拉取

  3. 创建一个名为mysql的容器。

  4. 在后台启动这个容器。

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

分析:

  1. 命令含义 :容器内的 /var/lib/mysql 目录直接就是宿主机上的 /home/user/app/data 目录。

  2. 强耦合体现在哪?

    • 环境依赖性 :这个命令假设宿主机上必须存在 /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

分析:

  1. 命令含义 :容器内的 /var/lib/mysql 目录现在挂载到了一个名为 mysql-data 的逻辑卷上。

  2. 解耦体现在哪?

    • 可移植性 :你的 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
相关推荐
wanhengidc2 小时前
云手机中的数据通常存储在哪里?
运维·服务器·安全·web安全·智能手机
凌寒112 小时前
Linux(Debain)安装Redis、数据迁移
linux·运维·服务器·redis
云渠道商yunshuguoji2 小时前
亚马逊云渠道商:怎么使用Spot实例实现成本降低70%?
运维·架构
2501_921939263 小时前
11.25Nginx服务器和Wordpress服务器
运维·服务器·nginx
dntktop3 小时前
搜索+计算+插件…这个“全能管家”让你告别80%的桌面图标
运维·windows·自动化·编辑器
ALex_zry3 小时前
Consul全方位入门指南:第二阶段—— 实操。Consul核心功能与项目集成
运维·docker·微服务·云原生·架构
wanhengidc3 小时前
云手机中分布式存储的功能
运维·服务器·分布式·游戏·智能手机·云计算
上班日常摸鱼3 小时前
防火墙高级配置完整教程:端口映射+访问控制策略+iptables规则编写
运维
翼龙云_cloud3 小时前
亚马逊云渠道商:AWS Shield和传统防火墙怎么选?
运维·服务器·云计算·aws