Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
一、docker的安装与部署
系统环境:要求centos7以上,内核必须不小于3.10
下载包,并安装
启动服务,并查看
ip addr可以看到docker0
二、镜像的导入和容器的使用
1、导入镜像并查看
2、使用镜像创建容器,并查看信息
3、网页查看
4、同样的方式导入nginx查看
也可以做端口映射:
还可以编辑默认发布目录,用cp命令
可以用diff查看容器的变化
5、数据卷管理
创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共享一个目录。
此时修改index.html里的内容,直接会在容器里生效
并且可以设置读写权限
但在主机里是没有读写权限的
备份数据卷 --volumes-from
对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置--rm选项,这样在容器退出时就能够自动清理容器内部的文件系统,如下图在ubuntu环境下打包一个文件
6、创建容器镜像
先建立一个ubuntu容器,在里面创建文件
完成后commit创建容器镜像v1,并删除vm1
再次创建容器名字随意,导入v1,查看文件还在
删除容器的命令是rm,删除镜像是rmi
7、容器间的互连
--link 参数可以在不映射端口的前提下为两个容器间建立安全连接, --link 参数可以连接一个或多个容器到将要创建的容器。
--link 参数的格式为 --link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名。
三、网络管理
Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.42.1/16, 容器启动后都会被桥接到 docker0 上,并自动分配到一个 IP 地址。
四种网络模型
1、bridge模式,不需要-net指定,为默认设置
改模式docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。
2、host模式:此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。
ip addr查看
3、container模式:此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。
先建立一个容器vm1,并查看ip信息
使用容器模式指定,并查看ip信息
4、none模式:此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置
查看网桥,没有需要我们自建建立,在真机端和容器端建立连接
在/var/run/下建立netns目录,并查看容器pid,建立链接
Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0和veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。
查看配置ip是否成功
四、使用Dockerfile构建镜像以及搭建服务
Dockerfike快速创建自定义的Docker镜像配置纯净环境,导入rhel7的镜像
在/tmp/docker目录下。编写好yum源
此时yum源是否搭建成功
编写Dockerfile,并执行安装httpd服务测试
--FROM(指定基础image) 在dockfile其他指令的前面指定基础image,后面的指令都依赖于该指令指定的image
--MAINTAINER (指定镜像创建者的信息)
--RUN(安装软件用) RUN可以运行任何被基础image支持的命令,如果基础image指定的是ubuntu,那么RUN中只能使用ubuntu的命令
--CMD(设置容器启动是执行的操作) 可以是自定义脚本,也可是系统命令,该指令只能出现一次,如果有多条,则只执行最后一条
--ENTRYPOINT(设置容器启动时执行的操作) 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个 ENTRYPOINT 时,只有最后一个生效
--USER(设置container容器的用户) 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
--EXPOSE(指定容器需要影射到宿主机的端口) 该命令会将容器中的端口映射成宿主机的某个端口,当你需要访问容器的时候,可以直接访问宿主机的ip:映射过去的端口
--ENV(用于设置环境变量)
--ADD(从src复制文件到container的dest路径)构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果是文件且中不使用斜杠结束,则会将视为文件,的内容会写入;如果是文件且中使用斜杠结束,则会文件拷贝到目录下
2、再次编写Dockerfile部署ssh服务
运行测试
3、设置一键部署
更改yum源,加入supervisior
编写Dockerfile和supervisord.conf
完成后测试
五、仓库的搭建
下载registry镜像
导入镜像并查看
生成容器
修改景象的tag,完成后把打了tag的镜像上传到本地镜像
去仓库目录查看
删除本地的镜像文件,从仓库拉取测试仓库的搭建
2、加ssl证书
创建证书文件夹,加入本地解析
生成ssl证书
将证书copy到上面创建的证书文件夹下
建立私有仓库并指定证书文件
上传镜像文件到私有仓库
将证书信息发送到其他主机,拉取测试
3、给私有仓库加入用户名和密码
建立auth目录生成用户名和密码
启动registry容器
上传镜像到仓库,失败,需要登陆,输入用户名和密码登陆后珊瑚和上传镜像成功
在里一台机器拉取测试,不登陆无法拉取,登陆后拉取成功
这里查询私有仓库的所有镜像,报错的话,需要将认证文件复制到/etc/pki/ca-trust/source/anchors/目录下执行update-ca-trust命令即可