笔记
docker精髓
1.容器数据卷
什么是容器数据卷?
数据,如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySql,容器删了,删库跑路!需求,MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
总结:容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
docker run -it -v /home/ceshi:/home centos /bin/bash
docker inspect 镜像id
数据卷技术 ==数据共享(双向)==
容器内
[root@87f99907bc64 /]# cd home/
[root@87f99907bc64 home]# ls
[root@87f99907bc64 home]# touch test.java
[root@87f99907bc64 home]# ls
test.java
主机
[root@iZwz9h33ok2v27xzrcdv8hZ ceshi]# ls
test.java
主机中
vim test.java
容器中
cat test.java
好处:修改只需要在本地服务器修改,容器内会自动同步.
实战:安装MySQL
思考:MySQL的数据持久化的问题
# 运行容器 需要做数据挂载
# 安装启动mysql,需要配置密码
docker run -d -p 3344: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
-d 后台运行
-p 端口运行
-v 卷挂载
-e 环境配置
--name 容器名字 命名
# navicat本地连接到服务器mysql成功
本地navicat创建一个数据库,服务器查看是否同步
删除容器,挂载到本地的数据卷依旧没有消失,实现了容器数据持久化功能
具名和匿名挂载
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的卷的情况
docker volume ls
[root@iZwz9h33ok2v27xzrcdv8hZ ~]# docker volume ls
DRIVER VOLUME NAME
local af44a34cd0e01786de0d715da74c655702fc1925e556fa46e1d2c85a8eb82fcd
# 这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器名字
===================================================
# 具名挂载
[root@iZwz9h33ok2v27xzrcdv8hZ ~]# docker volume ls
DRIVER VOLUME NAME
local af44a34cd0e01786de0d715da74c655702fc1925e556fa46e1d2c85a8eb82fcd
local juming-nginx
# 查看一下这个卷
[root@iZwz9h33ok2v27xzrcdv8hZ ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2021-02-24T10:12:47+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录的情况下都在 /var/lib/docker/volumes/juming-nginx/_data
如果确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有了限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro只要看ro就说明这个路径只能通过宿主机来操作,容器内部无法操作!
2.DockerFile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本.
通过脚本可以生成镜像,镜像是一层一层的,脚本是一个一个命令
创建一个dockerfile1文件
文件中的内容 指令(大写) 参数
FORM centos
VOLUME ["volume01","volume02"]
CMD echo "===end==="
CMD /bin/bash
docker build -f /root/home/docker-test-volume/dockerfile1 -t gg/centos .
查看自己生成的镜像
[root@iZwz9h33ok2v27xzrcdv8hZ docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gg/centos latest 6d6cb0588226 25 seconds ago 209MB
数据卷容器
实现容器间的数据共享
docker run -it --name docker01 gg/centos
docker run -it --name docker02 --volumes-from docker01 gg/centos
[root@iZwz9h33ok2v27xzrcdv8hZ ~]# docker attach f6b818c01c98
[root@f6b818c01c98 /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
[root@f6b818c01c98 /]# cd volume01/
[root@f6b818c01c98 volume01]# touch docker01
[root@f6b818c01c98 volume01]# ls
docker01
docker attach 00446efc421d
[root@00446efc421d /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
[root@00446efc421d /]# cd volume01/
[root@00446efc421d volume01]# ls
docker01
删除了docker01容器,docker03的数据依旧在
结论:容器之间配置信息的传递,数据卷容器的声明周期一直持续到没有容器使用为止.
但是一旦持久化到了本地,本地的数据是不会删除的.
DockerFile构建过程
1.编写一个dockerfile文件
2.docker build 构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像(DockerHub,阿里云镜像仓库)
DockerFile的指令
FORM # 基础镜像 scratch
MAINTAINER # 镜像是谁写的 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,tomcat压缩包,添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录位置
EXPOSE # 指定暴露端口
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加执行
ONBUILD # 当构建一个被继承的dockerfile这个时候就会运行ONBUILD 的指令,触发指令
COPY # 类似ADD命令,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
实战
创建一个组件的centos
1.编写dockerfile文件
FROM centos
MAINTAINER gg<1183681129@qq.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.通过文件构建镜像
docker build -f mydockerfile-centos -t mycentos:0.1 .
3.测试运行镜像
查看镜像更新历史
[root@iZwz9h33ok2v27xzrcdv8hZ dockerfile]# docker history dbc92c21d09b
IMAGE CREATED CREATED BY SIZE COMMENT
dbc92c21d09b 4 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
d4e0717081e0 4 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
13c33ae5a948 4 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
697c58c32c53 4 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
6dab71e85922 4 minutes ago /bin/sh -c yum -y install net-tools 23.3MB
64f7dc23a764 4 minutes ago /bin/sh -c yum -y install vim 58MB
0f72ceef7077 5 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
14ee2c54b9e3 5 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
8b3005407366 5 minutes ago /bin/sh -c #(nop) MAINTAINER gg<1183681129@… 0B
300e315adb2f 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
CMD和ENTRYPOINT的区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试cmd
FROM centos
CMD ["ls","-a"]
docker build -f docker-cmd-test -t cmdtest .
docker run id
CMD命令被覆盖,报错
[root@iZwz9h33ok2v27xzrcdv8hZ dockerfile]# docker run fb0fc261ebee -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
[root@iZwz9h33ok2v27xzrcdv8hZ dockerfile]# docker run fb0fc261ebee ls -al
实战:Tomcat镜像
1.准备镜像文件tomcat压缩包,jdk压缩包
2.编写Dockerfile文件(文件命名为Dockerfile不用添加-f参数指定文件)
[root@iZwz9h33ok2v27xzrcdv8hZ dockerTest]# cat Dockerfile
FROM centos
MAINTAINER gg<1183681129@qq.com>
COPY README.txt /usr/local/README.txt
ADD apache-tomcat-9.0.41.tar.gz /usr/local/
ADD jdk-8u162-linux-x64.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_162
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.41
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.41
ENV PATH $PATH:$JAVA_HOME/bin:$CATLINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.41/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.41/bin/logs/catalina.out
3.构建镜像
docker build -t diytomcat .
4.启动镜像
docker run -d -p 9090:8080 --name ggtomcat1 -v /root/dockerTest1/tomcat/test:/usr/local/apache-tomcat-9.0.41/webapps/test -v /root/dockerTest1/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.41/logs diycomcat
5.访问测试
6.发布项目
在本地目录下发布项目
/root/dockerTest1/tomcat/test
© 著作权归作者所有
举报
发表评论
0/200