44_自定义镜像及仓库、持久化存储 、 Docker网络架构

1. 制作自定义镜像(base基础镜像,搭建共性环境)
基于centos镜像使用commit创建新的镜像文件
基于centos镜像使用Dockerfile文件创建一个新的镜像文件
 
1.1 使用镜像启动容器
 
1)在该容器基础上修改yum源
docker_images]# docker run -it centos
345 /]# rm -rf /etc/yum.repos.d/*  
345 /]# vi /etc/yum.repos.d/dvd.repo
[dvd]
name=dvd
baseurl=ftp://10.10.11.1/dvd
enabled=1
gpgcheck=0
345 /]# yum clean all
345 /]# yum repolist
 
2)安装测试软件
345 /]# yum -y install net-tools iproute psmisc vim-enhanced
 
3)ifconfig查看
345 /]# ifconfig
... inet 172.17.0.2 ..
345 /]# exit
 
1.2 另存为另外一个镜像
 
1)创建新建镜像
images]# docker start 0821fcbc6028
//可以简写为08,要保证唯一性
images]# docker commit 0821fcbc6028 myos:v1
 
2)查看新建的镜像
images]# docker images
REPOSITORY  TAG   IMAGE ID      CREATED          SIZE
myos        v1    9a99a8ed4f6b  7 seconds ago    238 MB
 
3)验证新建镜像
images]# docker run -it myos:v1
4bf /]# ifconfig(有此命令,表示已安装)
...inet 172.17.0.3
    
1.3 使用Dockerfile文件创建一个新的镜像文件(根据基础镜像创建个性镜像)
 
Dockerfile语法格式:
– FROM:基础镜像
– MAINTAINER:镜像创建者信息(说明)
– EXPOSE:开放的端口
– ENV:设置环境变量
– ADD:复制文件到镜像
– RUN:制作镜像时执行的命令,可以有多个
– WORKDIR:定义容器默认工作目录
– CMD:容器启动时执行的命令,仅可以有一条CMD
 
1)创建一个Apache的镜像文件
docker1 ~]# mkdir oo
docker1 ~]# cd oo
oo]# touch Dockerfile    //Dockerfile文件第一个字母要大写
oo]# cp /etc/yum.repos.d/local.repo  ./
oo]# vi Dockerfile
FROM  myos:v1
RUN yum -y install httpd
ENV EnvironmentFile=/etc/sysconfig/httpd
WORKDIR /var/www/html/            //定义容器默认工作目录
RUN echo "test" > /var/www/html/index.html
EXPOSE 80                //设置开放端口号
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
 
oo]# docker build -t myos:http .
Successfully built 2cbd819bc792
 
oo]# docker run -d myos:http
oo]# docker inspect 2cbd819bc792
oo]# curl 172.17.0.3
test
 
2.创建私有镜像仓库
 
Docker主机:10.10.11.20
镜像仓库服务器:10.10.11.10
 
2.1 自定义私有仓库
 
1)定义一个私有仓库
oo]# vim /etc/docker/daemon.json    //不写这个文件会报错
{
"insecure-registries" : ["10.10.11.10:5000"]    //使用私有仓库运行容器
}
oo]# systemctl restart docker
oo]# docker run -(it)d -p 5000:5000 registry(:latest)
oo]# curl 10.10.11.10:5000/v2/
{}    //出现括号
oo]# docker tag busybox:latest 10.10.11.10:5000/busybox:latest  
//打标签
oo]# docker push 10.10.11.10:5000/busybox:latest  //上传
oo]# docker tag myos:http 10.10.11.10:5000/myos:http
oo]# docker push 10.10.11.10:5000/myos:http
 
2)在docker2上面启动
docker2 ~]# scp 10.10.11.10:/etc/docker/daemon.json /etc/docker/
docker2 ~]# systemctl restart docker
docker2 ~]# docker images
docker2 ~]# docker run -it(d) 10.10.11.10:5000/myos:http /bin/bash    
//直接启动
 
2.2 查看私有仓库
 
1)查看里面有什么镜像
oo]# curl http://10.10.11.10:5000/v2/_catalog
{"repositories":["busybox","myos"]}
 
2)查看里面的镜像标签
oo]# curl http://10.10.11.10:5000/v2/busybox/tags/list ;
{"name":"busybox","tags":["latest"]}
 
oo]# curl http://10.10.11.10:5000/v2/myos/tags/list ;
{"name":"myos","tags":["http"]}
 
3.NFS共享存储(多个容器共享一个目录)
要求创建NFS共享,能映射到容器里:
服务器创建NFS共享存储,共享目录为/content,权限为rw
客户端挂载共享,并将共享目录映射到容器中
 
3.1 配置NFS服务器
真机:
]# yum -y install nfs-utils
]# mkdir /content
]# vim /etc/exports
/content/ *(rw,no_root_squash)
]# systemctl restart nfs-server.service
]# systemctl restart nfs-secure.service
]# exportfs -rv
exporting *:/content
]# chmod 777 /content
]# echo 11 > /content/index.html
 
3.2 配置客户端
 
oo]# yum -y install nfs-utils
oo]# systemctl restart nfs-server.service
oo]# showmount -e 10.10.11.1
Export list for 10.10.11.1:
/content *
 
docker1 ~]# mkdir /mnt/qq
docker1 ~]# mount -t nfs 10.10.11.1:/content /mnt/qq
docker1 ~]# ls /mnt/qq
index.html
docker1 ~]# cat /mnt/qq/index.html
11
docker1 ~]# docker run -d -p 80:80 -v /mnt/qq:/var/www/html -it myos:http
-v 宿主机目录:容器目录
docker1 ~]# curl 10.10.11.10
11
docker1 ~]# ll /mnt/qq/index.html
-rw-r--r-- 1 root root 3 2月  26 08:53 /mnt/qq/index.html
docker1 ~]# vim /mnt/qq/index.html
11 dddd
 
docker2 ~]# yum -y install nfs-utils
docker2 ~]# showmount -e 10.10.11.1
Export list for 10.10.11.1:
/content *
 
docker2 ~]# mkdir /mnt/qq
docker2 ~]# mount -t nfs 10.10.11.1:/content /mnt/qq
docker2 ~]# docker run -d -p 80:80 -v /mnt/qq:/var/www/html -it 10.10.11.10:5000/myos:http
docker2 ~]# curl 10.10.11.20
11 dddd
 
docker1 ~]# touch /mnt/qq/a.sh
docker1 ~]# echo 22 > /mnt/qq/index.html
docker2 ~]# ls /mnt/qq/
a.sh  index.html
docker2 ~]# cat /mnt/qq/index.html
22
 
4.创建自定义网桥(虚拟交换机)
创建网桥设备docker01
设定网段为172.30.0.0/16
启动nginx容器,nginx容器桥接docker01设备
映射真实机8080端口与容器的80端口
 
4.1 新建Docker网络模型
 
1)新建docker1网络模型
docker1 ~]# yum -y install bridge-utils
--subnet= 指定子网
docker1 ~]# docker network create --subnet=172.30.0.0/16 docker01
2a20...
docker1 ~]# docker network list
NETWORK ID      NAME        DRIVER   SCOPE
76cb84177a0a    bridge      bridge   local
2a20c351189e    docker01    bridge   local
f3705509227a    host        host     local
1b9b98ace8dc    none        null     local          
 
docker1 ~]# ip a s
docker1 ~]# docker network inspect docker01
[
    {
        "Name": "docker01",
        "Id": "2a20c351189ea4acf036d9c52a647d5662e0ebff466c4311c92dc06669761d09",
        "Created": "2020-02-26T19:38:56.887219799+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.30.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
 
2)使用自定义网桥启动容器(用同一个虚拟交换机,(docker01)启动的两个容器之间可以互相通信)
docker1 ~]# docker run --network=docker01 -id nginx
 
3)端口映射
(外网可以访问到容器内容,即容器部署的环境就变成真机(宿主机)环境,不同容器部署的不同环境真机可以随时调用,部署(启动就可以了,不用可以关掉)【应用程序部署和封装的核心技术】,部署各种各样的运行环境。
-p 8080(宿主机端口):80(容器端口)
docker1 ~]# docker run -p 8080:80 -id nginx
6e72caec6e...
docker1 ~]# curl 10.10.11.10:8080
......
 
4.2 扩展
 
1)新建一个网络模型docker02
--driver bridge 交换机
docker1 ~]# docker network create --driver bridge docker02
//新建一个 名为docker02的网络模型(虚拟交换机)
46067f1...
docker1 ~]# ifconfig
//但是在用ifconfig命令查看的时候,显示的名字并不是docker02,而是br-46067f163c0a
br-46067f163c0a: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:c2:c3:f1:58  txqueuelen 0  (Ethernet)
        RX packets 15  bytes 1316 (1.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 67  bytes 5248 (5.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker1 ~]# docker network list  //查看显示docker02(查看加粗字样)
NETWORK ID      NAME          DRIVER   SCOPE
76cb84177a0a    bridge        bridge   local
2a20c351189e    docker01      bridge   local
46067f163c0a    docker02      bridge   local
f3705509227a    host          host     local
1b9b98ace8dc    none          null     local       
 
2)若要解决使用ifconfig命令可以看到docker02的问题,可以执行以下几步命令
docker1 ~]# docker network list   //查看docker0的NETWORK ID(加粗字样)
NETWORK ID      NAME          DRIVER   SCOPE
76cb84177a0a    bridge        bridge   local
2a20c351189e    docker01      bridge   local
46067f163c0a    docker02      bridge   local
f3705509227a    host          host     local
1b9b98ace8dc    none          null     local    
3)查看76cb84177a0a的信息
[[email protected] ~]# docker network inspect 76cb84177a0a
[
    {
        "Name": "bridge",
        "Id": "76cb84177a0a7b3ebfc4e15cf689dc9524d493c3be129a1184d019ff35712ed4",
        "Created": "2020-02-26T17:00:19.709434615+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "0821fcbc60280609d60ca4cb0c2dd92415bfb4b9d866a31ada96c013ceca3b34": {
                "Name": "cocky_hopper",
                "EndpointID": "445e5da9a6671cf230cb8f939f5b46a3a6ecbb1976b25888349b9c55e7e92942",
                "MacAddress": "02:42:ac:11:00:05",
                "IPv4Address": "172.17.0.5/16",
                "IPv6Address": ""
            },
            "0dca44ae2723e6037d6298b0d0b0f076245e2eeb870ac741bf6adc0335d87232": {
                "Name": "upbeat_darwin",
                "EndpointID": "64ff404dec68bf9241b43fb3cc3becdf43bcd521341279f04f84f9985ccbba89",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "32e49140afd1bc5ecdd76fe914bb232318ded9108a68252d3ba7605ccce1df6b": {
                "Name": "lucid_yalow",
                "EndpointID": "adcfd0b4b2099650881abfdd500f75e6f043a99ea5ce740066739264b4dd478b",
                "MacAddress": "02:42:ac:11:00:06",
                "IPv4Address": "172.17.0.6/16",
                "IPv6Address": ""
            },
            "9413edfbedeaa0783ee75a68ccb83e5f385ff55287343a1ca7f14a8b8d021d03": {
                "Name": "youthful_galileo",
                "EndpointID": "562cff64b74ae807e9cdf22ada1f4f815ae1232f8a526f5e6256dd046c91d59e",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "c5eb0cb9cb57b15061df18b3eebd123917881e725fbe9262fa4a2aee60fba157": {
                "Name": "determined_wescoff",
                "EndpointID": "424d1f30cf4ae5a3a05e0c6f91456bfc7f95fb84b6124ce6b971017f9e7a92ca",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
 
4)查看图片的倒数第六行有"com.docker.network.bridge.name": "docker0"字样
 
5)把刚刚创建的docker02网桥删掉
docker1 ~]# docker network rm docker02   //删除docker02
docker02
docker1 ~]# docker network create  \
docker02 -o com.docker.network.bridge.name=docker02   
//创建docker02网桥
da636186...
docker1 ~]# ifconfig  //ifconfig查看有docker02
docker02: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1
 
6)若想在创建docker03的时候自定义网段(之前已经创建过docker01和02,这里用docker03),执行以下命令
docker1 ~]# docker network create docker03 --subnet=172.40.0.0/16 -o com.docker.network.bridge.name=docker03
f10fbf...
docker1 ~]# ifconfig   //ifconfig查看,显示的是自己定义的网段
docker03: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.40.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
 
docker镜像编排是docker的核心.

**********************

知识点整理:

01:自定义镜像及仓库
基于源镜像进行配置,commit或build成新镜像,当成自己镜像仓库。
将自己的镜像搭建一个镜像仓库(registry),上传到网络,共享给其他主机。

02:持久化存储:卷
docker容器不保持任何数据,重要数据使用外部卷存储(数据持久化)
容器可以挂载真机目录或共享存储为卷(即共享存储服务器,如NFS共享,映射到容器中)。

03:真机将NFS目录共享给docker1、2挂载,docker1启动nginx容器和docker2启动http容器两者共享该目录(两个容器共享一web个页面).

04:Linux网桥:虚拟交换机(TYPE="bridge")
创建容器时启用该网桥(带子网,即网络区域)
目的:一台docker主机有多个容器可隔离网络,创建多个不同网桥,将不同需求的容器隔离开。(同一网桥的不同容器可以互相通信)
bridge:桥接 host:主机模型 null:无网络
查看:brctl show

05:docker最大的作用就是:快速的切换部署环境!
原理:docker容器端口可以跟docker宿主机进行绑定(宿主机可以真机通信,而真机可以访问外网),即外网可以访问到容器内的服务!
容器内部署了nginx和http容器,宿主机启动nginx容器,外网即可以宿主即nginx服务;宿主机关闭nginx服务,启动http容器,外网即可访问宿主机http服务!

虚拟化:kvm namespace(内核的三个功能)
---libvirt 单机命令管理 docker 单机容器管理
---openstack 管理集群 k8s 管理容器集群
***********************

原文地址:https://www.cnblogs.com/luwei0915/p/12368723.html

时间: 2024-07-29 01:20:39

44_自定义镜像及仓库、持久化存储 、 Docker网络架构的相关文章

docker的持久化存储和共享存储和网络架构

1.持久化存储docker容器中一般不保存数据,只封装系统和环境,这样就存在一个问题,一个docker容器的数据内容不能持久化,且不能共享出来,在生产中,不能很好地提供服务.为了解决这个问题,就要涉及到docker的持久化存储和共享存储的技术了.所谓持久化,就是将真实机目录挂载到容器中,让容器运行时所产生的数据都写入到真实机的目录中,以此来提供持久存储. mkdir /var/webroot docker run -d -p 80:80 -v /var/webroot:/var/www/html

五十四.自定义镜像及仓库、持久化存储 、 Docker网络架构

1. 制作自定义镜像(base基础镜像,搭建共性环境) 基于centos镜像使用commit创建新的镜像文件 基于centos镜像使用Dockerfile文件创建一个新的镜像文件 1.1 使用镜像启动容器 1)在该容器基础上修改yum源 docker_images]# docker run -it centos 345 /]# rm -rf /etc/yum.repos.d/* 345 /]# vi /etc/yum.repos.d/dvd.repo [dvd] name=dvd baseurl

“深入浅出”来解读Docker网络核心原理

前言 之前笔者写了有些关于dokcer的各种相关技术的文章,唯独Docker网络这一块没有具体的来分享.后期笔者会陆续更新Docker集群以及Docker高级实践的文章,所以在此之前必须要和大家一起来解读一下Docker网络原理.认真看下去你会有收获的. ?在深入Docker内部的网络原理之前,我们先从一个用户的角度来直观感受一下Docker的网络架构和基本操作是怎么样的. Docker网络架构 ?Docker在1.9版本中(现在都1.17了)引入了一整套docker network子命令和跨主

Docker网络浅析

Docker网络模式 Docker网络架构源自一种叫作容器网络模型(CNM)的方案,该方案是开源的并且支持插接式连接.Libnetwork是Docker对CNM的一种实现,提供了Docker核心网络架构的全部功能.不同的驱动可以通过插拔的方式接入Libnetwork来提供定制化的网络拓扑. 为了实现开箱即用的效果,Docker封装了一系列本地网络驱动(bridge驱动,overlay驱动,macvlan驱动),覆盖了大部分常见的网络需求,其中包括单机桥接网络(Single-Host Bridge

docker基础——自定义镜像、创建私有仓库、查看 docker 运行状态

一.自定义镜像 1,案例1 要求:请自定义一个 docker 镜像,基于 hub.c.163.com/library/centos,要求创建出来的镜像在生成容器的时候,可以直接使用 ifconfig 命令 自定义镜像,输入 vim Dockerfile: RUN rpm --import FROM hub.c.163.com/library/centos MAINTAINER suyunanyan RUN rpm --import/etc/pki/rpm-gpg/RPM-GPG-KEY-Cent

Docker之创建自定义镜像

简单介绍 之前使用docker run或者docker pull使用了Docker Hub上面已经构建好的的镜像,当然也可以自己基于基础镜像自定义镜像. 实际操作 1.可以使用docker run或者docker pull进行镜像的拉取和运行. 2.使用docker search ×××指令进行查找镜像 指令:sudo docker search fedora 结果 这里展示了有关fedora的镜像,显示了镜像名称,描述,星级,是否为官方以及是否自动构建信息. 3.构建镜像 构建镜像可以使用两个

Docker | 第五章:构建自定义镜像

前言 上一章节,主要是介绍了下Dockerfile的一些常用命令的说明.我们知道,利用Dockerfile可以构建一个新的镜像,比如运行Java环境,就需要一个JDK环境的镜像,但直接使用公共的镜像时,一般上大小都比较大.所以本章节就主要结合Dockerfile文件及commit方式,构建属于自己的镜像,同时对镜像进行压缩和优化,同时也是对Dockerfile知识的一个实践. 利用Dockerfile构建自定义镜像 选定基础镜像 准备JRE版本 编写Dockerfile 实践:运行SpringB

04 Docker 制作自定义镜像包

制作自定义镜像包的两种方式 1.创建容器并对容器进行修改,然后打包容器为镜像 2.使用Dockerfile编排镜像 自定义镜像 1.创建一个容器 docker run -itd centos 2.进入容器进行修改配置 docker exec -it 容器id bash 停止容器,不是必须的 3.创建镜像并验证 docker commit 容器id 镜像名称:标签 4.打包镜像 docker save 镜像名称 > 包名.tar 使用 Dockerfile 编排镜像 给容器配置 yum 源 查看宿

Docker持久化存储之数据共享

持久化存储 Data volume 要知道容器是有生命周期的.docker默认的存储方式:存储类型:(strage driver:overlay2.xfs) data volume有两种挂载方式: 1)bind mount(用户管理):将宿主机上的某个目录或文件(不可以是没有格式化的磁盘文件),挂载到容器中,默认在容器内对此目录是有读写权限的,如果只需要向容器内添加文件,不希望覆盖目录,需要注意源文件必须存在,否则会被当做一个目录bind mount给容器.2)docker manager vo