MrFuWen 2020-03-07
01 Docker技术介绍
Docker,是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何支持docker安装的Linux机器上运行。Docker实现了虚拟化,安全隔离,容器是完全沙箱机制,相互之间不会有任何接口。 一个完整的Docker有以下几个部分组成: 1、Docker Client客户端 2、Docker Daemon守护进程 3、Docker Image镜像 4、Docker Container容器 5、Docker Registry仓库 Docker技术架构 Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。Docker容器通过Docker镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。 Docker采用C/S架构,Docker Daemon作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTfulAPI来进行通信。 Docker Daemon一般在宿主机后台运行,等待接收来自客户端的消息。Docker客户端则为用户提供一系列可执行命令,用户用这些命令来实现跟Docker Daemon交互。 Docker技术优势 1、容器跨平台性与镜像。容器在linux容器的基础上设定了一套标准化的配置方法,将应用及其依赖的运行环境打包成镜像,真正实现了“构建一次,到处运行”的理念,大大提高了容器的跨平台性。 2、持续部署与测试。容器消除了线上线下的环境差异,保证了应用生命周期的环境一致性、标准化。开发人员使用镜像实现标准开发环境的构建,开发完成后通过封装完整环境和应用的镜像进行迁移。由此,测试和运维人员可以直接部署软件镜像来进行测试和发布,大大简化了持续集成、测试和发布的过程。 3、环境标准化和版本控制。基于容器提供的环境一致性和标准化,我们可以使用Git等工具对容器镜像进行版本控制,相比基于代码的版本控制来说,还能够对整个应用运行环境实现版本控制,一旦出现故障还可以快速回滚。相比以前的虚拟机镜像,容器压缩和备份速度更快,镜像启动也像启动一个普通进程一样快速。 4、高资源利用率与隔离。容器没有管理程序的额外开销,与机器底层共享操作系统,性能更加优良,系统负载更低,在同等条件下可以运行更多的应用实例,可以更充分地利用系统资源。同时,容器拥有资源隔离与限制能力,可以精确地对应用分配CPU、内存等资源,保证了应用间不会相互影响。 5、应用镜像仓库。Docker官方构建了一个镜像仓库,组织和管理形式类似于Github,其上已累积了成千上万的镜像。因为Docker的跨平台适配性,相当于为用户提供了一个非常有用的应用商店,所有人都可以自由地下载微服务组件,这为开发者提供了巨大便利。
02 Docker安装配置
目前,CentOS仅发行版本中的内核支持Docker。推荐使用CentOS7.0及以上版本,64位操作系统,系统版本内核为3.10及以上。Dokcer安装步骤如下: 1、查看系统版本是否符合要求 cat /etc/redhat-release
2、安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
3、添加软件源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、安装Docker-CE
yum -y install docker-ce
若已安装docker,请先卸载yum list installed | grep dockersudo yum remove docker\ docker-client\ docker-client-latest\ docker-common\ docker-latest\ docker-latest-logrotate\ docker-logrotate\ docker-selinux\ docker-engine-selinux\ docker-engine安装指定版本的dockeryum list docker-ce --showduplicates|sort -ryum install docker-ce-18.03.1.ce-1.el7.centos
5、启动docker后台服务并添加开机自启
systemctl start docker systemctl enable docker
6、查看docker安装版本
docker version
7、安装docker-compose curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose 8、赋执行权限 chmod +x /usr/local/bin/docker-compose 9、查看docker-compose安装版本 docker-compose --version
10、创建daemon.json文件,添加镜像仓库地址 { "registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"], "insecure-registries":["47.88.149.108:61010", "hdwuhan.ddns.info:41857"] }
11、重启docker systemctl restart docker
12、设置docker服务开机自启 systemctl enable docker
03 Docker镜像、容器、仓库
Docker镜像(Image)类似于虚拟机镜像,可以理解为面向Docker引擎的只读模板。可以从DockerHub下载官方发布的应用镜像,比如Redis、Mysql、Nginx等,也可以从搭建的镜像中心来下载镜像。镜像常用操作如下:1、搜索官方镜像 docker search mysql 2、下载镜像 docker pull centos:7.0 不带仓库名称则默认从Docker Hub下载 docker pull ubuntu 不带版本号则默认下载latest版本 docker pull hdwuhan.ddns.info:41857/ubuntu 指定仓库下载 3、上传镜像 docker push hdwuhan.ddns.info:41857/ubuntu:v1.0 上传到指定仓库 docker push ubuntu:v1.0 上传到官方仓库 4、查看本地镜像 docker images5、删除本地镜像 docker rmi dfs:0.2.0 通过镜像名删除 docker rmi db52f9bf0787 通过镜像ID删除 6、提交容器镜像 docker commit db52f9bf0787 hdwuhan.ddns.info:41857/dfs:0.2.0 7、给镜像打tag docker tag db52f9bf0787 hdwuhan.ddns.info:41857/dfs:0.2.0 8、从容器导出、导入镜像 docker export db52f9bf0787 > dfs_0.2.0.tar cat dfs_0.2.0.tar | docker import - dfs:v0.2.0 9、存出和载入镜像(推荐使用) docker save db52f9bf0787 > dfs_2.3.tar docker load < dfs_2.3.tar
Docker容器(Container)是从镜像创建的应用运行实例,可以将其看作是简易版Linux系统环境及运行在其中的应用程序打包而成的应用盒子。容器常用操作如下: 1、新建并启动容器 docker run [OPTIONS] IMAGE [COMMOND] OPTIONS: -t 让docker分配一个伪终端并绑定到容器的标准输入上 -i 表示让容器的标准输入保持打开 -d 让docker容器在后台以守护态形式运行 -p 桥接模式,端口映射 --net=host host模式启动 --restart=always 一直重启 --privileged=true 高级权限 --log-driver=none 不打印容器级别日志 --name 容器命名 新建并启动仓库容器 docker run -d -p 5000:5000 --name registry_5000 --restart=always --privileged=true --log-driver=none -v /home/test:/tmp/registry registry 2、进入容器 docker exec -it containerName/ID /bin/bash docker exec -it containerName/ID /bin/sh alpine镜像 3、停止容器 docker stop containerName/ID 4、启动容器 docker start containerName/ID 5、重启容器 docker restart containerName/ID 6、删除容器 docker rm containerName/ID 7、关闭所有容器 docker stop $(docker ps -q) 8、删除所有容器 docker rm $(docker ps -aq) 9、删除所有镜像 docker rmi $(docker images -aq) Docker仓库 Docker Registry是用于存储容器镜像的仓库。在Docker的运行过程中,Docker Daemon会与Docker Registry通信,并实现搜索镜像、下载镜像、上传镜像三个功能。 Docker可以使用公有的Docker Registry,如Docker Hub,但Docker获取容器镜像文件时,必须通过互联网访问Docker Hub。Docker也允许用户构建本地私有的Docker Registry,这样就可以保证容器镜像的获取在内网中就可以完成。
04 Docker配置文件
Compose是Docker容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose不再需要使用shell脚本来启动容器。 Compose通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动、停止、重启应用及其所依赖服务的容器,非常适合组合使用多个容器进行开发的场景。 docker-compose默认的模板文件是docker-compose.yml,其中定义的每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)来自动构建。 如果使用build指令,在Dockerfile中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV等)将会自动被获取,无需在docker-compose.yml中再次设置。 使用Compose基本上分为三步: 1、Dockerfile 定义应用的运行环境 2、docker-compose.yml 定义组成应用的各服务 3、docker-compose up 启动整个应用
一份标准配置文件应该包含version、services、networks三大部分,其中最关键的就是services和networks两个部分。 docker-compose文件是一个定义服务、网络和卷的YAML文件。dfs 配置文件举例: version: ‘3‘ services: emqx: image: emqx/emqx:v3.2.2 container_name: emqx ports: - "333:1883" restart: always dfs: image: hdwuhan.ddns.info:41857/dfs/dfs:2.3 container_name: dfs_2.3 restart: always ports: - "9999:9999" volumes: - ./application.yml:/dfs/application.yml:rw
其上docker-compose运行配置文件中,包含2个服务的容器配置,分别是emqx服务和dfs服务。其中
image:镜像获取地址及版本号,整个地址即为镜像的tag
container_name:容器名称
ports:端口映射。规则:”外部映射端口号:内部服务端口号”,注,外部映射端口号可根据需要修改,但内部服务端口号不能修改
restart:表示服务故障自启
volumes:文件共享路径
主要配置项介绍: 1、version Compose目前为止有三个版本分别为Version 1,Version 2,Version 3。Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。目前推荐使用 Version 3 2、services 配置管理多个容器的标签。所有容器及其配置项都是在services标签下定义的。 3、image services: dfs: image: hdwuhan.ddns.info:41857/dfs/dfs:2.3 在 services 标签下的第二级标签是 dfs,这个名字是用户自己定义的,它就是服务名称。 image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。 例如下面这些格式都是可以的: image: redis image: ubuntu:14.04 image: tutum/influxdb image: a4bc65fd 4、container_name Compose 的容器名称格式是:<项目名称><服务名称><序号> 虽然可以自定义项目名称、服务名称,但是如果你想完全控制容器的命名,可以使用这个标签指定: container_name: app 这样容器的名字就指定为 app 了。 5、depends_on depends_on: - db - redis 在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。 例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。 6、ports ports: - "9999:9999" 映射端口的标签。 使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。 ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001" 注意:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误的结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。 7、volumes volumes: - ./application.yml:/dfs/application.yml:rw 挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER] 这样的格式,或者使用 [HOST:CONTAINER:ro] 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。 Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。 数据卷的格式可以是下面多种形式: volumes: - /var/lib/mysql // 只是指定一个路径,Docker 会自动再创建一个数据卷(这个路径是容器内部的) - /opt/data:/var/lib/mysql // 使用绝对路径挂载数据卷 - ./cache:/tmp/cache // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。 05 Docker应用案例 案例:DFS应用 我们使用docker来管理程序的部署,首先是将我们的程序打包成镜像的方式并推送到宏电镜像中心,然后再拉取镜像到docker本地仓库,最后将镜像实例化并运行。 我们的DFS应用是由多个服务组成的,为方便安装服务,这里我们采用docker compose方式组合一次性地启动我们的容器服务,每个组成部分都对应一个单独容器,这样方便后续运维优化扩展工作。 DFS应用由以下几个服务组件组成: 。emqx 。mysql 。redis 。dfs_server 。dfs_client 。dfs_web DFS部署安装成功后,每一个组件都对应一个运行的容器实例。 第一步:获取应用配置文件 从我司获取DFS服务的配置文件夹,形如docker-compose文件夹,包含如下文件: 应用部署流程 第二步:安装应用 1、登录linux系统后,在home目录下创建docker文件夹 mkdir /home/docker 2、将平台配置文件夹上传到/home/docker目录 3、进入平台配置文件夹路径,如 cd /home/docker/docker-compose 4、查看配置文件列表 ll 5、运行docker-compose文件 docker-compose up -d 等待容器安装并启动平台相关组件服务,1分钟左右,取决于网速。安装完成后,可查看正在运行的容器。 6、查看当前正在运行的容器 docker-compose ps 7、访问web页面 平台地址:http://ip:41853 ip为部署平台的服务器地址
06 Docker常用运维命令
docker-compose 常用组合命令: docker-compose up -d //后台启动compose容器 docker-compose ps //在配置文件目录下执行,查看compose容器 docker-compose stop //关闭compose容器 docker-compose down //关闭移除除compose容器,网络,镜像和数据卷 docker-compose pull //更新compose 镜像 docker ps -a | grep wmmp //查找容器 docker logs -f --tail 100 wedora_server //查看容器日志docker exec -it wedora_server bash //进入容器exit //退出容器