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
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 8d07ecd7e345
//可以简写为8d,要保证唯一性
images]# docker commit 8d07ecd7e345 myos:v1
2)查看新建的镜像
images]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myos v1 7898cd0262c1 44 seconds ago 374.3 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主机:192.168.1.20
镜像仓库服务器:192.168.1.10
2.1 自定义私有仓库
1)定义一个私有仓库
oo]# vim /etc/docker/daemon.json //不写这个文件会报错
{
"insecure-registries" : ["192.168.1.10:5000"] //使用私有仓库运行容器
}
oo]# systemctl restart docker
oo]# docker run -(it)d -p 5000:5000 registry(:latest)
oo]# curl 192.168.1.10:5000/v2/
{} //出现括号
oo]# docker tag busybox:latest 192.168.1.10:5000/busybox:latest
//打标签
oo]# docker push 192.168.1.10:5000/busybox:latest //上传
oo]# docker tag myos:http 192.168.1.10:5000/myos:http
oo]# docker push 192.168.1.10:5000/myos:http
2)在docker2上面启动
docker2 ~]# scp 192.168.1.10:/etc/docker/daemon.json /etc/docker/
docker2 ~]# systemctl restart docker
docker2 ~]# docker images
docker2 ~]# docker run -it(d) 192.168.1.10:5000/myos:http /bin/bash
//直接启动
2.2 查看私有仓库
1)查看里面有什么镜像
{"repositories":["busybox","myos"]}
2)查看里面的镜像标签
{"name":"busybox","tags":["latest"]}
{"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 192.168.1.254
Export list for 192.168.1.254:
/content *
docker1 ~]# mkdir /mnt/qq
docker1 ~]# mount -t nfs 192.168.1.254:/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 192.168.1.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 192.168.1.254
Export list for 192.168.1.254:
/content *
docker2 ~]# mkdir /mnt/qq
docker2 ~]# mount -t nfs 192.168.1.254:/content /mnt/qq
docker2 ~]# docker run -d -p 80:80 -v /mnt/qq:/var/www/html -it 192.168.1.10:5000/myos:http
docker2 ~]# curl 192.168.1.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
4287a...
docker1 ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
03dabb0950de bridge bridge local
4287af1f4da0 docker01 bridge local
1dc55eeaba31 host host local
eef252b83aba none null local
docker1 ~]# ip a s
docker1 ~]# docker network inspect docker01
[
{
"Name": "docker01",
"Id": "4287af1f4da036e1f91885646c33ce29f44dd08fd0b93ac07d5ccc4d9eac4bf1",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.30.0.0/16"
}
]
},
"Internal": 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
e523b386f9...
docker1 ~]# curl 192.168.1.10:8080
......
4.2 扩展实验
1)新建一个网络模型docker02
--driver bridge 交换机
docker1 ~]# docker network create --driver bridge docker02
//新建一个 名为docker02的网络模型(虚拟交换机)
5496835bd...
docker1 ~]# ifconfig
//但是在用ifconfig命令查看的时候,显示的名字并不是docker02,而是br-5496835bd3f5
br-5496835bd3f5: flags=4099 mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:89:6a:a2:72 txqueuelen 0 (Ethernet)
RX packets 8 bytes 496 (496.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 496 (496.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker1 ~]# docker network list //查看显示docker02(查看加粗字样)
NETWORK ID NAME DRIVER SCOPE
03dabb0950de bridge bridge local
4287af1f4da0 docker01 bridge local
dc316667b1df docker02 bridge local
1dc55eeaba31 host host local
eef252b83aba none null local
2)若要解决使用ifconfig命令可以看到docker02的问题,可以执行以下几步命令
docker1 ~]# docker network list //查看docker0的NETWORK ID(加粗字样)
NETWORK ID NAME DRIVER SCOPE
03dabb0950de bridge bridge local
4287af1f4da0 docker01 bridge local
dc316667b1df docker02 bridge local
1dc55eeaba31 host host local
eef252b83aba none null local
3)查看03dabb0950de的信息
[root@docker2 ~]# docker network inspect 03dabb0950de
[
{
"Name": "bridge",
"Id": "03dabb0950de905f65a4e467e1af6b78b268cc8388a08f9098f145b0573dc9e3",
"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,
"Containers": {
"9601f47408ae7f218a8ded218205e77983326b06a5bb062f27ea311abd51fc6d": {
"Name": "hopeful_wing",
"EndpointID": "be2e930d737a4e0e957c11847b8e2c0ea4b48bbd0a5e2bc882a10566ff385cbe",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"fbf16a1f9477c06fedfb1a9a138f99443e058815f0b26a771b9db4fe41cba10e": {
"Name": "distracted_kowalevski",
"EndpointID": "ef15224759de94d7bcc3f347f0023eb378cc45af214125bc2c9c0ae32a3fd58c",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/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网桥
d721c...
docker1 ~]# ifconfig //ifconfig查看有docker02
docker02: flags=4099 mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
6)若想在创建docker03的时候自定义网段(之前已经创建过docker01和02,这里用docker03),执行以下命令
docker1 ~]# docker network create docker03 --subnet=172.40.0.0/16 -o com.docker.network.bridge.name=docker03
ab22300...
docker1 ~]# ifconfig //ifconfig查看,显示的是自己定义的网段
docker03: flags=4099 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 管理容器集群
***********************
- 第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection)
第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection) Scrapy提供了方便的收集数据的机制.数据以key/value方式存储,值大多是计数 ...
- “全栈2019”Java第五十四章:多态详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档
孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数据库 ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之五(五十四)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- 十四.自定义yum仓库、源码编译安装
pc7:192.168.4.7 1.自定义yum仓库1.1 源码仓库下:/root/tools/other]# createrepo .]# ls ntfs-3g-2014.2.15-6.el6.x8 ...
- 五十四:WTForms表单验证之自定义表单验证器
如果想要对表单中的某个字段进行自定义验证,则需要对这个字段进行单独的验证1.定义一个方法,命名规则为:validate_字段名(self, filed)2.在方法中,使用filed.data获取字段的 ...
- 《手把手教你》系列技巧篇(五十四)-java+ selenium自动化测试-上传文件-中篇(详细教程)
1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...
- 二十四 Redis消息订阅&事务&持久化
Redis数据类型: Redis控制5种数据类型:String,list,hash,set,sorted-set 添加数据,删除数据,获取数据,查看有多少个元素,判断元素是否存在 key通用操作 JR ...
- 五十四、SAP中LVC表格每列的宽度自适应
一.之前我们的LVC表格输出的界面,有些列太宽余留空白区块太多,有些列则显示不全还带省略号等 二.我们来到'REUSE_ALV_GRID_DISPLAY_LVC'的模块中,查看他的属性 三.我们查看L ...
随机推荐
- python学习-23 函数
函数 1.函数分为:数学定义的函数和编程语言中的函数 例如: - 数学定义的函数:y=2*x+1 - 编程语言的函数: def test(x): x += 1 return x def :定义函数的 ...
- mysql 中表与表之间的关系
如何找出两张表的对应关系 分析步骤: 1.先找出左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段 (通常是id) 2.再站 ...
- python多任务基础
1.多任务:两个程序段同时运行2.为某个函数创建线程并启动: import threading 线程名 = threading.Thread(target = 函数名,args = 参数元组) #创建 ...
- 使用Struts2实现图片上传和拦截器
今天来分享一个图片上传 现在很多小项目里面基本上都有要显示图片的功能,所以呢图片上传是基本要掌握的啦 一般的图片上传原理就是从本地选择一张图片然后通过io流发布到服务器上去 上传方案基本有三种: 1. ...
- CTS & APIO 2019 游记
写在前面 算是省选后的第一轮大考. 去年因为某些原因并没有参加 CTSC 以及 APIO,还是有些遗憾,所以希望今年能有所收获. 也希望今年的 CTS 能延续去年的出题风格,这样我还能苟一两个题. 然 ...
- (十一)Hibernate中的多表操作(1):单向一对多
一.单向一对多() 案例一(用XML文件配置): 一个班级有多个学生,班级可以查看所有学生的信息. ClassBean.java package bean; import java.util.Hash ...
- (七)shiro之编码/加密
一.编码/解码 使用Base64编码/解码操作 public class TestMain { public static void main(String[] args) { SecurityMan ...
- 数据库-SQL语句练习【已完成26题,还剩35题】
练习题链接:https://www.nowcoder.com/ta/sql?page=0 错题频次表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1+1 1+ ...
- C#如何调用C++(基础篇)
闲暇之余,记一下笔记!记录一下c#如何调用C++的动态库(dll). 步骤: 一.创建一个C++类,例如: AddOperate.h extern _declspec(dllexport) int S ...
- Python练习_初识函数_day9
1. 1.作业 1,写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. 2,写函数,判断用户传入的对象(字符串.列表.元组)长度是否大于5. 3,写函数,检查 ...