学习目标

  • 掌握 Docker 基础知识,能够理解 Docker 镜像与容器的概念。
  • 完成 Docker 安装与启动。
  • 掌握 Docker 镜像与容器相关命令。
  • 掌握 Tomcat Nginx 等软件的常用应用的安装。
  • 掌握 docker 迁移与备份相关命令。
  • 能够运用 Dockerfile 编写创建容器的脚本。
  • 能够搭建与使用 docker 私有仓库。

参考链接:https://www.zhihu.com/question/28300645

Docker基础

什么是Docker?

什么是虚拟化?

虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

Docker 是什么?

Docker 是一个开源的应用容器引擎,基于 GO 语言开发,可以让开发者把他们的应用及依赖打包封装到一个轻量级、可移植的容器中,然后发布到任意一台 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),并且容器性能开销极低。

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。

总之一句话:只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作 。

为什么要用Docker?

Docker 有以下几个特点:

  • 一致的运行环境:Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题。
  • 更快速的启动时间:可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
  • 隔离性:避免公用的服务器,资源会容易受到其他用户的影响。
  • 弹性伸缩,快速扩展:善于处理集中爆发的服务器使用压力。
  • 迁移方便:可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
  • 持续交付和部署:使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。

举例说明:比如我们在协作开发一个 java web 程序的时候,在本机可以跑起来,而在其他机器无法运行。因为它涉及到很多东西:jdk、tomcat、maven、spring 等等,当某一个版本不一致时,可能会导致程序运行不成功,使用 docker 可以有效的解决这个问题,可以实现开发人员的开发环境、测试人员的测试环境、运维人员的生产环境的一致性。
image.png

Docker和虚拟机比较

  • 传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如:VirtualBox和VMWare等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。
  • Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。

简单来说: 容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。

|

传统虚拟机 Docker容器
磁盘占用 几个GB到几十个GB左右 几十MB到几百MB左右
CPU内存占用 虚拟操作系统非常占用CPU和内存 Docker引擎占用极低
启动速度 (从开机到运行项目)几分钟 (从开启容器到运行项目)几秒
安装管理 需要专门的运维技术 安装、管理方便
应用部署 每次部署都费时费力 从第二次部署开始轻松简捷
耦合性 多个应用服务安装到一起,容易互相影响 每个应用服务一个容器,达成隔离
系统依赖 需求相同或相似的内核,目前推荐是Linux

Docker组件

image.png

  • 镜像:相当于一个 root 文件系统,一个镜像就代表一个应用环境,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。 可以简单理解为类。
  • 容器:镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写。镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
  • 仓库:集中存放镜像文件的地方。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中存储、分发镜像的地方。
  • Dockerfile:docker 生成镜像配置文件,用来书写自定义镜像的一些配置。简单来说,我们可以在一个 Java 项目根目录定义一个 Dockerfile 文件,用来将该项目封装成功镜像,并指定运行方式。
  • tar:一个对镜像打包的文件,日后可以还原成镜像。

    Docker安装与配置

    Docker安装

    1、卸载旧版本 docker。
    1. yum remove docker \
    2. docker-client \
    3. docker-client-latest \
    4. docker-common \
    5. docker-latest \
    6. docker-latest-logrotate \
    7. docker-logrotate \
    8. docker-engine
    2、安装 docker 依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    3、设置 docker 的 yum 源。
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    4、安装最新版本的 Docker Engine-Community 和 containerd。 ```shell

    安装最新版本的docker

    yum install docker-ce docker-ce-cli containerd.io —allowerasing

指定版本安装docker

yum list docker-ce —showduplicates | sort -r sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io

查看docker版本

docker version

5、启动 docker,通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community。
```shell
# 启动docker
systemctl start docker
# 设置docker开机启动
systemctl enable docker
# 测试docker安装
docker run hello-world

配置阿里云镜像

1、针对Docker客户端版本大于 1.10.0 的用户,修改daemon配置文件/etc/docker/daemon.json来使用加速器。

mkdir -p /etc/docker

2、这里的链接地址使用自己申请的阿里云镜像服务

阿里云官网
https://www.aliyun.com/
注册登录
控制台—》产品与服务—》容器镜像服务——》镜像工具—》镜像加速器

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://pu5sdck7.mirror.aliyuncs.com"]
}
EOF

3、重启 docker 服务。

systemctl daemon-reload
systemctl restart docker

Docker配置nacos

docker run --name nacos -d -p 8848 :8848 --privileged=true --restart=always -e JVM_XMS=512m -e JVM_XMX=2048m -e MODE=standalone -e PREFER_HOST_MODE=hostname -v /home/nacos/logs:/home/nacos/logs  nacos/nacos-server:latest

docker-compose -f /opt/nacos-docker/example/standalone-mysql-5.7.yaml up -d

参考链接:https://www.cnblogs.com/allennote/articles/12459907.html
浏览器访问:http://192.168.58.100:8848/nacos

Docker配置RabbitMQ

安装命令如下:

# 启用了mqtt插件的
docker pull cyrilix/rabbitmq-mqtt

# 启动rabbitmq
docker run --name rabbitmq -p 1883:1883 -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 8883:8883 -p 15672:15672 -p 25672:25672 -p 15675:15675  -d cyrilix/rabbitmq-mqtt

访问:http://192.168.58.100:15672/,帐号密码是 guest/guest。

Docker-Compose安装与配置

Docker-Compose安装

docker-compose 是基于 docker 的开源项目,托管于 github上,由 python 实现,调用 docker 服务的 API 负责实现对 docke r容器集群的快速编排,即通过一个单独的 yaml 文件,来定义一组相关的容器来为一个项目服务。

安装命令如下:

wget -c  https://github.com/docker/compose/releases/download/1.25.5/docker-compose-Linux-x86_64
mv docker-compose-Linux-x86_64  /usr/bin/docker-compose
chmod  a+x /usr/bin/docker-compose 
docker-compose  --version

常用命令如下:

# 在后台所有启动服务,使用-f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定
docker-compose up -d
docker-compose -f docker-compose.yml up -d

# 列出项目中目前的所有容器
docker-compose ps

# 停止正在运行的容器
docker-compose stop

# 停止和删除容器、网络、卷、镜像。
# -rmi all表示删除所有镜像
# –remove-orphans表示删除服务中没有在compose中定义的容器
docker-compose down [options]

定义Docker-Compose的yaml文件详解

Compose 允许用户通过一个 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目。
Docker-Compose 标准模板文件应该包含 version、services、networks 三大部分,最关键的是 services 和 networks 两个部分。

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: '2'

services:
  web:
    image: dockercloud/hello-world 
    ports:
      - 8080
    networks:
      - front-tier
      - back-tier

  redis:
    image: redis
    links:
      - web
    networks:
      - back-tier

  lb:
    # image指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
    image: dockercloud/haproxy
    ports:
      - 80:80
    # 链接到其它服务中的容器。使用服务名称(同时作为别名)
    links:
      - web
    networks:
      - front-tier
      - back-tier
    # 挂载一个目录或者一个已存在的数据卷容器
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 

# 设置网络模式,bridge表示桥接
networks:
  front-tier:
    driver: bridge
  back-tier:
    driver: bridge

Docker-Compose 应用

1、在 /opt/webapp/ 目录下新建一个 docker-compose.yml 文件。

version: '3'

services:
  web1:
    image: nginx:1.14.1
    ports: 
      - "6061:80"
    container_name: "web1"
    networks:
      - dev

  web2:
    image: nginx:1.14.1
    ports: 
      - "6062:80"
    container_name: "web2"
    networks:
      - dev
      - pro

  web3:
    image: nginx:1.14.1
    ports: 
      - "6063:80"
    container_name: "web3"
    networks:
      - pro

networks:
  dev:
    driver: bridge
  pro:
    driver: bridge

2、使用 docker-compose 启动应用。

docker-compose up -d

3、通过浏览器访问 web1,web2,web3 服务:

http://127.0.0.1:6061
http://127.0.0.1:6062
http://127.0.0.1:6063

常见错误

Error response from daemon: Get https://index.docker.io/v1/search?q=mysql&n=25: x509: certificate has expired or is not yet valid

原因在于是系统的时间和 docker hub 时间不一致,需要做系统时间与网络时间同步。

# 1.安装时间同步
sudo yum -y install ntp ntpdate
# 2.同步时间
sudo ntpdate cn.pool.ntp.org
# 3.查看本机时间
date