一、容器数据券
docker是将应用+环境打包成镜像,直接可以运行。但是如果一些配置文件、数据放在容器中,那么这些东西都会丢失。所以在使用镜像的时候,会有一些东西需要持久化,并且容器之间可以共享,也就是容器数据券的技术。
Docker产生的数据、配置文件都同步到本地,将容器内部的目录挂载到宿主机上。
使用数据卷
方式1:直接使用命令挂载 -v
docker run -it -v 主机目录:容器目录
使用 docker inspect 容器ID 可以看到如下信息,就是挂载成功了。
同比效果:
Mysql数据的挂载:
docker run -d -p 3306:3306 -v 宿主机目录:/etc/mysql/conf.d -v 宿主机目录/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
- -d 后台运行
- -p 端口映射
- -v 挂载
- -e 环境变量配置
- --name 容器名字
配置完之后可以看到,mysql的配置文件路径和数据路径都映射到了宿主机,这样就保证了即使容器删除了,容器所产生的数据都不会丢失。
具名挂载和匿名挂载
- 具名挂载:-v 不指定地址,指定的是名字
- docker run -d -P --name nginx01 -v jumingnginx:/etc/nginx nginx
- 使用 docker volume ls 查看所有 volume 情况
- 匿名挂载:-v 不指定宿主机地址
- docker run -d -P --name nginx01 -v /etc/nginx nginx
- 使用 docker volume ls 查看所有 volume 情况
- docker inspect ,可以看到卷相关的挂载地址
建议使用具名挂载,方便查找。
docker run -d -P --name nginx01 -v jumingnginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v jumingnginx:/etc/nginx:rw nginx
规定卷的读写权限,只读、读写是针对容器的。如果是只读,那么容器无法修改挂载的文件。
数据卷容器
容器和容器之间进行同步
docker run -it --name docker02 --volumes-from dokcer01 镜像名字
docker run --name mysql02 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysql01 -d mysql/mysql-server
docker01 就是数据卷容器。docker02挂载到docker01上。删除父容器,子容器还是可以访问挂载的文件的。其实可以理解成备份的机制。
二、DockerFile
DockerFile就是用来构建docker镜像的命令脚本。因为镜像是一层一层,所以脚本命令也是一句一句(废话),每个命令就是一层。
这样简单的DockerFile就写完了。使用命令
docker build -f DockerFile命令 -t 镜像名字 . 可以生成自己的镜像,运行截图如下:
在官方的每个镜像,在Git上都有DockerFile。
DockerFile构建过程
基础知识:
- 关键字都是大写
- 从上到下执行
- # 代表注释
- 每个命令创建一个镜像层
可能之前都是jar、war是交付物,现在DockerFile逐渐成为企业的交付标准。
DockerFile的指令
- FROM:基础镜像,一切从这里构建
- MAINTAINER:镜像的作者,维护人
- RUN:镜像构建的时候需要运行的命令
- ADD:添加一些使用的组件,JDK、TOMCAT等等
- WOKRDIR:镜像的工作目录
- VLOLIME:容器卷挂载的位置
- EXPOSE:指定暴露端口(很常用的)
- CMD:指定这个容器启动的时候需要运行的LINUX命令
- ENTRYPINT:跟CMD一样,但是会追加命令
- ONBUILD:当构建一个被继承DockerFile 这个时候就会运行该命令。
- COPY:拷贝命令,类似ADD,将文件拷贝到镜像中
- ENV:构建的时候设置环境变量
编写DockerFile
DockerFile中99%,都是从scratch这个镜像开始的。
在官方提供的centos基础上添加一些命令 vim和net-tools。
使用命令进行镜像构建:
docker bulid -f dockerfile -t 镜像名:版本号 .
构建出来的镜像启动后,就会比官方的镜像多了vim、pwd、ifconfig等命令。
通过docker history 镜像ID,查看镜像构建过程CMD命令:镜像启动的时候执行某个命令,CMD["ls", "-a"] ,只有最后一个CMD会执行。但是在run的时候想追加命令的时候,会用追加的命令替换CMD执行的命令。
ENTRYPOINT命令:正相反,在run的时候追加命令或参数的时候,会在ENTRYPOINT执行的命令后面追加。
制作tomcat镜像:
- 准备镜像文件,需要tomcat压缩包、需要jdk压缩包
- 编写dockerfile文件
- 从centos开始
- 加入tomcat、jdk
- yum安装vim命令
- 设置镜像工作目录(启动镜像后进入的地方)
- 设置环境变量jdk+tomcat
- 暴露端口 8080
- 启动tomcat,日志输入到某个地方
发布到docker hub上,直接使用 docker push 即可。
发布到阿里云上:
- 创建命名空间(一个账号最多三个)
- 创建镜像仓库,私有即可,选择本地仓库
- 查看镜像仓库详情,里面就有推送和拉去进行的文档
三、Dokcer网络
Docker0
docker是怎么处理不同容器之间的访问,例如容器1中的tomcat怎么访问容器2中的mysql?
docker exec -it tomcat01 ip addrs 查看启动容器的网卡
发现容器启动的时候,docker都会分配一个eth0@if262的IP。并且宿主机能够ping同容器。
- 没启动一个容器,启动一个容器就会分配一个ip,并且在宿主机上分配一个网卡
- 安装docker之后,宿主机上就会多了一个docker0的网卡,桥接到宿主机的网卡上,使用的是evth-pari技术
- evth-pari 就是一对虚拟设备接口,他们都是成对出现的,一段连接协议、一段彼此相连
- 使用evth-pari这个技术充当一个桥梁,连接虚拟网络设备的
- 容器之间也是可以通过evth-pari相互之间通信
--link
由于容器的ip都是动态分配的,所以相互之间的访问就是成为了一个问题,docker提供了--link命令,来处理这个事情。
docker exec -it tomcat01 ping tomcat02,这样是无法ping通的,所以在启动的时候可以直接使用--link参数:docker run -P --name tomcat03 --link tomcat02。在使用容器名字进行ping就可以通了。 反向无法ping通,
可以看到,在tomcat03的hosts中配置了tomcat02的访问信息
--link本质就是hosts的映射,现在开发基本都不使用--link命令了。
自定义网络
容器互联的方式处理--link,还可以使用自定义网络。常用的网络模式:
- bridge:桥接(默认)
- none:不配置
- host:和宿主机共享
- container:容器网络连通(用的少),局限性大
docker0默认网络,但是无法使用容器名访问,--link太局限,所以一般都使用自定义网络。
命令:docker network create --deirver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
使用docker network ls 就可以看到创建的网络
使用docker network inspect mynet 查看详情,自定义网络是可以通过容器名字进行ping通的:
使用自定义网路罗,在启动容器的时候增加 --net 网络名即可。
docker run -d -P --name tomcat01 --net mynet tomcat
不同的集群使用不同的网络,redis-、mysql- 等等,这样可以保证集群网络的健康。
网络连通
docker network conect 连接网络到一个容器
一个容器两个ip地址。
Docker搭建redis集群
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /Users/liming/software/docker/redis/node-6/data:/data \
-v /Users/liming/software/docker/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
启动好后,搭建集群:
docker exec -it redis-1 /bin/sh
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379
172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
创建完毕后,使用redis-cli -c 命令查看节点和集群信息:
发布一个应用到docker中:
- 编写Dockerfile
FROM java:8 COPY *.jar /app.jar CMD ["-- server port 8081 ---"] EXPOSE 8081 ENTRYPOINT ["java", "-jar", "/app.jar"]
-
docker build -f DockerFile -t sa_token_test . 执行docker命令,注意最后的.
-
docker run -d -P --name sa_token_test sa_token_test,启动容器
-
测试访问