一.容器和单机容器编排入门与实战 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。
镜像可以基于其它镜像进行重新构建,被引用的镜像称为父镜像。
一个镜像可以同时被创建为多个容器。
镜像是只读的,在容器的任何更改都不会直接修改镜像。
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有以上三种方式定义容器启动时所默认执行的命令或脚本
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 .
本文来自博客园,作者:梳碧湖砍柴少年,转载请注明原文链接:https://www.cnblogs.com/pang-lu/p/16928700.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通