本文共 5904 字,大约阅读时间需要 19 分钟。
百度百科:
Docker 是一个的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 或 机器上,也可以实现。容器是完全使用机制,相互之间不会有任何接口。
docker与虚拟机架构对比:
虚拟机:
虚拟机通过软件模拟了一套硬件设施,然后安装运行Guest OS,进而再在Guest OS中运行各种软件服务。
因为每套应用服务都运行在一个独立的操作系统环境中,所以虚拟机的隔离级别很高。
docker:
docker是基于宿主机的内核(Linux Kernel),所有容器共享了底层的基础设施,正因为此,docker创建启动销毁容器的效率远远高于传统的虚拟机。
对于宿主机而言,每个docker容器就是一个进程,底层共享内核以及docker提供的基础设施,鱼与熊掌不可兼得,相对虚拟机而言,在隔离级别上不及虚拟机,但优点是轻巧高效,而且容易标准化,可移植。
docker的容器是用来承载和运行我们的应用服务的,类似于一个虚拟机。
容器与镜像的关系,镜像就类似于Java中的类,而容器则是实例,镜像用于定义,而容器则是实际使用。
# 查询所有运行中的容器docker ps# 查询所有容器docker ps -a || docker ps --all# 监控容器当前运行状态,container可以使用名字或IDdocker stats [container1] [container2]# 启动容器docker start [container]# 停止容器docker stop [container]# 重启容器docker restart [container]# 创建并运行容器docker run -it ubuntu /bin/bash #从ubuntu镜像创建并运行容器,完成后进入容器交互界面,退出交互界面容器也停止运行,运行时执行/bin/bash命令,-i:支持交互式操作,即使没有连接仍保持STDIN开放;-t:分配一个虚拟终端;docker run -itd ubuntu /bin/bash #基本同上,但完成后在后台运行,-d:让容器在后台运行;docker run -d -P training/webapp python app.py #-P:将容器内部使用的网络端口映射到我们使用的主机上,即使用默认的桥接模式;python是命令,app.py是命令的参数docker run -d -p 5000:5000 training/webapp python app.py #-p:设置映射的端口,前面是宿主机的端口,后面是对应的容器的端口;docker run -itd --network host training/webapp python app.py #--network:指定容器要使用的网络;# 查询容器端口映射情况docker port [container]# 查看容器内部的标准输出docker logs -f [container] #-f:持续输出# 查看容器的底层信息docker inspect [container]# 移除容器docker rm [container] #移除的容器必须是停止的,否则会报错# 交互式操作容器docker attach [container] #这种方式进入容器,退出后容器也会停止运行docker exec -it [container] /bin/bash #这种方式进入容器,退出后容器将继续后台运行,-i:即使未连接也保持标准输入开放;-t:分配一个虚拟终端;/bin/bash是进入容器后执行的命令# 导出容器快照docker export [container] > /d/httpd.tar# 将容器快照导入为镜像cat /d/httpd.tar | docker import - author2/httpd:v1.0# 将宿主机文件复制到容器中# 将xxx.txt复制到容器56405a3cffa3的/usr/apps路径下docker cp D:\document\git-repo\docker-study\web-1\xxx.txt 56405a3cffa3:/usr/apps# 将整个web-1目录复制到容器56405a3cffa3的/usr/apps路径下docker cp D:\document\git-repo\docker-study\web-1\ 56405a3cffa3:/usr/apps
容器一节已经说过了,镜像是用来定义的,我们可以根据镜像来生成我们需要的容器。
# 查询所有本地镜像docker images# 从远端仓库中查询镜像docker search [image]# 拉取镜像到本地仓库,不指定tag则默认使用latestdocker pull [image]:[tag]# 删除本地仓库中的镜像docker rmi [image]# 设置镜像名和tagdocker tag [container] [name]:[tag]
创建镜像有三种方式:
首先我们需要按照之前的内容,创建一个容器,然后根据自己的需要,对容器进行一些自定义
将上述自定义后的容器作为镜像提交到本地仓库
# 参照容器提交镜像到本地仓库docker commit -m costom_ubuntu -a author [container] author/ubuntu:v1 #-m:提交信息;-a:作者;author/ubuntu:v1:其中author/ubuntu是镜像名,v1是tag,可以有多个名字相同tag不同的镜像,方便版本管理
这个方法在容器一节中已经讲到了,这其实也是基于现有容器来创建镜像的一种方式,但这个可以跨docker创建。
# 1、导出容器快照docker export [container] > /d/httpd.tar# 2、将容器快照导入为镜像,author2/httpd是给该镜像命的名,v1.0是tagcat /d/httpd.tar | docker import - author2/httpd:v1.0# 与import效果相同,-i:用读取文件替换读取标准输入docker load -i /d/httpd.tar
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
在空目录下创建名为Dockerfile的文件,无后缀
向之前创建的Dockerfile文件中写入构建镜像需要的指令,下面是一个示例文件
#基于centos7的镜像构建FROM centos:7#安装vimRUN yum install -y vim#安装httpdRUN yum install -y httpd#容器运行时执行的命令,此处为执行bashCMD ["/bin/bash"]
Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大,所以我们可以使用&&来连接多条命令,这样就只会创建一层。
#基于centos7的镜像构建FROM centos:7# 使用&&连接符合并命令,简化镜像层RUN yum install -y vim && yum install -y httpd#容器运行时执行的命令,此处为执行bashCMD ["/bin/bash"]
# my/httpd是镜像名,v1.0是镜像的tag,.表示当前目录,即Dockerfile所在的目录docker build --tag my/httpd:v1.0 .
构建成功后,即可获得我们定制的镜像。
与git类似,docker也有本地仓库和云端仓库的概念,我们自己创建的镜像都是在本地仓库,可以使用docker push命令将我们自己的镜像进行云端托管
# 登录docker,登录前需要现在云端创建账号,官方仓库docker hub地址:https://hub.docker.com/docker login# 从现有容器创建镜像,存放在本地仓库docker commit -a [author] -m [desc] [container] [name]:[tag]# 将本地镜像推送到云端,但需要注意的是,被推送的镜像的名字必须以用户用户名开头,比如imdongrui/node,否则将推送失败docker push [image]:[tag]
以上面的示例的Dockerfile来解释:
FROM centos:7
表明我们的镜像是基于centos7来构建,那么我们很明显我们镜像的基础就是centos:7这个镜像。
RUN yum install -y vim
现在我们要在centos:7这个镜像基础上做一些改动,安装vim,但我们肯定是不会去改动centos:7镜像的,但又需要记录我们的改动,那怎么办呢,docker的解决方案是增加一个层,这个层其实就是一块内存空间,在这块空间里面记录我们进行的改动,每次查找文件时都需要先在这个层里查找,优先以这个层里文件为准
,如果查找不到再到更下面一层查找。
这里我们安装vim对centos:7所做的改动,其实都记录在这个层中。
RUN yum install -y httpd
同上面安装vim一样,也会创建一个层来记录安装httpd做的改动。
CMD ["/bin/bash"]
CMD也会覆盖一层,只是这层占用空间为0。
容器我们可以自由使用,在容器里做各种改动,但这些改动都不能影响到镜像层,所以在镜像层之上设置了容器层,我们的所有改动都记录在容器层中。
这个原理和镜像层很相似,镜像层是为了不变更底层镜像,而容器层也是为了不变动镜像而开辟的一块内存区域。
centos:7中可能也包含了很多层,这里并未展示出
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
将需要部署的应用制作为Dockerfile;
编写docker-compose.yml文件,指定需要启动的应用服务及相关配置;
docker-compose.yml示例:
# yaml 配置version: '2' # version和使用的docker-compose版本有关,不行的话123挨个试...services: # 要部署的服务,每个服务对应一个容器 web-1: # 服务名,在Docker内部,可以不使用端口,而直接使用该服务名进行访问,从而避免端口变化导致的配置变更 build: ./web-1 # Dockerfile所在目录,用于构建镜像 ports: # 绑定宿主机与容器的端口 - "8888:8888" web-2: build: ./web-2 ports: - "8889:8889" web-3: build: ./web-3 ports: - "8890:8890"
在docker-compose.yml文件所在目录下,使用命令管理应用;
# 使用Dockerfile构建容器docker-compose build# 使用Dockerfile构建镜像(若镜像已存在则不会重新构建),生成容器,并启动应用docker-compose up# 启动应用docker-compose start# 停止应用docker-compose stop# 重启应用docker-compose restart# 删除该应用的所有容器docker-compose rm
首先需要明确的是,在Windows系统中,Docker其实是基于虚拟机软件中安装的Linux系统的,所以在Windows中使用Docker,Docker中容器的真正宿主机其实是虚拟机软件中运行的Linux系统,而不是我们的Windows系统
基于第一点,所以要通过Windows去访问Docker容器内的服务,就要保证Windows能够正常访问虚拟机软件中运行的虚拟机,通常在安装虚拟机软件的时候,虚拟机软件会为我们默认创建一个桥接网络适配器,在创建一个虚拟机时,虚拟机软件会为其分配一个IP,这个IP就是基于桥接网络网段的,我们可以用这个IP在我们的Windows主机上通过桥接网络访问虚拟机内部的服务,如果不知道这个IP,可以进入到虚拟机内部查询,docker在启动时也会有如下的提示:
docker is configured to use the default machine with IP 192.168.99.100
由于官方库在国外,所以直接获取镜像速度很慢,甚至超时断开,我们可以使用国内的镜像库来获取镜像
# 应该是网易的镜像库吧https://hub-mirror.c.163.com/
菜鸟驿站相关教程:https://www.runoob.com/docker/docker-dockerfile.html
大佬的文章:https://cloud.tencent.com/developer/article/1428223
转载地址:http://hptlf.baihongyu.com/