Docker进阶使用之二

DockerFile

DockerFile介绍

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

构建步骤:

  1. 编写一个dockerfile文件

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

  3. docker run运行镜像

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

查看一下官方怎么做的

很多官方的镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

官方既然可以制作镜像,那我们也可以!

DockerFile构建过程

基础知识:

  1. 每个保留关键字(指令)都必须是大写字母

  2. 执行从上到下顺序执行

  3. #表示注释

  4. 每一个指令都会创建提交一个新的镜像层,并提交!

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

Docker镜像逐渐成为了企业交付的标准,必须要掌握

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

Dockerfile:构建文件,定义了一切的步骤,源代码

DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品jar

Docker容器:容器就是镜像运行起来提供服务器

DockerFile的指令

 FROM    #基础镜像,一切从这里开始构建
 MAINTAINER  #镜像是谁写的,姓名+邮箱
 RUN     #镜像构建的时候需要运行的命令
 ADD     #步骤,tomcat镜像,这个tomcat压缩包!添加内容
 WORKDIR #镜像的工作目录
 VOLUME  #挂载的目录
 EXPOST  #暴露端口配置
 CMD     #指定这个容器启动的时候要运行的命令
 ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加命令
 ONBUILD #当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令,除法指令。
 COPY    #类似ADD,将我们文件拷贝到镜像中
 ENV     #构建的时候设置环境变量!

实战测试

Dokcer Hub中99%的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行的构建

创建自己的centos

 #1.编写Dockerfile的文件
 FROM centos
 MAINTAINER leshao<867927040@qq.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
 
 #2.通过这个文件构建镜像
 #命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]
 Successfully built f0560b315565
 Successfully tagged mycentos:0.1
 
 #3.测试运行
 docker run -it mycentos:0.1

我们可以列出本地进行的变更历史

image-20201102151743368

我们平时拿到一个镜像,可以研究一下他是怎么做的了

实战:tomcat镜像

  1. 准备镜像文件tomcat压缩包,jdk压缩包!

  2. 编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要-f指定了

image-20201102184026412

  1. 构建镜像

 docker build -t diytomcat .
  1. 启动镜像

    image-20201102184449669

  2. 访问测试

  3. 发布项目

发布自己的镜像

dockerhub

  1. 地址https://hub.docker.com/ 注册自己的账号

  2. 确定这个账号可以登录

  3. 在我们服务器上提交自己的镜像image-20201102192950787

  4. 提交自己的镜像image-20201102193428182

提交的时候也是按照镜像的层级提交!

阿里云镜像服务

  1. 登录阿里云

  2. 找到容器镜像服务

  3. 创建命名空间image-20201102194759387

  4. 创建容器镜像image-20201102194916977

image-20201102195031011

小结

image-20201102195614241

Docker网络

理解Docker0

清空所有环境

三个网络

问题:docker是如何处理网络访问的?

 docker run -d -P --name tomcat01 tomcat
 
 #查看容器内部网络地址 ip addr 发现容器启动的时候会得到一个eth0@if262 ip地址 docker分配的!
 [root@iZ2zeamm1ijxugkxau1bdnZ /]# docker exec -it tomcat01 ip addr
 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
 1216: eth0@if1217: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
        valid_lft forever preferred_lft forever
 

原理

  1. 我们没启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!

  2. 再启动一个容器测试,发现又多了一对网卡

 #我们发现这个容器带来网卡,都是一对对的
 #veth=pair 就是一堆的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
 #正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备
 #openstac,Docker容器之间的连接,OVS的连接,都是使用veth-pair技术
  1. 容器之间是可以ping通的

结论:tomcat01和tomcat02 是公用的一个路由器,docker0.

所有的容器不指定网络的情况下,都是docker0路由的,docket会给我们的容器分配哟个默认的可用ip

小结

docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥,docker0.

image-20201102214549526

docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件!)

只要容器删除,对应的网桥就没了

--link

思考一个场景,我们编写一个微服务,database url=ip; 项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以名字来进行访问容器?

image-20201102220239745

不建议使用--link

docker0的问题:不支持容器名连接访问

自定义网络

查看所有的docker网络

image-20201103074050781

网络模式

bridge:桥接docker(默认)

none:不配置网络

host:和宿主机共享网络

container:荣期间网络连通(局限大 不建议使用)

测试

 #我们直接启动的命令,--net bridge ,而这个就是我们的docker0
 docker run -d -P --name tomcat01 tomcat
 docker run -d -P --name tomcat01 --net bridge tomcat
 
 #docker0特点,默认,域名不能访问,--link可以打通连接
 
 #我们可以自定义一个网络!
 [root@iZ2zeamm1ijxugkxau1bdnZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
 1e22a224c7c5d81dc91011365bc856196a6de09706339589730039683c5e021a
 [root@iZ2zeamm1ijxugkxau1bdnZ ~]# docker network ls
 NETWORK ID         NAME               DRIVER             SCOPE
 69c2758780c1       bridge             bridge             local
 295a8d41184f       host               host               local
 1e22a224c7c5       mynet               bridge             local

我们自定义的网络docker都维护好了对应关系,推荐我们平时这样使用网络

好处

redis、mysql:不同的集群使用不同的网络,保证集群是安全和健康的

网络连通

image-20201103082801674

 #测试
 docker network connect mynet tomcat01
 
 #一个容器两个ip地址  

结论:假设要跨网络操作别人,就需要使用docker network connect 连通!

部署redis集群

 #创建网卡
 docker network create redis --subnet 172.38.0.0/16
 
 #通过脚本创建六个redis配置
 for port in $(seq 1 6); \
 do \
 mkdir -p /mydata/redis/node-${port}/conf
 touch /mydata/redis/node-${port}/conf/redis.conf
 cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
 port 6379
 bind 0.0.0.0
 cluster-enabled yes
 cluster-config-file nodes.conf
 cluster-node-timeout 5000
 cluster-announce-ip 172.38.0.1${port}
 cluster-announce-port 6379
 cluster-announce-bus-port 16379
 appendonly yes
 EOF
 done
 
 docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
 -v /mydata/redis/node-${port}/data:/data \
 -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
 
 docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
 -v /mydata/redis/node-1/data:/data \
 -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
 
 #创建集群
 redis-cli -cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

SpringBoot微服务打包Docker镜像

  1. 构建springboot项目

  2. 打包应用

  3. 编写dockerfile

  4. 构建镜像

  5. 发布运行

以后我们使用了Docker之后,给别人交付的就是一个镜像即可!

到了这里已经完全够用了。

预告:如果有很多镜像,怎么处理呢?

Docker Compose

简介

Dockerfile build run 手动操作,单个容器!

微服务,100个微服务!依赖关系

Docker Compose来轻松高效的管理容器。定义、运行多个容器

三步骤

  1. Dockerfile保证我们的项目在任何地方可以运行

  2. service是什么服务 docker-compose.yml这个文件怎么写

  3. 启动项目

作用:批量容器编排

Compose是docker官方的开源项目需要安装

dockerfile让程序在任何地方运行,web服务、redis、mysqlnginx,多个容器

Compose

image-20201103193757707

Compose:重要的概念

  • 服务services,容器、应用、(web、redis、mysql。。。)

  • 项目project,一组关联的容器。博客、web、mysql

安装

1.下载

 #不建议
 sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
 
 #镜像下载
 curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2.授权

 sudo chmod +x /usr/local/bin/docker-compose

3.测试

 docker-compose --version

4.如果一直安装失败,command not found

 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

体验

https://docs.docker.com/compose/gettingstarted/

  1. 应用app.py

  2. Dockerfile应用打包为镜像

  3. Docker-compose.yml文件(定义整个服务,需要的环境。web、redis)完整的上线服务!

  4. 启动comose项目(docker-compose up)

yaml规则

docker-compose.yaml 核心。!

 #3层!
 
 version:''      #版本
 services:       #服务
  服务1: web
   #服务配置
  images
  build
  network
  ......
  服务2: redis
 # 其他配置 网络/卷、全局规则
 volumes:
 networks:
 configs:
 ......

学习,要掌握规律

只要多写,多看。compose.yaml配置。

  1. 官网文档

https://docs.docker.com.compose/compose-file/#specifying-durations

  1. 开源项目compose.yaml

    redis、mysql、mq!

开源项目

博客

下载程序、安装数据库、配置......

compose应用=>一键启动!

  1. 下载项目(docker-compose.yaml)

  2. 如果需要文件。Dockerfile

  3. 文件准备齐全(直接一键启动项目)

后台启动

docker -d

docker-compose up -d