【docker】之基础篇二

目录

一、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>,这是因为新镜像跟原来镜像的名称和标签相同。

相关推荐
小p6 小时前
docker学习7:docker 容器的通信方式
docker
小p8 小时前
docker学习5:提升Dockerfile水平的5个技巧
docker
小p8 小时前
docker学习3:docker是怎么实现的?
docker
小p2 天前
docker学习: 2. 构建镜像Dockerfile
docker
小p2 天前
docker学习: 1. docker基本使用
docker
蝎子莱莱爱打怪2 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
崔小汤呀3 天前
Docker部署Nacos
docker·容器
缓解AI焦虑3 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
1candobetter3 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka
DianSan_ERP3 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet