https://www.bilibili.com/video/BV1og4y1q7M4?p=21
目录挂载: 将容器内的目录,挂载到宿主机上面 !
容器的持久化和同步操作!
容器间可以数据共享
命令挂载
背景知识:
docker run -it -p 主机端口:容器端口 (上一阶段学到的 部署tomcat服务器时候的知识)
命令挂载
docker run -it -v 主机目录:容器目录
docker run -it -v /home/ceshi:/home centos /bin/bash
将宿主机的 /home/ceshi 目录 与 centos容器 的 /home 目录建立映射关系
docker inspect **
Mounts : **** 挂载 -V 卷
同步过程是双向绑定的
cd /home/ceshi
docker attach **
cd /home
容器卷可以一对一,也可以一对多
针对配置文件 可以是一对多
docker run 注意事项
// 注意启动centos -it 参数一定要添加
// step1 运行centos ,将在宿主机创建目录 /home/centosfile 映射 启动容器的 /home目录
docker run -it -v /home/centosfile:/home centos:centos7 /bin/bash
// 在宿主机 cd /home 然后 ll 看到已经有新增的centosfile 目录
//docker ps
//docker inspect *** // 查看详细信息的mount配置情况,如下图
容器运行状态下
修改 宿主机 – 容器数据改变
修改 容器 – 宿主机数据改变
容器停止状态下
修改 宿主机 – (启动后)容器数据改变
//step01
// 宿主机/home/centosfile 目录下 touch test1.txt test2.txt 查看容器的变化
// 所以施维英项目修改配置文件的时候,是不需要重启服务器的
//step02 容器/home 目录 下新增 image1.txt ,查看 宿主机 /home/centosfile 变化
//step03 docker stop ***
//宿主机/home/centosfile 目录下 touch out1.txt
//docker restart ****
//docker attach ***
https://www.bilibili.com/video/BV1og4y1q7M4?p=22
实战安装mySQL
[root@aliyunleo ~]# docker pull mysql:5.7
[root@aliyunleo ~]# docker run -d -p 3310:3306 \
> -v /home/mysql/conf:/etc/mysql/conf.d \
> -v /home/mysql/data:/var/lib/mysql \
> -e MYSQL_ROOT_PASSWORD=123456 \
> --name mysql01 mysql:5.7
08b96b95a4bc045e5a844ce57930e10921068b96c8338edf3fcf13425d1a3379
[root@aliyunleo ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08b96b95a4bc mysql:5.7 "docker-entrypoint.s…" 4 seconds ago Up 4 seconds 33060/tcp, 0.0.0.0:3310->3306/tcp mysql01
[root@aliyunleo ~]#
docker search mysql — 查询 mysql
docker pull mysql:5.7 — 获取 mysql 5.7
docker images
hub.docker.com 中 查询 mysql的配置示例
-d 后台运行
-p 端口映射
-v 卷挂载 本地:容器内
-e 环境配置 root:123456
–name 容器名字
docker run -d -p 3310:3306
-v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
–name mysql01 mysql:5.7
启动成功后,再本地使用sqlyog链接测试
-h -u -p
链接到服务器的3310 ,3310 映射3306
容器删除后,挂载到本地数据不会丢失,实现了容器数据持久化功能
docker rm -f mysql01
docker ps -a
/home/mysql/data/mysql 目录下的文件 与 mysql 表结构的是一致的
新增一个表看 /home/mysql/data/mysql 目录的文件变化,发现他们是同步
新增表后,看到aliyun服务器上面的数据也同步了。
通过具名挂载,方便找到一个卷,大多数情况下使用 具名挂载
1. 匿名挂载 -v 容器内路径
2. 具名挂载 卷名:容器内路径
3. 指定路径 /宿主机路径::容器内路径 ?? 没有成功过 不清楚是:还是::
匿名挂载 -v ** 后面只跟一个参数
-v 只写了容器类路径 没有写 容器外 路径
-P 随机映射端口
// type01: --- 匿名类
docker run -d -P --name nginx02 -v /etc/nginx nginx
docker volume --help
docker volume ls --- 查看卷文件
[root@hell39 etc]# docker volume ls
DRIVER VOLUME NAME
local f8b7c80daf6473e8b1e06fe73cf99b4cd6ed3cc80cd8cfdfdeb8ba79a4b97f44
//type02: 具名挂载
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
[root@hell39 etc]# docker volume ls
DRIVER VOLUME NAME
local f8b7c80daf6473e8b1e06fe73cf99b4cd6ed3cc80cd8cfdfdeb8ba79a4b97f44
local juming-nginx
docker volume ls
看到会有 juming-nginx 类
-v 卷名:容器内路径
docker volume inspect juming-nginx
所有没有指定目录的卷都放在
/var/lib/docker/volumes/juming-nginx/data
---- 查看所有挂载文件 列表
[root@hell39 etc]# docker volume ls
DRIVER VOLUME NAME
local f8b7c80daf6473e8b1e06fe73cf99b4cd6ed3cc80cd8cfdfdeb8ba79a4b97f44
local juming-nginx
----查看某个挂载文件位置
[root@hell39 etc]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2021-03-14T03:14:35-07:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
[root@hell39 etc]# cd /var/lib/docker/volumes
[root@hell39 volumes]# ls
backingFsBlockDev juming-nginx
f8b7c80daf6473e8b1e06fe73cf99b4cd6ed3cc80cd8cfdfdeb8ba79a4b97f44 metadata.db
[root@hell39 volumes]# ll
total 24
brw-------. 1 root root 8, 3 Mar 13 19:17 backingFsBlockDev
drwx-----x. 3 root root 19 Mar 14 03:08 f8b7c80daf6473e8b1e06fe73cf99b4cd6ed3cc80cd8cfdfdeb8ba79a4b97f44
drwx-----x. 3 root root 19 Mar 14 03:14 juming-nginx
-rw-------. 1 root root 32768 Mar 14 03:14 metadata.db
[root@hell39 volumes]#
拓展:
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
ro: readonly 只读 --- 这个路径只能通过宿主机操作,容器内无法操作
rw: readwrite 可读可写
[root@hell39 docker-test-volume]# cat dockerfile1
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end---"
CMD /bin/bash
[root@hell39 docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t weilei/centos01 .
[root@iZm5e72eis7guszkqcstrfZ docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
weilei/centos01 latest 5657035841ac 4 minutes ago 215MB
docker inspect 5657035841ac
docker run -it 5657035841ac /bin/bash
ls -- 会看到 目录比正常的centos 多了 volume1 volume2 两个目录 ,
按照数据卷挂载的定义,在 volume1 文件夹下新增修改数据 ,会自动同步到宿主机对应的空间表 /var/lib/docker/volumes/89cc7e5f8a138a1090d6b9e905b29f0614ff8d1ab0eba5f55c5d714895527c40/_data
docker inspect 4cef501ec18d ---查看启动的容器
会看到 volume01 对应的宿主机空间
"Mounts": [
{
....... ,
"Destination": "volume02",
.......
},
{
"Type": "volume",
"Name": "89cc7e5f8a138a1090d6b9e905b29f0614ff8d1ab0eba5f55c5d714895527c40",
"Source": "/var/lib/docker/volumes/89cc7e5f8a138a1090d6b9e905b29f0614ff8d1ab0eba5f55c5d714895527c40/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
// 回到宿主机
cd /var/lib/docker/volumes/89cc7e5f8a138a1090d6b9e905b29f0614ff8d1ab0eba5f55c5d714895527c40/_data
ls 查看宿主机 内容时候有变化
[root@aliyunleo home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@aliyunleo home]# docker run -d -p 3311:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
4199862c03f465839e8c251c0bef68f0dd25554a4acc0f2db4219d10b6e0d4f3
[root@aliyunleo home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4199862c03f4 mysql:5.7 "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 33060/tcp, 0.0.0.0:3311->3306/tcp mysql02
08b96b95a4bc mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 33060/tcp, 0.0.0.0:3310->3306/tcp mysql01
数据卷容器
两个容器同步数据 (两个mysql同步数据)
docker images
docker run -it --name docker01 5657035841ac
ctrl+p+q
docker run -it --name docker02 --volumes-from docker01 weilei/centos01
ctrl+p+q
docker run -it --name docker01 *****
ctrl+p+q
docker attach ****
cd volume01
touche ***
docker01 创建的数据同步到了 docker02
https://www.bilibili.com/video/BV1og4y1q7M4?p=27
构建步骤
1. 编写一个 dockerfile 文件
2. docker build 构建一个镜像
3. docker run 运行镜像
4. docker push 发布镜像 (dockhub / 阿里云仓库 )
dockerFile构建过程
百度 dockerfile 命令
基础知识
1. 每个保留关键字(指令) 都必须是大写字母
2. # 注释
3. 每行指令创建一个镜像层
dockerfile ,十分简单 ,之前交Jar包,现在交docker镜像,成为企业交付标准
步骤:
1. dockerFile : 构建文件,定义了步骤,
2. dockerImages: 通过dockerFile 构建生成的镜像,最终发布的产品,原来是Jar,war
3. docker容器: 容器是镜像运行起来其提供服务器的
百度 dockerfile 命令
基础知识
1. 每个保留关键字(指令) 都必须是大写字母
2. # 注释
3. 每行指令创建一个镜像层
dockerfile ,十分简单 ,之前交Jar包,现在交docker镜像,成为企业交付标准
步骤:
1. dockerFile : 构建文件,定义了步骤,
2. dockerImages: 通过dockerFile 构建生成的镜像,最终发布的产品,原来是Jar,war
3. docker容器: 容器是镜像运行起来其提供服务器的
dockerFile 指令说明
FROM : 基础镜像 centos
MAINTAINER : 作者
RUN: 镜像构建时候,需要运行的命令
ADD: 步骤:tomcat ...
WORKDIR: 镜像的工作目录
VOLUME: 挂载的目录位置
EXPOSE: 暴露端口,此处有了,不用-p 了
CMD: 命令1 (指定容器启动时候要运行的命令,只有最后一个生效)
ENTRYPOINT: 命令2,(可以追加的命令)
ONBUILD: 当构建一个被继承的dockerFile此时会运行它 --触发指令
COPY : 类似 ADD ,将文件COPY到镜像中
ENV: 构建的时候设置环境变量 -e ( 如: 设置使用内存大小 、 设置用户名密码 )
-----------------构建自己的centos
cd home/dockerfile/
vim mydockerfile-centos
FROM centos
MAINTAINER leowei<wei198621@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end------"
CMD /bin/bash
2. 通过文件构建镜像 (注意最后有.)
----- f 文件名 t (target) 目标
docker build -f mydockerfile-centos -t mycentos:0.1 .
3.运行
docker images
docker run -it mycentos:0.1
pwd -- 默认工作目录为 文件中编辑的 /usr/local
ifconfig -- 可以使用
vim test -- 可以使用
docker history 查看镜像的制作过程
docker images
docker history *** (imageid)
[root@hell39 mydockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
leo/centos 1.3 dfb6da3a432a 3 hours ago 209MB
nginx latest 6084105296a9 2 days ago 133MB
registry.cn-hangzhou.aliyuncs.com/gousheng/schwing_web 1.0 890c08a70644 2 days ago 376MB
hello-world latest d1165f221234 8 days ago 13.3kB
centos latest 300e315adb2f 3 months ago 209MB
[root@hell39 mydockerfile]# docker history dfb6da3a432a
IMAGE CREATED CREATED BY SIZE COMMENT
dfb6da3a432a 3 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
aa2ad38c1b25 3 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
4e249a9f074d 3 hours ago /bin/sh -c #(nop) VOLUME [volume01 volume02] 0B
300e315adb2f 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
cmd 指令替换(不可以累加)
entrypoint 指令累加
// ************* 01 测试cmd命令 ,只有最后的CMD 指令被运行
vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
----(. 注意最后有点)
docker build -f dockerfile-cmd-test -t cmdtest .
---ok
docker run *****
---报错 向达到 ls -a -l ,的目的,实际是 -l 替换了 ls -a -l 所以报错
docker run **** -l
------OK 用 ls-l 替换原有的CMD指令 ls -a
docker run **** ls -l
// *************02 测试entrypoint-命令
vim dockerfile-entrypoint-test
FROM centos
ENTRYPOINT ["ls","-a"]
docker build -f dockerfile-entrypoint-test -t entrypointtest .
---ok
docker run *****
----ok
docker run **** -l
------- failed
docker run **** ls -l
[root@hell39 mydockerfile]# docker run entrypointtest ls -l
ls: cannot access 'ls': No such file or directory
https://www.bilibili.com/video/BV1og4y1q7M4?p=30
本节在此文章单独做了一次,成功运行
https://blog.csdn.net/wei198621/article/details/114684423
vim Dockerfile
FROM centos
MAINTAINER leo<wei1986@126.com>
COPY readme.txt /usr/local/readme.txt
# ADD 添加的命令会自动解压 到后面的目录
ADD jdk-8u141-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.33.tar.gz /usr/local/
# RUN 会走正常的下载流程
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 注意此处是 jdk1.8.0_141 不是 jdk1.8.0.141
ENV JAVA_HOME /usr/local/jdk1.8.0_141
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.33
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.33
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.33/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.33/bin/logs/catalina.out
----缩略写法 默认是到当前目录下找 Dockerfile
docker build -t diytomcat .
----全部参数
docker build -f Dockerfile -t diytomcat .
docker run -d \
-p 9090:8080 \
--name leotomcat \
-v /home/tomcat8source/test:/usr/local/apache-tomcat-9.0.33/webapps/test \
-v /home/tomcat8source/tomcatlogs/:/usr/local/apache-tomcat-9.0.33/logs \
diytomcat
docker ps
docker exec -it 00996826b3af /bin/bash
-v /home/tomcat8source/test:/usr/local/apache-tomcat-9.0.33/webapps/test \
本节在此文章单独做了一次,成功运行
https://blog.csdn.net/wei198621/article/details/114684423