docker数据卷/目录挂载
这里所谓的数据卷/目录类似于一个共享文件/文件夹,数据卷的文件和数据内容共享且相互绑定,通常是宿主机映射到容器内目录,且该数据卷是虚拟的。从而达成了对容器内数据以及配置等文件的操作和读取的功能,在对数据库,Nginx等部署时进行挂载,减少对容器内部的二次配置。
当然数据卷可以先单独创建,在创建容器时通过使用--mount
进行挂载
# 创建一个数据卷:docker volume create 数据卷名称
docker volume create volumetest
# 查看已有数据卷
docker volume ls
# 查看数据卷的信息: docker volume inspect 数据卷名称
docker volume inspect volumetest
# 输出,/var/lib/docker/volumes/ 这个目录是默认数据卷的目录
[
{
"CreatedAt": "2024-06-17T09:36:45+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/volumetest/_data",
"Name": "volumetest",
"Options": null,
"Scope": "local"
}
]
#创建容器时挂载
docker run -itd \
> --name=volumetest \
> --mount source=数据卷名称, target=容器对应的目录 \
> 数据卷名
# 删除数据卷:docker volume rm 数据卷名称
docker volume rm volumetest
需要挂载目录时,--mount
还需要添加参数 type=bind
,可以用参数-v
代替,-v
灵活度更高且不需要创建数据卷,推荐使用-v
。
# 使用--mount
--mount type=bind, source=数据卷名, target=容器内目标目录
# 使用-v
-v 宿主机挂载目录:容器目标目录
在容器创建时可使用参数-v
配置目录挂载,参数说明:-v 宿主机目录:容器内目录
,下面是创建MySQL容器并配置的示例,符号反斜杠\
仅为换行方便查看,无实际意义。
# 使用 -v
docker run -d \
> -p 3306:3306 \
> --name mysqltest \
> -v /root/mysql/conf:/etc/mysql/conf.d \
> -v /root/mysql/logs:/logs \
> -v /root/mysql/data:/var/lib/mysql \
> -e MYSQL_ROOT_PASSWORD=123 \
> mysql
Dockerfile
Dockerfile是一种文本文件,常用来自定义镜像,内容是一条条镜像的构建说明的指令。
Dockerfile构建镜像是一层一层建的。
Dockerfile文件常用指令:
# FROM:基础镜像信息,默认优先从本地查找,本地不存在则从远程拉取
FROM openjdk:8-jre-slim
# RUN:镜像构建时的操作指令,类似于以shell执行方式执行后面的指令
RUN echo '这是一个测试案例,'
# COPY:将主机目录或文件复制到镜像容器指定路径 <源路径> <目标路径>
COPY ./java.jar /app.jar
# ADD:与COPY功能类似,但ADD可以自动解压gzip, bzip2 以及 xz文件并复制到目标路径,官方推荐使用COPY
# 本例中这条命令和COPY功能一样
ADD ./java.jar /app.jar
# EXPOSE:生命容器运行时监听的端口
EXPOSE 8080
# VOLUME:容器的挂载点或声明卷,可在docker run 中使用-v修改
VOLUME <路径>
# CMD:类似RUN命令,但是CMD是在docker容器启动run时运行,RUN是在镜像构建build时运行
# 这条指令相当于运行 java -jar /app.jar
CMD ["java", "-jar", "/app.jar"]
Dockerfile文件编写好后,使用docker build
构建镜像。
docker build -t 镜像名:tag标签 Dockerfile文件位置
不写标签默认是latest,如:
docker build -t testjar .
其中.
表示Dockerfile在当前目录下
构建好镜像后使用docker images
查看镜像列表
[root@localhost upload]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_java8 8-jre 54301e8a1f0d 2 years ago 194MB
openjdk 8-jre-slim 54301e8a1f0d 2 years ago 194MB
mysql latest 3218b38490ce 2 years ago 516MB
moby/buildkit buildx-stable-1 19340e24de14 2 years ago 144MB
testjar latest b8604a3fe854 5 seconds ago 218MB
然后再可以使用docker run运行容器
docker run -d \
> --name 容器名称 \
> -p 宿主机端口:容器监听端口 \
> -v 宿主机挂载目录:容器内目标目录 \
> testjar
Docker容器连接
都知道Docker容器之间是隔离不互通的,那当这边的一个容器服务需要调用另一个容器的服务时应该怎么办,这时就要考虑容器连接
实现容器互联方式有多种,比较常用的是network网络,还有端口映射。
network网络
我们可以通过将两个或多个容器加入到同一个网络实现容器之间的互联
- 创建网络
docker network create -d bridge netname
-d:指定 Docker 网络类型,有 bridge、overlay
- 查看网络
docker network ls
- 运行容器连接网络
使用--network
参数连接
docker run -itd --name test1 --network netname 镜像名
docker run -itd --name test2 --network netname 镜像名
进入容器ping测试 连通性,ping test1
, ping test2
当有多个容器需要互联时,推荐使用Compose方式