Docker进阶使用之二
DockerFile
DockerFile介绍
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
编写一个dockerfile文件
docker build构建成为一个镜像
docker run运行镜像
docker push发布镜像(DockerHub、阿里云镜像仓库!)、
查看一下官方怎么做的
很多官方的镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
DockerFile构建过程
基础知识:
每个保留关键字(指令)都必须是大写字母
执行从上到下顺序执行
#表示注释
每一个指令都会创建提交一个新的镜像层,并提交!
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
我们可以列出本地进行的变更历史
我们平时拿到一个镜像,可以研究一下他是怎么做的了
实战:tomcat镜像
准备镜像文件tomcat压缩包,jdk压缩包!
编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要-f指定了
构建镜像
docker build -t diytomcat .
启动镜像
访问测试
发布项目
发布自己的镜像
dockerhub
地址https://hub.docker.com/ 注册自己的账号
确定这个账号可以登录
在我们服务器上提交自己的镜像
提交自己的镜像
提交的时候也是按照镜像的层级提交!
阿里云镜像服务
登录阿里云
找到容器镜像服务
创建命名空间
创建容器镜像
小结
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
原理
我们没启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!
再启动一个容器测试,发现又多了一对网卡
#我们发现这个容器带来网卡,都是一对对的
#veth=pair 就是一堆的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
#正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备
#openstac,Docker容器之间的连接,OVS的连接,都是使用veth-pair技术
容器之间是可以ping通的
结论:tomcat01和tomcat02 是公用的一个路由器,docker0.
所有的容器不指定网络的情况下,都是docker0路由的,docket会给我们的容器分配哟个默认的可用ip
小结
docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥,docker0.
docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件!)
只要容器删除,对应的网桥就没了
--link
思考一个场景,我们编写一个微服务,database url=ip; 项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以名字来进行访问容器?
不建议使用--link
docker0的问题:不支持容器名连接访问
自定义网络
查看所有的docker网络
网络模式
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:不同的集群使用不同的网络,保证集群是安全和健康的
网络连通
#测试
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镜像
构建springboot项目
打包应用
编写dockerfile
构建镜像
发布运行
以后我们使用了Docker之后,给别人交付的就是一个镜像即可!
到了这里已经完全够用了。
预告:如果有很多镜像,怎么处理呢?
Docker Compose
简介
Dockerfile build run 手动操作,单个容器!
微服务,100个微服务!依赖关系
Docker Compose来轻松高效的管理容器。定义、运行多个容器
三步骤
Dockerfile保证我们的项目在任何地方可以运行
service是什么服务 docker-compose.yml这个文件怎么写
启动项目
作用:批量容器编排
Compose是docker官方的开源项目需要安装
dockerfile让程序在任何地方运行,web服务、redis、mysqlnginx,多个容器
Compose
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/
应用app.py
Dockerfile应用打包为镜像
Docker-compose.yml文件(定义整个服务,需要的环境。web、redis)完整的上线服务!
启动comose项目(docker-compose up)
yaml规则
docker-compose.yaml 核心。!
#3层!
version:'' #版本
services#服务
服务1 web
#服务配置
images
build
network
......
服务2 redis
# 其他配置 网络/卷、全局规则
volumes
networks
configs
......
学习,要掌握规律
只要多写,多看。compose.yaml配置。
官网文档
https://docs.docker.com.compose/compose-file/#specifying-durations
开源项目compose.yaml
redis、mysql、mq!
开源项目
博客
下载程序、安装数据库、配置......
compose应用=>一键启动!
下载项目(docker-compose.yaml)
如果需要文件。Dockerfile
文件准备齐全(直接一键启动项目)
后台启动
docker -d
docker-compose up -d