zoukankan      html  css  js  c++  java
  • Docker学习

    Docker

    Author : Eric

    Version : 9.0.1

    一、Docker介绍

    1.1 引言

    1. 我本地运行没问题

    环境不一样

    1. 写了似死循环,会很卡

    再多用户操作系统下,会互相影响

    1. 淘宝在双11的时候,用户量暴增

    运维成本过高

    1. 学习一门技术,学习成本过高

    关于安装软件成本过高

    1.2 Docker的由来

    一帮年轻人创业,创办了一家公司,2010年的专门做PAAS平台。

    到了2013年的时候,像亚马逊、微软、Google都开始做PAAS平台。

    2013年,将公司内的核心技术对外开源,核心技术就是Docker。

    到了2014年的时候,得到了C轮融资,$4000W

    到了2015年的时候,得到了D轮融资,$9500W

    全神贯注的维护Docker。

    所罗门主要作者之一。

    Docker的作者已经离开了维护Docker的团队。

    1.4 Docker的思想

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

    二、Docker的基本操作

    2.1 Ubuntu安装Docker

    这里利用了阿里云的"Docker CE"镜像源站进行安装。

    # step 1: 安装必要的一些系统工具
        sudo apt-get update
        sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
         
        # step 2: 安装GPG证书
        curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
         
        # Step 3: 写入软件源信息
        sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
         
        # Step 4: 更新并安装Docker-CE
        sudo apt-get -y update
        sudo apt-get -y install docker-ce
     
     # 查看版本
     docker --version
    
     #  测试Docker是否安装成功
     sudo docker run hello-world
    

    2.2 Dockerd的中央仓库

    1. Docker官方的中央仓库:这个仓库是镜像最全的,但是下载速度很慢。https://hub.docker.com
    2. 国内的镜像网站:网易蜂巢、daoCloud...

    https://c.163yun.com/hub#/home

    http://hub.daocloud.io (推荐使用)

    1. 在公司内部会采用私服的方式拉取镜像。(添加配置)
    # 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.19
     
    # 2. 查看全部本地的镜像
    docker images
    
    # 3. 删除本地镜像
    docker rmi 镜像的标识
    
    # 4. 镜像的导入导出(不规范)  没网的时候
    # 将本地的镜像导出
    docker save -o 导出的路径 镜像id
    # 加载本地的镜像文件
    docker load -i 镜像文件
    # 修改镜像名称
    docker tag 镜像id 新镜像名称:版本
    

    2.4 容器的操作

    # 1. 运行容器
    # 简单操作
    docker run 镜像的标识|镜像名称[:tag]
    # 常用的参数
    docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
    # -d:代表后台运行容器
    # -p 宿主机端口:容器端口:为了映射当前Linux端口和容器端口
    # --name 容器名称:指定容器的名称
    # 记得打开服务器的安全组的端口
    
    # 2. 查看正在运行的容器
    docker ps [-qa]
    # -a:查看全部的容器,包括没有运行
    # -q:只查看容器得到标识
    
    # 3. 查看容器的日志
    docker logs -f 容器id
    # -f:可以滚动查看日志的最后几行
    
    # 4. 进入到容器内部
    docker exec -it 容器id bash
    # 退出
    exit
    
    # 5. 删除容器(删除容器前,需要停止容器)
    # 停止指定的容器
    docker stop 容器id
    # 停止全部容器
    docker stop $(docker ps -qa)
    # 删除指定的容器
    docker rm 容器id
    # 删除全部容器
    docker rm $(docker ps -qa)
    
    # 6. 启动容器
    docker start 容器id
    

    三、Docker应用

    3.1 准备SSM工程

    # MySQL数据库的连接用户名和密码改变了,修改db.properties

    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包部署到Tomcat容器内部即可
    # 可以通过命令将宿主机的内容服务到容器内部
    docker cp 文件名称 容器id:容器内部路径
    # 举个例子
    docker cp ssm.war fe:/usr/local/tomcat/webapps
    

    3.4 数据卷

    为了部署SSM的工程,需要使用到cp命令将宿主机内的ssm.war文件复制到容器内部。

    数据卷:将宿主机的一个目录映射到容器的一个目录中。

    可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着一起改变。

    # 1. 创建数据卷
    docker volume create 数据卷名称
    # 创建数据卷之后,默认会存放在一个目录下 /war/lib/docker/volumes/数据卷名称/_data
    
    # 2. 查看数据卷的详细信息
    docker volume inspect 数据卷名称
    
    # 3. 查看全部数据卷
    docker volume ls
    
    # 4. 删除数据卷
    docker volume rm 数据卷名称
    
    # 5. 应用数据卷
    # 当你映射数据卷时,如果数据卷不存在,Docker会自动帮你创建,会将容器内部自带的文件,存储在默认的存放路径中
    docker run -v 数据卷名称:定义的容器内部的路径 镜像id
    
    # 例子
    docker run -d -p 8080:8080 --name ssm_tomcat -v volume_ssm_tomcat:/usr/local/tomcat/webapps 3c
    
    # 直接指定一个路径作为数据卷的存放位置,这个路径下是空的。
    # 一般使用这个,以方便后期的修改
    docker run -v 路径:定义的容器内部的路径 镜像id
    
    

    四、Docker自定义的镜像

    中央仓库上的镜像,也是Docker的用户自己上传过去的。

    # 1. 创建一个Dockerfile文件,并且指定自定义镜像信息
    # Dockerfile文件中常用的内容
    from:指定当前自定义镜像依赖的环境
    copy:将相对路径下的内容复制到自定义镜像中
    workdir:声明镜像的默认工作目录
    cmd:需要执行的命令(在workdir下执行的,cmd可以写多的,只以最后一个为准)
    # 举个例子,自定义一个Tomcat镜像,并且将ssm.war部署到Tomcat中
    from daocloud.io/library/tomcat:8.5.15-jre8
    copy ssm.war /usr/local/tomcat/webapps
    
    # 2. 将准备好的Dockerfile和相应的文件拖拽到Linux操作系统中,通过Docker的命令制作镜像
    docker build -t 镜像名称:[tag]
    
    # 例子:
    docker run -d -p 8081:8080 --name custom-ssm-tomcat 9e
    
    

    五、Docker-Compress

    之前运行一个镜像,需要添加大量的参数。

    可以通过Docker-Compose编写这些参数。

    Docker-Compose可以帮助我们批量的管理容器。

    只需要通过一个docker-compose.yml文件去维护即可。

    5.1 下载Docker-Compose

    # 1. 去GitHub官网搜索docker-compose,下载最新版本的Docker-Compose
    # 2. 将下载好的文件,拖拽到Linux操作系统中
    # 3. 需要将Docker-Compose文件名称修改一下,给予DockerCompose文件一个可执行的权限
    mv docker-compose-Linux-x86_64 docker-compose
    chmod 777 docker-compose
    # 4. 方便后期操作,配置一个环境变量
    # 将docker-compose文件移动到/usr/local/bin,修改了/etc/profile文件,给/usr/local/bin配置到PATH中
    mv docker-compose /usr/local/bin
    vi /etc/profile
    	export PATH=$JAVA_HOME:/usr/local/bin:$PATH
    source /etc/profile
    
    # Java:环境变量配置
    export JAVA_HOMR=/usr/local/jdk
    export PATH=$JAVA_HOME/bin:$PATH
    
    # 5. 测试一下
    # 在任意目录下输入docker-composexxxxxxxxxx # 1. # 1. 去GitHub官网搜索docker-compose,下载最新版本的Docker-Compose# 2. 将下载好的文件,拖拽到Linux操作系统中# 3. 需要将Docker-Compose文件名称修改一下,给予DockerCompose文件一个可执行的权限mv docker-compose-Linux-x86_64 docker-composechmod 777 docker-compose# 4. 方便后期操作,配置一个环境变量# 将docker-compose文件移动到/usr/local/bin,修改了/etc/profile文件,给/usr/local/bin配置到PATH中mv docker-compose /usr/local/binvi /etc/profile    export PATH=$JAVA_HOME:/usr/local/bin:$PATHsource /etc/profile# 5. 测试一下# 在任意目录下输入docker-composeshell
    

    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          # 代表只要Docker启动,那么这个容器就跟着一起启动
        image: daocloud.io/library/tomcat:8.5.15-jre8     # 指定镜像路径
        container_name: tomcat    # 指定容器名称
        ports:
          - 8080:8080        # 指定端口号的映射
        environment:
          MYSQL_ROOT_PASSWORD: root         # 指定MySQL的ROOT用户登录密码
          TZ: Asia/Shanghai                 # 指定时区
        volumes:
          - /opt/docker_mysql-tomcat/tomcat_webapps:/usr/local/tomcat/webapps        # 映射数据卷
          - /opt/docker_mysql-tomcat/tomcat_logs:/usr/local/tomcat/logs        # 映射数据卷
    

    5.3 使用Docker-Compose命令管理容器

    在使用docker-compose的命令时,默认会在当前目录下找docker-compose.yml文件

    # 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 docker-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.15-jre8
    copy ssm.war /usr/local/tomcat/webapps
    
    # 可以直接启动基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
    docker-compose up -d
    # 如果自定义镜像不存在,会帮助我们构建出自定义镜像,如果自定义镜像已经存在,会直接运行这个自定义镜像
    # 重新构建的话
    # 重新构建自定义镜像
    docker-compose build
    # 运行前,重新构建
    docker-compose up -d --build
    

    六、 Docker DI、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

    创建一个全新的虚拟机,并且至少指定4G的运行内存

    2、安装docker以及docker-compose

    3、将ssh的默认22端口,修改为60022端口

    vi /etc/ssh/sshd_config
    PORT 22 -> 60022
    systemctl restart sshd
    

    4、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://124.70.158.106'
        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 搭建GitlabRunner

    1. 准备文件

    daemon.json
     
    {
    "registry-mirrors": ["https://registry.docker-cn.com"],
    "insecure-registries": [ip:ports]
    }
     
    文件夹 environment里面准备maven安装包,jdk1.8安装包,Dockerfile,daemon.json以及docker-compose
    

    2. 开始搭建

    • 复制daemon.json到/etc/docker/,并执行systemctl daemon-reload, systemctl restart dockertemc
    • 创建工作目录 /usr/local/docker_gitlab-runner
    • 将docker-compose.yml文件以及environment目录全部复制到上述目录中
    • 在宿主机启动docker程序后先执行 sudo chown root:root /var/run/docker.sock (如果重启过 docker,重新执行)
    • 在/usr/local/docker_gitlab-runner 目录中执行docker-compose up -d –build 启动容器
    • 添加容器权限,保证容器可以使用宿主机的dockerdocker exec -it gitlab-runner * usermod -aG root gitlab-runner
    • 注册Runner信息到gitlab

    3. 进入后续步骤

    docker exec -it gitlab-runner gitlab-runner register
     
    # 输入 GitLab 地址
    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
    http://192.168.199.109/
     
    # 输入 GitLab Token
    Please enter the gitlab-ci token for this runner:
    1Lxq_f1NRfCfeNbE5WRh
     
    # 输入 Runner 的说明
    Please enter the gitlab-ci description for this runner:
    可以为空
     
    # 设置 Tag,可以用于指定在构建规定的 tag 时触发 ci
    Please enter the gitlab-ci tags for this runner (comma separated):
    deploy
     
    # 这里选择 true ,可以用于代码上传后直接执行(根据版本,也会没有次选项)
    Whether to run untagged builds [true/false]:
    true
     
    # 这里选择 false,可以直接回车,默认为 false(根据版本,也会没有次选项)
    Whether to lock Runner to current project [true/false]:
    false
     
    # 选择 runner 执行器,这里我们选择的是 shell
    Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:
    shell
    
  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/itgopan/p/13931159.html
Copyright © 2011-2022 走看看