zoukankan      html  css  js  c++  java
  • 2_Docker

    一. Docker介绍

    1.1 引言

    • 场景1: 我本地运行没问题啊
      • 环境问题
    • 场景2: 哪个哥们又写死循环了, 怎么这么卡
      • 在多用户的操作系统下, 会相互影响
    • 场景3: 淘宝在双11的时候, 用户量暴增
      • 运维成本过高的问题
    • 场景: 学习一门技术, 学习安装成本过高
      • 关于安装软件成本过高的问题

    1.2 Docker的由来

    • 一帮年轻人, 创办了一家公司, 2010年的时候专门做PAAS平台
    • 到了2013年的时候, 像亚马逊,微软, Google都开始做PAAS平台
    • 2013年, 将公司内的核心技术对外开源, 核心技术就是Docker
    • 到了2014年的时候, 得到了C轮的融资,$4000W
    • 到了2015年的时候, 得到了D轮的容器,$9500W
    • 最终可以全神贯注的维护Docker
    • 所罗门是主要作者之一, 现已离开Docker团队

    1.3 Docker的思想

    1. 集装箱
      • 会将所有需要的内容放到不同的集装箱中, 谁需要这些环境直接拿到这个集装箱就可以了
    2. 标准化
      1. 运输的标准化: Docker有一个码头, 所有上传的集装箱都放在了这个码头上, 当谁需要某一个环境, 就直接派大鲸鱼去搬运这个集装箱
      2. 命令的标准化: Docker提供了一系列的命令, 帮助我们去获取集装箱
      3. 提供了REST的API: 衍生出了很多的图形化界面: Rancher
    3. 隔离性
      • Docker在运行集装箱中的内容时, 会在Linux的内核中, 单独的开辟一片空间, 这片空间不会影响到其他程序
    • 注册中心 (超级码头, 上面放的就是集装箱)
    • 镜像 (集装箱)
    • 容器 (运行起来的镜像)

    二. Docker的基本操作

    2.1 安装Docker

    #1. 下载关于Docker的依赖环境
    yum -y install yum-utils device-mapper-persistent-data lvm2
    
    #2. 设置一下Docker的镜像源
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    #3. 安装Docker
    yum makacache fast
    yum -y install docker-ce
    
    #4. 启动,并设置为开机自启,测试
    #启动Docker服务
    systemctl start docker
    #设置为开机自启
    systemctl enable docker
    #测试
    docker run hello-world
    
    #结果包含以下内容证明Docker安装并启动成功
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    

    2.2 Docker的中央仓库

    1. Docker官方的中央仓库: 这个仓库是最全的, 但是下载速度较慢

    2. 国内的镜像: 网易蜂巢, daoCloud...

    3. 在公司内部会采用私服的方式拉取镜像 (需要添加配置)

      • #需要在/etc/docker/daemon.json
        {
        	"registry-mirrors": ["https://registry.docker-cn.com"],
        	"insecure-registries": ["ip:port"]
        }
        #重启两个服务
        systemctl daemon-reload
        systemctl restart docker
        

    2.3 镜像的操作

    #1. 拉取镜像到本地
    docker pull 镜像名称[:tag]
    #举例
    docker pull daocloud.io/library/tomcat:8.5.16-jre8
    
    #2. 查看全部本地的镜像
    docker images
    
    #3. 删除本地镜像
    docker rmi 镜像ID
    
    #4. 镜像的导入导出(不规范)
    #将本地的镜像导出
    docker save -o 导出的路径 镜像ID
    #加载本地的镜像文件
    docker load -i 镜像文件
    #修改镜像名称
    docker tag 镜像ID 新镜像名称:版本
    #例如 docker tag b2 tomcat:8.5
    

    2.4 容器的操作

    #1. 运行容器
    #简单操作
    docker run 镜像ID|镜像名称[:tag]
    #常用参数
    docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像ID|镜像名称[:tag]
    #-d: 代表后台运行容器
    #-p 宿主机端口:容器端口: 为了映射当前Linux的端口和容器的端口
    #我们通过访问宿主机端口, 就相当于于访问了容器端口
    #--name 容器名称: 指定容器的名称
    
    #2. 查看正在运行的容器
    docker ps [-qa]
    #-a: 查看全部的容器,包括没有运行的
    #-q: 只查看容器的ID
    
    #3. 查看容器的日志
    docker logs -f 容器ID
    #-f: 可以查看日志的最后几行
    
    #4. 进入到容器内部
    #进入到容器内部
    docker exec -it 容器ID /bin/bash
    #或者
    docker exec -it 容器ID bash
    
    #5. 删除容器(删除容器前, 需要先停止容器)
    docker stop 容器ID
    #停止指定的容器
    docker stop $(docker ps -qa)
    #停止全部容器
    docker rm 容器ID
    #删除指定容器
    docker rm $(docker ps -qa)
    #删除全部容器
    
    #6. 启动容器
    docker start 容器ID
    
    #7. 补充
    /var/lib/docker
    #docker的默认安装路径
    /var/lib/docker/containers
    #docker下的容器存放位置
    /var/lib/docker/containers/43a9ba041db6f1130b26da8dd041bae32a3a14ee96f6a1491b72679708da8551
    #这一长串就是容器ID
    #进入容器ID后,可以看到几个配置文件,如果要修改容器的端口号,可以修改config.v2.json 和hostconfig.json这两个文件
    #(1)hostconfig.json
    "PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"8088"}]}
    #8080/tcp是容器端口号,8088是主机端口号
    #(2) config.v2.json
    "ExposedPorts":{"8080/tcp":{}},"Tty":false
    #8080/tcp是容器端口号
    #我们修改完端口号后要重启docker容器
    docker restart 容器ID
    

    三. Docker应用

    3.1 准备SSM工程

    #注意修改连接MySQL的配置文件jdbc.properties
    #ip地址从192.168.59.128变为192.168.59.129
    #用户名从doublez变为root
    #密码从Root8031.变为root
    #最后重新打包
    

    3.2 准备MySQL容器

    #运行MySQL容器
    docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4
    

    3.3 准备Tomcat容器

    #运行Tomcat容器, 前面已经搞定, 主需要将SSM项目的war包部署到Docker中的Tomcat容器即可
    #可以通过命令将宿主机的内容复制到容器内部
    docker cp 文件名称 容器ID:容器内部路径
    #举例
    docker cp ssm1.war 43:/usr/local/tomcat/webapps/
    

    3.4 数据卷

    • 上面为了部署SSM工程, 需要使用cp命令将宿主机内的ssm1.war文件复制到容器内部, 有些麻烦, 所以我们可以使用数据卷的方式
    • 数据卷: 将宿主机的一个目录映射到容器的一个目录中, 在宿主机中操作改变目录中的内容, 容器目录内部映射的文件, 也会跟着一起改变
    #1. 创建数据卷
    docker volume create 数据卷名称
    #创建数据卷后, 默认会存放在一个目录下 /var/lib/docker/volumes/数据卷名称/_data
    
    #2. 查看数据卷的详细信息
    docker volume inspect 数据卷名称
    
    #3. 查看全部数据卷
    docker volume ls
    
    #4. 删除数据卷
    docker volume rm 数据卷名称
    
    #5. 应用数据卷
    #方法一: 当你映射数据卷时, 如果数据卷不存在, Docker会帮你自动创建, 会将容器内部自带的文件, 存储在默认的存放路径中
    docker run -v 数据卷名称:容器内部路径 镜像ID
    #举例
    docker volume create volume_ssm1_tomcat
    docker run -d -p 8080:8080 --name ssm1_tomcat -v volume_ssm1_tomcat:/usr/local/tomcat/webapps b2
    #方法二: 直接指定一个路径作为数据卷的存放位置,这个路径下是空的[推荐]
    docker run -v 路径:容器内部路径 镜像ID
    #举例
    docker run -d -p 8080:8080 --name ssm1_tomcat -v /opt/volumn_ssm1_tomcat:/usr/local/tomcat/webapps b2
    cd /opt/volumn_ssm1_tomcat/
    mkdir ROOT
    cd ROOT/
    vi index.html
    #在index.html中添加<h1>Hello Volume!</h1>后保存退出,然后访问http://192.168.59.129:8080/就可以看到Hello Volume!
    
    

    四. Docker自定义镜像

    • 中央仓库上的镜像, 也是Docker用户自己上传上去的
    #1. 创建一个Dockerfile文件, 并且指定自定义镜像信息
    #Dockerfile文件中常用的内容
    from: 指向当前自定义镜像依赖的环境
    copy: 将相对路径下的内容复制到自定义镜像中
    workdir: 声明镜像的默认工作目录
    cmd: 需要执行的命令(是在workdir下执行的,cmd可以写多个, 但只以最后一个为准)
    #举例,自定义一个Tomcat镜像, 并且将ssm1.war部署到tomcat中(把ssm1.war和Dockerfile放在同一个目录下,然后Dockerfile中编写以下内容)
    from daocloud.io/library/tomcat:8.5.16-jre8
    copy ssm1.war /usr/local/tomcat/webapps
    
    #2. 将准备好的Dockerfile和相应文件拖拽到Linux操作系统中, 通过Docker的命令制作镜像
    docker build -t 镜像名称:[tag] .
    #举例
    cd ~
    mkdir ssm1-tomcat
    cd ssm1-tomcat
    #然后把Dockerfile和ssm1.war拖拽到此目录下
    docker build -t ssm1-tomcat:1.0.0 .
    docker images
    docker run -d -p 8082:8080 --name custom-ssm1-tomcat 78
    docker ps
    

    五. Docker-Compose

    • 之前我们运行一个镜像, 需要添加大量的参数
    • 现在我们可以通过Docker-Compose来编写这些参数
    • Docker-Compose可以帮助我们批量的管理容器
    • 只需要通过一个Docker-Compose.yml文件去维护即可

    5.1 下载Docker-Compose

    #1. 去github下载1.24.1版本的Docker-Compose
    https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64
    
    #2. 将下载好的文件拖拽到Linux操作系统中
    #先拖拽到root下,再移动到/usr/local下
    cd ~
    mv docker-compose-Linux-x86_64 /usr/local
    
    #3. 修改Docker-Compose文件的名称, 并赋予Docker-Compose文件一个可执行的权限
    cd /usr/local
    mv docker-compose-Linux-x86_64 docker-compose
    ll
    chmod 777 docker-compose
    
    #4. 方便后期操作, 需配置环境变量
    #把docker-compose文件移动到/usr/local/bin下,然后把/usr/local/bin配置到环境变量中
    mv docker-compose /usr/local/bin
    vi /etc/profile
    #最后一行修改为export PATH=$JAVA_HOME/bin:/usr/local/bin:$PATH
    #保存退出
    #最后在任意目录下输入docker-compose
    
    #结果出现以下内容代表配置成功
    Define and run multi-container applications with Docker.
    
    Usage:
      docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
      docker-compose -h|--help
    
    Options:...
    Commands:...
    

    5.2 Docker-Compose管理MySQL和Tomcat容器

    • yml文件以key: value方式来指定配置信息
    • 多个配置信息以换行+缩进的方式来区分
    • docker-compose.yml
    version: '3.1'
    services:
      mysql: #服务的名称
        restart: always #代表只要docker启动,那么这个容器就跟着一起启动
        image: daocloud.io/library/mysql:5.7.4 #指定镜像路径
        container_name: mysql #指定容器名称
        ports:
          - 3306:3306 #指定端口号的映射
        environment:
          MYSQL_ROOT_PASSWORD: root #指定MYSQL的ROOT用户登录密码
          TZ: Asia/Shanghai #指定时区
        volumes:
          - /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql #映射数据卷
      tomcat:
        restart: always
        image: daocloud.io/library/tomcat:8.5.16-jre8
        container_name: tomcat
        ports:
          - 8080:8080
        environment:
          TZ: Asia/Shanghai
        volumes:
          - /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
          - /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs
    
    cd /opt/
    mkdir docker_mysql_tomcat
    cd docker_mysql_tomcat
    vi docker-compose.yml
    #然后把上面写的docker-compose.yml内容复制进来,保存退出
    docker stop $(docker ps -qa)
    docker rm $(docker ps -qa)
    #把之前的容器停止并删除
    

    5.3 使用docker-compose命令管理容器

    #1. 基于docker-compose.yml启动管理的容器
    docker-compose up -d
    
    #2. 关闭并删除容器
    docker-compose down
    
    #3. 开启或关闭或重启已经存在的由docker-compose维护的容器
    docker-compose start|stop|restart
    
    #4. 查看由docker-compose管理的容器
    docker-compose ps
    
    #5. 查看日志
    docker-compose logs -f
    

    5.4 dcoker-compose配置Dockerfile使用

    • 使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像的同时启动当前镜像, 并且由docker-compose去管理容器

    • docker-compose.yml文件

    #yml文件
    version: '3.1'
    services:
      ssm:
        restart: always
        build:    #构建自定义镜像
          context: ../  #指定dockerfile文件的所在路径
          dockerfile: Dockerfile  #指定Dockerfile文件名称
        image: ssm:1.0.1
        container_name: ssm
        ports:
          - 8081:8080
        environment: 
          TZ: Asia/Shanghai
    
    • Dockerfile文件
    from daocloud.io/library/tomcat:8.5.16-jre8
    copy ssm1.war /usr/local/tomcat/webapps
    
    #可以直接启动基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
    docker-compose up -d
    #如果自定义镜像不存在, 会帮助我们构建出自定义镜像,如果自定义镜像已经存在, 会直接运行这个自定义镜像
    #重新构建的话
    docker-compose build
    #运行前,重新构建
    docker-compose up -d --build
    

    六. Docker CI, CD

    6.1 引言

    • 项目部署
      1. 将项目通过maven进行编译打包
      2. 将文件上传到指定的服务器中
      3. 将war包放到tomcat的目录中
      4. 通过Dockerfile将Tomcat和war包转成一个镜像, 由DockerCompose去运行容器
    • 项目更新了
      • 将上述流程再次从头到尾的执行一次

    6.2 CI介绍

    • CI (continuous intergration) 持续集成
    • 持续集成: 编写代码时, 完成了一个功能后, 立即提交代码到Git仓库中, 将项目重新的构建并且测试
      • 快速发现错误
      • 防止代码偏离主分支

    6.3 实现持续集成

    6.3.1 搭建Gitlab服务器
    1. 创建一个全新的虚拟机, 并且至少指定4G的运行内存
    2. 安装docker以及docker-compose
    3. 将ssh的默认22端口, 修改为60022端口
    vi /etc/ssh/sshd_config
    #将#Port 22 改为 Port 60022后保存退出
    systemctl restart sshd
    #重新启动sshd
    
    1. docker-compose.yml文件去安装gitlab(下载和运行的时间是比较长的)
    version: '3.1'
    services:
      gitlab:
        image: 'twang2218/gitlab-ce-zh:11.1.4'
        container_name: "gitlab"
        restart: always
        privileged: true
        hostname: 'gitlab'
        environment:
          TZ: 'Asia/Shanghai'
          GITLAB_OMNIBUS_CONFIG: |
            external_url 'http://192.168.199.110'
            gitlab_rails['time_zone'] = 'Asia/Shanghai'
            gitlab_rails['smtp_enable'] = true
            gitlab_rails['gitlab_shell_ssh_port'] = 22
        ports:
          - '80:80'
          - '443:443'
          - '22:22'
        volumes:
          - /opt/docker_gitlab/config:/etc/gitlab
          - /opt/docker_gitlab/data:/var/opt/gitlab
          - /opt/docker_gitlab/logs:/var/log/gitlab
    
    6.3.2 搭建Gitlab-Runner
  • 相关阅读:
    【转载】webDriver拾级而上·之五 iframe的处理
    Linux课程笔记 用户和用户组管理
    Linux课程笔记 文件和目录权限
    Linux课程笔记 软硬链接
    Java算法面试题
    Linux课程笔记 Day09 课上内容总结 MySql,Php的安装及Apache,Nginx,Php的优化
    Day13 高级子查询
    Day12 SET运算符
    Day11 其他数据库对象
    Linux课程笔记 Day08 课上内容总结 Apache,Raid技术及Nginx
  • 原文地址:https://www.cnblogs.com/MRASdoubleZ/p/14863932.html
Copyright © 2011-2022 走看看