Docker技术入门及实践

 

01 Docker技术介绍

  • 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安装配置

  • Linux平台安装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
  • 安装docker compose 
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镜像
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容器
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配置文件

  • docker compose 介绍
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 启动整个应用
  • docker-compose配置说明
一份标准配置文件应该包含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     //退出容器

相关推荐