赞
踩
这几天都在通过网上的一些课程学习docker容器化技术,深知docker为企业部署项目所带来的便利,比如可以解决以下问题:
以下是我对这几天学习docker的总结,希望对大家有所帮助,也是帮助我自己对docker知识的回顾,后续也会继续修改完善,如有理解不到位的地方还请指正。
目录
镜像:集装箱 仓库:超级码头 容器就是我们运行程序的地方
docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。
运输方式:任何地方需要货物都由鲸鱼先送到超级码头,然后再有鲸鱼从超级码头把货物送到目的地去。比如:我们要把台式机的应用部署到笔记本上,我们只需在台式机上执行一个dorker命令,把鲸鱼派过来将程序送到超级码头去,再在笔记本上执行一个docker命令,然后由鲸鱼把程序从超级码头送到笔记本上去。
镜像、容器、仓库三者的联系:
安装完docker后,没有任何镜像是无法运行容器的,需要从仓库(公共仓库/私有仓库)中拉取镜像,基于镜像运行容器,容器可以暂停、启动、重启等操作,可以将容器保存为一个镜像,保存之后可以进行备份为一个backup.tar包,这个tar包可以被迁移到其他地方再次恢复,恢复以后又是一个镜像。镜像又可以通过被打一个私有标签tag推送到仓库中
镜像来源有三种方式:
从仓库中直接拉取
基于容器制作镜像
通过dockerfile去创建镜像
鲸鱼拖着的所有集装箱就是一个镜像。镜像以分层的形式进行存储,类似于下图:
鲸鱼一次一般只能运一个镜像的集装箱,然后将其运回码头中心或者其他目的地
每一层都是只读的,然后把每一层加载完成之后这些文件都会被看成是同一个目录,相当于只有一个文件系统.docker的这种文件系统被称之为镜像.
只有最上面容器那一层是可读可写的,方便存储一些运行容器过程中的日志、数据和修改。
镜像是不能修改的,这样就能保证镜像可以生成多个容器独立运行,没有任何干扰.
用于统一的管理大量的镜像,并且进行标准化的运输方式,比如A的镜像要到B,都是需要通过输入命令,使得鲸鱼来到A并把镜像运输到超级码头,B再输入命令,使得鲸鱼将相应的镜像运输到B
docker官方自带仓库:dockerHub
docker run --help可以进行查看命令
-i和-t一般是组合去使用,可以进入到该容器里面
docker exec -it web bash:进入到容器里面,并可以修改里面的内容用于区分
docker run -d -e env=prod -p 88:80 --name web --restart=always nginx
prod是线上环境,test是测试环境,可以调用这个变量为环境做一些初始的配置
-p:将nginx暴露出来
88:80 右边是容器里面的服务端口,左边是宿主机端口
--name:可以一目了然的知道这个容器是用来干什么的
--restart=always:实现docker服务器重启了,容器依旧是可用的
docker ps:查看容器信息
可以通过docker inspect查看容器的详细信息
重启后容器里的数据是不会丢失的
docker ps:
-l:查看最新操作的容器
-a:查看所有容器,包含退出的
-q:列出所有的容器ID
nginx默认端口:80、redis默认端口:6379、mysql默认端口:3306、tomcat默认端口:8080
要注意映射到宿主机的端口号是否有被占用
应用于需要多个容器相互配合来完成某项任务的情况。可以通过配置docker-compose.yml文件同时启动多个容器。
概念:
Compose是Docker官方的开源项目。它是一个定义和运行多容器的docker应用工具。
通过YAML文件配置你的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务。
组成:
docker-compose将管理的容器分为三层,分别是工程、服务以及容器。
Docker-Compose运行目录下所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程
每个服务中定义容器运行的镜像、参数、依赖和多个容器实例
1、下载二进制文件
wget https://github.com/docker/compose/releases/download/1.24.0/docker-compose-Linux-x86_64
2、移动文件
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
3、赋予可执行权限
chmod +x /usr/local/bin/docker-compose
4、创建软链
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
5、测试是否安装成功
docker-compose --version
没有创建相应的tomcat、mysql和redis,只明白原理
目标:编写模板文件(docker-compose.yml)同时启动docker容器
docker-compose.yml文件比如:
步骤:
网络配置说明:
主要分为管理命令和命令
可以通过:docker --help进行查看
history可以查看构建历史,是通过dockerfile进行构建镜像的
从pull可以看出镜像是分层(目录)的,拉取的时候也是一层一层的进行拉取
我们在使用docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:
Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。
容器和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,并共享IP、端口范围等
注意:两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
docker0虚拟网桥,相当于一个二层交换机,可以给容器分配ip,并设置docker0的IP地址为容器的默认网关
通过Docker0和veth pair,宿主机上的连在同一网桥上的所有容器可以不受任何限制地相互通信,这可能导致拒绝服务攻击。进一步地,Docker可以通过–ip_forward和–iptables两个选项控制容器间、容器和外部世界的通信。
假设主机有一块网卡为eth0,IP地址为10.10.101.105/24,网关为10.10.101.254。从主机上一个IP为172.17.0.1/16的容器中ping百度(180.76.3.151)。IP包首先从容器发往自己的默认网关docker0,包到达docker0后,也就到达了主机上。然后会查询主机的路由表,发现包应该从主机的eth0发往主机的网关10.10.105.254/24。接着包会转发给eth0,并从eth0发出去(主机的ip_forward转发应该已经打开)。这时候,上面的Iptable规则就会起作用,对包做SNAT转换,将源地址换为eth0的地址。这样,在外界看来,这个包就是从10.10.101.105上发出来的。
Docker容器对外是不可见的。
流程:将容器的ip包通过veth pair传到主机的docker0上,然后根据路由表进行判断寻找有没有容器想要的IP地址,如果没有则会使用Iptable对包做SNAT转换,将源地址转换为主机地址向外部发出。
首先需要完成端口映射,将容器的端口暴露在主机的端口上,使用Iptable中的DNAT将目标地址进行转发,然后通过docker0找到对应的容器并连接上进行通信。
vmware就相当于Hypervisor层,可以允许存在多个操作系统
传统虚拟机:(基于硬件进行虚拟化)
Computer Hardware:基础设备(个人电脑,数据中心的服务器)
Hypervisor:虚拟机管理系统,如:VirtualBox或VMWare
Guest OS:虚拟出来的从操作系统
APP:应用
首先需要有一个笔记本或者是服务器,在该上面安装操作系统(windows/mac系统),再安装虚拟机管理系统比如VMWare,再去创建一个虚拟机,在虚拟机虚拟出来的硬件基础上再去创建一个虚拟出来的从操作系统比如centos7,在从操作系统上再去部署各种应用。
docker容器化:
Computer Hardware:基础设备(个人电脑,数据中心的服务器)
HostOS:主操作系统(如windows/mac)
Docker Engine:
直接在主操作系统上安装docker软件,再去在docker里面安装各种应用
docker直接利用的是宿主机的内核,而虚拟机需要基于宿主机再虚拟出来一个硬件设备供虚拟机使用,所以docker处理数据是秒级且占用体积小,虚拟机处理数据是分钟级
dockerfile文件内容:
将dockerfile的压缩包通过xftp传到vm操作系统的dockerfile文件夹中
可以在网页中F12点击网络中的所有,可以查看安装的nginx版本等
-v:将宿主机上的目录或文件挂载到容器中
nginx的默认访问端口是:80
注意:主机的88端口是否有被占用
意思是创建一个容器名称为web、将容器端口80暴露给宿主机88端口的并将宿主机的/opt/wwwroot目录挂载在容器的/usr/share/nginx/html中,向/usr/share/nginx/html里面添加的内容会同步在宿主机的/opt/wwwroot目录中,并且也可以在宿主机上的目录对数据进行修改
docker rm -f web:删除名称为web的容器
启动容器命令:docker container start web
网页内容如下:
因为笔记本和vm所创建的服务器是在同一个IP段(76)中,相互之间可以访问,再通过容器的端口映射访问到容器。
(端口映射在创建容器时就要完成)
进入容器,使用命令行客户端
DockerHub是一个用于管理公共镜像的仓库,可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去
但是,有时候我们的服务器无法访问网络(比如项目部署到的服务器所在的机房环境是无法访问外网的,但是又需要用到docker并拉取镜像),或者不希望将自己的镜像放到公网中,则需要搭建自己的私有仓库来存储和管理自己的镜像。(私有仓库产生的缘由)
daemon.json:
重启docker和registry
查看页面内容,此时仓库为空没有镜像
拉取registry镜像;基于镜像创建私有仓库容器;需要去修改docker的一个配置文件指定私有仓库地址;再访问私有仓库:192.168.254.128:5000/v2/_catalog
重新使用dockerfile文件创建了一个镜像名字为ccynginx的nginx镜像
可以用docker images进行查看:
上传步骤:
实操如下:
上传成功
分为两种情况:私有仓库所在服务器拉取镜像(比较少见)、其他服务器拉取私有仓库镜像
私有仓库所在服务器拉取镜像:
步骤:
其他服务器拉取私有仓库镜像:
没有另一台服务器就没有去实操,只理解原理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。