数据卷容器

初识dockerfile

dockerfile就是用来构建docker镜像的构建文件

  1. [root@docker-study home]# mkdir docker-test-volume
  2. [root@docker-study home]# cd docker-test-volume/
  3. #创建一个dockerfile文件,名字随意,建议dockerfile
  4. #在文件中写入指令
  5. [root@docker-study docker-test-volume]# vim dockerfile1
  6. #这里的每一条命令都是镜像的一层
  7. FROM centos
  8. VOLUME ["volume01","volume02"]
  9. CMD echo "-------end------"
  10. CMD /bin/bash
  11. [root@docker-study docker-test-volume]# docker build -f dockerfile1 -t ceshi/centos .
  12. Sending build context to Docker daemon 2.048kB
  13. Step 1/4 : FROM centos
  14. ---> 5d0da3dc9764
  15. Step 2/4 : VOLUME ["volume01","volume02"]
  16. ---> Running in a277d2596eaf
  17. Removing intermediate container a277d2596eaf
  18. ---> b102111f7078
  19. Step 3/4 : CMD echo "-------end------"
  20. ---> Running in 440895656d10
  21. Removing intermediate container 440895656d10
  22. ---> 16c7d1d393df
  23. Step 4/4 : CMD /bin/bash
  24. ---> Running in 2a03a073477e
  25. Removing intermediate container 2a03a073477e
  26. ---> 9a5e455a4d31
  27. Successfully built 9a5e455a4d31
  28. Successfully tagged ceshi/centos:latest
  29. [root@docker-study docker-test-volume]# docker images
  30. REPOSITORY TAG IMAGE ID CREATED SIZE
  31. ceshi/centos latest 9a5e455a4d31 44 seconds ago 231MB
  32. [root@docker-study docker-test-volume]# docker run -it 9a5e455a4d31 /bin/bash
  1. #运行自己做的镜像
  2. [root@docker-study ~]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. ceshi/centos latest 9a5e455a4d31 2 hours ago 231MB
  5. [root@docker-study ~]# docker run -it 9a5e455a4d31 /bin/bash
  6. [root@docker-study ~]# docker ps
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  8. 877b0cc03dca 9a5e455a4d31 "/bin/bash" 54 seconds ago Up 53 seconds great_hamilton
  9. [root@docker-study ~]# docker inspect 877b0cc03dca

在容器的卷内创建文件测试,可以在宿主机内查看到文件

数据卷容器

多个mysql同部数据

image-20220211140800318.png

  1. #启动三个容器,通过自己写的镜像启动
  2. #创建第一个容器
  3. [root@docker-study ~]# docker run -it --name docker01 9a5e455a4d31
  4. [root@113e6c9e9339 /]# ls -l
  5. total 56
  6. ......
  7. drwxr-xr-x 2 root root 4096 Feb 11 06:13 volume01
  8. drwxr-xr-x 2 root root 4096 Feb 11 06:13 volume02
  9. #创建第二个容器
  10. [root@docker-study ~]# docker run -it --name docker02 --volumes-from docker01 9a5e455a4d31
  11. [root@165fd8d636b6 /]# ls -l
  12. total 56
  13. 。。。。。。
  14. drwxr-xr-x 20 root root 4096 Sep 15 14:17 var
  15. drwxr-xr-x 2 root root 4096 Feb 11 06:13 volume01
  16. drwxr-xr-x 2 root root 4096 Feb 11 06:13 volume02
  17. #在第一个容器的卷里面创建文件,然后在容器2里面查看是否可以同步过去
  18. #1.查看容器ID
  19. [root@docker-study ~]# docker ps
  20. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  21. 165fd8d636b6 9a5e455a4d31 "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes docker02
  22. 113e6c9e9339 9a5e455a4d31 "/bin/sh -c /bin/bash" 5 minutes ago Up 5 minutes docker01
  23. #2.进入docker01,并创建一个文件
  24. [root@docker-study ~]# docker attach 113e6c9e9339
  25. [root@113e6c9e9339 /]# echo hahahahaha > volume01/test.txt
  26. #3.进入docker02查看,发现文件已经同步过来了
  27. [root@docker-study ~]# docker attach 113e6c9e9339
  28. [root@113e6c9e9339 /]# cat volume01/test.txt
  29. hahahahaha
  30. #创建第三个容器
  31. [root@docker-study ~]# docker run -it --name docker03 --volumes-from docker01 ceshi/centos
  32. [root@945bfaf1b976 /]# ls -l
  33. total 56
  34. 。。。。。。
  35. drwxr-xr-x 2 root root 4096 Feb 11 06:20 volume01
  36. drwxr-xr-x 2 root root 4096 Feb 11 06:13 volume02
  37. [root@945bfaf1b976 /]# ls volume01
  38. test.txt
  39. [root@945bfaf1b976 /]# echo "docker03 test" > volume01/docker03.txt
  40. #退出docker03,进入到docker01,并查看文件是否同步完成
  41. [root@945bfaf1b976 /]# [root@docker-study ~]#
  42. [root@docker-study ~]# docker attach 113e6c9e9339
  43. [root@113e6c9e9339 /]# ls -l volume01
  44. total 8
  45. -rw-r--r-- 1 root root 14 Feb 11 06:28 docker03.txt
  46. -rw-r--r-- 1 root root 11 Feb 11 06:20 test.txt
  47. #删除docker01,查看docker02、03是否还能使用
  48. [root@docker-study ~]# docker ps
  49. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  50. 945bfaf1b976 ceshi/centos "/bin/sh -c /bin/bash" 4 minutes ago Up 4 minutes docker03
  51. 165fd8d636b6 9a5e455a4d31 "/bin/sh -c /bin/bash" 16 minutes ago Up 16 minutes docker02
  52. 113e6c9e9339 9a5e455a4d31 "/bin/sh -c /bin/bash" 18 minutes ago Up 18 minutes docker01
  53. #删除docker01
  54. [root@docker-study ~]# docker rm -f 113e6c9e9339
  55. 113e6c9e9339
  56. #进入docker02并查看文件
  57. [root@docker-study ~]# docker attach 945bfaf1b976
  58. [root@945bfaf1b976 /]# ls -l volume01
  59. total 8
  60. -rw-r--r-- 1 root root 14 Feb 11 06:28 docker03.txt
  61. -rw-r--r-- 1 root root 11 Feb 11 06:20 test.txt
  62. #进入docker03并查看文件
  63. [root@docker-study ~]# docker attach 165fd8d636b6
  64. [root@165fd8d636b6 /]# ls -l volume01
  65. total 8
  66. -rw-r--r-- 1 root root 14 Feb 11 06:28 docker03.txt
  67. -rw-r--r-- 1 root root 11 Feb 11 06:20 test.txt

结论:数据卷容器的生命周期一直持续到没有容器使用为止,如果数据持久化到了本地是不会被删除的。

Dockerfile

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

构建步骤

1、编写一个dockerfile文件

2、docker build构建成为一个镜像

3、docker run运行一个镜像

4、docker push 发布镜像(DockerHub、阿里云镜像仓库)

查看一下官方是怎么做的

image-20220211144143927.png

Dockerfile的构建过程

基础知识

1、每个保留关键字(指令)都必须是大写字母

2、执行从上到下顺序执行

3、#表示注释
image-20220211144527220.png
4、每一个指令都会创建提交一个新的镜像层,并提交

dockerfile是面向开发的,发布镜像就需要编写dockerfile文件

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

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

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

DockerFile的指令

image-20220211092336463.png

  1. FROM #基础镜像 ,一切从这里构建
  2. MAINTAINER #镜像是谁写的,姓名+邮箱
  3. RUN #镜像构建的时候需要运行的命令
  4. ADD #步骤,比如Tomcat镜像,这里Tomcat的压缩包就是要添加的内容
  5. WORKDIR #镜像的工作目录
  6. VOLUME #挂载的目录位置
  7. EXPOSE #指定暴露端口
  8. CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
  9. ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
  10. ONBUILD #当构建一个被继承Dockerfile的时候,就会运行ONBUILD的指令。触发指令
  11. COPY #类似ADD命令,将文件拷贝到镜像中
  12. ENV #构建的时候设置环境变量

实战测试

Docker Hub中大部分镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置进行构建

image-20220211150012196.png

  1. #创建一个自己的centOS
  2. [root@docker-study ~]# mkdir dockerfile
  3. [root@docker-study ~]# vim mydockerfile-centos
  4. [root@docker-study ~]# cat mydockerfile-centos
  5. FROM centos
  6. MAINTAINER me<88888@qq.com>
  7. ENV MYPATH /usr/local
  8. WORKDIR $MYPATH
  9. RUN yum -y install vim
  10. RUN yum -y install net-tools
  11. EXPOSE 80
  12. CMD echo $MYPATH
  13. CMD echo "----------end----------"
  14. CMD /bin/bash
  15. [root@docker-study ~]# docker build -f mydockerfile-centos -t mycentos:0.1 .
  16. 此处报错尚未解决,宿主机系统centos7,容器镜像下载的7.9此处报错Linux8appstream这些报错不理解
  17. Step 5/10 : RUN yum -y install vim
  18. ---> Running in 60e3f59ba034
  19. CentOS Linux 8 - AppStream 46 B/s | 38 B 00:00
  20. Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
  21. The command '/bin/sh -c yum -y install vim' returned a non-zero code: 1

CDM和ENTRYPOINT的区别

  1. CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
  2. ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
  3. #创建一个CMD测试镜像
  4. [root@docker-study ~]# vim dockerfile-cmd-test
  5. [root@docker-study ~]# cat dockerfile-cmd-test
  6. FROM centos
  7. CMD ["ls","-a"]
  8. [root@docker-study ~]# docker build -f dockerfile-cmd-test -t cmdtest .
  9. Sending build context to Docker daemon 80.9kB
  10. Step 1/2 : FROM centos
  11. ---> 5d0da3dc9764
  12. Step 2/2 : CMD ["ls","-a"]
  13. ---> Using cache
  14. ---> 7dd3820076fa
  15. Successfully built 7dd3820076fa
  16. Successfully tagged cmdtest:latest
  17. #执行测试
  18. [root@docker-study ~]# docker run 7dd3820076fa
  19. .
  20. ..
  21. .dockerenv
  22. bin
  23. dev
  24. etc
  25. home
  26. lib
  27. lib64
  28. lost+found
  29. media
  30. mnt
  31. opt
  32. #追加一个命令
  33. [root@docker-study ~]# docker run 7dd3820076fa -l
  34. 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.
  35. #这种情况替换了CMD中["ls","-a"] 命令,不是一个完整命令所以报错

测试ENTRYPOINT

  1. [root@docker-study ~]# vim dockerfile-cmd-entrypointtest
  2. [root@docker-study ~]# docker build -f dockerfile-cmd-entrypointtest -t entrypoint-test .
  3. Sending build context to Docker daemon 81.92kB
  4. Step 1/2 : FROM centos
  5. ---> 5d0da3dc9764
  6. Step 2/2 : ENTRYPOINT ["ls","-a"]
  7. ---> Running in 83ff4c8c4ade
  8. Removing intermediate container 83ff4c8c4ade
  9. ---> b92863976e15
  10. Successfully built b92863976e15
  11. Successfully tagged entrypoint-test:latest
  12. [root@docker-study ~]# docker run b92863976e15
  13. .
  14. ..
  15. .dockerenv
  16. bin
  17. dev
  18. etc
  19. home
  20. lib
  21. lib64
  22. lost+found
  23. media
  24. mnt
  25. opt
  26. proc
  27. root
  28. run
  29. sbin
  30. srv
  31. sys
  32. tmp
  33. usr
  34. var
  35. #追加命令是直接可以追加到entrypoint构建的镜像后面的
  36. [root@docker-study ~]# docker run b92863976e15 -l
  37. total 56
  38. drwxr-xr-x 1 root root 4096 Feb 12 03:19 .
  39. drwxr-xr-x 1 root root 4096 Feb 12 03:19 ..
  40. -rwxr-xr-x 1 root root 0 Feb 12 03:19 .dockerenv
  41. lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
  42. drwxr-xr-x 5 root root 340 Feb 12 03:19 dev
  43. drwxr-xr-x 1 root root 4096 Feb 12 03:19 etc
  44. drwxr-xr-x 2 root root 4096 Nov 3 2020 home
  45. lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
  46. lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
  47. drwx------ 2 root root 4096 Sep 15 14:17 lost+found
  48. drwxr-xr-x 2 root root 4096 Nov 3 2020 media
  49. drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
  50. drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
  51. dr-xr-xr-x 94 root root 0 Feb 12 03:19 proc
  52. dr-xr-x--- 2 root root 4096 Sep 15 14:17 root
  53. drwxr-xr-x 11 root root 4096 Sep 15 14:17 run
  54. lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
  55. drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
  56. dr-xr-xr-x 13 root root 0 Feb 10 09:08 sys
  57. drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp
  58. drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr
  59. drwxr-xr-x 20 root root 4096 Sep 15 14:17 var

实战:Tomcat镜像

1、准备镜像文件 Tomcat压缩包,jdk的压缩包
2、编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件就不需要-f指定了

  1. [root@docker-study tomcat]# pwd
  2. /root/build/tomcat
  3. [root@docker-study tomcat]# ll
  4. total 154688
  5. -rw-r--r-- 1 root root 11579528 Feb 12 11:48 apache-tomcat-9.0.58.tar.gz
  6. -rw-r--r-- 1 root root 146815279 Feb 12 11:48 jdk-8u321-linux-x64.tar.gz
  7. [root@docker-study tomcat]# touch readme.txt
  8. [root@docker-study tomcat]# vim Dockerfile
  9. [root@docker-study tomcat]# cat Dockerfile
  10. FROM centos:7 #此处如果写centos会报错
  11. MAINTAINER me<8888@qq.com>
  12. COPY readme.txt /usr/local/readme.txt
  13. ADD jdk-8u321-linux-x64.tar.gz /usr/local
  14. ADD apache-tomcat-9.0.58.tar.gz /usr/local
  15. RUN yum -y install vim
  16. ENV MYPATH /usr/local
  17. WORKDIR $MYPATH
  18. ENV JAVA_HOME /usr/local/jdk1.8.0_321
  19. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  20. ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.58
  21. ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.58
  22. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  23. EXPOSE 8080
  24. CMD /usr/local/apache-tomcat-9.0.58/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out
  25. #创建镜像
  26. [root@docker-study tomcat]# docker build -t diytomcat .
  27. 。。。。
  28. Successfully built 9e518e7c352b
  29. Successfully tagged diytomcat:latest
  30. [root@docker-study tomcat]# docker images
  31. REPOSITORY TAG IMAGE ID CREATED SIZE
  32. diytomcat latest 9e518e7c352b 7 minutes ago 796MB
  33. [root@docker-study build]# docker run -it -p 9090:8080 --name diytomcat -v /home/build/tomcat/test:/usr/local/apache-tomcat-9.0.58/webapps/test -v /home/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.58/logs diytomcat
  34. #这个报错好像不用管,确认容器起来了就行
  35. tail: cannot open '/usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out' for reading: No such file or directory
  36. tail: cannot watch parent directory of '/usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out': No such file or directory
  37. tail: inotify cannot be used, reverting to polling
  38. #进入容器查看
  39. [root@5216f95820ac local]# ll
  40. total 52
  41. drwxr-xr-x 1 root root 4096 Feb 12 10:41 apache-tomcat-9.0.58
  42. drwxr-xr-x 2 root root 4096 Apr 11 2018 bin
  43. drwxr-xr-x 2 root root 4096 Apr 11 2018 etc
  44. drwxr-xr-x 2 root root 4096 Apr 11 2018 games
  45. drwxr-xr-x 2 root root 4096 Apr 11 2018 include
  46. drwxr-xr-x 8 10143 10143 4096 Dec 15 19:30 jdk1.8.0_321
  47. drwxr-xr-x 2 root root 4096 Apr 11 2018 lib
  48. drwxr-xr-x 2 root root 4096 Apr 11 2018 lib64
  49. drwxr-xr-x 2 root root 4096 Apr 11 2018 libexec
  50. -rw-r--r-- 1 root root 0 Feb 12 03:51 readme.txt
  51. drwxr-xr-x 2 root root 4096 Apr 11 2018 sbin
  52. drwxr-xr-x 5 root root 4096 Nov 13 2020 share
  53. drwxr-xr-x 2 root root 4096 Apr 11 2018 src
  54. #确认Tomcat起来了
  55. [root@5b1fc5c271c3 local]# ps -ef
  56. UID PID PPID C STIME TTY TIME CMD
  57. root 1 0 0 11:08 pts/0 00:00:00 /bin/sh -c /usr/local/apache-tomcat-9.0.58/bin/startup.sh && tail -F /usr/local/apache-to
  58. root 14 1 2 11:08 pts/0 00:00:02 /usr/local/jdk1.8.0_321/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat
  59. root 15 1 0 11:08 pts/0 00:00:00 tail -F /usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out
  60. root 42 0 0 11:10 pts/1 00:00:00 /bin/bash
  61. root 59 42 0 11:10 pts/1 00:00:00 ps -ef
  62. #在宿主机访问测试,也可以浏览器IP:端口访问
  63. [root@docker-study ~]# curl localhost:9090
  64. <!DOCTYPE html>
  65. <html lang="en">
  66. <head>
  67. <meta charset="UTF-8" />
  68. <title>Apache Tomcat/9.0.58</title>
  69. <link href="favicon.ico" rel="icon" type="image/x-icon" />
  70. <link href="tomcat.css" rel="stylesheet" type="text/css" />
  71. </head>
  72. 。。。。。。。

发布自己的镜像

发布到DockerHub

1、注册自己的账号 地址:https://hub.docker.com/

  1. #需要先登录
  2. [root@docker-study ~]# docker login --help
  3. Usage: docker login [OPTIONS] [SERVER]
  4. Log in to a Docker registry.
  5. If no server is specified, the default is defined by the daemon.
  6. Options:
  7. -p, --password string Password
  8. --password-stdin Take the password from stdin
  9. -u, --username string Username
  10. #登录到自己的hub.docker账户后发布镜像
  11. [root@docker-study ~]# docker push 账户名/diytomcat:版本号
  12. Using default tag: latest
  13. The push refers to repository [docker.io/library/diytomcat]
  14. 6afe6382943f: Pushing [=> ] 6.03MB/210.5MB
  15. 27a70cce5e52: Pushing [============> ] 4.013MB/16.06MB
  16. d1acb98e4e50: Pushing [> ] 2.751MB/365.3MB
  17. 84c6af1e8525: Pushed
  18. 174f56854903: Pushing [=> ]
  19. 。。。。。。。