当前位置 博文首页 > 范栩的博客:Docker进阶学习(容器数据卷、安装Mysql、DockerFil

    范栩的博客:Docker进阶学习(容器数据卷、安装Mysql、DockerFil

    作者:[db:作者] 时间:2021-08-31 09:44

    Docker进阶学习

    容器数据卷

    docker的理念是将应用和环境打包成一个镜像。

    如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

    需求:容器中的数据可以存在本地

    容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

    这就是卷技术!目录的挂在,将我们容器内的目录,挂载到Linux上面!
    在这里插入图片描述

    容器的持久化和同步操作!容器间也是可以共享的

    使用数据卷

    方式一 :直接使用命令来挂载 -v

    docker run -it -v 主机目录:容器内目录
    
    [root@VM-8-14-centos home]# docker run -it -v /home/test:/home centos /bin/bash
    #容器内
    [root@66917585e46c /]# cd home
    [root@66917585e46c home]# ls
    [root@66917585e46c home]# mkdir FANXU
    #主机内
    [root@VM-8-14-centos home]# ls
    lighthouse  MUYU  test
    [root@VM-8-14-centos home]# cd test
    [root@VM-8-14-centos test]# ls
    FANXU
    
    

    无论是从主机的test目录添加文件,或是从容器中的home下添加文件,两边都会自动进行同步。

    好处:我们以后修改只需要在本地修改即可,容器内会自动进行同步

    安装Mysql

    #获取容器
    [root@VM-8-14-centos test]# docker pull mysql:5.7
    5.7: Pulling from library/mysql
    e1acddbe380c: Already exists 
    bed879327370: Pull complete 
    03285f80bafd: Pull complete 
    ......
    Digest: sha256:7cf2e7d7ff876f93c8601406a5aa17484e6623875e64e7acc71432ad8e0a3d7e
    Status: Downloaded newer image for mysql:5.7
    docker.io/library/mysql:5.7
    
    #运行容器:-d后台运行 -p设置端口 -v设置挂载路径 -e 环境配置,MYSQL_ROOT_PASSWORD设置mysql密码(必填)
    [root@VM-8-14-centos test]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password --name mysql mysql:5.7
    2da46ed95ba3e66612e25d4f77129e72d209bd1cdd26edd47d82816e07820a89
    
    

    在这里插入图片描述

    具名和匿名挂载

    #匿名挂载
    -v 容器内路径! -P 随机映射端口
    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
    #查看所有的volume的情况
    [root@VM-8-14-centos data]# docker volume ls
    DRIVER    VOLUME NAME
    local     8613276e64c7d34e01b2366e80d6d2491dc2ae00f0c5ee6062dfc71a0bc897cb
    #这种就是匿名挂载,在-v中只写了容器内的路径,没有写容器外的路径
    
    #具名挂载
    docker run -d -P --name nginx01 -v /etc/nginx nginx
    [root@VM-8-14-centos data]# docker volume ls
    DRIVER    VOLUME NAME
    local     juming-nginx
    # 通过-v 卷名:容器内路径  命名
    
    #查看这个卷的详细信息
    docker volume inpsect juming-nginx
    
    

    所有docker容器内的卷,在没有指定目录的情况下都是存在/var/lib/docker/volumes/xxx/_data

    推荐使用具名挂载

    扩展

    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代表read only 只读
    #rw代表 read write 读写
    #默认为读写,如果使用ro的话,那么只能从容器内部进行写操作,容器外只能读。
    

    DockerFile挂载

    Dockerfile就是用来 构建docker镜像的构建文件!命令脚本!

    通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!

    使用dockerfile挂载文件夹

    #创建一个dockerfile文件,名字可以随机,建议 Dockerfile
    #文件中的内容 指令(大写) 参数
    [root@VM-8-14-centos docker-test-volume]# pwd
    /home/docker-test-volume
    [root@VM-8-14-centos docker-test-volume]# vi dockerfile1
    [root@VM-8-14-centos docker-test-volume]# cat dockerfile1 
    FROM centos
    
    VOLUME ["volume01","volume02"]
    
    CMD echo "----end----"
    CMD /bin/bash
    [root@VM-8-14-centos docker-test-volume]# docker build -f dockerfile1 -t fanxu/centos:1.0 .
    Sending build context to Docker daemon  2.048kB
    Step 1/4 : FROM centos
     ---> 300e315adb2f
    Step 2/4 : VOLUME ["volume01","volume02"]
     ---> Running in 4bac924c41e9
    Removing intermediate container 4bac924c41e9
     ---> 8df2881b227e
    Step 3/4 : CMD echo "----end----"
     ---> Running in 26e85ef2daf0
    Removing intermediate container 26e85ef2daf0
     ---> c066d8c93847
    Step 4/4 : CMD /bin/bash
     ---> Running in 9da8dbb3ae17
    Removing intermediate container 9da8dbb3ae17
     ---> a879d71f361b
    Successfully built a879d71f361b
    Successfully tagged fanxu/centos:1.0
    

    进入自己创建的镜像,查看挂载

    [root@VM-8-14-centos docker-test-volume]# docker images
    REPOSITORY            TAG       IMAGE ID       CREATED              SIZE
    fanxu/centos          1.0       a879d71f361b   About a minute ago   209MB
    [root@VM-8-14-centos docker-test-volume]# docker run -it a879d71f361b /bin/bash
    

    在这里插入图片描述

    查看挂载到了主机中的哪个目录

    [root@VM-8-14-centos /]# docker inspect 6a33393e604a
    

    在这里插入图片描述

    测试文件是否互通

    #主机
    [root@VM-8-14-centos /]# cd /var/lib/docker/volumes/b37419fb8fe1a5199f594c183e40d83f5e135b2ea7d1886083a65244105a0a0f/_data
    [root@VM-8-14-centos _data]# ls
    [root@VM-8-14-centos _data]# vi helloDockerFile
    [root@VM-8-14-centos _data]# cat helloDockerFile 
    hello dockerfile
    
    #镜像
    [root@6a33393e604a /]# cd volume01
    [root@6a33393e604a volume01]# ls
    helloDockerFile
    [root@6a33393e604a volume01]# cat helloDockerFile 
    hello dockerfile
    

    这种方式,平时使用的较多,因为我们通常会构建自己的镜像!假设构建镜像的时候没有挂载卷,就要手动镜像挂载 -v卷名 容器内路径

    数据卷容器

    在这里插入图片描述

    多个容器同步数据,比如多个mysql同步数据

    #docker01
    [root@VM-8-14-centos docker-test-volume]# docker run -it --name docker01 fanxu/centos:1.0
    [root@ecef5dcc0fb7 /]# ls
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
    [root@ecef5dcc0fb7 /]# cd volume01
    [root@ecef5dcc0fb7 volume01]# touch docker01
    [root@ecef5dcc0fb7 volume01]# ls
    docker01
    
    #docker02
    #--volumes-from 挂载到docker01   有些像java中的一个类继承另一个类
    [root@VM-8-14-centos _data]# docker run -it --name docker02 --volumes-from docker01 fanxu/centos:1.0
    [root@654c8a26b2da /]# ls
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
    [root@654c8a26b2da /]# cd volume01
    [root@654c8a26b2da volume01]# ls
    docker01
    
    
    #docker03
    [root@VM-8-14-centos ~]# docker run -it --name docker03 --volumes-from docker01 fanxu/centos:1.0
    [root@958350b8f730 /]# ls
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
    [root@958350b8f730 /]# cd volume0
    bash: cd: volume0: No such file or directory
    [root@958350b8f730 /]# cd volume01
    [root@958350b8f730 volume01]# ls
    docker01
    #从docker3中新建一个文件
    [root@958350b8f730 volume01]# touch docker03
    [root@958350b8f730 volume01]# ls
    docker01  docker03
    
    #docker01
    [root@ecef5dcc0fb7 volume01]# ls
    docker01  docker03
    #docker02
    [root@654c8a26b2da volume01]# ls
    docker01  docker03
    #此时三个镜像都是互通的,如果docker01删掉了会发生什么?
    [root@VM-8-14-centos docker-test-volume]# docker rm -f docker01
    docker01
    #docker02
    [root@654c8a26b2da volume01]# ls
    docker01  docker03
    #docker03
    [root@958350b8f730 volume01]# ls
    docker01  docker03
    #可见docker01即使挂掉了也不会影响到docker02和docker03,所以这些镜像相互之间的关系应该是拷贝、备份关系,而不是映射关系,一个挂掉了,不影响其他两个的使用。但是docker02和docker03都是挂载到docker01上的,docker01挂掉了,docker02和docker03还互通吗
    
    #docker02 创建一个文件
    [root@654c8a26b2da volume01]# touch docker02
    [root@654c8a26b2da volume01]# ls
    docker01  docker02  docker03
    #docker03 可以查询到,所以说,虽然docker02和docker03都是挂载到docker01上的,但是即使没有docker01,他们两个也是互通的
    [root@958350b8f730 volume01]# ls
    docker01  docker02  docker03
    
    

    DockerFile

    dockerfile是用来构建docker镜像的文件!命令参数脚本!

    构建步骤:

    1. 编写一个dockerfile文件
    2. docker build构建成为一个镜像
    3. docker run运行镜像
    4. docker push发布景象(DockerHub、阿里云镜像库)
      在这里插入图片描述

    很多官方镜像都是基础包,很多功能都没有,我们通常会自己搭建自己的镜像!

    Dockerfile构建过程

    基础知识:

    1. 每个保留关键字(指令)都必须是大写字母
    2. 执行从上到下顺序执行
    3. #表示注释
    4. 每一个指令都会创建提交一个新的镜像层,并提交

    dockerfile是面向开发的,发布项目,做镜像,就要编写dockerfile文件,这个文件十分简单!

    docker镜像主键成为了企业交付的标准

    DockerFile:构建文件,定义了一切的步骤,源代码

    DockerImages:通过DockerFIle构建生成的镜像。最终发布和运行的产品

    Docker容器:容器就是镜像运行起来提供服务的

    DockerFile的指令

    在这里插入图片描述

    FROM 		# 基础镜像,一切从这里开始构建
    MAINTAINER	# 镜像是谁写的 姓名+邮箱
    RUN			#镜像构建的时候需要运行的命令
    ADD			# 步骤:tomcat镜像,这个tomcat压缩包!添加内容
    WORKDIR		# 镜像的工作目录
    VOLUME 		# 挂载的目录
    EXPOST	 	# 保留端口配置
    RUN			# 运行
    CMD			# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
    ENTRYPOINT	# 指定这个容器启动的时候要运行的命令,可以追加命令
    ONBUILD	 	# 构建一个被集成DockerFile 这个时候就会运行ONBUILD的指令。
    COPY		#类似ADD,将我们的文件拷贝到镜像中
    ENV			#构建的时候设置环境变量!
    

    实战测试

    DockerHub中99%的镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建的。

    创建一个自己的centos

    #编写Dockerfile的文件
    [root@VM-8-14-centos FANXU]# vi myDockerFile
    [root@VM-8-14-centos FANXU]# cat myDockerFile 
    FROM centos
    MAINTAINER fanxu<yigemuyu@126.com>
    
    ENV MYPATH /user/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、通过这个文件构建镜像
    [root@VM-8-14-centos FANXU]# docker build -f myDockerFile-centos -t mycentos:1.0 .
    ......
    Successfully built d3b9ff75ac9f
    Successfully tagged mycentos:1.0
    
    #测试运行
    [root@VM-8-14-centos FANXU]# docker run -it --name mycentos01 mycentos:1.0
    [root@d773e340d0da local]# ls
    [root@d773e340d0da local]# pwd
    /user/local
    [root@d773e340d0da local]# vi helloDocker
    [root@d773e340d0da local]# ls
    helloDocker
    [root@d773e340d0da local]# more helloDocker 
    hello docker
    
    

    可以通过docker history查看构建历史
    在这里插入图片描述

    CMD 和 ENTRYPOINT 的区别

    CMD 		#指定这个容器启动时要运行的命令,只有最后一个会生效,可被替代
    ENTRYPOINT	#指定这个容器启动的时候要运行的命令,可以追加命令
    

    测试cmd

    [root@VM-8-14-centos FANXU]# vim dockerfile-cmd-test
    [root@VM-8-14-centos FANXU]# more dockerfile-cmd-test 
    FROM centos
    CMD ["ls","-a"]	
    
    #创建镜像
    [root@VM-8-14-centos FANXU]# docker build -f dockerfile-cmd-test -t cmdtest .
    Sending build context to Docker daemon  3.072kB
    Step 1/2 : FROM centos
     ---> 300e315adb2f
    Step 2/2 : CMD ["ls","-a"]
     ---> Running in 143a14f5839e
    Removing intermediate container 143a14f5839e
     ---> 05d86eab4ac9
    Successfully built 05d86eab4ac9
    Successfully tagged cmdtest:latest
    #启动容器
    [root@VM-8-14-centos FANXU]# docker run 05d86eab4ac9
    .
    ..
    .dockerenv
    bin
    dev
    etc
    home
    lib
    lib64
    lost+found
    media
    mnt
    opt
    ......
    var
    #想要追加一个命令的时候
    [root@VM-8-14-centos FANXU]# docker run 05d86eab4ac9 -l
    docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
    #cmd的清理下 -l替换了CMD ["ls","-a"]命令,-l 不是命令所以保存!
    
    [root@VM-8-14-centos FANXU]# docker run 05d86eab4ac9 ls -l
    total 48
    lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
    drwxr-xr-x   5 root root  340 Aug 26 12:35 dev
    drwxr-xr-x   1 root root 4096 Aug 26 12:35 etc
    drwxr-xr-x   2 root root 4096 Nov  3  2020 home
    #如果想要追加命令的话,那就要写全命令,替换掉ls -l
    

    测试entrypoint

    [root@VM-8-14-centos FANXU]# vim dockerfile-cmd-entrypoint
    [root@VM-8-14-centos FANXU]# cat dockerfile-cmd-entrypoint 
    FROM centos
    ENTRYPOINT ["ls","-a"]
    #创建镜像
    [root@VM-8-14-centos FANXU]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .
    Sending build context to Docker daemon  4.096kB
    Step 1/2 : FROM centos
     ---> 300e315adb2f
    Step 2/2 : ENTRYPOINT ["ls","-a"]
     ---> Running in a76b97795d71
    Removing intermediate container a76b97795d71
     ---> b32cc7f739ea
    Successfully built b32cc7f739ea
    Successfully tagged entrypoint-test:latest
    #查看所有的镜像
    [root@VM-8-14-centos FANXU]# docker images
    REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
    entrypoint-test   latest    b32cc7f739ea   6 seconds ago   209MB
    cmdtest           latest    05d86eab4ac9   9 minutes ago   209MB
    mycentos          1.0       d3b9ff75ac9f   23 hours ago    307MB
    centos            latest    300e315adb2f   8 months ago    209MB
    #运行测试
    [root@VM-8-14-centos FANXU]# docker run b32cc7f739ea
    .
    ..
    .dockerenv
    bin
    dev
    etc
    home
    lib
    lib64
    lost+found
    media
    mnt
    opt
    proc
    root
    run
    sbin
    srv
    sys
    tmp
    usr
    var
    #末尾追加命令测试
    [root@VM-8-14-centos FANXU]# docker run b32cc7f739ea -l
    total 56
    drwxr-xr-x   1 root root 4096 Aug 26 12:38 .
    drwxr-xr-x   1 root root 4096 Aug 26 12:38 ..
    -rwxr-xr-x   1 root root    0 Aug 26 12:38 .dockerenv
    lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
    drwxr-xr-x   5