文章目录
认识docker
什么是docker?
百度百科:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker与虚拟机
docker与虚拟机架构对比:
虚拟机:
虚拟机通过软件模拟了一套硬件设施,然后安装运行Guest OS,进而再在Guest OS中运行各种软件服务。
因为每套应用服务都运行在一个独立的操作系统环境中,所以虚拟机的隔离级别很高。
docker:
docker是基于宿主机的内核(Linux Kernel),所有容器共享了底层的基础设施,正因为此,docker创建启动销毁容器的效率远远高于传统的虚拟机。
对于宿主机而言,每个docker容器就是一个进程,底层共享内核以及docker提供的基础设施,鱼与熊掌不可兼得,相对虚拟机而言,在隔离级别上不及虚拟机,但优点是轻巧高效,而且容易标准化,可移植。
docker的使用场景
- 快速搭建开发环境
- 简化部署过程
- 持续部署
- 统一部署管理微服务
- 多租户环境
- …
容器
概念
docker的容器是用来承载和运行我们的应用服务的,类似于一个虚拟机。
容器与镜像的关系,镜像就类似于Java中的类,而容器则是实例,镜像用于定义,而容器则是实际使用。
容器管理相关命令
# 查询所有运行中的容器
docker ps
# 查询所有容器
docker ps -a || docker ps --all
# 监控容器当前运行状态,container可以使用名字或ID
docker 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则默认使用latest
docker pull [image]:[tag]
# 删除本地仓库中的镜像
docker rmi [image]
# 设置镜像名和tag
docker tag [container] [name]:[tag]
制作镜像
创建镜像有三种方式:
- 使用现有容器进行修改和配置,然后提交到本地仓库
- 使用导入容器快照来创建镜像
- 使用Dockerfile指令创建一个新的镜像
一、使用现有容器创建镜像
-
首先我们需要按照之前的内容,创建一个容器,然后根据自己的需要,对容器进行一些自定义
-
将上述自定义后的容器作为镜像提交到本地仓库
# 参照容器提交镜像到本地仓库 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是tag
cat /d/httpd.tar | docker import - author2/httpd:v1.0
# 与import效果相同,-i:用读取文件替换读取标准输入
docker load -i /d/httpd.tar
三、使用Dockerfile创建镜像
什么是Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile创建镜像步骤
一、创建Dockerfile文件
在空目录下创建名为Dockerfile的文件,无后缀
二、编写构建指令
向之前创建的Dockerfile文件中写入构建镜像需要的指令,下面是一个示例文件
#基于centos7的镜像构建
FROM centos:7
#安装vim
RUN yum install -y vim
#安装httpd
RUN yum install -y httpd
#容器运行时执行的命令,此处为执行bash
CMD ["/bin/bash"]
Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大,所以我们可以使用&&来连接多条命令,这样就只会创建一层。
#基于centos7的镜像构建
FROM centos:7
# 使用&&连接符合并命令,简化镜像层
RUN yum install -y vim && yum install -y httpd
#容器运行时执行的命令,此处为执行bash
CMD ["/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]
层
1、镜像层
以上面的示例的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。
2、容器层
容器我们可以自由使用,在容器里做各种改动,但这些改动都不能影响到镜像层,所以在镜像层之上设置了容器层,我们的所有改动都记录在容器层中。
这个原理和镜像层很相似,镜像层是为了不变更底层镜像,而容器层也是为了不变动镜像而开辟的一块内存区域。
3、分层结构图示
centos:7中可能也包含了很多层,这里并未展示出
docker-compose
简介
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容器中的服务
说明
-
首先需要明确的是,在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
通过bridge模式访问容器中服务
通过host模式访问容器中服务
配置优化
镜像加速
由于官方库在国外,所以直接获取镜像速度很慢,甚至超时断开,我们可以使用国内的镜像库来获取镜像
# 应该是网易的镜像库吧
https://hub-mirror.c.163.com/
参考文章
菜鸟驿站相关教程:https://www.runoob.com/docker/docker-dockerfile.html
大佬的文章:https://cloud.tencent.com/developer/article/1428223