docker精髓
作者:互联网
笔记
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
标签:bin,容器,local,精髓,镜像,docker,root 来源: https://www.cnblogs.com/GGhot/p/14695960.html