三、自定义镜像
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

浙公网安备 33010602011771号