• Docker超详细基础教程


    docker

    一.Docker介绍

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

    Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

    容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

    Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)。

    二.Docker的基本操作

    2.1基本准备

    这篇文章中我的运行环境都是在CentOS7中运行。

    配套视频: 2020 Docker最新超详细版教程通俗易懂

    2.2安装Docker

    # 1.下载关于Docker的依赖环境
    yum -y install yum-utils device-mapper-persistent-data lvm2
    
    • 1
    • 2

    # 2.设置下载Docker的镜像源
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    • 1
    • 2

    # 3.安装Docker
    yum makecache fast
    yum -y install docker-ce
    
    • 1
    • 2
    • 3

    # 4.启动Docker,并设置为开机自动启动,测试
    # 启动Docker服务
    systemctl start docker
    # 设置开机自动启动
    systemctl enable docker
    # 测试
    docker run hello-world
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.3 Docker的中央仓库

    1. Docker官方的中央仓库: 这个仓库是镜像最全的,但是下载速度较慢。
      https://hub.docker.com/
    2. 国内的镜像网站:网易蜂巢、daoCloud。。。
      https://c.163yun.com/hub#/home
      https://hub.daocloud.io/ (推荐使用)
    3. 在公司内部会采用私服的方式拉取镜像。(添加配置)
    # 需要在/etc/docker/daemon.json
    {
    	"registry-mirrors": ["https://registry.docker-cn.com"],
    	"insecure-registries": ["ip:port]
    }
    # ip:port
    公司私服的ip和port
    # 重启两个服务
    systemctl daemon-reload
    systemctl restart docker                          
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.4 镜像的操作

    # 1. 拉取镜像到本地
    docker pull 镜像名称[:tag]
    # 举个例子 tomcat
    docker pull daocloud.io/library/tomcat:8.5.15-jre8
    
    • 1
    • 2
    • 3
    • 4

    # 2. 查看全部本地的镜像
    docker images
    
    • 1
    • 2

    # 3. 删除本地镜像
    docker rmi 镜像的标识
    
    • 1
    • 2

    # 4. 镜像的导入导出(不规范)
    # 将本地的镜像导出
    docker save -o 导出的路径 镜像id
    # 加载本地的镜像文件
    docker load -i 镜像文件
    # 修改镜像名称
    docker tag 镜像id 新镜像名称:版本
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.5 容器的操作

    # 1. 运行容器
    # 简单操作
    docker run 镜像的标识|镜像名称[tag]
    # 常用的参数
    docker run -d -p  宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[tag]
    # -d: 代表后台运行容器
    # -p: 宿主机端口:容器端口: 为了映射当前Linux的端口和容器的端口
    # --name 容器名称: 指定容器的名称
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    # 2. 查看正在运行的容器
    docker ps [OPTIONS]
    # OPTIONS说明:
    # -a: 代表查看全部的容器,包括没有运行
    # -q: 只查看容器的标识
    # -f: 根据条件过滤显示的内容
    # --format: 指定返回值的模板文件
    # -l: 显示最近创建的容器
    # -n: 列出最近创建的n个容器
    # --no-trunc: 不截断输出
    # -s: 显示总的文件大小
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    # 3. 查看容器的日志
    docker logs -f 容器id
    # -f: 可以滚动查看日志的最后几行
    
    • 1
    • 2
    • 3

    # 4. 进入到容器内部
    docker exec -it 容器id bash
    
    • 1
    • 2

    # 5. 删除容器(删除容器前,需要先停止容器)
    docker stop 容器id
    # 停止指定的容器
    docker stop $(docker ps -qa)
    # 停止全部容器
    docker rm 镜像id
    # 删除指定容器
    docker rm $(docker ps -qa)
    # 删除全部容器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    #6. 启动容器
    docker start 容器id
    
    • 1
    • 2

    三.Docker应用

    3.1 准备SSM工程

    # MySQL数据库的连接用户名和密码改变了,修改db.propreties
    # 项目重新打包
    mvn clean package -DskipTests
    # 项目地址
    链接: https://pan.baidu.com/s/1F4xTLoOFCMb7rl1VUrBASA  密码: bgjw
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.2 准备MySQL容器

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

    3.3 准备Tomcat容器

    # 运行Tomcat容器,在上面容器操作中已经搞定,只需要将SSM项目的war包部署到Tomcat容器内部
    # 可以通过命令将宿主机的内容复制到容器内部
    docker cp 文件名称 容器id:容器内部路径
    # 举个例子
    docker cp ssm.war fe:/usr/local/tomcat/webapps/
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.4数据卷

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

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

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

    # 1. 创建数据卷
    docker volume create 数据卷名称
    # 创建数据卷之后默认会存放在一个目录下 /var/lib/docker/volumes/数据卷名称/_data
    
    • 1
    • 2
    • 3

    # 2. 查看数据卷的详细信息
    docker volume inspect 数据卷名称
    
    • 1
    • 2

    # 3. 查看全部数据卷
    docker volume ls
    
    • 1
    • 2

    # 4. 删除数据卷
    docker volume rm 数据卷名称
    
    • 1
    • 2

    # 5. 应用数据卷
    # 当你映射数据卷时,如果数据卷不存在。Docker会帮你自动创建
    docker run -v 数据卷名称:容器内部路径 镜像id
    # 直接指定一个路径作为数据卷的存放位置。这个路径下是空的。
    docker run -v 路径:容器内部的路径 镜像id
    
    • 1
    • 2
    • 3
    • 4
    • 5

    四.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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    # 2. 将准备好的Dockerfile和相应的文件拖拽到Linux操作系统中,通过Docker的命令制作镜像
    docker build -t 镜像名称:[tag] .
    
    • 1
    • 2

    五.Docker-Compose

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

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

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

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

    5.1 下载Docker-Compose

    # 1. 去Github官网搜索docker-compose,下载1.24.1版本的Docker-Compose
    https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64
    
    # 2. 将下载好的文件拖拽到Linux系统中
    将文件上传到你所使用的服务器或者虚拟机,然后将文件移动到/usr/local
    
    # 3. 需要将Docker-Compose文件的名称修改一下,基于Docker-Compose文件一个可执行的权限
    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=/usr/local/bin:$PATH
    source /etc/profile
    
    # 5. 测试一下
    # 在任意目录下输入docker-compose
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    测试结果

    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        # 映射数据卷
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

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

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

    # 1. 基于docker-compose.yml启动管理的容器
    docker-compose up -d
    
    • 1
    • 2

    # 2. 关闭并删除容器
    docker-compose down
    
    • 1
    • 2

    # 3. 开启 | 关闭 | 重启已经存在的由docker-compose维护的容器
    docker-compose start | stop | restart
    
    • 1
    • 2

    # 4. 查看由docker-compose管理的容器
    docker-compose ps
    
    • 1
    • 2

    # 5. 查看日志
    docker-compose logs -f
    
    • 1
    • 2

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Dockerfile文件

    from daocloud.io/library/tomcat:8.5.15-jre8
    copy ssm.war /usr/local/tomcat/webapps
    
    • 1
    • 2

    # 可以直接启动基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
    dockr-compose up -d
    # 如果自定义镜像不存在,会帮助我们构建出自定义镜像,如果自定义镜像已经存在,会直接运行这个自定义镜像
    # 重新构建的话
    # 重新构建自定义镜像
    docker-compose build
    # 运行前,重新构建
    docker-compose up -d --build
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    六.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服务器

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

    2、安装docker以及docker-compose

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

    vi /etc/ssh/sshd_config
    Port 22 -> 60022
    systemctl restart sshd
    
    • 1
    • 2
    • 3

    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://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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    6.3.2 搭建Gitlab-Runner

    查看资料中的g i t la b-runner文件即可安装


    6.3.3 整合项目入门测试

    1、创建一个maven工程,添加web.xml文件,编写html页面

    2、编写gitlab-ci.yml文件

    stages:
      - test
    
    test:
      stage: test
      script:
        - echo first test ci # 输入的命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3、将maven工程推送到gitlab中

    4、可以在gitlab中查看到gitlab-ci.yml编写的内容

    打开gitlab控制台-左侧CI/CD-流水线-已通过
    
    • 1

    查看


    6.3.4编写.gitlab-ci.yml文件

    1、编写.gitlab-ci.yml测试命令使用

    stages:
      - test
    
    test:
      stage: test
      script:
        - echo first test ci
        - /usr/local/maven/apache-maven-3.6.3/bin/mvn package
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2、编写关于dockerfile以及dock er-compose.yml文件的具体内容

    # 1. Dockerfile
    FROM daocloud.io/library/tomcat:8.5.15-jre8
    COPY testci.war /usr/local/tomcat/webapps
    
    • 1
    • 2
    • 3

    # 2. docker-compose.yml
    version: '3.1'
    services:
      testci:
        build: docker
        restart: always
        container_name: testci
        ports:
        - 8080:8080
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    # 3. ci.yml
    stages:
      - test
    
    test:
      stage: test
      script:
        - echo first test ci
        - /usr/local/maven/apache-maven-3.6.3/bin/mvn package
        - cp target/testci-1.0-SNAPSHOT.war docker/testci.war
        - docker-compose down
        - docker-compose up -d --build
        - docker rmi $(docker images -qf dangling=true)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3、测试

    测试图

    6.4 CD介绍

    CD(持续交付,持续部署)

    6.5 实现持续交付持续部署

    6.5.1 安装Jenkins

    官网:https://www.jenkins.io/

    version: '3.1'
    services:
      jeckins:
        image: jenkins/jenkins
        restart: always
        container_name: jenkins
        ports:
          - 8888:8080
          - 50000:50000
        volumes:
          - ./data:/var/jenkins_home
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    第一次运行时,会因为data目录没有权限,导致启动失败

    chmod 777 data
    
    • 1

    访问http://192.168.199.109:8888

    访问速度奇慢无比。。。。
    
    • 1

    输入密码

    输入密码

    手动指定插件安装:指定下面两个插件即可

    Publish ssh

    git param…

    这里安装过程忘了截图了。。。因为服务器安装的太快,没反应过来

    安装成功后,需要指定用户名和密码

    jenkins控制台


    6.5.2 配置目标服务器以及Gitlab免密码登录

    Gitlab -> Jenkins -> 目标服务器

    1、Jenkins去连接目标服务器

    左侧的系统设置

    image-20201202103359125

    选中系统设置

    image-20201202135154813

    搜索Publish over SSH

    image-20201202135435348

    点击新增

    image-20201202150053909


    6.5.3 配置Gitlab免密码登录

    1、登录Jenkins容器内部

    docker exec -it jenkins bash
    
    • 1

    2、输入生成SSH密钥命令

    ssh-keygen -t rsa -C "邮箱"
    
    • 1

    3、将密钥复制到Gitlab的SSH中

    image-20201202151117361


    6.5.4 配置JDK和Maven

    1、复制本地的jdk和maven的压缩包到data目录下

    2、手动解压

    image-20201202152610797

    3、在监控界面中配置JDK和Maven

    image-20201202152453378


    6.5.5 手动拉取gitlab项目

    使用SSH无密码连接时,第一次连接需要手动确定

    image-20201202153041926


    6.5.6 创建maven任务

    1、创建maven工程,推送到gitlab

    2、jenkins的监控页面中创建maven任务

    image-20201202161727559

    image-20201202161756699

    3、执行maven任务

    image-20201202162242988

    image-20201202162104630

    4、最终效果

    image-20201202165449820

    6.6 实现持续交付持续部署

    1、安装Git Parameter的插件,Persistent Parameter的插件(版本)

    image-20201202165935326

    2、重新制定构建项目的方式

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JmlV9ILd-1606958453454)(/Users/liufei/Library/Application Support/typora-user-images/image-20201202224449925.png)]


    image-20201203000655114

    3、构建项目成功后,需要将内容发布到目标服务器

    image-20201203000749347

    4、修改程序代码,(提交到GitLab仓库中)

    FROM daocloud.io/library/tomcat:8.5.15-jre8
    COPY testcd-1.0-SNAPSHOT.war /usr/local/tomcat/webapps
    
    • 1
    • 2

    version: '3.1'
    services:
      testcd:
        build: docker
        restart: always
        container_name: testcd
        ports:
          - 8081:8080
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5、测试

    1. 给当前代码添加一个标签
    2. 到Jenkins中查看

    image-20201203001600023

    1. 点击上图的开始构建(查看日志)
    2. 去指定的目标服务器中访问具体服务

    结束

    到这里这篇文章就结束了,如果你觉得这篇文章有用的话,请帮忙点个赞!谢谢!!

  • 相关阅读:
    HTML5学习系列之标题和正文、描述性信息
    【Aseprite】制作Unity2D瓦片地图素材(平台游戏)
    个股与指数行情走势对比分析 !股票量化分析工具QTYX-V2.5.2
    【云原生】Docker的数据卷、数据卷容器,容器互联
    OpenHarmony 3.1 Beta 样例:使用分布式菜单创建点餐神器
    【天线】【3】CST一些快捷键
    跨模态检索2023年最新顶会论文汇总
    制定测试计划和测试用例
    音容笑貌,两臻佳妙,人工智能AI换脸(deepfake)技术复刻《卡萨布兰卡》名场面(Python3.10)
    2022年了,零基础转行计算机还可靠么?
  • 原文地址:https://blog.csdn.net/m0_67390379/article/details/126327642