目录
一、docker的数据管理
在生产环境中使用docker,需要对数据进行持久化,或者多个容器之间进行数据共享。
容器中管理数据的两种方式:
数据卷:容器内的数据直接映射到本地主机环境
数据卷容器:使用特定的容器维护数据卷
1、数据卷
数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似LINUX的mount行为。
1.创建数据卷
bash
[root@gang ~]# docker volume create -d local test
数据卷的位置:
[root@gang ~]# ll /var/lib/docker/volumes/
docker volume 还支持 inspect(查看详细信息),ls(列出已有数据卷),prune(清理无用数据卷),rm(删除数据卷)等。
2、绑定数据卷
使用旧的-v标记可以在容器内创建一个数据卷:
c
docker run -d -P --name=web -v /web:/opt/web centos:7
这种挂载数据卷的默认权限是读写(rw),用户也可以通过ro指定为只读:
加了:ro之后,容器内对挂载数据卷中的数据也就无法修改了。
2、数据卷容器:
如果用户需要在多个容器之间共享一些可持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载的。
创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到 /dbdata:
c
[root@gang ~]# docker run -it -v /dbdata --name=dbdata centos:7
然后在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷。
cpp
[root@gang /]# docker run -it --volumes-from dbdata --name=db2 centos:7
可以发现这几个容器共享同一个目录
如果删除了挂载的容器dbdata,数据卷并不会自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。
二、端口映射与容器互联
1.从外部访问容器应用
在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
要让外部访问这些应用时,可以通过 -P或-p参数来指定端口映射。
使用-P大写标记时,docker会随机映射一个高端端口到内部容器开放的网络端口。
-p:指定可以映射的端口。
cpp
[root@redhat nginx]# docker run -d -P training/webapp python app.py
1、映射到所有接口的地址:
bash
[root@redhat nginx]# docker run -d -p 5000:5000 training/webapp python app.py
2、映射到指定地址的指定端口:
bash
[root@redhat nginx]# docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
3.映射到指定地址的任意端口:
bash
[root@redhat nginx]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
容器之间的通信
使用link方式让容器之间
三、Docker查看日志
docker logs 容器名字/id
docker logs -f -tail=10 mytomcat
docker logs -t --since="2024-01-18" mytomcat
bash
--since :此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
-f:查看实时日志。
-t:查看日志产生的日期
-tail-10:查看最近的10条日志
四、Dockerfile定制镜像
当官方的镜像不能满足我们的需求时,我们就需要定制镜像
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本时dockerfile。
Dockerfile是个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每条指令的内容,就是描述该层应当如何构建。
1、DockerFile常用的命令
1.FROM
功能为指定基础镜像,并且必须是第一条指令。 如果不以任何镜像为基础,那么写法为:FROM scratch。 同 时意味着接下来所写的指令将作为镜像的第一层开始 语法:
c
FROM <image>
FROM <image>:<tag>
2.RUN
RUN指令在镜像的构建过程中执行特定的命令,并生成一个中间镜像。
shell 格式:
c
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
exec格式:
c
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多 少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 RUN书写时的换行 符是\
如果想要具体了解Dockerfile的常用命令可以去看这篇文章:https://blog.csdn.net/m0_51913750/article/details/131563704?
2、DockerFile实操
案例1:创建一个镜像(基于tomcat),里面要有一个index.html页面,并写入hello,docker!
创建一个dockerfile的目录并创建一个Dockerfile的文件。
mkdir /dockerfile
注意:这个文件名必须为Dockerfile
c
[root@redhat dockerfile]# cat Dockerfile
FROM tomcat:7
WORKDIR /usr/local/tomcat/webapps/
RUN mkdir ROOT/ && echo 'hello docker!' > ./ROOT/index.html
bash
[root@redhat dockerfile]# docker build -t mytomcat:1.0 . .表示当前文件
可以用docker images验证是否成功了。
虚悬镜像:没有名字,也没有标签,为< none>,这是因为新镜像跟原来镜像的名称和标签相同。