docker高级篇

哈喽,大家好,我是花臂。

docker镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

UnionFS (联合文件系统)

UnionFS (联合文件系统) : Union文件 系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的, 包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos 等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?

对于一个精简的OS, rootfs可 以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

分层的镜像

为什么Docker镜像要采用这种分层结构呢?

最大的一个好处就是共享资源
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

docker镜像commt操作补充

语法:docker commit -a="提交的作者信息" -m="提交的描述信息" 容器ID 要创建的目标镜像名:[标签名]

步骤1:首先新建tomcat容器并启动

[root@bogon ~]# docker run -it -p 8888:8080 tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
20-May-2020 02:47:43.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/9.0.35
20-May-2020 02:47:43.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          May 5 2020 20:36:20 UTC
20-May-2020 02:47:43.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.35.0
20-May-2020 02:47:43.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
20-May-2020 02:47:43.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-862.el7.x86_64
20-May-2020 02:47:43.739 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
20-May-2020 02:47:43.739 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-11
20-May-2020 02:47:43.739 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           11.0.7+10
20-May-2020 02:47:43.739 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
20-May-2020 02:47:43.740 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
20-May-2020 02:47:43.740 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
20-May-2020 02:47:43.959 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
//-p 映射端口号:tomcat端口号
//这里也可以用 -P自动分配端口号
//这里也可以创建守护式容器运行:docker run -d -p 8888:8080 tomcat

步骤2:在的浏览器上输入ip地址:8888

404?找不到?别慌,我们进入容器内部查看。

可以看出webapps里面啥都没有,所以会报404,但是文件都在webapps.dist里面,所以我们将webapps.dist里面的文件复制或移动到webapps里面就好了。

步骤3:进入到tomcat目录中将webapps中的docs删除掉

[root@bogon ~]# docker exec -it cdc8bf4c6d8e /bin/bash
root@cdc8bf4c6d8e:/usr/local/tomcat# cd webapps/
root@cdc8bf4c6d8e:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@cdc8bf4c6d8e:/usr/local/tomcat/webapps# rm -rf docs/

步骤4:重启tomcat容器,并进入浏览器查看tomcat自带文档

删除docs文件之后查看tomcat文档就报404了

步骤5:docker commit提交容器副本使之成为一个新的镜像

步骤6:启动创建上一步创建好的mytomcat镜像

注意:这里是大写的-P,所以表示随机分配端口映射,所以浏览器访问的端口号为32768

ok,这一步就完成了,利用docker commit这个功能,我们可以在镜像里加一些自己的东西然后生成自己的镜像。

dokcer容器数据卷

是什么

一句话:有点类似我们Redis里面的rdb和aof文件
说白了就是做容器数据持久化、容器间继承+共享数据的。

数据卷

直接命令添加

语法:docker run -it -v /宿主机的绝对路径目录:/容器的绝对路径目录 镜像名字

[root@bogon ~]# docker run -it -v /HostdataValue:/ContainerdateValue centos

查看数据卷是否成功挂载


如图所示,说明数据卷挂载成功

容器与宿主机之间数据共享

在宿主机和容器的数据卷中各添加一个文件

[root@13023555dbb8 /]# ls
ContainerdateValue  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@13023555dbb8 /]# touch ContainerdateValue/bb.txt
[root@bogon /]# ls
bin  boot  dev  etc  home  HostdataValue  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@bogon /]# touch /HostdataValue/aa.html

查看容器和宿主机数据卷中的文件


文件一致,说明说明容器和宿主机之间数据可以共享

容器停止退出后,主机修改后数据是否同步
1.先停止容器

[root@13023555dbb8 /]# exit
exit
[root@bogon ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

2.在宿主机数据卷中添加一个文件

[root@bogon /]# touch HostdataValue/123.text
[root@bogon /]# ls HostdataValue/
123.text  aa.html  bb.txt

3.重新启动容器查看数据卷中的文件

[root@bogon ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
13023555dbb8        centos              "/bin/bash"         About an hour ago   Exited (0) 16 seconds ago                       elegant_allen
[root@bogon ~]# docker start 13023555dbb8
13023555dbb8
[root@bogon ~]# docker exec -it 13023555dbb8 /bin/bash
[root@13023555dbb8 /]# ls ContainerdateValue/
123.text  aa.html  bb.txt

结论:容器停止后,宿主机修改数据之后容器仍然可以同步数据

带权限的命令添加

语法:语法:docker run -it -v /宿主机的绝对路径目录:/容器的绝对路径目录:ro 镜像名字

[root@bogon ~]# docker run -it -v /HostValue:/ConValue:ro centos
[root@85bcab8a1509 /]# cd ConValue/
[root@85bcab8a1509 ConValue]# touch a.html
touch: cannot touch 'a.html': Read-only file system

结论:用带权限的命令添加,宿主机可以更改数据卷中的文件,但是容器内的数据卷只能被读(readonly),不能更改或者删除

dockerFile添加

1.根目录下新建mydocker文件夹并创建Dockerfile文件并进入

[root@bogon /]# mkdir mydocker
[root@bogon /]# cd mydocker/
[root@bogon mydocker]# touch Dockerfile

2.file构建

[root@localhost mydocker]# vim Dockerfile 
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,----------success1"
CMD /bin/bash   

3.build后生成镜像

[root@bogon mydocker]# docker build -f /mydocker/Dockerfile -t zmq/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 470671670cac
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
 ---> Running in f1c00b5183b2
Removing intermediate container f1c00b5183b2
 ---> 990ff7cbb1b0
Step 3/4 : CMD echo "finished,----------success1"
 ---> Running in cd0a73a880ce
Removing intermediate container cd0a73a880ce
 ---> 5999509fc07c
Step 4/4 : CMD /bin/bash
 ---> Running in 00f191dd728b
Removing intermediate container 00f191dd728b
 ---> 5670db9a12c6
Successfully built 5670db9a12c6
Successfully tagged zmq/centos:latest
[root@bogon mydocker]# 

4.run容器并查看容器卷

[root@bogon mydocker]#  docker run -it zmq/centos
[root@14ab11bc24e5 /]# ls
bin           dataVolumeContainer2  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dataVolumeContainer1  dev           home  lib64  media       opt  root  sbin  sys  usr
[root@14ab11bc24e5 /]# 

5.查看宿主机对应的数据卷

[root@bogon /]# docker inspect 14ab11bc24e5
 "Mounts": [
            {
                "Type": "volume",
                "Name": "96a884bdc1fa24689f88c67ea3b2736b4ced06a42264c8c9fc8eda41bc12ff1f",
                "Source": "/var/lib/docker/volumes/96a884bdc1fa24689f88c67ea3b2736b4ced06a42264c8c9fc8eda41bc12ff1f/_data",
                "Destination": "/dataVolumeContainer1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "80b2894d35554f3808380e2ea4a9f5b8062596306577cb0c4406a92b48869b6f",
                "Source": "/var/lib/docker/volumes/80b2894d35554f3808380e2ea4a9f5b8062596306577cb0c4406a92b48869b6f/_data",
                "Destination": "/dataVolumeContainer2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

这里就不测试了,这个dockerfile后面会详细讲解,这个可以先忽略。

数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
意思是:a挂载b,c,d,e挂载a

容器间传递共享

1.用新建好的zmq/centos为模板创建dc01/dc02/dc03容器,让dc02/dc03继承dc01

[root@localhost /]# docker run -it --name dc01 zmq/centos
[root@localhost /]# docker run -it --name dc02 --volumes-from dc01 zmq/centos
[root@localhost /]# docker run -it --name dc03 --volumes-from dc01 zmq/centos

2.分别在dc01/dc02/dc03卷中添加文件数据,看看数据是否共享

[root@54ba6e23052c dataVolumeContainer2]# touch dc01.txt
[root@54ba6e23052c dataVolumeContainer2]# ls
a.html
[root@54ba6e23052c dataVolumeContainer2]# touch dc02.txt
[root@54ba6e23052c dataVolumeContainer2]# ls
a.html
[root@54ba6e23052c dataVolumeContainer2]# touch dc03.txt
[root@54ba6e23052c dataVolumeContainer2]# ls
a.html
[root@fa08b0fd1abb dataVolumeContainer2]# ls
dc03.txt  dco1.txt  dco2.txt

通过观察,可以看出这三个容器之间的数据是可以共享的

3.删除dc01,然后在dc02中新建文件,查看dc03中是否有数据

[root@localhost /]# docker rm -f dc01
[root@0d0779bf05e1 dataVolumeContainer2]# touch dc02-2.txt
[root@34464cd99238 dataVolumeContainer2]# ls
dc01.txt  dc02-2.txt  dc02.txt  dc03.txt

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

dockerFile解析

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

构建三步骤

  1. 编写DockerFile文件
  2. docker build
  3. docker run

文件长什么样

以我们熟悉的centos为例

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20191001"

CMD ["/bin/bash"]

dockerFile内容基础知识

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层, 并对镜像进行提交

docker执行DockerFile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

dockerFile体系结构(保留字指令)

  1. FROM:基础镜像,当前新镜像是基于哪个镜像的
  2. MAINTAINER:镜像维护者的姓名和邮箱地址
  3. RUN:容器构建时需要运行的命令
  4. EXPOSE:当前容器对外暴露出的端口
  5. WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  6. ENV:用来在构建镜像过程中设置环境变量
    ENV MY_ PATH /usr/mytest
    这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;
    也可以在其它指令中直接使用这些环境变量,
    比如 WORKDIR $MY_PATH
  7. ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  8. COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
    copy src dest
    copy ["src","dest"]
  9. VOLUME:容器数据卷,用于数据保存和持久化工作
  10. CMD:指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
  11. ENTRYPOINT:指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
  12. ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

案例

Base镜像(scratch)

DockerHub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

自定义镜像mycentos

拉取centos镜像并启动

[root@bogon mydocker]# docker run -it centos
[root@0e3ce3512975 /]# vim tt.txt
bash: vim: command not found
[root@0e3ce3512975 /]# ifconfig
bash: ifconfig: command not found

结论:默认centos终端登录进来的位置为"/",不支持vim编辑器,不支持ifconfig指令

编写dockerFile文件
使得自定义的镜像具备以下要求:

  1. 登录进来的位置为/usr/local
  2. 具有vim编辑器
  3. 可以使用ifconfig指令查看自己的ip
[root@localhost mydocker]# vim Dockerfile2
FROM centos
MAINTAINER zmq<zmq2911@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo "success---------ok"
CMD /bin/bash

构建
语法:语法:docker build -f docker文件路径 -t 新镜像名字:tag(标签) .

[root@bogon mydocker]# docker build -f /mydocker/Dockerfile2 -t mycentos:1.3 .
Sending build context to Docker daemon  3.072kB
Step 1/9 : FROM centos
......
Step 9/9 : CMD /bin/bash
 ---> Running in 5ad8b7d0e9a3
Removing intermediate container 5ad8b7d0e9a3
 ---> cb1a10981f34
Successfully built cb1a10981f34
Successfully tagged mycentos:1.3

运行

[root@bogon mydocker]# docker run -it mycentos:1.3
[root@2437ec5b1b30 local]# pwd
/usr/local
[root@2437ec5b1b30 local]# vim --help
...
[root@2437ec5b1b30 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 1000  (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

列出镜像的变更历史
语法:语法:docker history 镜像id

[root@bogon /]# docker history cb1a10981f34
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
cb1a10981f34        7 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
169713372905        7 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
9392afbaa9e1        7 minutes ago       /bin/sh -c #(nop)  EXPOSE 80                    0B                  
ea8ba88e7b4b        7 minutes ago       /bin/sh -c yum -y install net-tools             24MB                
b6193c99c0ea        7 minutes ago       /bin/sh -c yum -y install vim                   59.8MB              
ab619b18a6be        8 minutes ago       /bin/sh -c #(nop) WORKDIR /usr/local            0B                  
ad61ece0b5e6        8 minutes ago       /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B                  
f190e0e8c0ec        8 minutes ago       /bin/sh -c #(nop)  MAINTAINER zmq<zmq2911@16…   0B                  
470671670cac        4 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           4 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           4 months ago        /bin/sh -c #(nop) ADD file:aa54047c80ba30064…   237MB

CMD/ENTRYPOINT镜像案例

CMD

1.编写DockerFile文件

[root@localhost mydocker]# vim Dockerfile3

FROM centos
RUN yum install curl
CMD ["curl","-s","https://ip.cn/"]

2.构建镜像myip

[root@bogon mydocker]# docker build -f /mydocker/Dockerfile3 -t myip .
Sending build context to Docker daemon  4.096kB
Step 1/3 : FROM centos
 ---> 470671670cac
Step 2/3 : RUN yum install curl
 ---> Running in 2fd27ea31f2b
CentOS-8 - AppStream                            125 kB/s | 7.0 MB     00:57    
CentOS-8 - Base                                  48 kB/s | 2.2 MB     00:46    
CentOS-8 - Extras                               178  B/s | 5.9 kB     00:33    
Package curl-7.61.1-11.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
Removing intermediate container 2fd27ea31f2b
 ---> 42d9884d06d9
Step 3/3 : CMD ["curl","-s","https://ip.cn/"]
 ---> Running in abd5a19d01f9
Removing intermediate container abd5a19d01f9
 ---> e150c3c49afe
Successfully built e150c3c49afe
Successfully tagged myip:latest

运行

[root@localhost mydocker]# docker run myip
{"ip": "27.28.98.41", "country": "湖北省宜昌市", "city": "电信"}
[root@localhost mydocker]# docker run myip -i
exec: "-i": executable file not found in $PATH
Error response from daemon: Cannot start container 4ba9522e20dca912c3348df9cf1d51823d493daa79ca62567cbdf7ef62fdf542: [8] System error: exec: "-i": executable file not found in $PATH

结论:使用CMD的时候,当你在docker run后面加其他指令的话会替换掉DockerFile文件里面的CMD的内容,所以会报错

ENTRYPOINT
1.编写DockerFile文件

[root@localhost mydocker]# vim Dockerfile3

FROM centos
RUN yum install curl
ENTRYPOINT ["curl","-s","https://ip.cn/"]

2.构建镜像myip2

[root@localhost mydocker]# docker build -f /mydocker/Dockerfile4 -t myip2 .

3.运行

结论:当你使用ENTRYPOINT的时候,在docker run 后面加其他指令会追加到ENTRYPOINT的内容后面,不会覆盖和替换

ONBUILD案例

当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
1.编写DockerFile文件

[root@localhost mydocker]# vim Dockerfile4
FROM centos
RUN yum install curl
ENTRYPOINT ["curl","-s","https://ip.cn/"]
ONBUILD RUN echo "father images onbuid-------886"

2.构建

[root@localhost mydocker]# docker build -f /mydocker/Dockerfile4 -t fatherdocker .

3.以fatherdocker为父镜像构建一个子镜像

[root@localhost mydocker]# vim Dockerfile5

FROM fatherdocker
RUN yum install curl
CMD ["curl","-s","https://ip.cn/"]

4.构建子镜像并运行

自定义镜像tomcat9

1.mkdir -p /zmq/mydockerfile/tomcat9

[root@localhost /]# mkdir -p /zmq/mydockerfile/tomcat9

2.上述目录中创建c.txt,并将tomcat和jdk的安装包拷贝进来

[root@localhost tomcat9]# touch c.txt
[root@localhost tomcat9]# ll
总用量 200756
-rw-r--r--. 1 root root  11026056 1月  18 00:55 apache-tomcat-9.0.30.tar.gz
-rw-r--r--. 1 root root         0 1月  18 00:54 c.txt
-rw-r--r--. 1 root root 194545143 1月  18 00:55 jdk-8u241-linux-x64.tar.gz

3.在/zmq/mydockerfile/tomcat9 下新建Dockerfile文件并编辑

[root@localhost tomcat9]# vim Dockerfile 
FROM centos
MAINTAINER zmq<zmq2911@163.com>
#把宿主机当前上下文的c. txt拷贝到容器/usr/local/路径下
COPY  c.txt /usr/local/Container.txt
#把java与tomcat添加到容器中
ADD apache-tomcat-9.0.30.tar.gz /usr/local
ADD jdk-8u241-linux-x64.tar.gz  /usr/local
#安装vim编辑器
RUN yum -y install vim
#设置登录进来的位置
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_241
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.30
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.30
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器对外暴露的端口号
EXPOSE 8080
#容器启动时运行tomcat
CMD ["/usr/local/apache-tomcat-9.0.30/bin/catalina.sh", "run"]

4.构建tomcat镜像

[root@localhost tomcat9]# docker build -t tomcat9 .
//-f 表示指定Dockerfile文件路径的,如果在当前路径则不用指定,如果文件名字是Dockerfile则不用写文件名,它会默认去找这个文件名字

5.run运行容器

[root@bogon tomcat9]# docker run -d -p 9080:8080 --name mytomcat9 \
>  -v /zmq/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.30/webapps/test \
>  -v /zmq/mydockerfile/tomcat9/tomcat9logs:/usr/local/apache-tomcat-9.0.30/logs \
>  tomcat9

6.验证

7.测试发布web服务

1.在/zmq/mydockerfile/tomcat9/test目录下创建WEB-INF目录并创建a.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>docker</title>
</head>
<body>
----------welcome------------
<%="i am in docker tomcat self"%>
<br>
<% System.out.println("docker tomcat ceshi"); %>

</body>
</html>
[root@bogon test]# vim a.jsp
[root@bogon test]# mkdir WEB-INF
[root@bogon test]# ls
a.jsp  WEB-INF
[root@bogon test]# 

2.在WEB-INF下创建web.xml文件并编写

[root@localhost WEB-INF]# vim web.xml 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <display-name>test</display-name>
</web-app>

3.运行测试

本地镜像发布到阿里云

1.登录阿里云开发者平台,搜索容器镜像服务创建仓库
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
2.创建命名空间和仓库
3.设置访问凭证
推送的时候需要身份验证,所以需要设置密码

4.点击仓库管理

这三条命令是推送镜像到阿里云的命令

5.推送镜像到阿里云

[root@bogon WEB-INF]# docker login --username=花臂seven registry.cn-hangzhou.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@bogon WEB-INF]# sudo docker tag 7c5d46fa12dd registry.cn-hangzhou.aliyuncs.com/flower_arm/zmq:1.1
[root@bogon WEB-INF]# sudo docker push registry.cn-hangzhou.aliyuncs.com/flower_arm/zmq:1.1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/flower_arm/zmq]
451f392377e0: Pushed 
964a78b9e9ea: Pushed 
0287412859ca: Layer already exists 
0b91a6026b2e: Layer already exists 
0683de282177: Pushed 
1.1: digest: sha256:1ebe48fd529f7d62061f34973c7a8bcdf6c7c795dea410851924fb01e9767d88 size: 1373
[root@bogon WEB-INF]# 

6.在阿里云查看自己发布的镜像




需要将仓库设置为公开才能搜索到

7.拉取镜像

[root@bogon WEB-INF]# sudo docker pull registry.cn-hangzhou.aliyuncs.com/flower_arm/zmq:1.1
1.1: Pulling from flower_arm/zmq
8a29a15cefae: Already exists 
fbc4382b4174: Pull complete 
a14ec6f57e4c: Downloading [=================>                                 ]  3.935MB/11.2MB
8a3a954fb9bb: Downloading [>                                                  ]  3.683MB/196.6MB
f7bc46f3dc74: Downloading [=====>                                             ]  3.284MB/29.58MB

ok,docker教程加上前面两部分以前全部结束了,应该算是比较详细了,如果有什么疑问,欢迎下方评论区留言!

评论区



© [2020] · Powered by Typecho · Theme by Morecho
鄂ICP备20005123号