Docker的出现是为了解决环境配置的难题,软件开发最大的麻烦事之一,就是环境配置。操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。
环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来
二、虚拟机
虚拟机(virtualmachine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
缺点:
三、Linux容器
由于虚拟机存在这些缺点,Linux发展出了另一种虚拟化技术:Linux容器(LinuxContainers,缩写为LXC)。
优势:
四、Docker是什么
Docker属于Linux容器的一种封装,是一个开源的应用容器引擎,提供简单易用的容器使用接口。它是目前最流行的Linux容器解决方案。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极低
五、Docker的用途
六、Docker架构
Docker包括三个基本概念:
仓库==>镜像==>容器
Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。
容器与镜像的关系类似于面向对象编程中的对象与类。容器==>对象/镜像==>类
整体流程:
从仓库拉取一个基础镜像(或本地导入),然后根据Dockerfile进行镜像文件的构建,然后通过构建的镜像文件生成实例容器
Windows上安装centos虚拟机
镜像(image)文件介绍:
(1)Docker把应用程序及其依赖,打包在镜像文件中。只有通过这个镜像文件才能生成Docker容器(container)。镜像文件可以看作是容器的模板。Docker根据镜像文件生成容器的实例,同一个镜像文件,可以生成多个同时运行的容器实例。
(2)image是二进制文件。实际开发中,一个image文件往往通过继承另一个image文件,加上一些个性化设置而生成。举例来说,你可以在Ubuntu的image基础上,往里面加入Apache服务器,形成你的image
Dcoker安装
1,安装docker-ce社区版
配置repo源
yumlistdocker-ce--showduplicates|sort-r安装
#最新版yuminstall-ydocker-ce#指定版本yuminstall-ydocker-ce-23.0.62,安装方式二
#service命令的用法$sudoservicedockerstart#systemctl命令的用法$sudosystemctlstartdocker停止docker
systemct1stopdocker验证是否安装成功
$sudousermod-aGdocker$USER验证DockerEngine是否已正确安装通过运行hello-world映像来验证
镜像文件
创建简单的镜像文件
$dockerimagepullhello-world$dockerimagepulllibrary/hello-world查看镜像文件
$dockerimagels运行镜像文件
$dockercontainerrunhello-worlddockercontainerrun命令会从image文件,生成一个正在运行的容器实例。
注意,dockercontainerrun命令具有自动抓取image文件的功能。如果发现本地没有指定的image文件,就会从仓库自动抓取。因此,前面的dockerimagepull命令并不是必需的步骤
运行成功显示:
输出这段提示以后,helloworld就会停止运行,容器自动终止。dockerps可以看到没有在运行的容器
容器文件
镜像文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成了,就会同时存在两个文件:镜像文件和容器文件。关闭容器并不会删除容器文件,只是容器停止运行而已。
#列出本机正在运行的容器$dockercontainerls#列出本机所有容器,包括终止运行的容器$dockercontainerls--all#停止容器$dockercontainerkill[containID]#删除容器$dockercontainerrm[containerID]编写Dockerfile
创建镜像时运行
格式:FROM
创建容器时运行
格式:CMD["executable","param1","param2"](执行可执行文件,优先)CMD["param1","param2"](设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)CMDcommandparam1param2(执行shell内部命令)示例:CMD["/usr/bin/wc","--help"]CMDpingwww.baidu.com注意:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令格式:ENTRYPOINT["executable","param1","param2"](可执行文件,优先)ENTRYPOINTcommandparam1param2(shell内部命令)示例:ENTRYPOINT["/usr/bin/wc","--help"]注意:ENTRYPOINT与CMD非常类似,不同的是通过dockerrun执行的命令不会覆盖ENTRPOINT,而dockerrun命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指令时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令在dockerrun时CMD等价于
在dockerrun时ENTRYPOINT等价于
如果要执行多条命令,则执行shell文件
ENTRYPOINT["/bin/sh","run.sh"]注意点:
1,容器中必须有前台进程,否则创建立即销毁
2,宿主机centos7,运行创建容器是否需要前台?后台?
宿主机后台进程+容器内部前台进程
dockerrun-d-p80:8000jiushao仅:容器内部前台进程
dockerrun-p81:8000jiushao仅:宿主机后台进程
dockerrun-d-p80:8000导入导出和发布
Dockerfile->构建->本地文件库,镜像构建完成后可以通过两种方式给其他人用
本地导入和导出
#先查看dockerimages#dockerimagesavejiushao/jd:1.0>/data/jd.tgz导入(删除镜像dockerrmi镜像ID,一定要提前把容器删除)
#查看dockerimages#导入dockerimageload-i/data/jd.tgz发布和下载
1,注册hub.docker.com账号
dockerpulljiushao/jd:1.0
实际工作的环境只会更复杂,Docker在环境配置方面真是解决了老大难问题,以后的应用程序就像一个APP发布一样简单了。直接导入或从仓库拉取就能用,用了就爱不释手
一个实战案例:部署Flask网站
1,获取镜像
dockersearchubuntudockerpullubuntu:18.04查看镜像
dockerimages2,构建镜像
2.1Dockerfiel+语法
1)在docker宿主机centos7创建两个文件Dockerfile、app.py
cd/opt/mkdirdemocddemovimDockerfilevimapp.py放入文件内容
#Dockerfile#Baseimages基础镜像FROMubuntu:latest#MAINTAINER维护者信息MAINTAINERjiushaoing#RUN执行以下命令RUNaptupdateRUNaptinstallpython3python3-pip-yRUNpip3installflaskRUNmkdir-p/data/www/#拷贝文件至工作目录COPYapp.py/data/www/app.py#工作目录WORKDIR/data/www/#EXPOSE映射端口EXPOSE80#容器启动时执行命令CMD["python3","app.py"]Flask示例程序app.py
fromflaskimportFlaskapp=Flask(__name__)@app.route("/index")defindex():return"这是一个测试页面"if__name__=="__main__":app.run(host="0.0.0.0",port=8000)2)命令构建自定义镜像(模板),在当前目录下构建
dockerbuild-tv0:0.1.-fDockerfile2.2基于镜像创建容器+运行
#运行dockerrunv0:0.1#映射端口,将外部端口80映射给容器内的端口8000dockerrun-p80:8000v0:0.1#后台运行dockerrun-d-p80:8000v0:0.1列出现在所有运行的容器
dockerps执行成功会显示如下画面:(输入虚拟机的ip地址然后加上映射的80端口即可)若80端口不行,换其他端口即可如83
浏览器访问{虚拟机IP}:{映射端口}/index。即可显示测试页面
查看所有容器
dockerps-a给容器设置名字
停止容器,输入容器的前几位ID即可,如:500707。可以空格多个ID停止多个容器