三、自定义镜像

docker commit   使用镜像启动容器,在该容器基础上修改,另存为另一个镜像       docker commit 容器ID  镜像名称:标签
 [root@jacob ~]# docker run -itd centos bash
[root@jacob ~]# docker ps
[root@jacob ~]# docker exec -it IDs bash   //IDs   容器的id
修改(增删改数据、安装软件、修改配置文件等)
[root@docker1 ~]# docker commit  7640ee1033cd   myos:latest    //以76为模板创建模板镜像
[root@jacob ~]# docker images
 
Dockerfile语法格式
– FROM:基础镜像,模板镜像                  FROM centos:latest
– MAINTAINER:镜像创建者信息           MAINTAINER lixin  
– EXPOSE:开放的端口                                 EXPOSE 80
– ENV:设置变量                        ENV  EnvironmentFile=/etc/sysconfig/httpd
– ADD:复制文件到镜像     //拷贝的文件必须为当前路径的文件           ADD  httpd.conf  /etc/httpd/conf/httpd.conf
– RUN:制作镜像时执行的命令,可以有多个    //容器里执行的命令          RUN  rm -f /etc/yum.repos.d/*
– WORKDIR:定义容器默认工作目录,即进入容器时处于的目录                WORKDIR /var/www/html   
– CMD:容器启动时执行的命令,仅可以有一条CMD                   CMD  ["/usr/sbin/httpd", "-DFOREGROUND"]
 
使用Dockerfile工作流程        
– mkdir xx; cd xx  //创建文件夹,进入文件夹                                                                        
– vim Dockerfile     //配置Dockerfile文件,文件名Dockerfile
– docker  build  -t   镜像名称  Dockerfile所在文件夹路径             //创建镜像
 
Dockerfile 01
FROM centos:latest
RUN  rm -f /etc/yum.repos.d/*
ADD  local.repo /etc/yum.repos.d/local.repo
RUN  yum install -y net-tools psmisc lftp iproute vim
 
Dockerfile 02
FROM myos:latest
CMD ["/usr/bin/pythono"]
 
Dockerfile 03
FROM myos
RUN  yum install -y httpd
ADD  httpd.conf /etc/httpd/conf/httpd.conf
WORKDIR /var/www/html
RUN  echo "hello nsd1803" >index.html
EXPOSE 80
MAINTAINER lixin
ENV  EnvironmentFile=/etc/sysconfig/httpd
CMD  ["/usr/sbin/httpd", "-DFOREGROUND"]
                                                                                  
创建私有仓库
配置文件 /etc/docker/daemon.json
{
  "insecure-registries" : ["192.168.1.10:5000"]
}
 
完成配置以后重启 docker 服务
systemctl restart docker
 
启动私有仓库服务
docker run -d -p 5000:5000 registry
 
打标记
docker tag busybox:latest 192.168.1.10:5000/busybox:latest
docker tag myos:latest 192.168.1.10:5000/myos:latest
docker tag myos:python 192.168.1.10:5000/myos:python
docker tag myos:httpd  192.168.1.10:5000/myos:httpd
 
上传镜像
docker push 192.168.1.10:5000/busybox:latest
docker push 192.168.1.10:5000/myos:latest
docker push 192.168.1.10:5000/myos:python
docker push 192.168.1.10:5000/myos:httpd
查看私有仓库有什么样的镜像
查看私有仓库的镜像有什么样的标签
 
客户机使用私有镜像源
配置 daemon.json
重启服务 systemctl  restart  docker
启动容器
docker run -it 192.168.1.10:5000/busybox
docker run -it 192.168.1.10:5000/myos
docker run -d 192.168.1.10:5000/myos:httpd
 
卷的概念
• docker容器不保持任何数据
• 重要数据请使用外部卷存储(数据持久化)
• 容器可以挂载真实机目录或共享存储为卷                          
 
主机卷的映射:  将真实机目录挂载到容器中提供持久化存储
[root@jacob ~]# docker  run  -v  真实机的目录:容器的目录   -it   centos   bash
 
共享存储基本概念
• 一台共享存储服务器可以提供给所有Docker主机使用,共享存储服务器(NAS、SAN、DAS等)
• 如:使用NFS创建共享存储服务器,客户端挂载NFS共享,并最终映射到容器中
 
使用共享存储的案例
• 服务器
– yum -y install nfs-utils
– vim /etc/exports
– systemctl start nfs
• Docker主机
– mount挂载共享
– 运行容器时,使用-v选项映射磁盘到容器中
                                                               
Linux网桥                                                    
真实网卡配置文件                                                    
cat  /etc/sysconfig/network-scripts/ifcfg-eth0
• 虚拟网卡配置文件
cat  /etc/sysconfig/network-scripts/ifcfg-eth0:0
[root@jacob ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=static
... ...
NAME=eth0:0
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.4.15
 
[root@jacob ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
... ...
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.4.15
[root@jacob ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
... ...
NAME=eth0
DEVICE=eth0
BRIDGE=br0
ONBOOT=yes
IPADDR=192.168.4.15
[root@jacob ~]# brctl show    //查看网桥
 
查看默认Docker创建的网络模型
[root@jacob ~]# docker network list                //查看网络模型
[root@jacob ~]# ip a s docker0            //查看docker0  ip地址
[root@jacob ~]# brctl show docker0      //启动容器时如果不指定默认会绑定该网桥
 
创建虚拟交换机                                 
docker network create --driver=bridge  --subnet 192.168.100.0/24  docker1       //--driver  指定模型  --subnet 指定网段 
[root@docker1 ~]# brctl show           //查看网桥
bridge name                   bridge id            STP enabled   interfaces
br-a757260f6ff4                 8000.0242b59006c1         no              veth2592ab6          //docker1网桥
docker0                      8000.0242e5f6a138 no              veth5a29cec
[root@docker1 ~]# docker network list            //查看网络模型
NETWORK ID          NAME                DRIVER              SCOPE
718ee74d0aba        bridge              bridge              local               //桥接模型 
a757260f6ff4        docker1             bridge              local               //新建的docker1
fe4269187e3f        host                host                local                  //主机模型
4faaa6502f66        none                null                local                //无网络
 
创建一个新的容器,使用新的交换机(不同网桥的容器不能通信,防火墙规则隔离,要通信需修改iptables防火墙)
docker run -it --network=docker1 myos          //--network  指定网桥
创建容器,使用宿主机的端口 -p 宿主机端口:容器端口
docker run -d -p 80:80 -v /var/webroot:/var/www/html 192.168.1.10:5000/myos:httpd
 
客户端访问容器内的资源
默认容器通过SNAT可以访问外网,但外部网络的主机不可以访问容器内的资源,使用端口映射可以实现外部网络访问容器内的资源
[root@jacob ~]# docker run -p 8080 80 -id nginx       //如:真实机IP为192.168.4.5,   使用-p映射真实机的8080端口到容器中的80端口
[root@client ~]# firefox http://192.168.4.5:8080 
posted @ 2021-09-13 14:41  落樰兂痕  阅读(108)  评论(0)    收藏  举报