Docker高级
Docker高级
DockerFile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
构建三部曲:
- 编写Dockerfile文件
- docker build命令构建镜像
- docker run依镜像运行容器实例
常用保留字指令
FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:容器构建时需要运行的命令
shell格式:
exec格式:
EXPOSE:当前容器对外暴露出的端口
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root
ENV:用来在构建镜像过程中设置环境变量
ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 < 源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定容器启动后的要干的事情
ENTRYPOINT:
也是用来指定一个容器启动时要运行的命令,ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
例如:
案例
安装Centos7镜像具备vim+ifconfig+jdk8
准备编写Dockerfile文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26FROM centos
MAINTAINER wht<136921735@126.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-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 -f Dockerfile -t 新镜像名字:TAG .
运行:
docker run -it 新镜像名字:TAG
虚悬镜像
仓库名、标签都是
- 查看虚悬镜像:
docker image ls -f dangling=true
- 删除虚悬镜像:
docker image prune
部署项目
将项目打包成jar包,并上传到服务器
编写Dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER wht
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为springBoot_docker.jar
ADD docker_boot.jar springBoot_docker.jar
# 运行jar包
RUN bash -c 'touch /springBoot_docker.jar'
ENTRYPOINT ["java","-jar","/springBoot_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001构建镜像:
docker build -t springBoot_docker:1.6
运行容器:
docker run -d -p 6001:6001 springBoot_docker:1.6
Docker网络
docker启动后,会产生一个名为docker0的虚拟网桥。主要解决容器间的互联和通信以及端口映射、容器IP变动时候通信问题。
相关命令
创建网络:
docker network create 网络名
(自定义网络本身就维护好了主机名和ip的对应关系)查看docker网络模式命令:
docker network ls
(默认会有三种模式:bridge、host、none)查看网络源数据:
docker network inspect XXX网络名字
删除网络:
docker network rm XXX网络名字
网络模式
bridge模式:为每一个容器分配、设置IP等,并将容器连接到一个docker0,使用–network bridge指定,默认使用docker0
host模式:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口,使用–network host指定
none模式:容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等,使用–network none指定
container模式:新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等,使用–network container:NAME或者容器ID指定
Docker-compose容器编排
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器, 负责实现对Docker容器集群的快速编排。
Docker-compose 安装
官网地址:https://docs.docker.com/compose/compose-file/compose-file-v3/
官方下载文档:
下载安装:
1
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
给文件权限:
chmod +x /usr/local/bin/docker-compose
检验是否安装:
docker-compose --version
卸载:
sudo rm / usr/ local/bin/ docker-compose
相关概念
重要文件:docker-compose.yml
两要素:
- 服务(service):一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器
- 工程(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
三大步骤:
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
- 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
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 # 查看容器输出日志
- docker-compose config # 检查配置
- docker-compose config -q # 检查配置,有问题才有输出
- docker-compose restart # 重启服务
- docker-compose start # 启动服务
- docker-compose stop # 停止服务
部署实例
同样项目打包
编写docker-compose.yml文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56# 版本
version: "1"
# 镜像中的服务容器
services:
microService:
# 镜像来源
image: springboot_docker:1.6
# 容器名(不加默认目录_服务名_序号)
container_name: ms01
# 端口映射
ports:
- "6001:6001"
# 数据卷
volumes:
- /app/microService:/data
# 网络
networks:
- test_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:
- test_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: 'root'
MYSQL_PASSWORD: '123456'
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:
- test_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
# 创建网络
networks:
test_net由于使用同一网络所以可以将ip改为服务名(改了除了重新打包)
检查docker-compose.yml文件语法是否错误:
docker-compose config -q
执行docker-compose:
docker-compose up -d
停止compose:
docker-compose stop
Portainer
Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。
拉镜像:
docker pull lihaixin/portainer
启动容器:
1
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 lihaixin/portainer
第一次登录需创建admin,访问地址:ip:9000
注册并选择监控本地docker
主页状态:
CIG
CIG:Docker容器监控之CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表
一般使用docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据,当容器数据太多时就需要CIG了
安装
新建目录
mkdir /opt/docker_app/cig
新建3件套组合的 docker-compose.yml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50version: '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启动compose:
docker-compose up -d
测试:
- 浏览cAdvisor收集服务,http://ip:8080/
- 浏览influxdb存储服务,http://ip:8083/
- 浏览grafana展现服务,http://ip:3000 (ip+3000端口的方式访问,默认帐户密码(admin/admin))
在grafana配置数据源:
选择influxdb数据源:
配置细节:
配置面板panel:
部署完成