Linux-Docker

基础

介绍

部署存在的问题

问题1:
	某IT部门要上线一个项目。常规操作,直接去线上服务器,拷贝一个tomcat,然后改端口号,然后部署应用到webapps文件夹下,重启就好。
	一个服务器上可能会部署多个应用服务。如果某个应用出现问题,CPU100%,可能这个服务器上的其他应用也会出现问题。
	对于一个大型应用拆分为几十个微服务,分别交由不同的团队开发,不同团队之间水平参差不齐。如果还采用这种部署方式,
	你的应用可能会因为另一个团队的应用发生意外。因部署在了同一台服务器上,导致全部出现问题。
	
问题2:
	开发和线上代码(同一套代码)问题。开发阶段部署一套软件环境,测试人员在开发中测试没有问题,运维进行部署。
	但是正式部署到服务器时,发生了问题(启动参数、环境问题、漏配了参数)等意外。
	
问题3:
	随着微服务技术的兴起,一个大的应用需要拆分成多个微服务。多个微服务的生成,就会面临庞大系统的部署效率,开发协同效率问题。
	然后通过服务的拆分,数据的读写分离、分库分表等方式重新架构,而且这种方式如果要做的彻底,需要花费大量人力物力。
	可能需要部署很多个服务器。

问题4:
持续的软件版本发布/测试项目。到线上环境的集成

什么是docker

  • Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源
  • Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化
  • 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低

应用场景

  • Web 应用的自动化打包和发布

  • 自动化测试和持续集成、发布

  • 在服务型环境中部署和调整数据库或其他的后台应用

  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境

    开发一个软件、有一台服务器(Linux)、安装相应的开发环境
    
    IaaS:(Infrastructure-as-a-Service)(基础设施即服务)
    PaaS:(Platform as a Service)(平台即服务)
    SaaS:(Software-as-a-Service)(软件即服务)
    

Docker和虚拟机

  1. 实现原理技术不同
    虚拟机是⽤来进⾏硬件资源划分的完美解决⽅案,利⽤的是硬件虚拟化技术,如此VT-x 、AMD-V会通过⼀个 hypervisor 层来实现对资源的彻底隔离。而容器则是操作系统级别的虚拟化,利⽤的是内核的 Cgroup 和 Namespace 特性,此功能通过软件
    来实现,仅仅是进程本身就可以实现互相隔离,不需要任何辅助。

  2. 使用资源不同
    Docker 容器与主机共享操作系统内核,不同的容器之间可以共享部分系统资源,因此更加轻量级,消耗的资源更少。虚拟机会独占分配给⾃⼰的资源,不存在资源共享,各个虚拟机之间近乎完全隔离,更加重量级,也会消耗更多的资源。

  3. 应用场景不同
    若需要资源的完全隔离并且不考虑资源的消耗,可以使用虚拟机。
    若是想隔离进程并且需要运行大量进程实例,应该选择 Docker 容器。

    特性容器虚拟机
    启动秒级分钟级
    硬盘使用一般为MB一般为GB
    性能接近原生弱于
    系统支持量单机支持上千个容器一般几十个

Docker总结

  • Docker是世界领先的软件容器平台。
  • Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docke最初实现是基于LXC。
  • Docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件
  • 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
  • Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题;——一致的运行环境
  • 可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间
  • 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
  • 善于处理集中爆发的服务器使用压力;——弹性伸缩,快速扩展
  • 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
  • 使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署

架构

简介

  • Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器
  • Docker 容器通过 Docker 镜像来创建
  • 容器与镜像的关系类似于面向对象编程中的对象与类

基本概念

Docker 包括三个基本概念

  • 镜像(Image
  • 容器(Container
  • 仓库(Repository

理解了这三个概念,就理解了 Docker 的整个生命周期。

引擎

  • Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
  • Docker 容器通过 Docker 镜像来创建

架构

容器与镜像的关系类似于面向对象编程中的对象与类

Docker面向对象
容器对象
镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jXwZhF1I-1655112096138)(576507-docker1.png)]

Docker 镜像(Images)Docker 镜像是用于创建 Docker 容器的模板。
Docker 容器(Container)容器是独立运行的一个或一组应用。
Docker 客户端(Client)Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。
Docker 主机(Host)一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 仓库(Registry)Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub提供了庞大的镜像集合供使用。
Docker MachineDocker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
Docker 镜像
  • 是一个存入镜像的仓库。通常被部署在互联网服务器或者云端。
  • Docker Hub(docker仓库地址:https://hub.docker.com) 提供了庞大的镜像集合供使用。
  • Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
分层存储
  • 因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
  • 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
  • 分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像
Docker 容器

容器与镜像的关系类似于面向对象编程中的对象与类

Docker面向对象
容器对象
镜像

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机

前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失

Docker 仓库

  • Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库
  • Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用

公有 Docker Registry

  • Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像
  • 最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 CoreOSQuay.io,CoreOS 相关的镜像存储在这里;Google 的 Google Container RegistryKubernetes 的镜像使用的就是这个服务
  • 由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见的有 阿里云加速器DaoCloud 加速器 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多
  • 国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓库网易云镜像服务DaoCloud 镜像市场阿里云镜像库

私有 Docker Registry

  • 除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务
  • 开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker Trusted Registry 中,提供了这些高级功能
  • 除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,VMWare HarborSonatype Nexus

Docker安装

要求

Docker支持以下的CentOS版本:

  • CentOS 7 (64-bit)
  • CentOS 6.5 (64-bit) 或更高的版本

​ 目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

安装流程

  1. 校验版本

    [root@master ~]# uname -r
    3.10.0-1160.el7.x86_64
    
  2. 移除旧版本

    [root@master ~]# sudo yum remove docker \
                       docker-client \
                       docker-client-latest \
                       docker-common \
                       docker-latest \
                       docker-latest-logrotate \
                       docker-logrotate \
                       docker-selinux \
                       docker-engine-selinux \
                       docker-engine
    ......
    参数 docker-engine 没有匹配
    不删除任何软件包
    
  3. 安装必要的系统工具

    安装所需的软件包。yum-utils提供了yum-config-manager 应用,并device-mapper-persistent-datalvm2由需要 devicemapper存储驱动程序。

    [root@master ~]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    ......
    更新完毕:
      device-mapper-persistent-data.x86_64 0:0.8.5-3.el7_9.2                                   lvm2.x86_64 7:2.02.187-6.el7_9.5                                  
    
    作为依赖被升级:
      device-mapper.x86_64 7:1.02.170-6.el7_9.5        device-mapper-event.x86_64 7:1.02.170-6.el7_9.5   device-mapper-event-libs.x86_64 7:1.02.170-6.el7_9.5  
      device-mapper-libs.x86_64 7:1.02.170-6.el7_9.5   lvm2-libs.x86_64 7:2.02.187-6.el7_9.5            
    
    完毕!
    
  4. 添加软件源信息

    • 官方源

      [root@master ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      
    • 阿里云源(使用阿里云源)

      [root@master ~]# sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      已加载插件:fastestmirror, langpacks
      adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
      repo saved to /etc/yum.repos.d/docker-ce.repo
      
  5. 更新yum缓存

    [root@master ~]# sudo yum makecache fast
    已加载插件:fastestmirror, langpacks
    ......   
    元数据缓存已建立
    
  6. 安装Docker-CE

    [root@master ~]# sudo yum -y install docker-ce
    ......
    已安装:
      docker-ce.x86_64 3:20.10.12-3.el7                                                                                                                          
    作为依赖被安装:
      container-selinux.noarch 2:2.119.2-1.911c772.el7_8         containerd.io.x86_64 0:1.4.12-3.1.el7            docker-ce-cli.x86_64 1:20.10.12-3.el7        
      docker-ce-rootless-extras.x86_64 0:20.10.12-3.el7          docker-scan-plugin.x86_64 0:0.12.0-3.el7         fuse-overlayfs.x86_64 0:0.7.2-6.el7_8        
      fuse3-libs.x86_64 0:3.6.1-4.el7                            slirp4netns.x86_64 0:0.4.3-4.el7_8              
    
    完毕!
    
  7. 启动Docker后台服务

    [root@master ~]# sudo systemctl start docker
    
  8. 重启Docker服务

    [root@master ~]# sudo systemctl restart docker
    
  9. 查看版本

    [root@master ~]# docker -version
    unknown shorthand flag: 'e' in -ersion
    See 'docker --help'.
    ......
    
    Management Commands:
      app*        Docker App (Docker Inc., v0.9.1-beta3)
    	......
      volume      Manage volumes
    
    Commands:
      attach      Attach local standard input, output, and error streams to a running container
    	.......
    
    Run 'docker COMMAND --help' for more information on a command.
    
    To get more help with docker, check out our guides at https://docs.docker.com/go/guides/
    
  10. 测试

    通过运行hello-world 映像来验证是否正确安装了Docker Engine-Community

    [root@master ~]# sudo docker run hello-world
    

卸载

执行以下命令来删除 Docker CE:

[root@master ~]# sudo yum remove docker-ce
[root@master ~]# sudo rm -rf /var/lib/docker

Docker镜像加速器

配置加速器

  1. 进入/etc/docker/目录下,添加 daemon.json 文件,添加镜像加速器

    [root@master ~]# cd /etc/docker/
    [root@master docker]# ll
    总用量 4
    -rw-------. 1 root root 244 112 11:32 key.json
    [root@master docker]# vi daemon.json
    
  2. 加速器

    • 官方加速器

      {
      "registry-mirrors":["https://registry.docker-cn.com"]
      }
      
    • 阿里云加速器:阿里云个人账号–管理中心–容器镜像服务–镜像加速器

      {
        "registry-mirrors": ["https://gxeo3yz7.mirror.aliyuncs.com"]
      }
      
  3. 重新启动docker

    [root@master docker]# sudo systemctl daemon-reload
    [root@master docker]# sudo systemctl restart docker
    
  4. 检查加速器是否生效

    
    [root@master docker]# docker info
    Client:
     Context:    default
    	......
      scan: Docker Scan (Docker Inc., v0.12.0)
    
    Server:
     Containers: 1
    	.......
     Registry Mirrors:
      https://gxeo3yz7.mirror.aliyuncs.com/
     Live Restore Enabled: false
    

测试

  1. 下载tomcat镜像

    ##下载指定版本镜像:docker images tomcat:9-jre11
    [root@master ~]# docker pull tomcat
    Using default tag: latest
    latest: Pulling from library/tomcat
    ......
    Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
    Status: Downloaded newer image for tomcat:latest
    docker.io/library/tomcat:latest
    
  2. 查看已下载的镜像

    [root@master ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    tomcat       latest    fb5657adc892   2 weeks ago   680MB
    
  3. 启动镜像

    docker run –p 8080:8080 tomcat
    

Docker镜像

获取镜像

[root@master ~]# docker pull tomcat		

docker pull [选项] [Docker Registey 地址[:端口号]/] 仓库名[:标签]
docker pull tomcat:版本号   //不写 :版本号 代表latest版本
具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。
- Docker 镜像仓库地址:  地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
- 仓库名:这里的仓库名是两段式名称,  即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。

列出镜像

两个都可以

[root@master ~]# docker images   
[root@master ~]# docker image ls

删除镜像

docker image rmi 镜像ID  //常用
docker image rm [选项] <镜像1> [<镜像2>.....]

Docker容器

查看容器状态

  • 查看所有镜像

    [root@master ~]# docker ps -a
    [root@master opt]# docker container ls -a
    
  • 查看运行的镜像

    [root@master ~]# docker ps
    [root@master opt]# docker container ls
    
  • 查看本地的镜像ID

    [root@master ~]# docker images -q
    
  • 查看一个镜像的制作历程

    [root@master ~]# docker history 镜像名称
    

创建并启动容器

[root@master ~]# docker run -it  -d --name tomcat-8080 -p  8080:8080 tomcat
8f9f2ddfb8d846e5add4d92b76dcb75a87b7800a60407322676c5889d7bd45a1

	-i 保持和 docker 容器内的交互,启动容器时,运行的命令结束后,容器依然存活,没有退出(默认是会退出,即停⽌的)
	-t 为容器的标准输⼊虚拟⼀个tty
	-d 后台运行容器
	--rm 容器在启动后,执行完成命令或程序后就销毁
	--name 给容器起一个自定义名称
	-p 宿主机:内部端口

停止容器

  • 停止正在运行的容器(单个/多个)

    [root@master ~]# docker stop 9be696a0c283  				//停止正在运行容器(或Ctrl+c)
    [root@master ~]# docker container stop tomcat1			//停止正运行容器(ID或Names)
    
  • 停止正在运行的容器(全部)

    [root@master ~]# docker stop $(docker ps -a -q)
    

启动容器

[root@master ~]# docker start 容器名
[root@master ~]# docker start 容器 ID

重启已关闭容器

[root@master opt]# docker restart tomcat-8080		//启动容器(根据ID或NAMES)
tomcat-8080

删除容器

  • 删除单个或多个

    [root@master ~]# docker rm 容器ID
    
  • 删除全部

    [root@master ~]# docker rm $(docker ps -a -q)
    

虚悬镜像

镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 <none>

删除命令(删除全部虚悬镜像)

[root@master ~]# docker image prune

保存镜像

备份本地仓库的镜像

  • 将本地仓库的镜像保存到当前目录

    命令:docker save -o tomcat.guo.tar 镜像名称

    [root@master opt]# docker save -o demo1-night-tar demo1
    
  • 将本地目录下的镜像文件导入到本地Docker仓库

    方式一:不输出详细信息

    [root@master opt]# docker load -i demo1-night-tar 
    1004e671ad58: Loading layer [==================================================>]  4.608kB/4.608kB
    Loaded image: demo1:latest
    

    方式二:输出详细信息

    [root@master opt]# docker load < demo1-night-tar 
    1004e671ad58: Loading layer [==================================================>]  4.608kB/4.608kB
    Loaded image: demo1:latest
    

进入容器

docker exec -it 容器ID(Names)bash

[root@master ~]# docker exec -it tomcat-8080 bash
[root@master ~]# echo 'qfnj-weixin'>>index.jsp 			//对容器内的index.jsp进行字符串追加
[root@master ~]# echo 'qfnj-weixin'>index.jsp 			//对容器内的index.jsp进行覆盖

宿主机与容器交换文件

docker cp [OPTIONS] CONTAINER:PATH LOCALPATH    //容器中 复制到 宿主机
docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH  //宿主机 复制到 容器中

宿主机复制一个图片到容器中:将png图片复制到了容器指定目录下
[root@master ~]# docker cp guoweixin.png tomcat2:/usr/local/tomcat/webapps/ROOT   
将容器内的index.jsp 复制出来,修改再复制回去
[root@master ~]# docker cp tomcat2:/usr/local/tomcat/webapps/ROOT/index.jsp /root

Docker日志

[root@master opt]# docker logs boot

--since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
-f : 查看实时日志
-t : 查看日志产生的日期
-tail=10 : 查看最后的10条日志
qfjy_exam : 容器名称

数据卷

特性

  1. 可以在容器之间共享、重用
  2. 对数据卷内容修改后会立马生效
  3. 数据卷的修改不影响镜像
  4. 数据卷会一直存在,即使容器被删除

应用命令

  1. 创建数据卷

    • 直接创建

      docker volume create 数据卷名称
      # 创建数据卷之后,默认会存放到目录: /var/lib/docker/volume/数据卷名称/_data目录下
      
    • #当你映射数据卷时,如果数据卷不存在,Docker会帮你自动创建

      docker run -v 数据卷名称:容器内路径 镜像ID

      #创建数据卷
      docker volume create vol_qfnj  
      #运行容器
      docker run -it --name tomcat-8080 -d -p 8080:8080 **-v vol_qfnj:/usr/local/tomcat/webapps/**  tomcat  
      
    • 直接指定一个路径作为数据卷的存储位置

      #docker run -v 路径:容器内部的路径  镜像ID
      #数据卷地址:/opt/exam/,目标地址:/usr/local/tomcat/webapps/
      docker run -it -d --name tomcat-8081 -p 8081:8080 -v /opt/exam/:/usr/local/tomcat/webapps/ tomcat
      
  2. 查看数据卷

    #查看数据卷
    docker volume inspect 数据卷名称
    #查看全部数据卷信息
    docker volume ls
    
  3. 删除数据卷

    docker volume rm 数据卷名称
    

防火墙

开放8080端口(如下命令只针对Centos7以上)

查看已经开放的端口

firewall-cmd --list-ports

开启端口

firewall-cmd --zone=public --add-port=8080/tcp --permanent

关闭端口

firewall-cmd --permanent --zone=public --remove-port=8080/tcp

开启防火墙

systemctl start firewalld

重启防火墙

firewall-cmd --reload #重启
firewall systemctl stop firewalld.service #停止
firewall systemctl disable firewalld.service #禁止firewall开机启动

systemctl stop firewalld && systemctl disable firewalld #关闭并停止防火墙

Docker安装组件

docker安装mysql

  1. 下载镜像

    [root@master opt]# docker pull mysql:5.6
    5.6: Pulling from library/mysql
    35b2232c987e: Pull complete 
    .......
    Digest: sha256:20575ecebe6216036d25dab5903808211f1e9ba63dc7825ac20cb975e34cfcae
    Status: Downloaded newer image for mysql:5.6
    docker.io/library/mysql:5.6
    
  2. 查看镜像是否已下载完成

    [root@master ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    mysql        5.6       dd3b2a5dcb48   3 weeks ago   303MB
    
  3. 创建并启动mysql容器

    [root@master opt]# docker run -d  --name mysql5.6-3306  -p 3306:3306   -e MYSQL_ROOT_PASSWORD='123456'  mysql:5.6
    234b30423561a10a7b43615f14a6d367bbbdb9e21eceab6c0159cceabeecf2e2
    
  4. 访问测试

    [root@master opt]# docker exec -it 234 bash
    root@234b30423561:/# mysql -uroot -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    ......
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql>
    
  5. 开启端口

    [root@master opt]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
    success
    [root@master opt]# firewall-cmd --reload
    success
    
  6. 授权主机访问

    mysql> use mysql
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select user,host from user;
    +------+-----------+
    | user | host      |
    +------+-----------+
    | root | %         |
    | root | localhost |
    +------+-----------+
    2 rows in set (0.00 sec)
    
    mysql> exit
    Bye
        
    # root账号已经是%,可以不执行
    mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; 
    MySQL>FLUSH PRIVILEGES;   #刷新权限,使配置生效
    

docker安装nginx

安装

  1. 拉取镜像

    [root@master opt]# docker pull nginx:latest
    latest: Pulling from library/nginx
    a2abf6c4d29d: Pull complete 
    ......
    Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
    Status: Downloaded newer image for nginx:latest
    docker.io/library/nginx:latest
    
  2. 查看镜像是否已拉取

    [root@master opt]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    nginx        latest    605c77e624dd   2 weeks ago   141MB
    
  3. 运行容器

    [root@master opt]# docker run -it --name nginx-80  -d -p 80:80 nginx
    88845772c2287095bb670a13f44bbf41ce7a3c1e803a54dcc81c76cb52c429cb
    
  4. 如果没有关闭防火墙,关闭防火墙(需要端口映射)

    [root@master opt]# systemctl stop firewalld && systemctl disable firewalld
    Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    
  5. 访问niginx

静态文件

使用数据卷处理静态文件

  1. 将容器里面的静态文件、配置文件复制到centos里面

    [root@master nginx]# mkdir conf
    [root@master nginx]# mkdir logs
    [root@master nginx]# docker cp c094:/etc/nginx/conf.d ./conf/
    [root@master nginx]# docker cp c094:/etc/nginx/nginx.conf ./conf/
    [root@master nginx]# docker cp c094:/usr/share/nginx/html/ ./
    
    
  2. 启动nginx,将数据卷的数据共享(这里是重新创建了容器,也可以单独操作数据卷)

    [root@master nginx]# docker run -d -p 80:80 --name nginx-80 -v /usr/local/docker/nginx/html:/usr/share/nginx/html -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/docker/nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /usr/local/docker/nginx/logs:/var/log/nginx nginx
    

反向代理

  1. 编辑配置文件

    [root@master conf]#  vi conf.d/default.conf 
        docker run -d -p 80:80 --name nginx-80 -v /usr/local/docker/nginx/html:/usr/share/nginx/html -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.server {
    	......
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
         
         ##添加如下内容
        location /jd {
                proxy_pass https://www.jd.com/;
      	}
    
     	location /bd {
                proxy_pass https://www.baidu.com/;
      	}
    [root@master conf]# docker restart nginx-80
    nginx-80
    
  2. 访问

    http://192.168.30.10/bd			跳转到百度
    http://192.168.30.10/jd			跳转到京东
    

Docker定制镜像

Dockerfile 定制镜像

镜像的定制实际上就是定制每一层所添加的配置、文件。**如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,**那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

常用命令

FROM:指定基础镜像

基础镜像不存在会在Docker Hub上拉去(一般会是文件的第一个指令)
使用格式:
FROM <镜像>:[tag]
FROM <镜像>@digest[校验码]
当前主机没有此镜像时,会自动去官网HUB下载

FROM openjdk:11-jdk-bullseye

MAINTAINER:作者

[逐渐废弃]
LABLE --替代MAINTANIER
具体使用:
LABLE maintainer=“作者信息”

MAINTANIER "night <night@aliyun.com>"

LABEL maintainer="night@aliyun.com"
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

ENV:环境变量

ENV指令可以用于为docker容器设置环境变量 ENV设置的环境变量

可以使用 docker inspect命令来查看。同时还可以使用docker run --env <key>=<value>来修改环境变量。

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"

WORKDIR:工作目录

Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个 RUN 都是独立进行的。

如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次 WORKDIR。

ENV CATALINA_HOME /usr/local/tomcat
WORKDIR $CATALINA_HOME
WORKDIR /usr/local/tomcat/

VOLUME:数据卷

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

只能定义docker管理的卷:
VOLUME /data/mysql运行的时候会随机在宿主机的目录下生成一个卷目录!

COPY:复制文件

把宿主机中的文件复制到镜像中去

文件要在Dockerfile工作目录
src 原文件
–支持通配符
–通常相对路径
dest 目标路径
–通常绝对路径

ADD:添加文件

类似COPY命令

ADD 将文件从路径 复制添加到容器内部路径 。

必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url。

是目标容器中的绝对路径。 所有的新文件和文件夹都会创建UID 和 GID。事实上如果 是一个远程文件URL,那么目标文件的权限将会是600

EXPOSE:暴露端口

为容器打开指定要监听的端口以实现与外部通信

使用格式:
EXPOSE 80/tcp 23/udp

不加协议默认为tcp

使用-P选项可以暴露这里指定的端口!
但是宿主的关联至这个端口的端口是随机的!

EXPOSE 8080

RUN:执行命令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:

  1. shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
  2. exec 格式:RUN [“可执行文件”, “参数1”, “参数2”],这更像是函数调用中的格式。
RUN <command>
RUN ["<executable>","<param1>","<param2>"]

RUN 就像 Shell 脚本一样可以执行命令,Shell 脚本的每个命令对应一个 RUN

RUN apt-get update
RUN apt-get install -y gcc libc6-dev make
RUN wget http://download.redis.io/releases/redis-4.0.1.tar.gz
RUN tar xzf redis-4.0.1.tar.gz
RUN cd redis-4.0.1

Dockerfile 中每一个指令都会建立一层,RUN 也不例外。每一个 RUN 的行为,和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。
而上面的这种写法,创建了 多 层镜像。这是完全没有意义的,而且很多运行时不需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。 这是很多初学 Docker 的人常犯的一个错误。

Union FS 是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过 127 层。上面的 Dockerfile 正确的写法应该是这样

RUN set -eux; \
	nativeLines="$(catalina.sh configtest 2>&1)"; \
	nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')"; \
	nativeLines="$(echo "$nativeLines" | sort -u)"; \
	if ! echo "$nativeLines" | grep -E 'INFO: Loaded( APR based)? Apache Tomcat Native library' >&2; then \
		echo >&2 "$nativeLines"; \
		exit 1; \

首先,之前所有的命令只有一个目的,就是编译、安装 redis 可执行文件。因此没有必要建立很多层,这只是一层的事情。因此,这里没有使用很多个 RUN 对一一对应不同的命令,而是仅仅使用一个 RUN 指令,并使用 && 将各个所需命令串联起来。将之前的 7 层,简化为了 1 层。在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建。并且,这里为了格式化还进行了换行。Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。良好的格式,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯。

应用

案例一:页面

  1. 创建文件夹,存放Dockerfile文件

    [root@master Dockerfile]# mkdir demo1
    [root@master Dockerfile]# cd demo1/
    
  2. 创建Dockerfile文件,并添加内容

    FROM tomcat
    ENV HOME /usr/local/tomcat/webapps/ROOT
    RUN mkdir -p "$HOME"
    WORKDIR $HOME
    RUN echo 'hello demo1'>>index.html
    
  3. 使用build命令创建镜像

    . 指从当前文件中寻找并使用Dockerfile文件

    Dockerfile由5条命令组成,所有镜像构建有5步

    [root@master demo1]# docker build -t demo1 .
    Sending build context to Docker daemon  2.048kB
    Step 1/5 : FROM tomcat
     ---> fb5657adc892
    Step 2/5 : ENV HOME /usr/local/tomcat/webapps/ROOT
     ---> Running in 8bcd75ab5077
    Removing intermediate container 8bcd75ab5077
     ---> a3647728b118
    Step 3/5 : RUN mkdir -p "$HOME"
     ---> Running in 7449e6cc3731
    Removing intermediate container 7449e6cc3731
     ---> bfa76b49bb55
    Step 4/5 : WORKDIR $HOME
     ---> Running in b8fe4dd90f21
    Removing intermediate container b8fe4dd90f21
     ---> 6f30bcb00a92
    Step 5/5 : RUN echo 'hello demo1'>>index.html
     ---> Running in 5c1048b3dab7
    Removing intermediate container 5c1048b3dab7
     ---> b74d2ee93c11
    Successfully built b74d2ee93c11
    Successfully tagged demo1:latest
    
  4. 查看镜像是否创建成功

    [root@master demo1]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    demo1        latest    b74d2ee93c11   13 minutes ago   680MB
    
  5. 创建容器并启动

    [root@master demo1]# docker run -d --name demo1-8080 -p 8080:8080 demo1
    fee8bdced8b4e2f1eda352d0b0be73ac6e3b875fe3f8d592178d616a60a730b2
    
  6. 访问服务

在这里插入图片描述

案例二:图片

  1. 创建文件夹,存放Dockerfile文件

    [root@master Dockerfile]# mkdir demo2
    [root@master Dockerfile]# cd demo2
    
  2. 上传图片文件到当前文件夹

    [root@master demo2]# ll
    总用量 56
    -rw-r--r--. 1 root root 54292 1月  16 14:43 1.jpg
    
  3. 创建Dockerfile文件,并添加内容

    FROM tomcat
    ENV HOME /usr/local/tomcat/webapps/ROOT
    RUN mkdir -p "$HOME"
    WORKDIR $HOME
    COPY 1.jpg "$HOME"
    
  4. 构建镜像

    [root@master demo2]# docker build -t demo2 .
    Sending build context to Docker daemon  57.34kB
    Step 1/5 : FROM tomcat
     ---> fb5657adc892
    Step 2/5 : ENV HOME /usr/local/tomcat/webapps/ROOT
     ---> Using cache
     ---> a3647728b118
    Step 3/5 : RUN mkdir -p "$HOME"
     ---> Using cache
     ---> bfa76b49bb55
    Step 4/5 : WORKDIR $HOME
     ---> Using cache
     ---> 6f30bcb00a92
    Step 5/5 : COPY 1.jpg "$HOME"
     ---> 4a761d0a3485
    Successfully built 4a761d0a3485
    Successfully tagged demo2:latest
    
  5. 查看镜像是否创建成功

    [root@master demo2]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    demo2        latest    4a761d0a3485   2 minutes ago    680MB
    
  6. 创建容器并启动

    [root@master demo2]#  docker run -d --name demo2-8081 -p 8081:8080 demo2
    f846976c159ab039c55132bc27963657c03a980d7ee38a688026a77c68a7672d
    
  7. 访问服务

案例三:war

实际开发中,利用Dockerfile 将一个war包生成镜像的Dockerfile:

  1. docker下创建项目工程名称

     mkdir -p /usr/local/docker/qfjy_exam
     cd /usr/local/docker/qfjy_exam 
    
  2. 将桌面qfjy_exam.zip复制到访目录下

     cp qfjy_exam-1.0-SNAPSHOT.zip  /usr/local/docker/qfjy_exam/
    
  3. 创建镜像文件Dockerfile

    在这里插入图片描述

  4. 构建镜像

    docker build -t qfjy_exam .
    
  5. 进入镜像内查看

    docker run -it qfjy_exam bash
    

案例四:jar

  1. 准备SpringBoot项目,并打包jar

  2. 上传jar到当前目录

  3. 创建镜像文件Dockerfile

    [root@master demo4]# vi Dockerfile 
    FROM java:8
    VOLUME /tmp
    ADD hello.jar hello.jar
    EXPOSE 8082
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/hello.jar"]
    
  4. 构建镜像

    [root@master demo4]# docker build -t bootimg .
    Sending build context to Docker daemon  17.56MB
    Step 1/5 : FROM java:8
     ---> d23bdf5b1b1b
    Step 2/5 : VOLUME /tmp
     ---> Using cache
     ---> a22d36b39a53
    Step 3/5 : ADD hello.jar hello.jar
     ---> 8f100ecb37f7
    Step 4/5 : EXPOSE 8082
     ---> Running in a0b212974f55
    Removing intermediate container a0b212974f55
     ---> 8a119ac40caf
    Step 5/5 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/hello.jar"]
     ---> Running in 6512343d5402
    Removing intermediate container 6512343d5402
     ---> 8c65586f43bf
    Successfully built 8c65586f43bf
    Successfully tagged bootimg:latest
    
  5. 查看镜像是否构建成功

    [root@master demo4]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
    bootimg      latest    8c65586f43bf   4 seconds ago       661MB
    
  6. 创建容器并运行

    [root@master demo4]# docker run -d --name boot -p 8083:8082 bootimg
    5a37700d55424630435726abf08d3168283acd9799755a4c97bdea80cdf396ff
    
  7. 查看运行日志

     docker logs -f --tail=100 容器名称
    

IDEA集成Docker部署

IDEA集成Docker部署

开启远程访问

#修改该Docker服务文件
vi /lib/systemd/system/docker.service
#修改ExecStart这行
ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock

[root@master demo2]# vi /lib/systemd/system/docker.service

#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

#重新加载配置文件
[root@master demo2]# systemctl daemon-reload

#重启服务
[root@master demo2]# systemctl restart docker.service

#查看端口是否开启   如果找不到netstat命令,可进行安装。yum install net-tools
[root@master demo2]# netstat -nlpt 
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name          
tcp6       0      0 :::2375                 :::*                    LISTEN      8133/dockerd      

#直接curl看是否生效
[root@master demo2]# curl http://127.0.0.1:2375/info
{"ID":"5HGL:RSNY:OEFO:JROF:YXLT:U57U:K5EB:MZVE:CU3V:S3RY:CEXJ:NGVD","Containers":2,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":2,"Images":6,"Driver":"overlay2","DriverStatus":[["Backing Filesystem","xfs"]......}

IDEA安装插件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-82tTuSOE-1655112096141)(image-20220116160732242.png)]

配置docker

连接Docker

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EkRrtrCD-1655112096142)(image-20220116160911296.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wx0088g-1655112096143)(image-20220116160951069.png)]

创建容器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tustMhRQ-1655112096144)(image-20220116161748707.png)]

容器控制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9TOmZcDL-1655112096144)(image-20220116161912846.png)]

docker-maven插件

集成插件

docker-maven-plugin 插件是为了帮助我们在Maven工程中,通过简单的配置,自动生成镜像并推送到仓库中

  1. 修改POM.xml文件

        <properties>
            <docker.image.prefix>ngint</docker.image.prefix>
        </properties>
    
    
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>1.0.0</version>
    
                    <configuration>
                        <!-- 镜像名称  ngint/docker-->
                        <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                        <!--指定标签-->
                        <imageTags>
                            <imageTag>latest</imageTag>
                        </imageTags>
                        <!-- 基础镜像jdk 1.8-->
                        <baseImage>java</baseImage>
                        <!-- 制作者提供本人信息 -->
                        <maintainer>ngint ngint@aliyun.com</maintainer>
                        <!--切换到/ROOT目录 -->
                        <workdir>/ROOT</workdir>
                        <cmd>["java", "-version"]</cmd>
                        <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>
    
                        <!-- 指定 Dockerfile 路径
                          <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                       -->
    
                        <!--指定远程 docker api地址-->
                        <dockerHost>http://192.168.30.10:2375</dockerHost>
    
                        <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                        <resources>
                            <resource>
                                <targetPath>/ROOT</targetPath>
                                <!--用于指定需要复制的根目录,${project.build.directory}表示target目录-->
                                <directory>${project.build.directory}</directory>
                                <!--用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。-->
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                    </configuration>
                </plugin>
    
  2. 最好清除缓存

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UfzBKFgY-1655112096145)(image-20220116163522709.png)]

  3. 打包并构建成镜像

    Microsoft Windows [版本 10.0.19042.1348]
    (c) Microsoft Corporation。保留所有权利。
    #打包并构建成镜像
    F:\WP\BaiduNetdiskWorkspace\IDEA_File\SptingBoot\docker>mvn package docker:build
    ......
    Successfully built b040813bdd89
    Successfully tagged ngint/demo:latest
    [INFO] Built ngint/demo
    [INFO] Tagging ngint/demo with latest
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  02:32 min
    [INFO] Finished at: 2022-01-16T16:30:31+08:00
    [INFO] ------------------------------------------------------------------------
    

mvn命令绑定
  1. 修改pom.xml文件

    docker-maven-plugin插件中添加(一般只添加打包部分)

    <executions>
        <!--当执行mvn package 时,执行: mvn clean package docker:build --> 
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
        
        
    	  <!--当执行mvn package 时,会对镜像进行 标签设定--> 	
         <execution>
             <id>tag-image</id>
             <phase>package</phase>
             <goals>
                 <goal>tag</goal>
             </goals>
             <configuration>
                 <image>${docker.image.prefix}/${project.artifactId}:latest</image>
                 <newName>docker.io/${docker.image.prefix}/${project.artifactId}:${project.version}		    </newName>
             </configuration>
        </execution>
        <execution>
            <id>push-image</id>
            <phase>deploy</phase>
            <goals>
                <goal>push</goal>
            </goals>
            <configuration>
                <imageName>docker.io/${docker.image.prefix}/${project.artifactId}:${project.version}	   </imageName>
            </configuration>
        </execution>
        
    </executions>
    

    当我们执行mvn package时,执行 build、tag 操作,

    当执行mvn deploy时,执行build、tag、push 操作。

    如果我们想跳过 docker 某个过程时,只需要:

    • -DskipDockerBuild 跳过 build 镜像
    • -DskipDockerTag 跳过 tag 镜像
    • -DskipDockerPush 跳过 push 镜像
    • -DskipDocker 跳过整个阶段

    例如:我们想执行 package 时,跳过 tag 过程,那么就需要mvn package -DskipDockerTag

  2. 打包并构建镜像

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A5tsv6aA-1655112096146)(image-20220116164649898.png)]

Portainer

​ docker 图形页面管理工具常用的有三种,DockerUI ,Portainer ,Shipyard 。DockerUI 是 Portainer 的前身,这三个工具通过docker api来获取管理的资源信息。平时我们常常对着shell对着这些命令行客户端,审美会很疲劳,如果有漂亮的图形化界面可以直观查看docker资源信息,也是非常方便的。今天我们就搭建单机版的三种常用图形页面管理工具。这三种图形化管理工具以Portainer最为受欢迎。

  1. 查看portainer镜像

    [root@master demo2]# docker search portainer
    NAME                                DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
                   
    portainerci/portainer               Portainer images automatically created via P…   6                    
    ......
    
  2. 镜像下载

    [root@master demo2]# docker pull portainer/portainer 
    Using default tag: latest
    latest: Pulling from portainer/portainer
    94cfa856b2b1: Pull complete 
    49d59ee0881a: Pull complete 
    a2300fd28637: Pull complete 
    Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
    Status: Downloaded newer image for portainer/portainer:latest
    docker.io/portainer/portainer:latest
    
  3. 启动dockerui容器

    [root@master demo2]# docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
    ef6dda2bf4a3c51257466dd5e6b065355771215cdf57e04394492270d74a3fd8
    
  4. 浏览器访问 (开发端口)

    虚拟机ip:9000

Docker-Compose

简介

Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具

Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

安装

官方下载安装

  1. github官方网站 搜索Docker compose

  2. 根据如下动态图片示例,找到下载好的二进制文件

    https://github.com/docker/compose/releases/download/1.25.5/docker-compose-Linux-x86_64
    
  3. 将下载好的文件拖入Linux 修改名称(为后面方便调用)

    [root@master demo2]# cd /usr/local/bin/
    [root@master bin]# ll
    总用量 17176
    -rw-r--r--. 1 root root 17586312 1月  16 17:09 docker-compose
    
  4. 修改其为可执行文件

    chmod 777 docker-compose
    

curl方式下载安装

https://docs.docker.com/compose/install/

  1. 下载文件

    sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
  2. 将可执行权限应用于二进制文件

    sudo chmod +x /usr/local/bin/docker-compose
    
  3. 测试是否安装

    [root@master bin]# docker-compose --version
    docker-compose version 1.25.5, build 8a1c60f6
    

卸载

#如果是 二进制包方式安装的,删除二进制文件即可
sudo rm /usr/local/bin/docker-compose

#如果是通过 pip 安装的,则执行如下命令即可删除。
sudo pip uninstall docker-compose

使用

创建容器

创建docker-cpmpose文件

yml格式要求

1、yml文件以缩进代表层级关系
2、缩进不允许使用tab只能使用空格
3、空格的个数不重要,只要相同层级的元素左对齐即可(建议2个)
4、大小写敏感
5、数据格式为,名称:(空格)值

#一、 k: (空格)v:表示一对键值对(空格不能省略),以空格控制层级关系,只要是左对齐的数据,都是同一级别;
server:
port: 8083
path: /helloBoot
#二、数组(用-表示数组中的一个元素):
animal:

  • cat
  • dag
  1. 创建目录

    [root@master local]# mkdir docker-compose
    
  2. 编写文件

    • 用compose的方式管理一个Tomcat容器和MySQL

      version: '3.1'
      services: 
        mysql-3306:                                        # 服务的名称
          restart: always                             # 只要docker启动,容器会随着启动
          image: daocloud.io/library/mysql:5.7.6      # 指定镜像路径信息(默认官方镜像地址)
          container_name: mysql-3306                   # 指定容器名称 --name
          ports:
            - 3306:3306                              #指定端口号映射
          environment: 
            MYSQL_ROOT_PASSWORD: root                 #指定MYSQL ROOT用户的密码
            TZ: Asiz/Shanghai                         #指定时区
          volumes:
            - /opt/docker_mysql_tomcat/mysql/data:/var/lib/mysql #映射mysql的数据目录到宿主机,保存数据
            - /opt/docker_mysql_tomcat/mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
            #把mysql的配置文件映射到容器的相应目录
        tomcat:
          restart: always
          image: daocloud.io/library/tomcat:8.5.15-jre8
          container_name: tomcat-8080
          ports:
            - 8080:8080
          environment:   
            TZ: Asiz/Shanghai  
          volumes:
            - /opt/docker_mysql_tomcat/tomcat/webapps:/usr/local/tomcat/webapps
            - /opt/docker_mysql_tomcat/tomcat/logs:/usr/local/tomcat/logs
      
    • 用compose的方式管理多个Tomcat容器

      version: '3.1'
      services: 
        tomcat-8081:
          restart: always
          image: daocloud.io/library/tomcat:8.5.15-jre8
          container_name: tomcat-8081
          ports:
            - 8081:8080
          environment:   
            TZ: Asiz/Shanghai  
          volumes:
            - /usr/local/docker-compose/tomcat/webapps:/usr/local/tomcat/webapps
            - /usr/local/docker-compose/tomcat/logs:/usr/local/tomcat/logs
        tomcat-8082:
          restart: always
          image: daocloud.io/library/tomcat:8.5.15-jre8
          container_name: tomcat-8082
          ports:
            - 8082:8080
          environment:   
            TZ: Asiz/Shanghai  
          volumes:
            - /usr/local/docker-compose/tomcat/webapps:/usr/local/tomcat/webapps
            - /usr/local/docker-compose/tomcat/logs:/usr/local/tomcat/logs
        tomcat-8083:
          restart: always
          image: daocloud.io/library/tomcat:8.5.15-jre8
          container_name: tomcat-8083
          ports:
            - 8083:8080
          environment:   
            TZ: Asiz/Shanghai  
          volumes:
            - /usr/local/docker-compose/tomcat/webapps:/usr/local/tomcat/webapps
            - /usr/local/docker-compose/tomcat/logs:/usr/local/tomcat/logs
      
启动
[root@master docker-compose]# docker-compose up -d
Creating tomcat-8082 ... done
Creating tomcat-8081 ... done
Creating tomcat-8083 ... done

#默认执行的文件名:docker-compose.yml(且需要在当前上下文路径中) 。如果说文件名不是默认的需要使用下面的指令:
docker-compose -f 文件名.后缀名 up –d
测试
#1 Bash进入mysql容器:
sudo docker exec -it 7f /bin/bash
mysql -u root -p

use mysql;
grant all privileges on *.* to 'root'@'%';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
flush privileges;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4qsLl7Aq-1655112096147)(image-20220116180156149.png)]

关闭
docker-compose down  #关闭并删除容器
docker-compose stop  #关闭容器

开启容器

docker-compose start 

查看由docker-compose管理的容器

[root@master docker-compose]# docker-compose ps
   Name           Command       State                    Ports                  
--------------------------------------------------------------------------------
tomcat-8081   catalina.sh run   Up      0.0.0.0:8081->8080/tcp,:::8081->8080/tcp
tomcat-8082   catalina.sh run   Up      0.0.0.0:8082->8080/tcp,:::8082->8080/tcp
tomcat-8083   catalina.sh run   Up      0.0.0.0:8083->8080/tcp,:::8083->8080/tcp

查看日志

[root@master docker-compose]# docker-compose logs -f

Docker-compose 常用命令

build 构建或重建服务

help 命令帮助

kill 杀掉容器

logs 显示容器的输出内容

port 打印绑定的开放端口

ps 显示容器

pull 拉取服务镜像

restart 重启服务

rm 删除停止的容器

run 运行一个一次性命令

scale 设置服务的容器数目

start 开启服务

stop 停止服务

up 创建并启动容器

down

常用命令示例

docker-compose up -d nginx 构建启动nignx容器

docker-compose exec nginx bash 登录到nginx容器中

docker-compose down 删除所有nginx容器,镜像

docker-compose ps 显示所有容器

docker-compose restart nginx 重新启动nginx容器

docker-compose run --no-deps --rm php-fpm php -v 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器

docker-compose build nginx 构建镜像 。

docker-compose build --no-cache nginx 不带缓存的构建。

docker-compose logs nginx 查看nginx的日志

docker-compose logs -f nginx 查看nginx的实时日志

docker-compose config -q 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。

docker-compose events --json nginx 以json的形式输出nginx的docker日志

docker-compose pause nginx 暂停nignx容器

docker-compose unpause nginx 恢复ningx容器

docker-compose rm nginx 删除容器(删除前必须关闭容器)

docker-compose stop nginx 停止nignx容器


tomcat-8081 catalina.sh run Up 0.0.0.0:8081->8080/tcp,:::8081->8080/tcp
tomcat-8082 catalina.sh run Up 0.0.0.0:8082->8080/tcp,:::8082->8080/tcp
tomcat-8083 catalina.sh run Up 0.0.0.0:8083->8080/tcp,:::8083->8080/tcp


查看日志

```sh
[root@master docker-compose]# docker-compose logs -f

Docker-compose 常用命令

build 构建或重建服务

help 命令帮助

kill 杀掉容器

logs 显示容器的输出内容

port 打印绑定的开放端口

ps 显示容器

pull 拉取服务镜像

restart 重启服务

rm 删除停止的容器

run 运行一个一次性命令

scale 设置服务的容器数目

start 开启服务

stop 停止服务

up 创建并启动容器

down

常用命令示例

docker-compose up -d nginx 构建启动nignx容器

docker-compose exec nginx bash 登录到nginx容器中

docker-compose down 删除所有nginx容器,镜像

docker-compose ps 显示所有容器

docker-compose restart nginx 重新启动nginx容器

docker-compose run --no-deps --rm php-fpm php -v 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器

docker-compose build nginx 构建镜像 。

docker-compose build --no-cache nginx 不带缓存的构建。

docker-compose logs nginx 查看nginx的日志

docker-compose logs -f nginx 查看nginx的实时日志

docker-compose config -q 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。

docker-compose events --json nginx 以json的形式输出nginx的docker日志

docker-compose pause nginx 暂停nignx容器

docker-compose unpause nginx 恢复ningx容器

docker-compose rm nginx 删除容器(删除前必须关闭容器)

docker-compose stop nginx 停止nignx容器

docker-compose start nginx 启动nignx容器

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值