思考

在工作中如何高效的保证开发人员写代码的开发环境与应用程序要部署的生产环境一致性? 如果要部署一台新的机器, 一切都要从头开始配置吗? (本文以VM虚拟机和ubuntu系统的镜像为例)

Docker:

1. 上述的问题都涉及一个点--相同的工作是否需要重复的做?
2. 避免相同的工作重复做就是容器化技术应用之一
3. Docker的目标之一就是缩短代码从开发, 测试到部署, 上线运行的周期, 让我们的应用程序具备可移植性, 易于构建, 并易于协作
4. docker是一款开源的软件部署解决方案
5. docker是一款轻量级的容器框架
6. docker可以打包, 发布, 运行任何的应用
7. docker就像是一个盒子, 里面可以装很多的物件, 如果需要可以将盒子拿走, 不需要一样一样的取
8. docker是C/S架构, 客户端只需要发出请求, 服务器处理完就会返回结果

Docker的三个基本概念

1. 镜像
类似于虚拟机里面的镜像, 是一个只读的模板, 一个独立的文件系统, 有运行容器所需要的数据, 也可以创建新的容器
2. 容器
容器是由镜像创建的运行实例, 支持启动, 停止, 删除
3. 仓库

用于托管镜像(上传下载)

4. 总结
镜像就像一个类, 容器就相当于镜像的实例, 类能创建新的实例,所以镜像能创建容器,  类里面也包含实例的属性, 所以镜像里面也包含了容器运行所需要的数据
5. docker的网络
docker在安装时会自动在host上创建三个网络可以用 “docker network ls” 命令查看

docker容器实例化 docker 容器化_docker

docker容器实例化 docker 容器化_docker容器实例化_02
在使用docker run开启容器时, 使用–net=host指定docker使用的网络实际上和宿主机一样, 启动容器时使用host模式–和主机共用一个Network Namespace(容器不会虚拟出自己的网卡, 配置自己的ip等, 都是使用主机的ip和端口)但是容器的其他方面, 如文件系统, 进程列表等还是和宿主机隔离的
docker容器实例化 docker 容器化_docker_03
1.用命令开启如下容器

docker容器实例化 docker 容器化_docker_04


2 .查看–net=host模式下的容器ip(进入fastdfs镜像映射本机的trcker日志文件, 可以看见此时的tracker容器和我本机的ip一样)


docker容器实例化 docker 容器化_docker_05


docker容器实例化 docker 容器化_docker_06


docker容器实例化 docker 容器化_应用程序_07

docker容器实例化 docker 容器化_docker_08
使用–net=container:container_id/container_name多个容器使用共同的网络, 这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace, 两个容器通过lo网卡设备通信

docker容器实例化 docker 容器化_docker容器实例化_09
none模式, 使用–net=none指定, 不会配置任何网络, 需要自己配置网卡, ip等

docker容器实例化 docker 容器化_应用程序_10
docker进程启动时会在主机上创建一个docker的虚拟网桥, 此主机启动的docker容器都会连接到这个虚拟网桥上, 虚拟网桥相当于交换机