当前位置: 首页 > news >正文

docker基础到进阶

文章目录

    • 1.Docker简介
    • 2.Docker基础概念
    • 3.Docker安装
    • 4.Docker命令
      • 4.1 镜像命令
      • 4.2 容器命令
    • 5. 数据卷
    • 5.1具名挂载
    • 5.2 匿名挂载
  • 进阶
    • 1. 镜像
    • 2 Dockerfile
    • 3 网络
      • 1.网络模式
      • 2.网络操作
    • DockerCompose
      • 1.基本语法
  • 总结


这篇文章记录了以下的内容:
1️⃣ 利用Docker部署常见软件
2️⃣ Docker打包部署java应用
3️⃣ Docker数据卷的基本作用
4️⃣ 看得懂DockerCompose文件

1.Docker简介

⭐️ 在Linux上部署一个单体项目。大多数人都有相同的感受,有以下问题:

  • 每次部署一台服务器,需要安装各种依赖,配置各种环境,十分麻烦;
  • 软件安装包名字复杂,不知道去哪里找;
  • 安装和部署步骤复杂,容易出错;
  • 由于开发、测试和生产环境配置不一致,导致在生产环境中出现了在开发环境未曾出现的bug;
  • 。。。

2.Docker基础概念

首先先了解这三个基本概念⭐️ 镜像⭐️ 容器⭐️ 仓库
从仓库中下载镜像,然后运行镜像成为容器,一个镜像可以运行多个容器实例。

  • 镜像(image)
    以下载MySQL为例,Docker会自动搜索并下载MySQL。注意:这里下载的不是安装包,而是镜像。镜像中不仅包含了MySQL本身,还包含了其运行所需要的环境、配置、系统级函数库。因此它在运行时就有自己独立的环境,就可以跨系统运行,也不需要手动再次配置环境了。这套独立运行的隔离环境我们称为容器
  • 容器(container)
    容器是镜像的运行时实例,相当于面向对象中的一个个对象实例。当你运行一个镜像时,docker会创建一个容器,他提供了一个隔离的环境,让应用程序可以在其中运行,所以容器可以被理解一个独立的、隔离的运行时环境,其中包含了应用程序以及运行所需的一切。
    在这里插入图片描述
  • 仓库(repository)
    仓库就是存放镜像的地方,仓库分为公有仓库和私有仓库。Docker 公司提供了公共的镜像仓库 https://hub.docker.com,里面提供了大量的镜像可以给我们给我们使用,我们也可以基于别人的镜像来创建我们自己的镜像。但是国内访问dockerhub速度比较慢,一般使用阿里云或网易云。
    在这里插入图片描述

总之,镜像的来源有两种:
🅰️基于官方基础镜像自己制作
🅱️直接去DockerRegistry下载

3.Docker安装

Docker 的官网地址:https://www.docker.com/,在官网可以找到 Docker Engine 的安装步骤。
下面进行Docker环境的安装,正常情况下Docker都是运行在Linux服务器上,因为Docker依赖在宿主机的操作系统内核,也就是已经存在并运行的Linux内核环境,只是在已经运行的Linux上制造了一个隔离的文件环境,所以所在的主机必须时Linux操作系统,window操作系统也可以安装Docker,但是必须安装一个Linux操作系统。
可以参考以下文档笔记 https://b11et3un53m.feishu.cn/wiki/FJAnwOhpIihMkLkOKQocdWZ7nUc

Docker 官方提供了镜像仓库是 DockerHub ,但是服务器是在国外的,在国内使用下载镜像会很慢,所以我们配置阿里云镜像服务后,下载镜像会快很多。

🔥 阿里云镜像加速为例。

1. 注册阿里云账号

首先访问阿里云网站:
https://www.aliyun.com/
注册一个账号。

2. 开通镜像服务

在首页的产品中,找到阿里云的容器镜像服务:在这里插入图片描述
点击后进入控制台:在这里插入图片描述
首次可能需要选择立刻开通,然后进入控制台

3. 配置镜像加速
在这里插入图片描述
页面向下滚动,即可找到配置的文档说明:
在这里插入图片描述

4.Docker命令

利用Docker快速的安装了MySQL为例安装部署镜像。

docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql

解读:
docker run -d: 创建并运行一个容器。-d则是让容器在后台进程运行
--name mysql: 给容器起个名字叫mysql,你可以叫别的
-p 3306:3306:设置端口映射。
🔥容器是隔离环境,外界不可访问。但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就会映射到容器内的端口。
🔥 格式: -p 宿主机端口 : 容器内端口,示例中就是将宿主机的3306映射到容器内的3306端口
🔥 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
-e TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数 可以在hub.docker.com找到对应的镜像文档查看参数。
🔥 格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定
🔥 案例中,TZ=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码
mysql: 设置镜像名称,Docker会根据这个名字搜索并下载镜像
🔥 格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号
🔥 在未指定TAG的情况下,默认是最新版本,也就是mysql:latest

4.1 镜像命令

在这里插入图片描述
下载镜像

docker pull 镜像名

在这里插入图片描述
每个镜像都有 tag,也就是版本,如果不指定tag,默认拉取的就是最新版本。
我们可以登录 dockerhub,查看镜像有哪些版本。

docker pull redis:6.0.20

docker pull redis:6.0.20

 查看本地所有镜像
docker images# 查看本地所有镜像,包括中间层(intermediate layers)。
docker images -a

在这里插入图片描述
删除本地镜像
如果镜像以后不会再使用了,可以将其从本地删除。
在删除之前先查看一下本地的镜像,然后通过镜像的 ID 或镜像名称进行删除。

# 删除镜像
docker rmi 镜像ID# 强制删除
docker rmi -f 镜像ID

还存在该镜像创建的容器,需要强制删除或者先删除这个镜像创建的容器。
在这里插入图片描述
查看镜像容器数据卷的占用空间
可以查看Docker系统资源使用情况,以及各个镜像,容器和数据卷所占的空间

docker system df

在这里插入图片描述

  • Images:所有镜像占用的空间,包括拉取的镜像、本地构建的镜像。
  • Containers:容器的数量、和占用的空间。
  • Local Volumes:本地数据卷的空间。
  • Build Cache:镜像构建过程中,产生的缓存数据。

导出镜像
使用 docker save 命令将本地的 Docker 镜像保存为一个 tar 文件。

docker save -o /path/to/your_image.tar your_image_name:tag

例如,如果你的镜像名为 mysql,标签为 latest,并且你想保存到当前目录下的 mysql.tar 文件中,你可以运行:

docker save -o mysql.tar mysql:latest

在这里插入图片描述

导入镜像
可以使用 docker load 命令将镜像文件的 tar 包导入。

docker load -i /path/to/your_image.tar

4.2 容器命令

我们以Nginx为例给大家演示上述命令。
在这里插入图片描述
1、创建并运行nginx容器

# 创建并运行nginx容器
docker run -d --name nginx2 -p 81:80 nginx

-p:端口映射、前面的 81表示宿主机的端口号,后面的 80表示容器的端口号。
解释的讲通过宿主机的80端口可以访问到nginx2的81端口,进而访问到nginx2容器的服务

2、查看运行中容器

docker ps

表示查询所以容器,包括没有运行的

docker ps -a

在这里插入图片描述

#也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

3、再次启动nginx容器

docker start nginx

4、再次查看容器

docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

5、查看容器详细信息

docker inspect nginx

6、进入容器,查看容器内目录

docker exec -it nginx bash

或者,可以进入MySQL

docker exec -it mysql mysql -uroot -p
#-it参数:添加可输入终端
# bash:进入容器后以bash命令行的方式交互

如果再想进入正在运行的容器,可以使用 docker execdocker attach 命令
推荐使用docker exec命令。因为 docker attach 会直接进入容器启动命令的终端,不会启动新的进程,所以用 exit 退出,会导致容器停止;
而 docekr exec 是现在容器中打开新的终端,是启动了新的进程,时候用 exit 退出容器,不会导致容器停止

7、删除容器

docker rm nginx

8、发现无法删除,因为容器运行中,强制删除容器

docker rm -f nginx

9、 停止容器

docker stop 容器ID/名称

还有一个强制停止容器的命令,用的不多

# 强制停止容器
docker kill 容器ID/名称

docker stop 和 docker kill 的区别:

  • docker stop比较温柔,它会给容器发送一个TERM信号,给容器充足时间(默认10秒)保存数据,让容器自动安全停止运行,超时后再给系统发送SIGKILL的系统信号强行kill掉进程,最后转变为stop状态。
  • docker kill则比较生猛,它会直接给系统发送SIGKILL的系统信号强行kill掉进程。

10、重启策略
当我们的容器运行的过程中,因为某种原因退出,这个时候我们想容器能够重新启动,该如何设置呢?
我们可以在运行容器的时候,指定重启策略。

docker run -d -p 6379:6379 --restart=always --name myredis redis

--restart 可以设置为如下值:

  • no:默认策略,在容器退出时不进行重启。
  • always:无论容器退出状态如何,都会尝试重启容器。
  • on-failure:只有在容器以非零状态码退出时才尝试重启容器。
  • unless-stopped:在容器退出或守护进程重启时,始终重启容器,除非用户明确停止了容器。

11、 查看容器日志
想要查看容器运行的日志,可以使用命令进行查看:

docker logs 容器ID/名称
命令说明文档地址
docker pull拉取镜像docker pull
docker push推送镜像到DockerRegistrydocker push
docker images查看本地镜像docker images
docker rmi删除本地镜像docker rmi
docker run创建并运行容器(不能重复创建)docker run
docker stop停止指定容器docker stop
docker start启动指定容器docker start
docker restart重新启动容器docker restart
docker rm删除指定容器docs.docker.com
docker ps查看容器docker ps
docker logs查看容器运行日志docker logs
docker exec进入容器docker exec
docker save保存镜像到本地压缩文件docker save
docker load加载本地压缩文件到镜像docker load
docker inspect查看容器详细信息docker inspect

其他常用命令

# 查看最近创建的容器
docker ps -l# 查看容器,只显示容器编号
docker ps -q# 查看最近n个创建的容器
docker ps -n 5	# 查看最近创建的5个容器

Docker 服务相关的命令
下面是控制 Docker 服务的一些命令,这是属于Linux命令。
设置docker开机自启, 正常安装完docker都是开机自启的,所以一般不用执行。

systemctl enable docker

查看docker状态

systemctl status docker

停止docker

systemctl stop docker

启动docker

systemctl start docker

重启docker

systemctl restart docker

查看概要信息

docker info

在这里插入图片描述

5. 数据卷

数据卷(volume)是一个虚拟目录,是容器内目录宿主机目录之间映射的桥梁

使用数据卷可以实现宿主机目录与容器内目录的双向映射绑定,方便操作容器内的文件,或迁移容器产生的数据。
以Nginx为例,我们知道Nginx中有两个关键的目录:

  • html:放置一些静态资源
  • conf:放置配置文件

如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。
但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。
在这里插入图片描述
在上图中:

  • 创建了两个数据卷:conf、html
  • Nginx容器内部的conf目录和html目录分别与两个数据卷关联。
  • 而数据卷conf和html分别指向了宿主机
  • /var/lib/docker/volumes/conf/_data目录和
  • /var/lib/docker/volumes/html/_data目录
    这样以来,容器内的conf和html目录就 与宿主机的conf和html目录关联起来,我们称为挂载
    我们操作宿主机的 /var/lib/docker/volumes/html/_data就是在操作容器内的 /usr/share/nginx/html/_data 目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。

🔥提示
/var/lib/docker/volumes这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data

为什么不让容器目录直接指向宿主机目录呢?

  • 因为直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。
  • 但是容器指向数据卷,一个逻辑名称,而数据卷再指向宿主机目录,就不存在强耦合。如果宿主机目录发生改变,只要改变数据卷与宿主机目录之间的映射关系即可。

5.1具名挂载

# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
# 2.然后查看挂载信息
docker inspect nginx

html 就是容器卷的名称,使用卷挂载,docker 会将容器中的目录映射到 html容器卷
容器中对应的目录中的数据会被存储在/var/lib/docker/volumes/容器卷名/_data目录中。
在这里插入图片描述

# .然后查看数据卷
docker volume ls

在这里插入图片描述
🖕容器与数据卷的挂载在创建容器时配置,对于创建好的容器,是不能设置数据卷的而且创建容器的过程中,数据卷自动创建,会自动生成数据卷名字

# 查看数据卷详情
docker volume inspect html

其中/var/lib/docker/volumes/html/_data是数据卷挂载到宿主机的目录
在这里插入图片描述

 #查看/var/lib/docker/volumes/html/_data目录
ll /var/lib/docker/volumes/html/_data
#进入该目录,并随意修改index.html内容
cd /var/lib/docker/volumes/html/_data
vi index.html

在这里插入图片描述
我们也可以使用命令创建容器卷,然后在运行容器的时候,使用已存在的卷:
多个容器可以挂载同一个数据卷,实现容器间数据的共享:

创建容器卷
docker volume create 卷名称
举个栗子,创建ubuntu_data2容器卷
docker volume create ubuntu_data2 创建容器1
docker run -it --privileged=true \
-v ubuntu_data:/root/docker_data \
--name my-ubuntu1 ubuntu创建容器2,使用同样的数据卷
docker run -it --privileged=true \
-v ubuntu_data:/root/docker_data \
--name my-ubuntu2 ubuntu

5.2 匿名挂载

指的是容器内部的目录,不指定宿主机的目录,例如:

docker run -it --privileged=true -v /root/docker_data --name my-ubuntu ubuntu

在创建容器的时候,如果不自定义数据卷名称,数据卷自动创建,会自动生成数据卷名字。
在这里插入图片描述
可以看到,使用匿名挂载,容器卷是被挂载到宿主机的 /var/lib/docker/volumes/xxxx/_data 目录下。

挂载本地目录或文件
可以发现,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:

# 挂载本地目录
-v 本地目录:容器内目录
-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
# 挂载本地文件
-v 本地文件:容器内文件
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

进阶

1. 镜像

想要自己构建镜像,那如果部署一个Java项目,把它打包为一个镜像该怎么做?
🅰️ 首先要了解镜像的结构,因为镜像中包含了程序运行的函数库,环境,配置,依赖。

举个例子,我们要从0部署一个Java应用,大概流程是这样:

  • 准备一个linux服务(CentOS或者Ubuntu均可)
  • 安装并配置JDK
  • 上传Jar包
  • 运行jar包

我们打包镜像也是分成这么几步:

  • 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
  • 安装并配置JDK
  • 拷贝jar包
  • 配置启动脚本

在上述步骤每一次操作都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像都是一堆文件集合
在这里插入图片描述

2 Dockerfile

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能,我们需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。
而这种记录镜像结构的文件就称为Dockerfile
其中的语法比较多,比较常用的有:

指令说明示例
FROM指定基础镜像FROM <image>: <tag>FROM centos:6
ENV设置环境变量,可在后面指令使用格式1:ENV key value ENV WORK_HOME /home/doubi 格式2:可以使用ENV key1=value1 key2=value2 WORKDIR $WORK_HOME
LABEL镜像添加元数据,提供关于镜像的描述信息,包含维护者,版本,许可证等LABEL version=”1.0“ maintainer=”My custom Docker image“
COPY拷贝本地文件到镜像的指定目录COPY ./xx.jar /tmp/app.jar、将hello.jar复制到镜像文件中,目标名称为app.jar COPY hello.jar app.jar
RUN执行命令接收两种格式:Shell 和 Exec,一般是安装过程的命令RUN yum install gccRUN mkdir -p /home/doubi/hello、Exec格式:RUN ["apt", "update", "&&", "apt", "install", "-y", "vim"]
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的暴露80端口EXPOSE 80 暴露多个端口EXPOSE 80 443 指定端口和协议EXPOSE 8080/tcp
ADD可以拷贝文件或目录到镜像中 类似copy <src> <dest>通过 url 下载文件到镜像的 /tmp/ 目录下,并解压:ADD https://example.com/file.tar.gz /tmp/
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar
VOLUME命令用来做匿名挂载,在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。方式1: VOLUME <路径>方式2:VOLUME <路径1> <路径2>方式3:VOLUME ["<路径1>", "<路径2>"...] 例如:FROM ubuntu:latest VOLUME /data VOLUME /config
WORKDIR设置工作目录,此后RUN、CMD、COPY等都在这个目录下执行WORKDIR 路径、WORKDIR /path/to/directory

例如,基于ubuntu镜像来构建Java应用,其Dockerfile内容如下:

# 设置基础镜像为 Ubuntu 22.04  
FROM ubuntu:22.04  # 设置环境变量,防止在安装时有提示  
ARG DEBIAN_FRONTEND=noninteractive  # 更新软件包列表  
RUN apt-get update \  # 安装jdk  && apt install -y openjdk-17-jdk-headless \# 安装软件包之后清理APT缓存&& rm -rf /var/lib/apt/lists/*# 设置工作目录  
WORKDIR /opt  # 使用 ADD 命令拷贝并解压 Tomcat 压缩包  
ADD apache-tomcat-10.1.19.tar.gz /opt/  # 重命名解压后的目录
RUN mv apache-tomcat-10.1.19 tomcat# 暴露 Tomcat 默认的端口  
EXPOSE 8080  # 启动 Tomcat  
CMD ["/opt/tomcat/bin/catalina.sh", "run"]

在这里插入图片描述
执行命令,构建镜像:

docker build -t docker-demo:1.0

命令说明:

  • docker build : 就是构建一个docker镜像
    t docker-demo:1.0 :-t参数是指定镜像的名称(repository和tag)(镜像名称 : 版本号)
  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:

在这里插入图片描述

# 查看镜像列表:
docker images
# 结果
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
docker-demo   1.0       d6ab0b9e64b9   27 minutes ago   327MB
nginx         latest    605c77e624dd   16 months ago    141MB
mysql         latest    3218b38490ce   17 months ago    516MB

然后尝试运行该镜像:

# 1.创建并运行容器
docker run -d --name dd -p 8080:8080 docker-demo:1.0
# 2.查看容器
dps #别名
# 结果
CONTAINER ID   IMAGE             PORTS                                                  STATUS         NAMES
78a000447b49   docker-demo:1.0   0.0.0.0:8080->8080/tcp, :::8090->8090/tcp              Up 2 seconds   dd
f63cfead8502   mysql             0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   Up 2 hours     mysql# 3.访问
curl localhost:8080/hello/count

3 网络

创建了一个Java项目的容器,而Java项目往往需要访问其它各种中间件,例如MySQL、Redis等。现在,我们的容器之间能否互相访问呢?
🔥我们查看下MySQL容器的详细信息,重点关注其中的网络IP地址(每个容器都有IP地址):

#1.用基本命令,寻找Networks.bridge.IPAddress属性
docker inspect mysql

在这里插入图片描述

使用format过滤结果
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql

在这里插入图片描述

在容器内,通过ping命令测试网络
在这里插入图片描述
容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。
🅰️容器的ip地址都是docker分配的举例:如果mysql容器ip是172.17.0.2,此时停止mysql容器,启动nginx容器那么nginx ip地址就是172.17.0.2,再启动mysql容器,mysql容器的ip就是172.17.0.3了

1.网络模式

我们在使用虚拟机的时候,虚拟机会有不同的网络模式,例如桥接、共享等;和虚拟机有些类似,安装 Docker 以后,也会默认创建三种网络模式,可以通过 docker network ls 查看。

docker network ls

在这里插入图片描述
默认会有 bridge hostnone 三种模式。
bridge网络模式
为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,Docker 网络默认使用的就是该模式。

host网络模式
容器将不会虚拟出自己的网卡,所以没有自己的 IP,而是使用宿主机的 IP 和端口。

none网络模式
容器有独立的 Network namespace,但并没有对容器进行任何网络设置,如分配网卡、IP 等。这种模式下,容器禁用了网络功能,不能进行网络通信。如果需要,只能自己添加网络配置。
在 docker run 命令中使用 --network none 指定使用该模式。

2.网络操作

在这里插入图片描述
可以看到 docker network 有` connect 、create、disconnect、inspect、ls、prune、rm 命令

命令说明文档地址
docker network create创建一个网络docker network create
docker network ls查看所有网络docs.docker.com
docker network rm删除指定网络docs.docker.com
docker network prune清除未使用的网络docs.docker.com
docker network connect使指定容器连接加入某网络docs.docker.com
docker network disconnect使指定容器连接离开某网络docker network disconnect
docker network inspect查看网络详细信息docker network inspect

创建网络

# 命令
docker network create 网络名称
# 举个栗子:
docker network create doubi-network

在这里插入图片描述
删除网络

# 命令
docker network rm 网络ID/名称 
# 举个栗子:
docker network rm doubi-network

查看网络详细信息

# 命令
docker network inspect 网络ID/名称 
# 举个栗子:
docker network inspect bridge

DockerCompose

部署一个简单的java项目,其中包含3个容器:

  • MySQL
  • Nginx
  • Java项目

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

1.基本语法

docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。
举例来说,用docker run部署MySQL的命令如下:

docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \-v ./mysql/data:/var/lib/mysql \-v ./mysql/conf:/etc/mysql/conf.d \-v ./mysql/init:/docker-entrypoint-initdb.d \--network hmallmysql

如果用docker-compose.yml文件来定义,就是这样:

version:"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"networks:- new
networks:new:name: hm
docker run 参数docker compose 指令说明
–namecontainer_name容器名称
-pports端口映射
-eenvironment环境变量
-vvolumes数据卷配置
–networknetworks网络

总结

❤️希望对你有帮助,关注收藏一下吧,防止丢失文章!!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 科研项目经费管理,降本增效的不二之选
  • 【网络安全】服务基础第一阶段——第二节:Windows系统管理基础----虚拟化IP地址以及用户与组管理
  • SAP 有趣的‘bug‘ 选择屏幕输入框没了
  • redis分布式是如何实现的(面试版)
  • Unity URPShader支持多光源处理
  • Qt杂项功能实现
  • Linux 数据结构 树知识
  • 学习bat脚本
  • 自然语言处理系列四十七》Elasticsearch搜索引擎》Elasticsearch代码实战
  • 川崎机器人维修请开启马达电源报警故障
  • 使用Lora微调LLM——笔记
  • okhttp异步请求连接阻塞问题排查
  • cenos 7 安装 golang
  • vue3 自定义hooks(组合式函数)
  • PHP语言有哪些优势和特点?
  • create-react-app项目添加less配置
  • css布局,左右固定中间自适应实现
  • ECS应用管理最佳实践
  • HTTP请求重发
  • leetcode46 Permutation 排列组合
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • VuePress 静态网站生成
  • 蓝海存储开关机注意事项总结
  • 聊聊sentinel的DegradeSlot
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 听说你叫Java(二)–Servlet请求
  • 详解NodeJs流之一
  • 消息队列系列二(IOT中消息队列的应用)
  • 阿里云ACE认证学习知识点梳理
  • 选择阿里云数据库HBase版十大理由
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #Spring-boot高级
  • #WEB前端(HTML属性)
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (3) cmake编译多个cpp文件
  • (7)STL算法之交换赋值
  • (JS基础)String 类型
  • (vue)页面文件上传获取:action地址
  • (附源码)计算机毕业设计大学生兼职系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (汇总)os模块以及shutil模块对文件的操作
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (数据结构)顺序表的定义
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一) 初入MySQL 【认识和部署】
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET 8.0 中有哪些新的变化?
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net 无限分类
  • .NetCore项目nginx发布
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET运行机制