docker===》数据卷之dockerfile、实战构建centos、tomcat

一、Dockerfile介绍

1.什么是Dockerfile?

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行,一般而言,Dockerfile主体内容分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行命令。
Dockerfile以从上而下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM,一个声明以#字符开头则被视为注释,可以在docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
在这里插入图片描述

2.通过Dockerfile生成镜像

#1.创建一个Dockerfile文件,名字可以随机,建议用Dockerfile(文件中的内容指令大写)
[root@docker ~]# cd /home
[root@docker home]# vim dockerfile1
FROM centos
VOLUME ["volume01","volume02"]   #匿名挂载
CMD echo "-----end-----"
CMD /bin/bash              
[root@docker home]# docker build -f dockerfile1 -t test/centos:v1 .   #构建镜像
Sending build context to Docker daemon  190.8MB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in f0c041664f2f
Removing intermediate container f0c041664f2f
 ---> 736d765bc692
Step 3/4 : CMD echo "-----end-----"
 ---> Running in 718ddf9ab2fd
Removing intermediate container 718ddf9ab2fd
 ---> d7a675f0e939
Step 4/4 : CMD /bin/bash
 ---> Running in 585894ec73cd
Removing intermediate container 585894ec73cd
 ---> 3850e269b94a
Successfully built 3850e269b94a
Successfully tagged test/centos:v1
[root@docker home]# docker images  #查看构建镜像
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
test/centos   v1        3850e269b94a   51 seconds ago   209MB


#2.启动自己生成的容器
[root@docker home]# docker run -it 3850e269b94a /bin/bash
[root@383339684d3c /]# 
[root@383339684d3c /]# ls -l   #查看目录
total 0
lrwxrwxrwx   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root 360 Mar 20 07:09 dev
drwxr-xr-x   1 root root  66 Mar 20 07:09 etc
drwxr-xr-x   2 root root   6 Nov  3 15:22 home
lrwxrwxrwx   1 root root   7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root   6 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root   6 Nov  3 15:22 media
drwxr-xr-x   2 root root   6 Nov  3 15:22 mnt
drwxr-xr-x   2 root root   6 Nov  3 15:22 opt
dr-xr-xr-x 113 root root   0 Mar 20 07:09 proc
dr-xr-x---   2 root root 162 Dec  4 17:37 root
drwxr-xr-x  11 root root 163 Dec  4 17:37 run
lrwxrwxrwx   1 root root   8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 Nov  3 15:22 srv
dr-xr-xr-x  13 root root   0 Mar 20 07:09 sys
drwxrwxrwt   7 root root 145 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 144 Dec  4 17:37 usr
drwxr-xr-x  20 root root 262 Dec  4 17:37 var
drwxr-xr-x   2 root root   6 Mar 20 07:09 volume01  #自己挂载的目录(生成镜像自动挂载的数据卷目录)
drwxr-xr-x   2 root root   6 Mar 20 07:09 volume02  #自己挂载的目录(生成镜像自动挂载的数据卷目录)
注:这个卷一定和外部有一个同步目录


#3.在容器内挂载目录下创建测试文件
[root@383339684d3c /]# cd volume01
[root@383339684d3c volume01]# touch 1.txt
[root@383339684d3c volume01]# ls
1.txt


#4.查看容器的具体信息
[root@docker ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS       
383339684d3c   3850e269b94a   "/bin/bash"              4 minutes ago   Up 4 minutes
[root@docker ~]# docker inspect 383339684d3c
   "Mounts": [
            {
    
    
                "Type": "volume",
                "Name": "34bbc194a4ba7b7cdc424ba768f89d6437f6be9004ef91e89a205288cfa
                "Source": "/var/lib/docker/volumes/34bbc194a4ba7b7cdc424ba768f89d643 #对应容器外目录路径
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
    
    
                "Type": "volume",
                "Name": "b4f2a3ca38131f0bc8fe55398a9759266f171e02fd8f3ad7813a6889712
                "Source": "/var/lib/docker/volumes/b4f2a3ca38131f0bc8fe55398a9759266  #对应容器外目录路径
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

#5.去容器外看一下创建的测试文件是否同步
[root@docker ~]# cd /var/lib/docker/volumes/34bbc194a4ba7b7cdc424ba768f89d6437f6be9004ef91e89a205288cfa3aeba/_data
[root@docker _data]# ls
1.txt

3.数据卷容器(父容器)

多个 MySQL同步数据
在这里插入图片描述

#1.先启动2个容器,通过上边自己写的镜像(test/centos)启动
[root@docker home]# docker run -it --name docker01 test/centos:v1  #
[root@f8ad77730f83 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01
[root@docker home]# docker run -it --name docker02 --volumes-from docker01 test/centos:v1  #docker01为docker02的数据卷容器即父容器
[root@7b9104b8a5ad /]# 
[root@7b9104b8a5ad /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01

(做测试docker01和docker02是不是互通的)
[root@docker home]# docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS     NAMES
7b9104b8a5ad   test/centos:v1   "/bin/sh -c /bin/bash"   2 minutes ago   Up 2 minutes             docker02
f8ad77730f83   test/centos:v1   "/bin/sh -c /bin/bash"   5 minutes ago   Up 5 minutes             docker01
[root@docker home]# docker attach f8ad77730f83   #进入到docker01
[root@f8ad77730f83 /]# cd volume01
[root@f8ad77730f83 volume01]# ls
[root@f8ad77730f83 volume01]# touch docker01.tst  #创建测试文件

[root@docker ~]# docker attach 7b9104b8a5ad   #进入到docker02 
[root@7b9104b8a5ad /]# cd volume01
[root@7b9104b8a5ad volume01]# ls   #可以看到同步文件即为成功
docker01.tst

#2.以docker01为数据卷容器创建docker03
[root@docker home]# docker run -it --name=docker03 --volumes-from docker01 test/centos:v1

(做测试docker01和docker03是不是互通的)
[root@7bd6d5539a3e /]# cd volume01
[root@7bd6d5539a3e volume01]# touch docker03.txt   #创建docker03.txt测试文件
[root@docker ~]# docker attach f8ad77730f83 
[root@f8ad77730f83 volume01]# ls    #docker01也是可以同步的
docker01.tst  docker03.txt

注:如果删除掉docker01,所创建的测试文件也是不会消失的

在这里插入图片描述
在这里插入图片描述

4.多个MySQL实现数据共享

[root@docker home]# docker run -d -p 3310:3306 -v /etc/mysql/cong.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 --name mysql01 mysql  #创建mysql01容器
[root@docker home]# docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123 --name mysql02 --volumes-from mysql01 mysql  #创建mysql02容器
这个时候就可以实现两个容器数据同步了

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

二、Dockerfile的使用

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

构建步骤:

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

1.基础知识

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

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单
docker镜像逐渐成为了企业交付的标准,必须掌握

步骤:开发、部署、运维,缺一不可!

dockerfile:构建文件,定义了一切步骤,相当于源代码
dockerimages:通过dockerfile构建生成的镜像,最终发布和运行的产品
docker容器:容器就是镜像运行起来提供服务的

2.dockerfile指令说明

在这里插入图片描述

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

3.实战测试(构建自己的centos)

#1.编写dockerfile文件
[root@docker dockerfile]# vim mydockerfile-centos
FROM centos
MAINTAINER fxs<[email protected]>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum install -y vim 
RUN yum install -y net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash

#2.通过文件构建镜像
[root@docker dockerfile]# docker build -f mydockerfile-centos -t mycentos:v1 .
Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos
 ---> 300e315adb2f
Step 2/10 : MAINTAINER fxs<[email protected]>
 ---> Running in e52e12575926
Removing intermediate container e52e12575926
 ---> 4e870718528a
Step 3/10 : ENV MYPATH /usr/local
 ---> Running in d82fa4ed482b
Removing intermediate container d82fa4ed482b
 ---> c82eb3e4a162
Step 4/10 : WORKDIR $MYPATH
 ---> Running in 6f0249f46ab3
Removing intermediate container 6f0249f46ab3
 ---> 109dee8d18e9
Step 5/10 : RUN yum install -y vim
 ---> Running in 5560189ef2bf
CentOS Linux 8 - AppStream                      1.2 MB/s | 6.3 MB     00:05    
CentOS Linux 8 - BaseOS                         935 kB/s | 2.3 MB     00:02    
CentOS Linux 8 - Extras                         7.6 kB/s | 9.2 kB     00:01

#3.查看自己创建的镜像
[root@docker dockerfile]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mycentos      v1        3f33768da126   2 minutes ago   291MB

#4.运行自己构建的镜像
[root@docker dockerfile]# docker run -it mycentos:v1
[root@f9e4e57fdbeb local]# pwd   #自动进入工作目录
/usr/local
[root@f9e4e57fdbeb local]# ifconfig   #自己增强的命令可以使用
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 648 (648.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

扫描二维码关注公众号,回复: 12917624 查看本文章

4.CMD和ENIRYPOINT的区别

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

ENTRYPOINT #指定容器启动的时候要运行的命令,可以追加命令

#1.测试CMD
[root@docker dockerfile]# vim dockerfile-cmd-test  #编写dockerfile文件
FROM centos
CMD ["ls","-a"]
[root@docker dockerfile]# docker build -f dockerfile-cmd-test  -t cmdtest .  #构建镜像
[root@docker dockerfile]# docker run c851cfaf4de4  #运行构建的镜像  (ls -a命令生效)
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc

#2.想追加一个命令l【ls -al】
[root@docker dockerfile]# docker run c851cfaf4de4 -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.

注:CMD用-l替换了 ["ls","-a"],然而-l不是命令所以报错

#如果想运行命令要接完整命令
[root@docker dockerfile]# docker run c851cfaf4de4 ls -al
total 0
drwxr-xr-x   1 root root   6 Mar 20 10:02 .
drwxr-xr-x   1 root root   6 Mar 20 10:02 ..
-rwxr-xr-x   1 root root   0 Mar 20 10:02 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root 340 Mar 20 10:02 dev
drwxr-xr-x   1 root root  66 Mar 20 10:02 etc
drwxr-xr-x   2 root root   6 Nov  3 15:22 home
#1.测试ENTRYPOINT
[root@docker dockerfile]# vim dockerfile-ENTRYPOINT-test   #编写dockerfile文件
FROM centos
ENTRYPOINT ["ls","-a"]
[root@docker dockerfile]# docker build -f dockerfile-ENTRYPOINT-test  -t entrypointtest .   #构建镜像
[root@docker dockerfile]# docker run fd149b7d1690   #运行镜像
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found

#2.想追加一个命令-l  【ls -al】
[root@docker dockerfile]# docker run fd149b7d1690 -l
total 0
drwxr-xr-x   1 root root   6 Mar 20 10:07 .
drwxr-xr-x   1 root root   6 Mar 20 10:07 ..
-rwxr-xr-x   1 root root   0 Mar 20 10:07 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root 340 Mar 20 10:07 dev

5.实战测试tomcat镜像

在这里插入图片描述

#1.准备镜像文件 tomcat压缩包  jdk压缩包
#2.编写dockerfile文件,官方命名Dockerfile,build时候会自动寻找这个文件,不需要-f指定
vim Dockerfile
FROM centos
MAINTAINER fxs<[email protected]>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/  #自动解压到此目录
ADD aoache-tomcat-9.0.22.tar.gz /usr/local/   #自动解压到此目录
RUN yum install vim -y

ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH #JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
EVN CATALINA_BASH /usr/local/apache-tomcat-9.0.22
EVN PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

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


#3.构建镜像
docker build -t diytomcat .
docker images  #查看自己构建的镜像

#4.启动镜像(第一个-v 指定项目目录,第二个-v指定日志目录)
docker run -d -p 9090:8080 --name fxstomcat -v /home/build/tomcat/test:/usr/local/appache-tomcat-9.0.22/webapps/test  -v /home/build/tomcat/tomcatlogs/:/usr/local/appache-tomcat-9.0.22/logs diytomcat

#5.访问测试
本地:curl localhost:9090
浏览器:外网IP:9090

#6.发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)
cd test
mkdir WEB-INF
cd WEB-INF
vim web.xml===》百度搜索  见下下图
cd ..  返回test层
vim index.jsp===》百度搜索  见下下下图

在这里插入图片描述
web.xml内容:
在这里插入图片描述
index.jsp内容:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_52492280/article/details/115133976