docker部署--高级篇【运维开发】

docker部署--高级篇

  • 前言
  • 一、DockerFile
  • 二、docker网络
  • 三、docker-compose 容器编排
  • Docker轻量级可视化工具Portainer
  • 总结:


前言

接下来,学习的是docker的进阶知识点。

开头不说mysql的主从复制和redis的集群。因为后面有K8s,能帮我们简化命令。真的,命令太多了,看着都难受,更别说学了。后面直接用K8s,分分钟搞定。


一、DockerFile

dockerFile是什么?

我们写好的项目最后都是部署在docker容器内的。而docker容器内只能是镜像实例,镜像实例又是镜像文件创建出来的。所以,我们完成的项目必须先转换为镜像文件,然后run出镜像实例,最后才能在docker容器内部运行。
综上,DockerFile是帮助我们去打包项目成为镜像文件的工具脚本。

说人话,就是:DockerFile是一本说明书【订单、单子、药方】;docker根据DockerFile上面的一行行的步骤去【抓药、煮饭】。最后将成品打包成一个镜像。

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。

docker部署--高级篇【运维开发】_第1张图片

dockerFile官方文档,请点击

dockerFile保留字【关键字】要求:

  • 保留字必须大写,且后面必须至少跟一个参数【不然你写出来的意义在哪?】
  • 顺序执行
  • ‘’#‘’ 表示注释

其实,dockerFile我们已经见过了。拉取Tomcat镜像的时候,去那个官网看看

docker官网上的tomcat镜像地址,请点击…

docker部署--高级篇【运维开发】_第2张图片
![在这里插入图片描述](https://img-blog.csdnimg.cn/3be32067746743b0890c6c4ecd7145ca.png

常用的保留字介绍:

docker部署--高级篇【运维开发】_第3张图片

看这个很难受。实践上手,就能明白了。

组长给了你这样一个任务:

在docker中打包一个新的CentOS镜像,称为myCentOS。这个myCentOS必须包含 vim + ifconfig + JDK8这些东西,另外还要加一份说明文件dem.txt .你怎么完成?

上诉的需求,就需要用到DockerFile脚本去自定义一个镜像了。

  • 先从官方仓库去拉取一个CentOS模板

在这里插入图片描述

  • 去下载一个JDK8文件【你可以把JDK8理解为你以后要部署到服务器上的项目+环境】

在这里插入图片描述

  • 自定义一个说明文件hang.txt.然后一起放到共享文件夹内。

Windows上:
docker部署--高级篇【运维开发】_第4张图片虚拟机上
docker部署--高级篇【运维开发】_第5张图片

上传的材料准备好了,是不是应该去手写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的加强版、并创建将要存储的JDKRUN 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.

docker部署--高级篇【运维开发】_第6张图片

docker部署--高级篇【运维开发】_第7张图片

修改版本为 CentOS 7

docker部署--高级篇【运维开发】_第8张图片

成功效果:

docker部署--高级篇【运维开发】_第9张图片

docker部署--高级篇【运维开发】_第10张图片
运行我的新镜像:

  • docker run -it javacentos:1.0 /bin/bash

docker部署--高级篇【运维开发】_第11张图片

查看JDK 8的存放路径
docker部署--高级篇【运维开发】_第12张图片
检测是否具有vim、ifconfig、JDK8新功能:

docker部署--高级篇【运维开发】_第13张图片
在这里插入图片描述

自定义的镜像打包成功!

虚悬镜像:

  • docker build -t .

没有镜像名、标签版本的镜像. 一般是自己创建镜像时出现【你没写呗】。遇到了直接剔除即可。

删除虚悬镜像:

  • docker image ls -f dangling=true

查找你本地仓库的虚悬镜像

  • docker image prune

删除所有的虚悬镜像

二、docker网络

docker网络是什么?

  • ifconfig

docker部署--高级篇【运维开发】_第14张图片

  • docker network ls

安装docker以后,系统默认创建的三大网络模式。该命令是查看所有的docker网络模式。

docker部署--高级篇【运维开发】_第15张图片

  • docker network --help

docker部署--高级篇【运维开发】_第16张图片

  • docker inspect bridge
    docker部署--高级篇【运维开发】_第17张图片
    docker部署--高级篇【运维开发】_第18张图片

切记:【千万别去删除系统默认的网络模式,如果你真的删了,那我只能说:“重来吧,朋友!”】

docker网络能干什么?

  • 容器间的互联和通信以及端口映射,【一条鲸鱼背上的多个集装箱的通信】
  • 容器IP变动时可以通过服务名直接网络通信而不受到影响。【多条鲸鱼的通信】

一般的docker网络没有特别说明,就默认是bridge网络模式。

bridge网络模式:

bridge网络模式会给每一个镜像实例赋予一个ip地址和网关。【给鲸鱼背上的各个集装箱都生成一个ip地址和网关】。

  • docker run -d -p 3306:3306 --name=hangmysql mysql:5.7
  • docker inspect hangmysql | tail -n 20

docker部署--高级篇【运维开发】_第19张图片

bridge网络模式的分配ip地址的策略是:

  • 当创建了m1、m2、m3等多个实例时,会依次分配 【172.17.0.1】、【172.17.0.2】、【172.17.0.3】…
  • 当你删除了m2容器实例时,m3的ip地址就会变为【172.17.0.2】

总结:

  • ip地址是资源,不可能浪费掉。
  • 一个docker上的实例有几个,那么就会分配几个ip地址,并且ip地址是连续的
  • 容器实例的ip地址是会变化的,所以,通过ip去访问容器实例是不可靠的。所以,只能用服务名去定位

docker部署--高级篇【运维开发】_第20张图片

三、docker-compose 容器编排

docker内部运行了很多个容器实例。这个时候就需要管理了。容器编排就是来管理这些容器实例的。

需要定义一个YAML格式的配置文件。docker-compose.yml写好多个容器之间的调用关系。然后只需要一个命令,就可以同步的启动、管理这些容器实例。类似于Dockerfile.

有这么一个场景:你要把你写的项目打包成镜像,然后作为docker实例运行在docker上。但这个项目的前提要求是把mysql、redis等容器实例部署好,才能运行。你是不是得先去启动mysql、redis?

一个两个辅助实例启动还能行。但万一,有十几个这样的容器实例,是不是得一直run十几次?所以,有没有这样一个思路。我把需要的辅助实例这些启动命令列个清单,就跟Dockerfile差不多?这就是docker-compose.yml文件

docker-compose:

  • Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

docker-compose官方下载文档,请点击…

  • docker compose --version

新版的docker容器,不需要下载。自带有 docker-compose

docker部署--高级篇【运维开发】_第21张图片

// 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      # 停止服务

Docker轻量级可视化工具Portainer

Portainer:提供了图形化界面,用于方便的管理Docker环境,无论是集群环境还是单机环境。

Portainer官网,请点击…

安装:

  • docker search portainer/portainer-ce
  • docker pull portainer/portainer-ce

docker部署--高级篇【运维开发】_第22张图片

  • 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部署--高级篇【运维开发】_第23张图片
访问:

docker部署--高级篇【运维开发】_第24张图片
localdocker部署--高级篇【运维开发】_第25张图片

总结:

我这一篇讲的很水。Docker高级知识还有很多。但我为什么不讲呢?

  • docker是在走下坡路了。
  • 一般公司用docker也就是打包成镜像,简单部署一下,当个小团体的测试环境。
  • docker的高级知识一般也没用过

因为Kubernetes来了!!!这才是时代的领航者

你可能感兴趣的:(docker,运维开发,容器)