一.容器和单机容器编排入门与实战 2.1 Docker网络模型、容器跨主机通信、Dockerfile构建镜像

docker 网络模型与跨主机的容器间通信原理与过程展示和分析

方法一:
修改docker默认子网范围并实现跨主机通信
主机一
vim /lib/systemd/system/docker.service
 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=10.10.0.1/24

主机二
 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=10.20.0.1/24


主机一添加 到主机二的网络路由
route add -net 10.20.0.0/24 gw 192.168.2.11(主机二 宿主机ip)
主机二添加 到主机一的网络路由
route add -net 10.10.0.0/24 gw 192.168.2.10(主机一 宿主机ip)


方法二:
flannel calio等 方法,动态添加路由
k8s就是利用flannel等工具


创建自定义网络:(略)
 如何按需创建网络
 实现单机多服务间的网络隔离

 

镜像简介:
  docker镜像基于union file system将多个目录合并挂载至一个目录给容器使用。
  docker镜像只有rootfs而没有内核、运行使用的是宿主机的bootfs。
     rootfs(root file system),文件系统
     bootfs(boot file system),主要包含 bootloader 和 Kernel
  一个镜像是有一层或者多层合并而成,每一层称为是一个layer。
  镜像可以基于其它镜像进行重新构建,被引用的镜像称为父镜像。
  一个镜像可以同时被创建为多个容器。
       镜像是只读的,在容器的任何更改都不会直接修改镜像。

 

Dockerfile构建镜像:
  DockerFile是一个可以被Docker程序解释的文本文件,其中由指定的命令组成,在构建镜像的过程中,Docker程序会读取DockerFile文件内容并生成一个临时容器、然后在临时容器中从上向下顺序执行DockerFile的指令,当执行完所有的指令后再把临时容器提交为一个Docker镜像,这样就完成了一个镜像的构建,基于DockerFile构建镜像的主要优势便于后期对镜像的内容进行调整,因此在企业中有了提前编写好的各种各样DockerFile文件就可以快速构建出不同的业务镜像,而当后期某个镜像有额外的需求变更时,只要在之前的DockerFile添加或者修改相应的内容、即可重新生成新的Docke镜像然后部署在业务容器环境中(docker、docker-compsoe、swarm、kubernetes、openshift等)。

 

Dockerfile 指令:

FROM centos:7.9.2009
#在整个dockfile文件中除了注释之外的第一行,要是FROM指令,FROM 指令用于指定当前镜像(base image)引用的父镜像(parent image)
MAINTAINER #(镜像的维护者信息,目前已经不推荐使用)
LABEL “key”=“value” #设置镜像的属性标签
LABEL author="jack jack@gmail.com"
LABEL version="1.0"
ADD [--chown=<user>:<group>] <src>... <dest>
#用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,会自动解压tar.gz格式的压缩包,但不会自动解压zip包
ADD --chown=root:root test /opt/test
COPY COPY [--chown=<user>:<group>] <src>... <dest>
#用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,不会解压任何压缩包
ENV MY_NAME="John Doe" #设置容器环境变量
USER <user>[:<group>] or USER <UID>[:<GID>] #指定运行操作的用户
RUN yum install vim unzip -y && cd /etc/nginx #执行shell命令,但是一定要以非交互式的方式执行
VOLUME ["/data/data1","/data/data2"] #定义volume
WORKDIR /data/data1 #用于定义当前工作目录
EXPOSE <port> [<port>/<protocol>...]
#声明要把容器的某些端口映射到宿主机

关于CMD与entrypoint:

CMD 和 ENTRYPOINT:
    CMD有以上三种方式定义容器启动时所默认执行的命令或脚本
  CMD ["executable","param1","param2"] (exec form, this is the preferred form) #推荐的可执行程序方式
  CMD ["param1","param2"] (as default parameters to ENTRYPOINT) #作为ENTRYPOINT默认参数
  CMD command param1 param2 (shell form) #基于shell命令的
   如:基于CMD #镜像启动为一个容器时候的默认命令或脚本,
    • CMD ["/bin/bash"]
ENTRYPOINT #也可以用于定义容器在启动时候默认执行的命令或者脚本,如果是和CMD命令混合使用的时候,会将CMD的命令当做参数传递给ENTRYPOINT后面的脚本,可以在脚本中对参数做判断并相应的容器初始化操作。
 案例1:
  ENTRYPOINT ["top","-b"]
  CMD ["-c"]
  等于如下一行:
  ENTRYPOINT ["top","-b","-c"]
 案例2:
  ENTRYPOINT ["docker-entrypoint.sh"] #定义一个入口点脚本,并传递mysqld 参数
  CMD ["mysqld"]
  等于如下一行:
  ENTRYPOINT ["docker-entrypoint.sh","mysqld"]
 使用总结:
  ENTRYPOINT(脚本) + CMD(当做参数传递给ENTRYPOINT)

例一: 基于ubuntu 构建Nginx镜像
Dockerfile  docker-entrypoint.sh  frontend.tar.gz  nginx-1.22.1.tar.gz  nginx.conf  sources.list

root@docker-server1:/usr/local/src/dockerfile/nginx-ubuntu# cat Dockerfile
FROM ubuntu:22.04

#ADD sources.list /etc/apt/sources.list

RUN apt update && apt  install -y iproute2  ntpdate  tcpdump telnet traceroute nfs-kernel-server nfs-common  lrzsz tree  openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute  gcc openssh-server lrzsz tree  openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip make

ADD nginx-1.22.1.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.22.1 && ./configure --prefix=/apps/nginx && make && make install  && ln -sv /apps/nginx/sbin/nginx /usr/bin
RUN groupadd  -g 2088 nginx && useradd  -g nginx -s /usr/sbin/nologin -u 2088 nginx && chown -R nginx.nginx /apps/nginx
ADD nginx.conf /apps/nginx/conf/
ADD frontend.tar.gz /apps/nginx/html/


EXPOSE 80 443
#ENTRYPOINT ["nginx"]
#CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]

##
#ENTRYPOINT ["/apps/nginx/sbin/nginx","-g","daemon off;"]

##
#ENTRYPOINT ["/apps/nginx/sbin/nginx"]

#CMD ["-g","daemon off;"]
##

COPY docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod a+x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]


root@docker-server1:/usr/local/src/dockerfile/nginx-ubuntu# cat docker-entrypoint.sh
#!/bin/bash

/apps/nginx/sbin/nginx  -g "daemon off;"

root@docker-server1:/usr/local/src/dockerfile/nginx-ubuntu# cat nginx.conf



events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

upstream tomcat {
  server 192.168.106.131:8080;
  server 192.168.106.132:8080;
}
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }


        location /myapp {
           proxy_pass http://tomcat;
        }
        
docker build -t  harbor.xxx.com/nginx:v1 .

posted @   梳碧湖砍柴少年  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示