一.镜像制作
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镜像原理



一个镜像可以放在另外一个镜像的上面.位于下面的镜像称为父镜像,最底层的镜像为基础镜像
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部
这一层就是我们的容器层,容器之下的都叫镜像层
2. 镜像制作
方法一:容器转为镜像
容器转为镜像
docker commit 容器id 镜像名称:版本号
镜像转为压缩文件
docker save -o 压缩文件名称 镜像名称:版本号
压缩文件转为镜像
docker load -i 压缩文件名称
commit镜像:
docker commit 提交容器为一个镜像docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:版本号
测试
# 1.启动默认的tomcat# 2.发现默认的tomcat是没有webapps应用,# 3.将自己的拷贝进去# 4.将我们操作过的容器通过commit 提交为一个镜像文件!以后就可以使用我们定义的镜像文件


方式二: dockerfile
dockerfile概念
通过脚本可以生成镜像
- dockerfile 是一个文本文件
- 包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员, 可以为开发团队提供一个完全的开发环境
- 对于测试人员, 可以直接拿开发时索构建的镜像或者通过Dockerfile我呢见构建一个新的镜像开始工作
- 对于运维,在部署时,可以实现应用的无缝移植
构建步骤:
- 编写一个dockerfile 文件
- docker bulid #构建成为一个镜像
- docker run #运行镜像
- docker push #发布镜像(DockerHub,阿里云镜像)
dockerfile案例
如何定义dockerfile,发布springboot项目
实现步骤
- 定义父级镜像: FROM java:8
- 定义作者信息: MAINTAINER xiaohuyyds xiaohuyyds@xxx.cn
- 将jar包添加到容器中: ADD Springboot.jar app.jar
- 定义容器启动执行的命令 CMD java -jar app.jar
- 通过dockerfile构建镜像: docker build -f dockerfile 文件路径 -t 镜像名称:版本
步骤
#编写Dockerfile[root@localhost docker-test-volume]# vim dockerfile1FROM centosVOLUME ["volume01","volume02"]CMD echo "----end----"CMD /bin/bash#创建镜像#-f 路径 需要dockerfile文件路径#-t 生成的镜像名 前面不能有/# 注意后面有点[root@localhost docker-test-volume]# docker build -f $PWD/dockerfile1 \-t xiaohuyyds/centos .Sending build context to Docker daemon 2.048kBStep 1/4 : FROM centos---> 5d0da3dc9764Step 2/4 : VOLUME ["volume01","volume02"]---> Running in 857166760f55Removing intermediate container 857166760f55---> a62fbbefd79aStep 3/4 : CMD echo "----end----"---> Running in 97fca656747dRemoving intermediate container 97fca656747d---> 323998b86a11Step 4/4 : CMD /bin/bash---> Running in f923f411836fRemoving intermediate container f923f411836f---> 5c1eb233c81bSuccessfully built 5c1eb233c81bSuccessfully tagged xiaohuyyds/centos:latest[root@localhost docker-test-volume]#
二.数据卷容器


多个mysql同步数据
docker run -d -p 3307:3306 -v /etc/conf.d -v /var/lib/mysql \-e MYSQL_ROOT_PASSWORD=ROOT --name mysql01 mysql:5.7docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=ROOT --name mysql01 \volumes-from mysql01 mysql:5.7#这个时候可以实现两个容器数据同步
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有人使用为止
但是一旦你持久化到本地,这个时候,本地的数据是不会删除的
三.DockerFile
介绍
DockerFile构建过程
构建步骤
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行环境
- docker push 发布镜像(DockerHub .阿里云镜像仓库)
DockerFile指令
FROM #基础镜像,起始点MAINTAINER #镜像是谁写的RUN #镜像构建时运行的命令ADD #步骤:添加的镜像WORKDIR #镜像的工作目录VOLUME #挂载的目录EXPOST #暴露端口CMD #指定这个容器启动的时候要运行的命令 只有最后一个会被执行,可以替代ENTRYPOINT #指定这个容器启动的时候要运行的命令 可以追加命令ONBUILD #当构建一个被继承DockerFile 这个时候就会运行ONBUILD命令 触发指令COPY #类似ADD,将我们的文件拷贝到镜像中ENV #构建时设置环境变量
dockerfile 关键字



练习:
DockerHub中99%镜像都是从基础镜像FROM scratch 开始的
创建自己的centos
#编写dockerfile文件FROM centosMAINTAINER xiaohuyyds<15835837863@163.com>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATHCMD echo "----end-----"CMD /bin/bash#构建容器[root@localhost dockerfile]# docker build -f dockerfilecentos -t mydockerfilecentos:0.1 .#查看镜像的构建过程docker history 镜像id
CMD和ENTRYPOINT的区别
#构建dockerfile[root@localhost dockerfile]# cat dockerfilecentos01FROM centosCMD ["ls","-a"]#制作镜像[root@localhost dockerfile]# docker build -f dockerfilecentos01 -t dockerfilecentos01 .Sending build context to Docker daemon 3.072kBStep 1/2 : FROM centos---> 5d0da3dc9764Step 2/2 : CMD ["ls","-a"]---> Running in e79f72b345a9Removing intermediate container e79f72b345a9---> 10e546aab68aSuccessfully built 10e546aab68aSuccessfully tagged dockerfilecentos01:latest#制作docker[root@localhost dockerfile]# docker run 10e546aab68a....dockerenvbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar#加-l[root@localhost dockerfile]# docker run 10e546aab68a -ldocker: 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.ERRO[0000] error waiting for container: context canceled
#构建dockerfile[root@localhost dockerfile]# cat dockerfilecentos02FROM centosENTRYPOINT ["ls","-a"]#制作镜像[root@localhost dockerfile]# docker build -f dockerfilecentos02 -t dockerfileos02 .Sending build context to Docker daemon 4.096kBStep 1/2 : FROM centos---> 5d0da3dc9764Step 2/2 : ENTRYPOINT ["ls","-a"]---> Running in 9ee9ab8e1b93Removing intermediate container 9ee9ab8e1b93---> 4fa78330abf4Successfully built 4fa78330abf4Successfully tagged dockerfileos02:latest#制作docker[root@localhost dockerfile]# docker run 4fa78330abf4....dockerenvbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar#加-l[root@localhost dockerfile]# docker run 4fa78330abf4 -ltotal 0drwxr-xr-x. 1 root root 6 May 6 02:16 .drwxr-xr-x. 1 root root 6 May 6 02:16 ..-rwxr-xr-x. 1 root root 0 May 6 02:16 .dockerenvlrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bindrwxr-xr-x. 5 root root 340 May 6 02:16 devdrwxr-xr-x. 1 root root 66 May 6 02:16 etcdrwxr-xr-x. 2 root root 6 Nov 3 2020 homelrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/liblrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64drwx------. 2 root root 6 Sep 15 2021 lost+founddrwxr-xr-x. 2 root root 6 Nov 3 2020 mediadrwxr-xr-x. 2 root root 6 Nov 3 2020 mntdrwxr-xr-x. 2 root root 6 Nov 3 2020 optdr-xr-xr-x. 232 root root 0 May 6 02:16 procdr-xr-x---. 2 root root 162 Sep 15 2021 rootdrwxr-xr-x. 11 root root 163 Sep 15 2021 runlrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbindrwxr-xr-x. 2 root root 6 Nov 3 2020 srvdr-xr-xr-x. 13 root root 0 May 6 01:58 sysdrwxrwxrwt. 7 root root 171 Sep 15 2021 tmpdrwxr-xr-x. 12 root root 144 Sep 15 2021 usrdrwxr-xr-x. 20 root root 262 Sep 15 2021 var
实战tomcat镜像
- 制作镜像(tomcat压缩包,jdk压缩包)

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

- 发布项目(由于做了卷挂载,所有可以直接发布项目) ```shell [root@localhost WEB-INF]# pwd /home/mytomcat/test/WEB-INF
将项目文件放入到对应的文件夹下 ```
- 部署成功

