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
挂载的方式参加上面数据卷的部分;