文章目录

  • 简介
  • 一、dockerfile
  • 1、基础知识
  • 2、dockerfile 指令
  • 3、centos 简单测试
  • 4、CMD 和 ENTRYPOINT 区别
  • 5、实战 tomcat
  • 二、docker 网络
  • 1、初识docker网络
  • 2、查看网络详情
  • 4、docker 容器通信原理
  • 三、容器互联
  • 四、自定义网络
  • 1、常用命令
  • 2、网络模式
  • 3、自定义网络
  • 4、新建网络
  • 5、启动容器
  • 6、小结
  • 五、网络联通
  • 六、实战:部署 redis 集群


简介

学习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搭建高版本gcc环境_docker搭建高版本gcc环境


③、测试镜像

启动镜像 docker run -it --name docker_centos my_dock_centos:9.99

docker搭建高版本gcc环境_docker搭建高版本gcc环境_02

启动镜像之后默认进入设置的工作目录,可以正常使用 vim 编辑命令

④、docker history mysql:latest

查询镜像的制作过程

docker搭建高版本gcc环境_tomcat_03

4、CMD 和 ENTRYPOINT 区别

①、测试 CMD

FROM centos

CMD ["ls","-a"]

如上,可以正常打印容器的目录

若使用 docker run cmd_test -l ,会报错,因为使用 -l 会替换 ls -a,提示 -l 不是一个命令,并不会达到预期效果(ls -al)

docker搭建高版本gcc环境_docker_04


可以使用 docker run cmd_test ls -al 达到预期效果,因为如此使用,会用 ls -al 代替 ls -a

docker搭建高版本gcc环境_tomcat_05


②、测试 ENTRYPOINT

可追加命令,CMD 是替换

FROM centos
ENTRYPOINT ["ls","a"]

docker run ent_test 相当于执行 ls -a

docker搭建高版本gcc环境_docker搭建高版本gcc环境_06


docker run ent_test -l 相当于执行 ls -a -l 命令

docker搭建高版本gcc环境_tomcat_07


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搭建高版本gcc环境_redis_08


启动镜像

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搭建高版本gcc环境_docker_09


docker 创建-发布-启动流程

docker搭建高版本gcc环境_tomcat_10

二、docker 网络
1、初识docker网络

宿主机

docker搭建高版本gcc环境_tomcat_11


查看容器内部地址

容器启动有一个 eth0@if223 的ip,docker 分配的

docker搭建高版本gcc环境_docker_12


Linux 宿主机,可以ping 通容器内部

docker搭建高版本gcc环境_redis_13


每启动一个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 容器通信原理

docker搭建高版本gcc环境_docker搭建高版本gcc环境_14


结论:

  • tomcat01 和 tomcat02 是公用的一个路由器,docker0。
  • 所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP

docker搭建高版本gcc环境_docker_15


小结:

Docker 使用 Linux 桥接技术(Veth-pair),docker 中所有的网络接口都是虚拟的,虚拟转发效率高

只要容器删除,对应的一堆网桥就没有了

三、容器互联

直接使用容器名不能 ping 通

docker搭建高版本gcc环境_docker_16


使用 --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 通

docker搭建高版本gcc环境_docker_17

tomcat03 使用了 --link 可以 ping 通 tomcat02 ,tomcat02 没有使用 --link 不能 ping 通 tomcat03

docker搭建高版本gcc环境_redis_18


查看 docker 网络配置

docker network ls

docker搭建高版本gcc环境_docker搭建高版本gcc环境_19


查看详细配置

docker network inspect

docker搭建高版本gcc环境_docker_20


包含的容器

docker搭建高版本gcc环境_docker搭建高版本gcc环境_21

查看 tomcat03 详细连接

docker inspect tomcat03

docker搭建高版本gcc环境_redis_22


docker exec -it tomcat03 cat /etc/hosts

docker搭建高版本gcc环境_redis_23


docker0 不支持容器名访问

四、自定义网络
1、常用命令

docker network --help

docker搭建高版本gcc环境_docker搭建高版本gcc环境_24


查看所有 docker 网络

docker network ls

docker搭建高版本gcc环境_redis_25

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

docker搭建高版本gcc环境_tomcat_26

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

docker搭建高版本gcc环境_redis_27


详细信息

docker搭建高版本gcc环境_redis_28

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

docker搭建高版本gcc环境_docker_29


测试能否 ping 通

发现直接使用 IP 或者容器名都可以 ping 通,不需要再使用 --link

docker搭建高版本gcc环境_docker_30

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搭建高版本gcc环境_docker搭建高版本gcc环境_31

docker exec -it tomcat01 ping tomcat-net-01 测试发现不同 ping 通

docker搭建高版本gcc环境_docker_32


使用 docker network connect 连接

docker network connect --help

注意: Connect a container to a network,网络和容器连接,不是网络之间连接

docker搭建高版本gcc环境_redis_33


使用 mynet 网络连接 tomcat01(bridge网路) 容器

注意:不要使用bridge网络,bridge不能使用容器名连接,bridge需要使用 --link,自定义网络可以使用容器名连接

docker network connect mynet tomcat01

查看 mynet 网络 详情, docker network inspect mynet ,发现 tomcat01 容器加入了 mynet 网络

docker搭建高版本gcc环境_docker搭建高版本gcc环境_34


测试 tomcat01(bridge网络)ping tomcat-net-01(mynet 网络)

成功 ping 通,使用 connect 可以将不同网段的容器进行互联

docker搭建高版本gcc环境_tomcat_35

六、实战:部署 redis 集群

docker搭建高版本gcc环境_redis_36


运行 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 容器如下

docker搭建高版本gcc环境_redis_37


进入 redis-1 容器

docker exec -it redis-1 /bin/sh

注意使用 /bin/sh 不是 /bin/bash,进入容器默认工作目录 /data

docker搭建高版本gcc环境_docker_38


创建 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 集群配置完毕

docker搭建高版本gcc环境_docker搭建高版本gcc环境_39


测试集群

进入redis-cli 集群,redis-cli -c 查看集群信息 cluster info

docker搭建高版本gcc环境_docker搭建高版本gcc环境_40


查询集群节点cluster nodes

docker搭建高版本gcc环境_tomcat_41


插入一个值,添加到 13 中了

docker搭建高版本gcc环境_docker_42


关闭 redis-3 容器,依旧可以在 redis-1 中获取到,集群部署测试成功