目录
一、Dockerfile解析
1.1.什么是Dockerfile
1.2.Dockerfile构建过程解析
1.2.1.Dockerfile内容基础知识
1.2.2.Docker执行Dockerfile的大致流程
1.3.Dockerfile常用保留字指令
1.3.1.FROM
1.3.2.MAINTAINER
1.3.3.RUN
1.3.4.EXPOSE
1.3.5.WORKDIR
1.3.6.USER
1.3.7.ENV
1.3.8.ADD
1.3.9.COPY
1.3.10.VOLUME
1.3.11.CMD
1.3.12.ENTRYPOINT
1.3.13.各命令运行时期
1.4.Dockerfile实践
1.4.1.生成微服务jar包
1.4.2.编写Dockerfile
1.4.3.将微服务jar包和Dockerfile文件上传到同一个目录下/mydocker
1.4.4.在/mydocker路径下构建镜像,打包成镜像文件
1.4.5.运行容器
二、Docker网络
2.1.常用命令
2.2.作用
2.3.网络模式
三、Docker-compose容器编排
3.1.Docker-compose使用的三个步骤
3.2.Docker-compose常用命令
3.3.Docker-compose实践
3.3.1.编写docker-compose.yml文件
3.3.2. 执行docker-compose up或者执行docker-compose up -d
四、Docker轻量级可视化工具Portainer
五、Docker容器监控之CAdivisor+InfluxDB+Granfana
5.1.编写docker-compose.yml
5.2.启动docker-compose文件
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
构建三部曲:
1)编写Dockerfile文件;
2)docker build 命令构建镜像
3)docker run 以镜像运行容器实例
1)每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2)指令按照从上到下,顺序执行
3)#表示注释
4)每条指令都会创建一个新的镜像层并对镜像进行提交
1)docker从基础镜像运行一个容器
2)执行一条指令并对容器作出修改
3)执行类似docker commit的操作提交一个新的镜像层
4)docker再基于刚提交的镜像运行一个新容器
5)执行dockerfile中的下一条指令直到所有指令都执行完成
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
镜像维护者的姓名和邮箱地址
容器构建时需要运行的命令,在 docker build时运行
有两种格式:
shell格式:RUN yum -y install vim
exce格式:RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
当前容器对外暴露出的端口
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
指定该镜像以什么样的用户去执行,如果都不指定,默认是root
用来在构建镜像过程中设置环境变量
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
COPY src dest
容器数据卷,用于数据保存和持久化工作
指定容器启动后的要干的事情,在docker run 时运行
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
也是用来指定一个容器启动时要运行的命令
类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
BUILD | Both | RUN |
FROM | WORKDIR | CMD |
MAINTAINER | USER | ENV |
COPY | EXPOSE | |
ADD | VOLUME | |
RUN | ENTRYPOINT | |
ONBULID | ||
.dockerignore |
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER yjw
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
# 运行jar包
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001
docker build -t zzyy_docker:1.6 .
#注意后面的空格和.
docker run -d -p 6001:6001 zzyy_docker:1.6
docker启动后,主机网络会产生一个名为docker0的虚拟网桥
docker network create xxx网络名字:添加网络
docker network ls:查看网络
docker network inspect xxx网络名字:查看网络源数据
docker network rm xxx网络名字:删除网络
1)容器间的互联和通信以及端口映射
2)容器IP变动时候可以通过服务名直接网络通信而不受到影响
1)bridge模式:使用--network bridge指定,默认使用docker0
2)host模式:使用--network host指定
3)none模式:使用--network none指定
4)container模式:使用--network container:NAME或者容器ID指定
1)编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
2)使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务
3)最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
docker-compose -h:查看帮助
docker-compose up:启动所有docker-compose服务
docker-compose up -d : 启动所有docker-compose服务并后台运行
docker-compose down:停止并删除容器、网络、卷、镜像
docker-compose exec 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:停止服务
version: "3"
services:
microService:
image: zzyy_docker:1.6
container_name: ms01
ports:
- "6001:6001"
volumes:
- /app/microService:/data
networks:
- atguigu_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- atguigu_net
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: '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 #解决外部无法访问
networks:
atguigu_net:
安装命令如下
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
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
docker-compose up