一.镜像制作

Docker镜像本质是什么?

  • 一个分层文件系统

Docker中一个centos镜像为什么只有20OMB,而一个centos操作系统的iso文件要几个个G?

  • Centos的ios镜像文件包含bootfs和rootfs.而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层

Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?

  • 由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB

1.Docker镜像原理

image.png
image.png
image.png
一个镜像可以放在另外一个镜像的上面.位于下面的镜像称为父镜像,最底层的镜像为基础镜像
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部
这一层就是我们的容器层,容器之下的都叫镜像层
image.png

2. 镜像制作

方法一:容器转为镜像

容器转为镜像

docker commit 容器id 镜像名称:版本号

镜像转为压缩文件

docker save -o 压缩文件名称 镜像名称:版本号

压缩文件转为镜像

docker load -i 压缩文件名称

commit镜像:

  1. docker commit 提交容器为一个镜像
  2. docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:版本号

测试

  1. # 1.启动默认的tomcat
  2. # 2.发现默认的tomcat是没有webapps应用,
  3. # 3.将自己的拷贝进去
  4. # 4.将我们操作过的容器通过commit 提交为一个镜像文件!以后就可以使用我们定义的镜像文件

image.png
image.png

方式二: dockerfile

dockerfile概念

通过脚本可以生成镜像

  • dockerfile 是一个文本文件
  • 包含了一条条的指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 对于开发人员, 可以为开发团队提供一个完全的开发环境
  • 对于测试人员, 可以直接拿开发时索构建的镜像或者通过Dockerfile我呢见构建一个新的镜像开始工作
  • 对于运维,在部署时,可以实现应用的无缝移植

构建步骤:

  1. 编写一个dockerfile 文件
  2. docker bulid #构建成为一个镜像
  3. docker run #运行镜像
  4. docker push #发布镜像(DockerHub,阿里云镜像)

    dockerfile案例

    如何定义dockerfile,发布springboot项目

实现步骤

  1. 定义父级镜像: FROM java:8
  2. 定义作者信息: MAINTAINER xiaohuyyds xiaohuyyds@xxx.cn
  3. 将jar包添加到容器中: ADD Springboot.jar app.jar
  4. 定义容器启动执行的命令 CMD java -jar app.jar
  5. 通过dockerfile构建镜像: docker build -f dockerfile 文件路径 -t 镜像名称:版本

步骤

  1. #编写Dockerfile
  2. [root@localhost docker-test-volume]# vim dockerfile1
  3. FROM centos
  4. VOLUME ["volume01","volume02"]
  5. CMD echo "----end----"
  6. CMD /bin/bash
  7. #创建镜像
  8. #-f 路径 需要dockerfile文件路径
  9. #-t 生成的镜像名 前面不能有/
  10. # 注意后面有点
  11. [root@localhost docker-test-volume]# docker build -f $PWD/dockerfile1 \
  12. -t xiaohuyyds/centos .
  13. Sending build context to Docker daemon 2.048kB
  14. Step 1/4 : FROM centos
  15. ---> 5d0da3dc9764
  16. Step 2/4 : VOLUME ["volume01","volume02"]
  17. ---> Running in 857166760f55
  18. Removing intermediate container 857166760f55
  19. ---> a62fbbefd79a
  20. Step 3/4 : CMD echo "----end----"
  21. ---> Running in 97fca656747d
  22. Removing intermediate container 97fca656747d
  23. ---> 323998b86a11
  24. Step 4/4 : CMD /bin/bash
  25. ---> Running in f923f411836f
  26. Removing intermediate container f923f411836f
  27. ---> 5c1eb233c81b
  28. Successfully built 5c1eb233c81b
  29. Successfully tagged xiaohuyyds/centos:latest
  30. [root@localhost docker-test-volume]#

启动自己的容器
image.png
宿主机挂载的路径
image.png

二.数据卷容器

image.png
image.png
多个mysql同步数据

  1. docker run -d -p 3307:3306 -v /etc/conf.d -v /var/lib/mysql \
  2. -e MYSQL_ROOT_PASSWORD=ROOT --name mysql01 mysql:5.7
  3. docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=ROOT --name mysql01 \
  4. volumes-from mysql01 mysql:5.7
  5. #这个时候可以实现两个容器数据同步

结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有人使用为止
但是一旦你持久化到本地,这个时候,本地的数据是不会删除的

三.DockerFile

介绍

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

DockerFile构建过程

构建步骤

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行环境
  4. docker push 发布镜像(DockerHub .阿里云镜像仓库)

    DockerFile指令

    1. FROM #基础镜像,起始点
    2. MAINTAINER #镜像是谁写的
    3. RUN #镜像构建时运行的命令
    4. ADD #步骤:添加的镜像
    5. WORKDIR #镜像的工作目录
    6. VOLUME #挂载的目录
    7. EXPOST #暴露端口
    8. CMD #指定这个容器启动的时候要运行的命令 只有最后一个会被执行,可以替代
    9. ENTRYPOINT #指定这个容器启动的时候要运行的命令 可以追加命令
    10. ONBUILD #当构建一个被继承DockerFile 这个时候就会运行ONBUILD命令 触发指令
    11. COPY #类似ADD,将我们的文件拷贝到镜像中
    12. ENV #构建时设置环境变量

    dockerfile 关键字

image.pngimage.pngimage.png
练习:
DockerHub中99%镜像都是从基础镜像FROM scratch 开始的
image.png
创建自己的centos

  1. #编写dockerfile文件
  2. FROM centos
  3. MAINTAINER xiaohuyyds<15835837863@163.com>
  4. ENV MYPATH /usr/local
  5. WORKDIR $MYPATH
  6. RUN yum -y install vim
  7. RUN yum -y install net-tools
  8. EXPOSE 80
  9. CMD echo $MYPATH
  10. CMD echo "----end-----"
  11. CMD /bin/bash
  12. #构建容器
  13. [root@localhost dockerfile]# docker build -f dockerfilecentos -t mydockerfilecentos:0.1 .
  14. #查看镜像的构建过程
  15. docker history 镜像id

CMD和ENTRYPOINT的区别

  1. #构建dockerfile
  2. [root@localhost dockerfile]# cat dockerfilecentos01
  3. FROM centos
  4. CMD ["ls","-a"]
  5. #制作镜像
  6. [root@localhost dockerfile]# docker build -f dockerfilecentos01 -t dockerfilecentos01 .
  7. Sending build context to Docker daemon 3.072kB
  8. Step 1/2 : FROM centos
  9. ---> 5d0da3dc9764
  10. Step 2/2 : CMD ["ls","-a"]
  11. ---> Running in e79f72b345a9
  12. Removing intermediate container e79f72b345a9
  13. ---> 10e546aab68a
  14. Successfully built 10e546aab68a
  15. Successfully tagged dockerfilecentos01:latest
  16. #制作docker
  17. [root@localhost dockerfile]# docker run 10e546aab68a
  18. .
  19. ..
  20. .dockerenv
  21. bin
  22. dev
  23. etc
  24. home
  25. lib
  26. lib64
  27. lost+found
  28. media
  29. mnt
  30. opt
  31. proc
  32. root
  33. run
  34. sbin
  35. srv
  36. sys
  37. tmp
  38. usr
  39. var
  40. #加-l
  41. [root@localhost dockerfile]# docker run 10e546aab68a -l
  42. docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
  43. ERRO[0000] error waiting for container: context canceled
  1. #构建dockerfile
  2. [root@localhost dockerfile]# cat dockerfilecentos02
  3. FROM centos
  4. ENTRYPOINT ["ls","-a"]
  5. #制作镜像
  6. [root@localhost dockerfile]# docker build -f dockerfilecentos02 -t dockerfileos02 .
  7. Sending build context to Docker daemon 4.096kB
  8. Step 1/2 : FROM centos
  9. ---> 5d0da3dc9764
  10. Step 2/2 : ENTRYPOINT ["ls","-a"]
  11. ---> Running in 9ee9ab8e1b93
  12. Removing intermediate container 9ee9ab8e1b93
  13. ---> 4fa78330abf4
  14. Successfully built 4fa78330abf4
  15. Successfully tagged dockerfileos02:latest
  16. #制作docker
  17. [root@localhost dockerfile]# docker run 4fa78330abf4
  18. .
  19. ..
  20. .dockerenv
  21. bin
  22. dev
  23. etc
  24. home
  25. lib
  26. lib64
  27. lost+found
  28. media
  29. mnt
  30. opt
  31. proc
  32. root
  33. run
  34. sbin
  35. srv
  36. sys
  37. tmp
  38. usr
  39. var
  40. #加-l
  41. [root@localhost dockerfile]# docker run 4fa78330abf4 -l
  42. total 0
  43. drwxr-xr-x. 1 root root 6 May 6 02:16 .
  44. drwxr-xr-x. 1 root root 6 May 6 02:16 ..
  45. -rwxr-xr-x. 1 root root 0 May 6 02:16 .dockerenv
  46. lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
  47. drwxr-xr-x. 5 root root 340 May 6 02:16 dev
  48. drwxr-xr-x. 1 root root 66 May 6 02:16 etc
  49. drwxr-xr-x. 2 root root 6 Nov 3 2020 home
  50. lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
  51. lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
  52. drwx------. 2 root root 6 Sep 15 2021 lost+found
  53. drwxr-xr-x. 2 root root 6 Nov 3 2020 media
  54. drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
  55. drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
  56. dr-xr-xr-x. 232 root root 0 May 6 02:16 proc
  57. dr-xr-x---. 2 root root 162 Sep 15 2021 root
  58. drwxr-xr-x. 11 root root 163 Sep 15 2021 run
  59. lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
  60. drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
  61. dr-xr-xr-x. 13 root root 0 May 6 01:58 sys
  62. drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
  63. drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
  64. drwxr-xr-x. 20 root root 262 Sep 15 2021 var

实战tomcat镜像

  1. 制作镜像(tomcat压缩包,jdk压缩包)

image.png

  1. 编写dockerfile文件,官方命名Dockerfile, build会自动寻找这个文件,不需要 -f 指定了 ```shell FROM centos:7 MAINTAINER xiaohuyyds15835837863@163.com

COPY readme.txt /home/mytomcat/readme.txt

ADD jdk-18_linux-x64_bin.tar.gz /usr/local/ ADD apache-tomcat-10.0.18.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk-18 ENV CLASSPATH $JAVA_HOME/lib.tools.jar:$JAVA_HOME/lib/dt.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.18 ENV CATALINA_BASH /usr/local/apache-tomcat-10.0.18

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-10.0.18/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.18/bin/logs/catalina.out

  1. 3. 构建镜像
  2. ```shell
  3. docker build -t diytomcat .
  1. 启动容器 ```shell [root@localhost mytomcat]# docker run -d -p 8080:8080 —name xiaohuyydstomcat \
    1. -v /home/mytomcat/test:/usr/local/apache-tomcat-10.0.18/webapps/test \
    2. -v /home/mytomcat/tomcatlogs/:/usr/local/apache-tomcat-10.0.18/logs diytomcat
    006fcdb78c0d8f714c01d97e2d7a54b8820bb61806acc41878c2671ee22c8c1d
  1. 5. 访问测试
  2. ```shell
  3. [root@localhost mytomcat]# curl localhost:8080

image.png

  1. 发布项目(由于做了卷挂载,所有可以直接发布项目) ```shell [root@localhost WEB-INF]# pwd /home/mytomcat/test/WEB-INF

将项目文件放入到对应的文件夹下 ```

  1. 部署成功