接下来,学习的是docker的进阶知识点。
开头不说mysql的主从复制和redis的集群。因为后面有K8s,能帮我们简化命令。真的,命令太多了,看着都难受,更别说学了。后面直接用K8s,分分钟搞定。
dockerFile是什么?
我们写好的项目最后都是部署在docker容器内的。而docker容器内只能是镜像实例,镜像实例又是镜像文件创建出来的。所以,我们完成的项目必须先转换为镜像文件,然后run出镜像实例,最后才能在docker容器内部运行。
综上,DockerFile是帮助我们去打包项目成为镜像文件的工具脚本。
说人话,就是:DockerFile是一本说明书【订单、单子、药方】;docker根据DockerFile上面的一行行的步骤去【抓药、煮饭】。最后将成品打包成一个镜像。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。
dockerFile官方文档,请点击
dockerFile保留字【关键字】要求:
其实,dockerFile我们已经见过了。拉取Tomcat镜像的时候,去那个官网看看
docker官网上的tomcat镜像地址,请点击…
![在这里插入图片描述](https://img-blog.csdnimg.cn/3be32067746743b0890c6c4ecd7145ca.png
常用的保留字介绍:
看这个很难受。实践上手,就能明白了。
组长给了你这样一个任务:
在docker中打包一个新的CentOS镜像,称为myCentOS。这个myCentOS必须包含 vim + ifconfig + JDK8这些东西,另外还要加一份说明文件dem.txt .你怎么完成?
上诉的需求,就需要用到DockerFile脚本去自定义一个镜像了。
先从官方仓库去拉取一个CentOS模板
上传的材料准备好了,是不是应该去手写DockerFile文件了?【注意:DockerFile文件必须与材料放在同一级目录】
#继承父类
FROM centos
#指定作者、邮箱
MAINTAINER hang<yinhanghang@aapss.com>
#设定环境变量
ENV MYPATH /usr/local
#我进入该终端的起始路径
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装lib库、类似于gcc的加强版、并创建将要存储的JDK录
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
docker build -t {新的自定义镜像名}:{TAG} .
创建自己的镜像;【注意:TAG {空格} .{逗号,表示当前目录下去找Dockerfile}】
这串命令没有指定Dockerfile文件。所以,必须在Dockerfile文件的当前目录下去运行该命令。且文件名必须为Dockfile.
修改版本为 CentOS 7
成功效果:
docker run -it javacentos:1.0 /bin/bash
查看JDK 8的存放路径
检测是否具有vim、ifconfig、JDK8新功能:
自定义的镜像打包成功!
虚悬镜像:
docker build -t .
没有镜像名、标签版本的镜像. 一般是自己创建镜像时出现【你没写呗】。遇到了直接剔除即可。
删除虚悬镜像:
docker image ls -f dangling=true
查找你本地仓库的虚悬镜像
docker image prune
删除所有的虚悬镜像
docker网络是什么?
ifconfig
docker network ls
安装docker以后,系统默认创建的三大网络模式。该命令是查看所有的docker网络模式。
docker network --help
切记:【千万别去删除系统默认的网络模式,如果你真的删了,那我只能说:“重来吧,朋友!”】
docker网络能干什么?
一般的docker网络没有特别说明,就默认是bridge网络模式。
bridge网络模式:
bridge网络模式会给每一个镜像实例赋予一个ip地址和网关。【给鲸鱼背上的各个集装箱都生成一个ip地址和网关】。
docker run -d -p 3306:3306 --name=hangmysql mysql:5.7
docker inspect hangmysql | tail -n 20
bridge网络模式的分配ip地址的策略是:
总结:
ip地址是资源,不可能浪费掉。
一个docker上的实例有几个,那么就会分配几个ip地址,并且ip地址是连续的
docker内部运行了很多个容器实例。这个时候就需要管理了。容器编排就是来管理这些容器实例的。
需要定义一个YAML格式的配置文件。
docker-compose.yml
写好多个容器之间的调用关系。然后只需要一个命令,就可以同步的启动、管理这些容器实例。类似于Dockerfile.
有这么一个场景:你要把你写的项目打包成镜像,然后作为docker实例运行在docker上。但这个项目的前提要求是把mysql、redis等容器实例部署好,才能运行。你是不是得先去启动mysql、redis?
一个两个辅助实例启动还能行。但万一,有十几个这样的容器实例,是不是得一直run十几次?所以,有没有这样一个思路。我把需要的辅助实例这些启动命令列个清单,就跟Dockerfile差不多?这就是docker-compose.yml文件
docker-compose:
docker-compose官方下载文档,请点击…
docker compose --version
新版的docker容器,不需要下载。自带有 docker-compose
// docker-compose的版本必须为3
version: "3"
//services 相当于 run出你项目镜像的容器实例
services:
//microService 一般写你的项目名+service ;随便写也可以
microService:
//你的项目打包生成的镜像
image: zzyy_docker:1.6
//生成的docker实例名
container_name: ms01
//端口映射
ports:
- "6001:6001"
//容器卷
volumes:
- /app/microService:/data
//docker网络
networks:
- atguigu_net
//需要的依赖,填的是下面的redsi 、 mysql 名字
depends_on:
- redis666
- mysql
//redis 要跟depends_on中的同步,且这个是【服务名】!以后访问就是写这个
redis666:
//redis镜像
image: redis:6.0.8
//端口映射
ports:
- "6379:6379"
//容器卷
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
//docker网络,必须与你的项目实例保持在同一网络,不然访问不到
networks:
- atguigu_net
//启动命令,读取配置文件
command: redis-server /etc/redis/redis.conf
//mysql
mysql:
//mysql镜像
image: mysql:5.7
//配置环境
environment:
//密码
MYSQL_ROOT_PASSWORD: '123456'
//可以不写
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'zzyy'
MYSQL_PASSWORD: 'zzyy123'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- atguigu_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
//创建docker网络
networks:
atguigu_net:
文件名必须是
docker-compose.yml
,且一般与Dockerfile放在同级目录下。
只针对docker-compose.yml
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id/bin/bash # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
Portainer:提供了图形化界面,用于方便的管理Docker环境,无论是集群环境还是单机环境。
Portainer官网,请点击…
安装:
docker search portainer/portainer-ce
docker pull portainer/portainer-ce
docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
-p 8000:8000 -p 9000:9000 【一个容器实例可以配多个端口映射】
–restart=always 【docker启动时,portainer自动跟着启动】
-v /var/run/docker.sock:/var/run/docker.sock【必须容器卷到该目录下,不然打不开】
【portainer/portainer 必须是这个镜像文件,其他的portainer不要run ,千万别去拉社区版!!!】
我这一篇讲的很水。Docker高级知识还有很多。但我为什么不讲呢?
因为Kubernetes来了!!!这才是时代的领航者