Docker数据卷及[Tomcat,MySQL,Redis]的部署

Docker数据卷

docker数据卷是什么?

我们通过docker可以启动多个容器,但是当我们的容器被删除后,我们在容器中的数据也一并丢失了;

这就迫使我们考虑docker数据的持久化技术—数据卷来解决这个问题;

数据卷---->>

docker 容器产生的数据 如果不通过 docker commit 来打包生成新的镜像,那么当容器删除后,数据也自然就没有了,为了能保存数据在docker中,我们使用数据卷;
这有些类似于redis中的 *.rdb和 *.aof 两种持久化文件,新的docker可以读取两种文件来完成数据的导入;
但又不完全一样---->>

  • 1,被挂载的数据卷可在容器之间共享;
  • 2,数据卷中的数据更改可以直接生效
  • 3,数据卷的更改不会包含在镜像的更新中
  • 4,数据卷的生命周期一直持续到没有容器使用它为止;

数据卷设计的初衷

实现数据的持久化,这种持久化独立于容器的整个生命周期,因此当删除容器时不会删除其挂载的数据卷;

数据卷的使用

添加数据卷

来看一下我们之前制作好的镜像:
在这里插入图片描述
运行这个镜像:
在这里插入图片描述

进入这个镜像:
在这里插入图片描述

然后我们添加数据卷----->>

容器中的数据管理主要有两种方式
数据卷---->>容器内数据直接映射到本地主机环境;

数据卷容器即使用特定的容器维护数据卷;

创建一个数据卷---->>

docker volume create mydata

C:\Users\Gavin>docker volume create mydata
mydata

返回值是创建的数据卷的名称;

查看创建的所有数据卷----->>

docker volume ls

C:\Users\Gavin>docker volume ls
DRIVER    VOLUME NAME
local     mydata

查看指定数据卷的信息—>>

C:\Users\Gavin>docker volume inspect mydata
[
    {
        "CreatedAt": "2022-07-03T00:28:29Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/mydata/_data",
        "Name": "mydata",
        "Options": {},
        "Scope": "local"
    }
]

在这里插入图片描述
删除数据卷—>

C:\Users\Gavin>docker volume rm yourdata
yourdata

C:\Users\Gavin>docker volume ls
DRIVER    VOLUME NAME
local     mydata

数据卷是被用来设计持久化数据的,我们手动创建数据卷的方式不如在容器启动时自动创建来的方便;

挂载数据卷时最好时通过run 的方式而不是 create/start 来创建;

create/start命令创建启动容器后,再挂载数据卷相当麻烦,要修改很多配置文件,但并非不可以;

数据卷的生命周期独立于容器,且不会在容器被删除后自动删除,这样当我们删除不用的容器的时候那些没有被引用的数据卷会占用很多空间,所以要及时删除;

挂载数据卷—>>

启动容器时挂载数据卷:

C:\Users\Gavin>docker run -it -p 8888:8080 -v d:/gavin:/usr/local/tomcat/webapps gavin/tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /opt/java/openjdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

宿主机中的映射文件
在这里插入图片描述

进入容器后查看

C:\Users\Gavin>docker exec -it 1eed /bin/bash
root@1eed7f286c4c:/usr/local/tomcat# ls
bin           CONTRIBUTING.md  logs            README.md      temp          work
BUILDING.txt  lib              native-jni-lib  RELEASE-NOTES  webapps
conf          LICENSE          NOTICE          RUNNING.txt    webapps.dist
root@1eed7f286c4c:/usr/local/tomcat# cd webapps
root@1eed7f286c4c:/usr/local/tomcat/webapps# ls
Documents  Music  Pictures  Videos
root@1eed7f286c4c:/usr/local/tomcat/webapps# cd Pictures/
root@1eed7f286c4c:/usr/local/tomcat/webapps/Pictures# ls
'Camera Roll'   desktop.ini  'Saved Pictures'

在这里插入图片描述

可以看到本地的文件被映射到容器中的相应目录中;

接下来我们在宿主机Documents文件夹中添加一个hello.txt文件

root@1eed7f286c4c:/usr/local/tomcat/webapps# cd Documents/
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# ls
desktop.ini  FeedbackHub  hello.txt
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# cat hello.txt
hello dockerroot@1eed7f286c4c:/usr/local/tomcat/webapps/Documents#

在这里插入图片描述

然后我们反过来,在容器中添加文件 world.txt

直接使用vi 命令---->>bash: vi: command not found

我们可以使用echo的方式创建并写入文本

echo ‘hello world’ > ./world.txt

root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# cat hello.txt
hello dockerroot@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# vi world.txt
bash: vi: command not found
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# echo 'hello world' > ./world.txt
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# ls
desktop.ini  FeedbackHub  hello.txt  world.txt
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents#

在这里插入图片描述
使用cat 命令创建并逐行添加内容
命令格式—>>
cat >> 数据文件地址 << 结束标志

root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# cat >> ./gavin.txt <<EOF
> 今天天气不错呀!
> EOF
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# LS
bash: LS: command not found
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# ls
desktop.ini  FeedbackHub  gavin.txt  hello.txt  world.txt
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# cat gavin.txt
今天天气不错呀!
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents#

在这里插入图片描述

其他方式

cat >> ./test.txt

root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# cat >> ./test.txt
你好世界

在这里插入图片描述

我们可以发现这中创建时挂在数据卷的方式可以自动做到同步,不需要手动去挂载数据卷;

我们可以在宿主机里面修改数据,也可以在容器里面修改数据

小结:

一个数据卷是一个特别指定的目录映射,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享,数据卷可以在多个容器之间共享;

创建数据卷—>>
docker run -v 宿主机地址:容器内数据地址 ,后面也可以跟多个 -v 来创建多个数据卷;

数据卷的挂载---->>
创建好数据卷之后可以在其他容器中通过 volumes -from 来挂载数据卷了(不管容器是否在运行,都可以挂载,以为数据卷的生命周期独立于容器)

查看容器的信息---->>

docker inspect containerid
在这里插入图片描述
在这里插入图片描述

关掉容器之后我们来查看数据卷

C:\Users\Gavin>
C:\Users\Gavin>docker kill 1eed
1eed

C:\Users\Gavin>d:

D:\>cd Gavin

D:\Gavin>cd Documents

D:\Gavin\Documents>dir
 驱动器 D 中的卷是 Data
 卷的序列号是 24F7-97D0

 D:\Gavin\Documents 的目录

2022/07/03  09:30    <DIR>          .
2022/07/03  09:30    <DIR>          ..
2022/05/29  18:27    <DIR>          FeedbackHub
2022/07/03  09:28                23 gavin.txt
2022/07/03  09:18                12 hello.txt
2022/07/03  09:30                13 test.txt
2022/07/03  09:23                12 world.txt
               4 个文件             60 字节
               3 个目录 218,314,788,864 可用字节
 

数据卷中的信息还在;

数据卷中的读写权限控制

重新启动之前的容器

D:\Gavin\Documents>docker ps -a
CONTAINER ID   IMAGE          COMMAND             CREATED             STATUS                       PORTS     NAMES
1eed7f286c4c   gavin/tomcat   "catalina.sh run"   About an hour ago   Exited (137) 8 minutes ago             relaxed_benz
f7aa85d1f7cf   gavin/tomcat   "catalina.sh run"   2 hours ago         Exited (137) 2 hours ago               condescending_tesla

D:\Gavin\Documents>docker start 1eed
1eed
# 在宿主机中数据卷位置删除文件后进入容器查看
D:\Gavin\Documents>docker exec -it 1eed /bin/bash
root@1eed7f286c4c:/usr/local/tomcat# cd webapps
root@1eed7f286c4c:/usr/local/tomcat/webapps# ls
Documents  Music  Pictures  Videos
root@1eed7f286c4c:/usr/local/tomcat/webapps# cd Documents/
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents# ls
desktop.ini  FeedbackHub  gavin.txt  hello.txt
root@1eed7f286c4c:/usr/local/tomcat/webapps/Documents#

当我们在宿主机中删除文件后,容器内的文件也被删除了;
我们的实际需求是宿主机中文件不能被随便删除,要在容器内才有权限删除;

所以我们要对宿主机中文件的权限做出调整;

我们在查看容器的信息时有Mount 的配置信息---->>
在这里插入图片描述

我们需要在启动容器是指定相应的权限
关闭之前运行的容器,然后重新挂载并赋予一定的权限

修改权限
docker run -it -v /宿主机绝对路径:/容器目录:ro 镜像名

D:\Gavin\Documents>docker ps
CONTAINER ID   IMAGE          COMMAND             CREATED             STATUS         PORTS                    NAMES
1eed7f286c4c   gavin/tomcat   "catalina.sh run"   About an hour ago   Up 9 minutes   0.0.0.0:8888->8080/tcp   relaxed_benz

D:\Gavin\Documents>docker stop 1eed
1eed

D:\Gavin\Documents>docker run -it -p 8888:8080 -v  d:/Gavin:/usr/local/tomcat/webapps:ro  gavin/tomcat

在这里插入图片描述
这表示我们在容器中对文件是只读的模式

我们进入容器后尝试删除数据卷映射中的文件

C:\Users\Gavin>docker ps
CONTAINER ID   IMAGE          COMMAND             CREATED         STATUS         PORTS                    NAMES
da9b74d58095   gavin/tomcat   "catalina.sh run"   3 minutes ago   Up 3 minutes   0.0.0.0:8888->8080/tcp   naughty_poitras

C:\Users\Gavin>docker exec -it da9b  /bin/bash
root@da9b74d58095:/usr/local/tomcat# cd webapps
root@da9b74d58095:/usr/local/tomcat/webapps# ls
Documents  Music  Pictures  Videos
root@da9b74d58095:/usr/local/tomcat/webapps# cd Documents/
root@da9b74d58095:/usr/local/tomcat/webapps/Documents# ls
desktop.ini  FeedbackHub  gavin.txt  hello.txt  world.txt
root@da9b74d58095:/usr/local/tomcat/webapps/Documents# rm -rf world.txt
rm: cannot remove 'world.txt': Read-only file system
 

提示文件只读,不能被删除

尝试新建一个文件----提示只读

root@da9b74d58095:/usr/local/tomcat/webapps/Documents# echo 'hello' > ./test.txt
bash: ./test.txt: Read-only file system

在这里插入图片描述

我们查看一下容器信息---->

在这里插入图片描述

DockerFile添加数据卷

在宿主机相应目录下创建一个dockerfile,并在该目录下创建一个文件
在这里插入图片描述
文件内容

文件的基本格式---->>

 # volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash

dataVolumeContainer1 挂载的数据卷1
dataVolumeContainer2 挂载的数据卷2在这里插入图片描述

根据这个DockerFile构建我们的镜像文件
-f DockerFile文件的路径
-t 标签
. 当前路径

docker build -f 文件路径 -t 镜像名 .
在这里插入图片描述

创建一个容器

根据新创建的镜像文件创建一个容器,启动后我们可以看到在容器中创建的有对应的目录运行这个创建好的容器:

C:\Users\Gavin>docker run -it gavin/centos /bin/bash
[root@a6dad6d4aca5 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@a6dad6d4aca5 /]# cd usr/local
[root@a6dad6d4aca5 local]# ls
bin  games    lib    libexec  share  tomcat
etc  include  lib64  sbin     src
[root@a6dad6d4aca5 local]# cd tomcat
[root@a6dad6d4aca5 tomcat]# ls
MYTOM1  MYTOM2
[root@a6dad6d4aca5 tomcat]#

进入对应的目录---->>查看
在这里插入图片描述
那么这两个文件对应的映射文件目录是什么?

在这里插入图片描述
只需要在宿主机中创建文件,然后再到容器对应的文件夹中查看即可;

数据卷容器

命名挂载数据卷的容器---->>数据卷容器,可以实现数据的共享;

数据卷数据的共享实现的方式:

  • 1,挂载的数据卷指向 宿主机中同一个目录

在这里插入图片描述

docker run -it -v 宿主机绝对路径:容器中的路径:权限 容器名

这种方式毕竟不太方便,改一个数据卷位置需要改三个

  • 2,通过父容器挂载子容器的方式实现

在这里插入图片描述
首先启动一个父容器:

C:\Users\Gavin>docker run -it --name father gavin/centos /bin/bash
[root@8812076b6de5 /]#

启动两个子容器

C:\Users\Gavin>docker run -it --name son01 --volumes-from father gavin/centos /bin/bash
 
C:\Users\Gavin>docker run -it --name son02 --volumes-from father gavin/centos /bin/bash
 

在父容器中修改共享资源:

[root@8812076b6de5 /]# cd /usr/local
[root@8812076b6de5 local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src  tomcat
[root@8812076b6de5 local]# cd tomcat/
[root@8812076b6de5 tomcat]# ls
MYTOM1  MYTOM2
[root@8812076b6de5 tomcat]# cd MYTOM1
[root@8812076b6de5 MYTOM1]# ls
[root@8812076b6de5 MYTOM1]# vi hello.txt
[root@8812076b6de5 MYTOM1]# ls
hello.txt
[root@8812076b6de5 MYTOM1]#

在子容器中查看文件:
在这里插入图片描述
尝试在子容器中修改文件:

之后在父容器中查看:
在这里插入图片描述

小结:
挂载数据卷—dockerfile的方式挂载数据卷:

首选创建一个数据卷配置文件 dockerconigfile

然后根据配置文件创建一个镜像

docker build -f dockerconigfile的文件路径 -t 镜像名A .

-f 表示 dockerconigfile的文件路径
-t 表示标签
. 表示当前路径

创建一个数据卷的镜像后,启动一个父类镜像
docker run -it --name father 镜像名A

启动子类镜像:
docker run -it --name son1 --volumes-from father 镜像名A

之后修改数据卷中的文件在其他容器中查看变化;

注意:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

DockerFile

dockerfile 是用来Docker 镜像的构建文件,是由一系列命令参数构成的脚本.

构建三部曲----->>

在这里插入图片描述

首先我们看一下官方给出的DockerFile文件—>这里先看一下Centos的;

在这里插入图片描述

FROM scratch # 创建的镜像来自于哪里 --基础镜像
ADD centos-7-x86_64-docker.tar.xz /

LABEL \  # 描述信息
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20201113" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

CMD ["/bin/bash"]  #CMD命令

ubuntu 即dockerfile
在这里插入图片描述
tomcat的dockerfile

在这里插入图片描述tomcat的DockerFile文件就复杂很多;

一起来看一下—>>

#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#

FROM eclipse-temurin:17-jre-jammy #基础镜像 
# tomcat 环境的一些配置 和 版本信息
ENV CATALINA_HOME /usr/local/tomcat  
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME

# let "Tomcat Native" live somewhere isolated
# 让tomcat隔离运行
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR

# see https://www.apache.org/dist/tomcat/tomcat-10/KEYS
# see also "versions.sh" (https://github.com/docker-library/tomcat/blob/master/versions.sh)
ENV GPG_KEYS A9C5DF4D22E99998D9875A5110C01C5A2F6059E7

ENV TOMCAT_MAJOR 10
ENV TOMCAT_VERSION 10.1.0-M16
ENV TOMCAT_SHA512 ad25f3393324ce42619d6aeeb685186322776b5ba4583453c5e16957fa71cd64fa9f30e379985d57a701be43e9475991312893ee87979e69dd2b51de06510060

COPY --from=tomcat:10.1.0-M16-jdk17-temurin-jammy $CATALINA_HOME $CATALINA_HOME
#tomcat 运行的命令
RUN set -eux; \
	apt-get update; \
	xargs -rt apt-get install -y --no-install-recommends < "$TOMCAT_NATIVE_LIBDIR/.dependencies.txt"; \
	rm -rf /var/lib/apt/lists/*

# verify Tomcat Native is working properly
RUN set -eux; \
	nativeLines="$(catalina.sh configtest 2>&1)"; \
	nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')"; \
	nativeLines="$(echo "$nativeLines" | sort -u)"; \
	if ! echo "$nativeLines" | grep -E 'INFO: Loaded( APR based)? Apache Tomcat Native library' >&2; then \
		echo >&2 "$nativeLines"; \
		exit 1; \
	fi
 #端口信息
EXPOSE 8080
CMD ["catalina.sh", "run"]

DockerFile 的构建过程:

指令规则:
1,每条指令保留字指令都必须为大写字母后面要跟随至少一个参数;
2,指令按照从上到下顺序执行;
3,#表示注解;
4,每条指令都会创建一个新的镜像层,并对镜像提交;

Dokcer执行DockerFile脚本的大致流程如下:
1,从基础镜像运行一个容器;
2,执行一条指令并对容器作出修改;
3,提交一个新的镜像层;
4,docker在基于刚提交的镜像运行一个新的容器;
5,执行dockerfile中下一条指令知道所有指令都执行完成;

由DockerFile----->>构建成一个Docker镜像----->>运行镜像
在这里插入图片描述
指令分析---->>

FROM eclipse-temurin:17-jre-jammy  #基础镜像  来自于jre17

ENV CATALINA_HOME /usr/local/tomcat #tomcat home
ENV PATH $CATALINA_HOME/bin:$PATH  #tomcat bin
RUN mkdir -p "$CATALINA_HOME"  # 创建 tomcat的home
WORKDIR $CATALINA_HOME  #工作路径 tomcat的指定进入目录  即进入容器时所在的目录 

# let "Tomcat Native" live somewhere isolated
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib  #tomcat 本地的 lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR

# see https://www.apache.org/dist/tomcat/tomcat-10/KEYS
# see also "versions.sh" (https://github.com/docker-library/tomcat/blob/master/versions.sh)

ENV GPG_KEYS A9C5DF4D22E99998D9875A5110C01C5A2F6059E7  #GPG 密钥

ENV TOMCAT_MAJOR 10 # tomcat 主版本
ENV TOMCAT_VERSION 10.1.0-M16 # tomcat 版本
ENV TOMCAT_SHA512 ad25f3393324ce42619d6aeeb685186322776b5ba4583453c5e16957fa71cd64fa9f30e379985d57a701be43e9475991312893ee87979e69dd2b51de06510060

COPY --from=tomcat:10.1.0-M16-jdk17-temurin-jammy $CATALINA_HOME $CATALINA_HOME #拷贝的功能
#执行---像是在linux中运行tomcat
RUN set -eux; \
	apt-get update; \
	xargs -rt apt-get install -y --no-install-recommends < "$TOMCAT_NATIVE_LIBDIR/.dependencies.txt"; \
	rm -rf /var/lib/apt/lists/*

# verify Tomcat Native is working properly
RUN set -eux; \
	nativeLines="$(catalina.sh configtest 2>&1)"; \
	nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')"; \
	nativeLines="$(echo "$nativeLines" | sort -u)"; \
	if ! echo "$nativeLines" | grep -E 'INFO: Loaded( APR based)? Apache Tomcat Native library' >&2; then \
		echo >&2 "$nativeLines"; \
		exit 1; \
	fi

#端口 8080
EXPOSE 8080
CMD ["catalina.sh", "run"]

在这里插入图片描述

CMD---->>>指定一个容器启动时要运行的命令Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

ENTRYPOINT---->>指定一个容器启动时要运行的命令ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数;

DockerFile案例—Tomcat

手动编写Dockerfile文件

在这里插入图片描述
构建对应的镜像文件

在使用windows版docker构建时发生了一些小问题—

在这里插入图片描述
我想着不开虚拟机使用 wsl就可以了,然而,这个问题始终没有解决,还是切换到linux虚拟机上吧,毕竟服务器一般使用的是linux;

首先在虚拟机上安装docker:
安装教程:----->>centos8为例子吧,(其他教程网络上有很多)

# 安装docker基础包
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
# 设置稳定仓库
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装最新版本
yum install docker-ce docker-ce-cli containerd.io

# 启动与测试
sudo systemctl start docker  # 启动docker

接着编辑一个dockerfile文件
然后制作镜像---->>

docker build -f dockerfile  -t gcentos:88 .

在这里插入图片描述

启动我们制作的容器,
在这里插入图片描述
刚开始时,镜像里没有配置镜像源,所以会安装一些软件失败,所以我们在制作镜像时需要将宿主机中的一些配置文件拷贝到容器中:

docker copy 命令

在这里插入图片描述

我们可以查一下docker镜像的历史情况:
docker history 镜像名:版本号
在这里插入图片描述

CMD和ENTRYPOINT区别介绍

区别就是cmd会被他下面的cmd命令覆盖掉

FROM centos:latest   
MAINTAINER gavin<gavinlim@126.com> 
ENV MYPATH /usr/local  
WORKDIR $MYPATH   
RUN  sudo yum -y install  vim 
EXPOSE 80
CMD echo $MYPATH
CMD echo "success-----ok"
CMD /bin/bash 

而使用ENTRYPOINT不会被覆盖掉

copy 与add命令的区别

为了便于理解镜像的分层,我们通过一个案例来加深理解:
我们以tomcat为例
首先准备jdk的linux安装包;
另一个是tomcat的linux安装包;

在这里插入图片描述

准备的dockefile文件:

FROM centos  #基础镜像
MAINTAINER gavin<gavinlim@126.com>
#把宿主机当前上下文的suzhijiDoc.txt拷贝到容器/usr/local/路径下
COPY suzhijiDoc.txt  /usr/local/hello.txt
#把java与tomcat添加到容器中
ADD jdk-17_linux-x64_bin.tar.gz /usr/local/
ADD apache-tomcat-9.0.64.tar.gz  /usr/local/
#安装vim编辑器
# RUN yum -y install vim  会运行失败,因为没有配置url
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk-17.0.3.1
ENV CLASSPATH $JAVA_HOME/bin:$JAVA_HOME/lib
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.64
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.64

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.64/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.64/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.64/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.64/bin/logs/catalina.out

执行结果:

[root@localhost local]# docker build -f dockerfile  -t gtomcat:66 .
Sending build context to Docker daemon  4.249GB
Step 1/14 : FROM centos
 ---> 5d0da3dc9764
Step 2/14 : MAINTAINER gavin<gavinlim@126.com>
 ---> Using cache
 ---> a6545d8e1807
Step 3/14 : COPY suzhijiDoc.txt  /usr/local/hello.txt
 ---> Using cache
 ---> e251bc8e2871
Step 4/14 : ADD jdk-17_linux-x64_bin.tar.gz /usr/local/
 ---> Using cache
 ---> 7655925bd264
Step 5/14 : ADD apache-tomcat-9.0.64.tar.gz  /usr/local/
 ---> Using cache
 ---> 48168a9f3828
Step 6/14 : ENV MYPATH /usr/local
 ---> Running in 5b79550a9438
Removing intermediate container 5b79550a9438
 ---> c8e173ccb134
Step 7/14 : WORKDIR $MYPATH
 ---> Running in df19428d41f0
Removing intermediate container df19428d41f0
 ---> 181201bbc8cf
Step 8/14 : ENV JAVA_HOME /usr/local/jdk-17.0.3.1
 ---> Running in 00f5d9c86d36
Removing intermediate container 00f5d9c86d36
 ---> 60f0c5f2052d
Step 9/14 : ENV CLASSPATH $JAVA_HOME/bin:$JAVA_HOME/lib
 ---> Running in 012e9bd8ae72
Removing intermediate container 012e9bd8ae72
 ---> 49891ccc5174
Step 10/14 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.64
 ---> Running in 31bf7b8dc5c6
Removing intermediate container 31bf7b8dc5c6
 ---> af4b2ac729fe
Step 11/14 : ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.64
 ---> Running in 9e4c7f9370eb
Removing intermediate container 9e4c7f9370eb
 ---> 72ee21f32c66
Step 12/14 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 ---> Running in 2150970335c3
Removing intermediate container 2150970335c3
 ---> 8b9b4fdc7a35
Step 13/14 : EXPOSE 8080
 ---> Running in 8162f3456a5c
Removing intermediate container 8162f3456a5c
 ---> 75c620541c3e
Step 14/14 : CMD /usr/local/apache-tomcat-9.0.64/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.64/bin/logs/catalina.out
 ---> Running in f739e7247989
Removing intermediate container f739e7247989
 ---> 258366f0a954
Successfully built 258366f0a954
Successfully tagged gtomcat:66

在这里插入图片描述

运行tomcat
在这里插入图片描述
可以看到运行后直接到了local文件夹下;

再看复制的文件----内容在这里插入图片描述

在这里插入图片描述

启动一下我们的tomcat

[root@localhost dockertomcat]# docker run -it -p 9080:8080 --name mytomcat9 -v /usr/local/tomcat/webapps:/usr/local/apache-tomcat-9.0.64/webapps  --privileged=true  limtomcat:latest
Using CATALINA_BASE:   /usr/local/apache-tomcat-9.0.64
Using CATALINA_HOME:   /usr/local/apache-tomcat-9.0.64
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-9.0.64/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_333
Using CLASSPATH:       /usr/local/apache-tomcat-9.0.64/bin/bootstrap.jar:/usr/local/apache-tomcat-9.0.64/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
tail: cannot open '/usr/local/apache-tomcat-9.0.64/bin/logs/catalina.out' for reading: No such file or directory

在这里插入图片描述
如果不挂在数据卷的情况下运行tomcat,是无法访问8080端口的,
在这里插入图片描述
这个就没挂载数据卷—虽然我们在自定义镜像时add 命令解压的tomcat包中有 index.jsp但是我们在访问时却无法访问;
在这里插入图片描述

数据库–mysql部署

首先下载镜像----->>

[root@localhost dockermysql]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
 # 运行mysql服务器实例
[root@localhost dockermysql]# docker run --name limmysql -e MYSQL_ROOT_PASSWORD=12345 -d mysql:latest 
e2b61240e28c732f7d32fbdc33b64a0f41c285637d349dab6cdbbd1ff9fb10a9

在这里插入图片描述

命令解析—

docker run  -it  --name mysql8.0.7 -p 3308:3306  -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest 

–name mysql的名字
-e是mysql初始化时的root用户配置 密码
-d 是守护式运行的 mysql:运行版本

运行之后需要配置连接到mysql 服务器

进入容器—>>

[root@localhost zzy]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
0075ecab2f87   mysql:latest   "docker-entrypoint.s…"   57 seconds ago   Up 53 seconds   33060/tcp, 0.0.0.0:6666->3306/tcp, :::3308->3306/tcp   mysql8.0.7
[root@localhost zzy]# docker exec -it 0075 /bin/bash  #进入容器
root@0075ecab2f87:/# mysql -u root -p  #登录mysql
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
root@0075ecab2f87:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

建立远程链接

直接远程连接会出现错误,因为默认mysql 8的密码加密方式是caching_sha2_password身份验证机制,而一般链接数据库的工具使用的是mysql_native_password
在这里插入图片描述

我们需要修改一下用户权限,
查看用户的host---->>
在这里插入图片描述
root用户的host符合条件不需要修改;

mysql> show databases 
    -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.02 sec)

mysql> use mysql ;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> grant all privileges on *.* to 'root'@'%';  # root 默认就是拥有全局权限
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges ;
Query OK, 0 rows affected (0.02 sec)
# 修改密码加密方式
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)


在远程链接数据库—>>
在这里插入图片描述

Redis的部署

拉取镜像:

[root@localhost zzy]# docker pull redis 
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Pull complete 
c7a4e4382001: Pull complete 
4044b9ba67c9: Pull complete 
c8388a79482f: Pull complete 
413c8bb60be2: Pull complete 
1abfd3011519: Pull complete 
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
[root@localhost zzy]# 

运行redis,需要配置文件,

使用默认配置文件运行一个reids实例

[root@localhost zzy]# docker run --name redis7 -d redis:latest
9e51d073b007124add859ae64e90cc541b7cc6eba43bcf0918456ed1c26a95e5
[root@localhost zzy]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS      NAMES
9e51d073b007   redis:latest   "docker-entrypoint.s…"   6 seconds ago   Up 4 seconds   6379/tcp   redis7
[root@localhost zzy]# 

进入容器—>>

[root@localhost zzy]# docker exec -it 9e51 bash
root@9e51d073b007:/data# redis-cli   
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name gavin
OK
127.0.0.1:6379> set age 19
OK
127.0.0.1:6379> get name
"gavin"
127.0.0.1:6379> get age
"19"
127.0.0.1:6379> 

当然也可以根据自己需要配置redis.conf文件

挂载数据卷的方式来实现

docker run -p 6379:6379 -v /usr/local/redis/data:/data -v
/root/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:4.0
redis-server /usr/local/etc/redis/redis.conf --appendonly yes

挂载的方式参加上面数据卷的部分;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeMartain

祝:生活蒸蒸日上!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值