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

 

FROM centos

VOLUME ["volume01","volume02"]   ##匿名挂载

CMD echo "-----end-----"
CMD /bin/bash
docker build -f /home/docker-test-volume/dockerfile -t xilanxiaoge/centos:2.0 .   #当前目录生成镜像

 

镜像生成的容器内部,显示挂载的卷文件,

通过

docker inspect 容器id

 

可以查看,挂载的详细信息

 

数据卷容器

多个数据库进行数据同步

docker run -it --name docker02 --volumes-from docker01 xilanxiaoge/centos:2.0  ##容器docker02挂载docker01的数据卷
docker run -it --name docker01 --volumes-from docker01 xilanxiaoge/centos:2.0  ##容器docker01挂载docker01的数据卷

 

docker01容器变成了数据卷容器

##删除docker01后,docker02和docker03中的数据依然存在,是种基于拷贝的共享机制

 

容器之间的数据卷,数据卷容器的生命周期持续到没有容器使用为止;

但是-v进行持久化到本地的数据卷,则不会被删除。

 

Dockerfile

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

构建步骤:

1、编写一个dockerfile文件

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

3、docker run 运行镜像

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

 

查看DockerHub上的CentOS镜像

centos 8 转至gitHub

FROM scratch

ADD centos-8-x86_64.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="20200809"

CMD ["/bin/bash"]

 

Dockerfile构建

FROM             # 基础镜像
MAINTAINER       # 镜像是谁写的,姓名+邮箱
RUN              # 构建镜像时需要运行的命令
ADD              # 添加内容,例如:tomcat镜像,则是tomcat的压缩包
WORKDIR          # 镜像的工作目录
VOLUME           # 挂载主机目录
EXPOSE           # 暴露的端口设置
CMD              # 指定这个容器启动时要运行的命令,只有最后一个会生效,被替代  构建完容器之后执行
ENTRYPOINT       # 指定这个容器启动时要运行的命令,可以追加命令
ONBUILD          # 当构建一个被继承的dockerfile时,触发
COPY             # 类似ADD, 将本地文件拷贝到镜像中
ENV              # 构建的时候设置环境变量

Docker Hub 中99%的镜像都是从最基础的镜像开始构建  FROM scratch

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="20200809" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-08-09 00:00:00+01:00"

CMD ["/bin/bash"]

 

#cat docker_file_centos

FROM centos
MAINTAINER xilanxioage<843844390@123.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 80

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

 

docker build -f docker_file_centos -t mycentos:1.0   #构建    -f dockerfile文件路径   -t  镜像名:[tag]

 

docker run -it mycentos:1.0   #默认进入/usr/local/目录

 

docker history 镜像id     #可以查看镜像的构建历史

 

CDM命令

#docker_file_cmd_test
FROM centos
CMD ["ls","-a"]           # 构建镜像 执行 命令 ls -a
docker build -f docker_file_cmd_test -t cmdtest .  # 构建镜像

 

docker run cmdtest  # 执行镜像
docker run cmdtest ls -al  # ls -al命令会覆盖 CMD 命令

 

ENTRYPOINT命令

#docker_file_cmd_Entry_test
FROM centos
ENTRYPOINT  ["ls","-a"]           # 构建镜像 执行 命令 ls -a

 

docker build -f docker_file_cmd_Entroy_test -t cmdEntry_test . # 构建镜像

 

docker run cmdEntry_test  # 执行镜像 
docker run cmdEntry_test -l  # -l 命令会追加在 ENTRYPOINT 命令后

制作TomCat镜像

1、当前目录准备镜像文件tomcat压缩包,jdk的压缩包

2、编写dockerfile文件,官方命名Dockerfile,build时会自动寻找,不需要-f 指定目录

#Dockerfile
FROM centos
MAINTAINER xilanxiaoge<84384390@123.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u11-linux-x64.tar.gz /usr/local/       #jdk包放在当前目录
ADD apache-tomcat-9.0.22.tar.gz /usr/local/  #apache包放在当前目录

RUN yum -y install vim 

ENV MYPATH /usr/local                                  #相当于export命令
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINE_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINE_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.22/bin/staartup.sh && tail -F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out

 

docker build -t diytomcat .  #构建Dockerfile文件镜像

 

docker run -d \
      -p 9090:8080 \
     --name xilantomcat \
      -v /home/xilanxiaoge/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test \
      -v /home/xilanxiaoge/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs \    #tomcat日志目录
      diytomcat

 

 

发布镜像

发布到dockerHub上

1、dockerHub上注册自己的账号

2、docker login -u username  -p  密码          #  登录账号

3、docker push username/diytomcat:1.0      #  上传镜像

 

给镜像更改标签

docker tag 镜像id xilanxioage/tomcat:1.0      # 复制镜像,更改名称和标签(更改REPOSITORY 和 TAG)

镜像发布时也是按照层级进行提交

 

发布到阿里云镜像服务上:

去了解阿里云如何使用,参考官方文档

小结

docker 容器内文件夹挂载到宿主机 dockerfile 挂载文件_docker

docker save 和 load 保存为本地jar包和加载本地包

 

docker 容器内文件夹挂载到宿主机 dockerfile 挂载文件_centos_02

 

docker网络

理解docker0

#清空docker环境
docker rm -f $(docker ps -aq)             #删除全部容器
docker rmi -f $(docker image ls -aq)      #删除全部镜像

 

#ip addr

三个网卡 lo   eth0   docker0

lo:本地回环地址

eth0: 内网地址

docker0:docker 地址

 

技术原理:

每启动一个docker容器,docker都会给容器分配一个ip;

桥接模式,使用evth-pair技术;

# 发现容器带来的网卡都是成对出现的
# evth-pair 是一对虚拟设备接口,他们是成对出现的,一端连着协议,另一端连着彼此
# evth-pair 充当一个桥梁,连接各种虚拟网络设备
# OpenStack, Docker容器之间的连接,OVS的连接,都是使用evth-pair技术

docker 容器内文件夹挂载到宿主机 dockerfile 挂载文件_tomcat_03

 

小结:Docker使用的是Linux的网桥,宿主机中是一个Docker容器的网桥docker0,,,,,,,最多可以分配65535个容器?

docker 容器内文件夹挂载到宿主机 dockerfile 挂载文件_tomcat_04

Docker中的所有网络接口都是虚拟的。虚拟的转发效率高

 

--Link

docker run -d -P --name tomcat03 --link tomcat02  tomcat

在tomcat03中 执行 ping tomcat02  可以ping通

反过来,在tomcat02中 执行 ping tomcat03  不可以ping通

原理:在tomcat03这个linux环境下,配置的/etc/hosts修改的

docker 容器内文件夹挂载到宿主机 dockerfile 挂载文件_docker 容器内文件夹挂载到宿主机_05

--link不适用大范围

 

自定义网络

docker network ls                               # 查看所有网卡

docker network rm 网卡名或者id        # 删除指定网卡

网络模式

bridge : 桥接 docker (默认)

none :不配置网络

host  :和宿主机共享网络

container : 容器网络连通(用的少)

#直接启动的命令,  --net bridge,默认设置
docker run -d -P  --name tomcat01 tomcat
docker run -d -P  --name tomcat01 --net bridge tomcat
# 自定义一个网络   不使用--ling 也可以直接ping 容器名  可以ping通
# --driver bridge
# --subnet 192.168.0.0/16  子网   范围192.168.0.2-----192.168.255.255
# --gateway 192.168.0.1    网关
docker network creat --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet   #创建网络
docker network inspect mynet   #查看自己的网络

docker run -d -P --name tomcat-net-01 --net mynet tomcat                      #创建容器01,使用自己的网络
docker run -d -P --name tomcat-net-02 --net mynet tomcat                      #创建容器01,使用自己的网络

docker network inspect mynet                                                  #查看自己的网络

docker exec -it tomcate-net-01 ping 192.168.0.3                               #直接ping tomcat-net-02的ip
docker exec -it tomcate-net-01 ping tomcate-net-02                               #直接ping tomcat-net-02 是可以通的

 

网络连通

docker0网络与mynet网络之间进行连接

docker network connect mynet tomcat01  #将docker0网络中的tomcat01与mynet网络连接
docker network inspect mynet           #查看mynet网络的信息,可以观察到,将tomcat01放到了mynet网络中,给其赋值一个ip地址

docker 容器内文件夹挂载到宿主机 dockerfile 挂载文件_centos_06

docker exec -it tomcat01 ping tomcat-net-01             #可以ping通

 

 

SpringBoot 微服务打包成Docker镜像

1、构建springboot微项目

2、生成.jar包,执行java -jar ****.jar 可以运行

3、在idear中添加docker插件,编写Dockerfile文件

docker 容器内文件夹挂载到宿主机 dockerfile 挂载文件_centos_07

4、只需要将Dockerfile和*****.jar包文件上传到服务器;

docker 容器内文件夹挂载到宿主机 dockerfile 挂载文件_docker_08

5、运行测试

docker 容器内文件夹挂载到宿主机 dockerfile 挂载文件_tomcat_09