DockerFile
一:什么是DockerFile
- DockerFile是用来构建Docker的文本文件,是由一条条构建镜像所需的指令参数构成的脚本
二:DockerFile构建过程解析
- 每条保留字指令时都必须为大写字母且后面要很一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像并对镜像进行提交
2.1:DockerFile的执行大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器进行修改
- 执行类似于docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个容器
- 执行dockerfile中的下一条指令直到所有指令都加载完毕
2.2:FROM
- 基础镜像,当前的新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
2.3:MAINTAINER
- 镜像维护者的姓名和邮箱地址
2.4:RUN
- 容器构建时需要运行的命令
- 两种格式:shell格式 exec格式
- run是在docker build时运行
2.5:EXPOSE
- 当前容器对外暴露的端口
2.6:WORKDIR
- 指定容器创建后,终端默认登录的进来工作目录,一个落脚点
2.7:USER
- 指定镜像以什么样的用户去执行,如果不指定,默认是root
2.7:ENV
- 用来构建镜像过程中,设置环境变量
2.8:VOLUME
- 容器卷,用于保存数据和持久化工作
2.9:ADD
- 将宿主目录下的文件拷贝镜像且会自动处理URL和解压缩tar 压缩包
2.10:CMD
- 指定容器启动后要干的事情
- 可以有一个cmd命令,但只有最后一个会生效,cmd会被之前docker run之后的参数替换
- CMD和RUN的区别
- cmd是在docker run时运行
- run 是在docker build时运行
2.10:ENTRYPOINT
- 也是用来指定一个容器启动时要运行的命令
- 类似于cmd命令但是ENTRYPOINT不会被docker run后面的命令覆盖,而这些命令行参数会被当做参数传递给ENTRYPOINT指令指定的程序
三:自定义功能增强版centos7镜像
#下载
docker pull centos
#运行
docker run -it 5d0da3dc9764
#里面vim ifconfig 等等什么命令都没有,接下来用dockerfile来进行一个功能的增强
# 创建文件夹
mkdir myfile
-将java的安装包拷贝到目录下
#在当前目录
vim Dockerfile
#这边拉取了一个7的centos
FROM centos:7
MAINTAINER lxy<2050298183.com>
#落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u241-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_241
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
- 升级版1.5个g
三:虚悬镜像
构建或者删除的时候出现一些错误,会出现徐悬镜像
- docker image ls -f dangling=true
查看本地的徐悬镜像 - docker image prune
- 删除
四:Docker部署Springboot项目
- 打成jar包,先本地跑一下,可以跑起来那ok
- 将jar包直接拖进来
- 编写dockerfile
- vim Dockerfile
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER lxy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD Workpase-1.0-SNAPSHOT.jar zzyy_docker.jar
# 运行jar包
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 8081
- 构建镜像
docker build -t zzyy_docker:1.6 .
- 查看构建的镜像
docker images
- 启动
docker run -d -p 8081:8081 19b0ffd318f1
-查看
docker ps
- 运行成功
五:Docker网络
ifconfig 之后会产生一个虚拟的docker网桥
-
查看docker网络
docker network ls -
创建一个网络
docker network create lxy_docker
-
删除网络
docker network rm lxy_docker -
查看网络数据源
docker network inspect bridge
4.1:Docker网络作用
- 容器之间的互联通信和端口映射
- 容器ip变动时候可以通过服务名直接网络通信而不受影响
a的dockermysql想访问b的dockermysql
如果把地址写死了,docker重启一下他的ip地址会变更
通过网络去调用服务名,随便重启,不受影响
4.2底层容器的变化
- 启动一个ubuntu
docker run -it --name u1 ubuntu /bin/bash
- 在启动一个
docker run -it --name u2 ubuntu /bin/bash
-
docker inspect u1
-
docker inspect u1
bridge 是默认的桥接网络,人手一份,u1和u2的网络不一样 -
将u2杀掉
-
docker rm -f u2
-
docker run -it --name u3 ubuntu /bin/bash
在启动一个u3
-
发现u3还是和已经被被杀掉的u2一样
-
我们的u2挂了,但是这个ip被u3复用了,内容就会有变更,所以很麻烦
-
会发生的问题:docker容器内的ip是有可能发生变化的
4.3docker的bridge
名字是bridge
范围是local
网络驱动模式bridge
名字是host
范围是local
网络驱动模式host
名字是none
范围是local
网络驱动模式没有
- 接下来创建一个
- ocker network create docker_lxy
名字是docker_lxy
范围是local
网络驱动模式bridge (默认就是bridge)
- 创建两个容器
docker run -d -p 8081:8080 --name tom1 tomcat:8.5
docker run -d -p 8089:8080 --name tom2 tomcat:8.5
- 查看ip 发现 100和101哪去了,说明了
- docker0创建了一对虚拟接口一个是veth 一个是etho
- veth是暴露在外面的
- etho 是在容器内部访问ip adder就可以看到。这就是一个容器与宿主机通信的桥梁
4.3docker的host
- 直接使用主机的ip,地址与外面的设备进行通信,不需要额外的NAT转换
通过 host启动一个tomcat
docker run -d -p 8087:8080 --network host --name tom7 tomcat:8.5
- 启动完毕之后会有警告,不推荐你这么做。
- 为什么配置了-p但是还没有映射关系,因为host是直接通过宿主机映射过去的,所以不显示,在显示没有意义
- 没有警告的启动
docker run -d -p --network host --name tom7 tomcat:8.5
- 查看tom7发下是空的ip,因为host启动的没有ip,是和主任同用的一个ip,所以是空
4.3docker的none
- none就是没有网络配置(了解即可)
4.3docker的container
新建自定义网络
#创建网络
docker network create lxy_docker
#将两台tomcatt装入到我们新自定义的网络中
docker run -d -p 8081:8080 --network lxy_docker --name tomat81 tomcat:8.5
docker run -d -p 8082:8080 --network lxy_docker --name tomat82 tomcat:8.5
- 在81里面ping 82完全可以ping通
六:Docker-compose容器编排
- 通俗来说 容器台多了你怎么管理
- Docker-compose是docker官方提供的开源项目,负责实现对容器的快速编排
- compose是Docker公司退出的一个工具软件,可以管理多个Docker容器组成的一个应用,你需要定义一个Yam格式的配置文件
- docker-compose.yml
- 然后只要一声令下就能启动和关闭这些容器
下载地址
API文档
#一次没成功多试几次
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker/docker-compose
* sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 若是github访问太慢,可以用daocloud下载
* sudo chmod +x /usr/local/bin/docker-compose 添加可执行权限
* sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose root用户无法使用
* docker-compose --version 查看版本
6.1:Docker-compose核心概念
- 一文件 -->docker-compose.yml
- 2要素–>服务(service)和工程(project)
-
- 服务:一个个的容实例,比如订单微服务,库存微服务,mysql容器,nginx容器或者redid容器
-
- 工程:由一组关联的应用程序组成的一个完整的业务单元,在docker-compost.yml上定义
6.2:Docker-compose使用的三个步骤
- 编写dockerfile定义的各各微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml定义一个完整的业务单元,安排好整体应用中的各个容器服务
- 最后执行docker-compose up命令,来启动并运行整个程序,完成一键部署上线
6.3 普通部署项目
#正常情况需要先将mysql启动
docker run -d -p 3306:3306 --privileged=true -v /usr/local/mysql/log:/var/log/mysql -v/usr/local/mysql/data:/var/lib/mysql -v/usr/local/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123321 --name mysql mysql:5.7
#在启动redis
docker run -d -p 6379:6379 --privileged=true -v/usr/local/redis/redis.conf:/etc/redis/redis.conf -v/usr/local/redis/data:/data redis:6.2 redis-server /etc/redis/redis.conf
#在把java项目跑起来
docker run -d -p 8081:8081 19b0ffd318f1
- 一个springboot就得启动3个容器,如果是分布式项目,不得启动30几个java程序,直接就累死了
6.3 docker-compose部署项目
#创建yml文件
vim docker-compose.yml
#写入如下内容
version: "3"
services:
microService:
image: zzyy_docker:1.6
container_name: ms01
ports:
- "8081:8081"
volumes:
- /usr/local/microServic:/data
networks:
- lxy
depends_on:
- redis
- mysql
redis:
image: redis:6.2
ports:
- "6379:6379"
volumes:
- /usr/local/redis/redis.conf:/etc/redis/redis.conf
- /usr/local/redis/data:/data
networks:
- lxy
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'root'
MYSQL_PASSWORD: '123321'
ports:
- "3306:3306"
volumes:
- /usr/local/mysql/data:/var/lib/mysql
- /usr/local/mysql/conf/my.cnf:/etc/my.cnf
- /usr/local/mysql/init:/docker-entrypoint-initdb.d
networks:
- lxy
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
lxy:
#查看配置文件是否写的对自我效验
docker-compose config -q
#启动命令
docker-compose up -d
-
如何和spring项目联系呢,我在yml文件中定义了redis和mysql,我可以再springboot的ym文件
-
比如 如下是我们的mysq连接我们镜像的docker地址
-
可以将192.168.116:3306 替换为mysql,只要在docker-compose配置了的启动容器都可以这样配置,就不用担心ip变了,还得改源码了
-
url: jdbc:mysql://192.168.116:3306/xxxx?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true
-
全部启动成功
-
启动成功
-
脚本说明
6.3 docker-compose常用命令
Compose常用命令
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
dokcer-compose config # 检查配置
dokcer-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
七:docker轻量级可视化工具portainer
#安装
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
#查看
docker ps
第一次登录需创建admin,访问地址:xxx.xxx.xxx.xxx:9000
7.1:portainer操作
7.2:portainer安装nginx
7.1:GAdvisor监控收集+InfluxDB存储数据+Granfana展示图表
docker stats
查看内存使用cpu啊等等很不方便
- 资料不能一直实时,没有健康指标警戒线等等
7.1.1 GAdvisor
7.1.1 InfluxDB
7.1.3 Granfana
7.1.4 compose一键部署
#新建文件夹
mkdir cig
cd cig
vim dokcer-compose.yml
#复制
version: '3.1'
volumes:
grafana_data: {}
services:
influxdb:
image: tutum/influxdb:0.9
restart: always
environment:
- PRE_CREATE_DB=cadvisor
ports:
- "8083:8083"
- "8086:8086"
volumes:
- ./data/influxdb:/data
cadvisor:
image: google/cadvisor
links:
- influxdb:influxsrv
command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
restart: always
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
grafana:
user: "104"
image: grafana/grafana
user: "104"
restart: always
links:
- influxdb:influxsrv
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- HTTP_USER=admin
- HTTP_PASS=admin
- INFLUXDB_HOST=influxsrv
- INFLUXDB_PORT=8086
- INFLUXDB_NAME=cadvisor
- INFLUXDB_USER=root
- INFLUXDB_PASS=root
#检查
dokcer-compose config -q
#运行
dokcer-compose up
浏览器访问http://192.168.116.126:808/
(信息收集)
http://192.168.116.126:8083/
- 数据存储
http://192.168.116.126:3000/ - 数据展示
- 既然要展示肯定要先添加数据源
设置-Datasoure选择数据库,选择InfluxDB
- 创建一个新的面板
点击+ 然后点击dashboard