docker 高阶
文章目录一、dockerfile1、基础知识2、dockerfile 指令3、实战测试4、CMD 和 ENTRYPOINT 区别5、实战 tomcat一、dockerfile1、基础知识每个保留关键字都必须是大写字母执行从上而下顺序执行#表示注释每个指令都会去创建提交一个新的镜像,并提交docke 镜像逐渐成为企业交付的标准Dockerfile 构建镜像的步骤Dockerimage 通过docke
文章目录
简介
学习docker教程 https://www.bilibili.com/video/BV1og4y1q7M4?p=30&spm_id_from=pageDriver主要以记笔记为主,可能有些描述不太准确,希望能帮到你
一、dockerfile
1、基础知识
- 每个保留关键字都必须是大写字母
- 执行从上而下顺序执行
- #表示注释
- 每个指令都会去创建提交一个新的镜像,并提交
docke 镜像逐渐成为企业交付的标准
Dockerfile 构建镜像的步骤
Dockerimage 通过docker 构建生成镜像
Docker 容器:容器就是镜像运行起来提供服务
2、dockerfile 指令
`FROM # 基础镜像,一切从这里开始构建`
`MAINTAINER # 镜像是谁写的,名字,邮箱等`
`RUN # 镜像构建时需要运行的命令`
`ADD # 步骤:tomcat 镜像、tomcat压缩包! 添加内容(类似从宿主机copy)`
`WORKDIR # 镜像的工作目录(设置当前工作目录,类似创建容器时的 /bin/bash)`
`VOLUME # 设置挂载卷,挂载目录`
`EXPOSE # 端口配置,暴露端口,不暴露需要创建时通过 -p 指定`
`RUN # 指定容器启动后要干的事情`
`CMD # 指定这个容器启动时运行的命令、类似创建容器是指定 echo 输出等,只有最后一个生效,可被覆盖替代`
`ENTRYPOINT # 指定这个容器启动时要运行的命令,可以追加命令`
`ONBULID # 当构建一个被继承的 Dockerfile 这个时候就会运行 ONBUILD 指令,触发指令`
`COPY # 类似 ADD 命令,将文件拷贝到镜像中`
`ENV # 构建的时候设置环境变量`
3、centos 简单测试
Docker Hub 中 99% 的镜像都是从 FROM scratch 开始,然后配置需要的软件和配置进行构建
①、构建一个简单的 centos
FROM centos
MAINTAINER yelingyun<2684789qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "------end------ "
CMD /bin/bash
②、生成镜像
# -f 指 dockerfile 的文件目录,-t 指生成镜像名以及 tag
docker build -f dockerfile -t my_dock_centos:9.99 .
③、测试镜像
启动镜像 docker run -it --name docker_centos my_dock_centos:9.99
启动镜像之后默认进入设置的工作目录,可以正常使用 vim 编辑命令
④、docker history mysql:latest
查询镜像的制作过程
4、CMD 和 ENTRYPOINT 区别
①、测试 CMD
FROM centos
CMD ["ls","-a"]
如上,可以正常打印容器的目录
若使用 docker run cmd_test -l ,会报错,因为使用 -l 会替换 ls -a,提示 -l 不是一个命令,并不会达到预期效果(ls -al)
可以使用 docker run cmd_test ls -al 达到预期效果,因为如此使用,会用 ls -al 代替 ls -a
②、测试 ENTRYPOINT
可追加命令,CMD 是替换
FROM centos
ENTRYPOINT ["ls","a"]
docker run ent_test 相当于执行 ls -a
docker run ent_test -l 相当于执行 ls -a -l 命令
dockerfile 中许多命令十分相似,CMD 和 ENTRYPOINT 最大的区别就是 CMD 替换,ENTRYPOINT 是追加
5、实战 tomcat
dockerfile 使用压缩包创建
FROM centos
MAINTAINER yelingyun<2689942@qq.com>
# readme.md 可以写一些文件说明
COPY readme.md /usr/local/readme.md
# 将两个压缩包添加进容器的 /usr/local 会自动解压,使用 COPY 不会自动解压
ADD jdk-8u161-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5.55.tar.gz /usr/local
# 安装 vim 命令
RUN yum -y install vim
# 设置工作目录( 使用 docker exec -it ye_diy_tomcat /bin/bash 进入容器,当前目录为 /usr/local)
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置 Java 和 tomcat 环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.55
ENV CATLINA_BASH /usr/local/apache-tomcat-8.5.55
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 暴露 8080 端口
EXPOSE 8080
# 启动容器时运行命令(启动tomcat,查看日志)
CMD /usr/local/apache-tomcat-8.5.55/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.55/logs/catalina.out
使用dockerfile 制作镜像(如果文件名为 dockerfile 可以不添加 -f 指定dockerfile 文件目录,会去当前目录自动查找)
docker build -t div_tomcat
.
启动镜像
docker run -d -p 8080:8080 --name ye_diy_tomcat -v /home/lighthouse/tomcat/test:/url/local/apache-tomcat-8.5.55/webapps/test -v /home/lighthouse/tomcat/tomcatlogs/:/url/local/apache-tomcat-8.5.55/logs diy_tomcat
docker 创建-发布-启动流程
二、docker 网络
1、初识docker网络
宿主机
查看容器内部地址
容器启动有一个 eth0@if223 的ip,docker 分配的
Linux 宿主机,可以ping 通容器内部
每启动一个docker 容器,docker 就会给每个容器分配一个 ip ,如果宿主机安装 docker ,就会有一个网卡 docker0 桥接模式,使用的技术是veth-pair技术!
2、查看网络详情
①、启动容器 tomcat01
- tomcat01容器内部
- 宿主机
②、启动容器 tomcat02
- tomcat02 内部
- 宿主机
③、小结
- 发现容器分配的网卡,都是一对一对出现的
- veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备的
- openstac,Docker容器之间的连接,oVs的连接,都是使用veth-pair技术
tomcat01 ping tomcat02
4、docker 容器通信原理
结论:
- tomcat01 和 tomcat02 是公用的一个路由器,docker0。
- 所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP
小结:
Docker 使用 Linux 桥接技术(Veth-pair),docker 中所有的网络接口都是虚拟的,虚拟转发效率高
只要容器删除,对应的一堆网桥就没有了
三、容器互联
直接使用容器名不能 ping 通
使用 --link
docker run -d -P --name tomcat03 --link tomcat02 --link tomcat01 tomcat
docker exec -it tomcat03 ping tomcat01
docker exec -it tomcat03 ping tomcat02
使用 --link 可以 ping 通
tomcat03 使用了 --link 可以 ping 通 tomcat02 ,tomcat02 没有使用 --link 不能 ping 通 tomcat03
查看 docker 网络配置
docker network ls
查看详细配置
docker network inspect
包含的容器
查看 tomcat03 详细连接
docker inspect tomcat03
docker exec -it tomcat03 cat /etc/hosts
docker0 不支持容器名访问
四、自定义网络
1、常用命令
docker network --help
查看所有 docker 网络
docker network ls
2、网络模式
- bridge : 桥接模式(默认,自己创建使用)
- none:不配置网络
- host:和宿主机共享网络
- container:容器网络联通(用的少,局限大)
测试
docker run -d -P --name tomcat01 tomcat
# 等同于下面,默认会加 --net bridge
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0 默认,域名不能访问,--link 可以连接打通
3、自定义网络
创建网络 docker network create --help
4、新建网络
# --driver bridge 默认桥接,--subnet 子网(不是子网掩码,子网掩码应该为 255.255.0.0) --gateway 网关
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network ls
详细信息
5、启动容器
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
查看 mynet 网络详情
docker network inspect mynet
测试能否 ping 通
发现直接使用 IP 或者容器名都可以 ping 通,不需要再使用 --link
6、小结
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!
好处:
- redis -不同的集群使用不同的网络,保证集群是安全和健康的
- mysql -不同的集群使用不同的网络,保证集群是安全和健康的
- 两个集群之间也可以连通
五、网络联通
之前的连接,容器之间都是属于同一个网段,如 tomcat-net-01(IP:192.168.0.2),tomcat-net-02(IP:192.168.0.3),容器之间可以正常联通,但是 tomcat01(IP:172.17.0.2)和 tomcat-net-01(IP:192.168.0.2)不在相同网段,不能直接 ping 通,需要使用 connect连接才可以 ping 通。
不同网段之间连通,tomcat01 使用默认 docker0 网络, tomcat-net-01 使用docker自定义网络mynet
docker exec -it tomcat01 ping tomcat-net-01
测试发现不同 ping 通
使用 docker network connect 连接
docker network connect --help
注意: Connect a container to a network,网络和容器连接,不是网络之间连接
使用 mynet 网络连接 tomcat01(bridge网路) 容器
注意:不要使用bridge网络,bridge不能使用容器名连接,bridge需要使用 --link,自定义网络可以使用容器名连接
docker network connect mynet tomcat01
查看 mynet 网络 详情, docker network inspect mynet ,发现 tomcat01 容器加入了 mynet 网络
测试 tomcat01(bridge网络)ping tomcat-net-01(mynet 网络)
成功 ping 通,使用 connect 可以将不同网段的容器进行互联
六、实战:部署 redis 集群
运行 shell 脚本,创建六个 redis 节点
for port in $(seq 1 6); do mkdir -p /mydata/redis/node-${port}/conf; touch /mydata/redis/node-${port}/conf/redis.conf
cat <<EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
启动六个 redis 容器,端口递增
docker run -p 6371:6379 -p 16376:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/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
六个 redis 容器如下
进入 redis-1 容器
docker exec -it redis-1 /bin/sh
注意使用 /bin/sh 不是 /bin/bash,进入容器默认工作目录 /data
创建 redis 集群
redis-cli --cluster create 172.38.0.11:6379 127.38.0.12:637
9 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:63
79 --cluster-replicas 1
输入 yes 集群配置完毕
测试集群
进入redis-cli 集群,redis-cli -c
查看集群信息 cluster info
查询集群节点cluster nodes
插入一个值,添加到 13 中了
关闭 redis-3 容器,依旧可以在 redis-1 中获取到,集群部署测试成功
更多推荐
所有评论(0)