一. 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

2_Docker的更多相关文章

  1. Docker常用命令速查手册(华贵铂金版)

    原创声明:作者:Arnold.zhao  博客园地址:https://www.cnblogs.com/zh94 Docker常用命令速查手册 搜索仓库镜像 docker search nginx 获取 ...

随机推荐

  1. 常见加密算法C#实现(一)

    前言:最近项目中需要用到字符串加解密,遂研究了一波,发现密码学真的是博大精深,好多算法的设计都相当巧妙,学到了不少东西,在这里做个小小的总结,方便后续查阅. 文中关键词: 明文(P,Plaintext ...

  2. go-zero单体服务使用泛型简化注册Handler路由

    一.Golang环境安装及配置Go Module https://go-zero.dev/cn/docs/prepare/golang-install mac OS安装Go# 下载并安装Go for ...

  3. HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界

    从单声道.立体声.环绕声发展到三维声,音频回放技术的迭代演进是为了还原真实世界的声音.其中,三维声技术使用信号处理的方法对到达两耳的声音信号进行模拟,将声场还原为三维空间,更接近真实世界.凭借这个技术 ...

  4. JavaWeb--基本概念、Web服务器与Tomcat

    前言 Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件. 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会 ...

  5. LyScript 内存交换与差异对比

    LyScript 针对内存读写函数的封装功能并不多,只提供了内存读取和内存写入函数的封装,本篇文章将继续对API进行封装,实现一些在软件逆向分析中非常实用的功能,例如内存交换,内存区域对比,磁盘与内存 ...

  6. MySQL 数据查询语句

    一般查询 字段取别名 别名不用加单引号,as 可省略. select t.id ID, t.name 名称 from grade t; 拼接字符串 concat(a, b) select concat ...

  7. QtCreator像C# region一样折叠代码

    C# #region "comment" [code] #endregion 就可以在VS中实现代码折叠了 QtCreator #pragma region "comme ...

  8. CF-1623C

    Problem - 1623C - Codeforces 题意: 给出一个序列,从第三个数字开始,你可以让他减少3*d,然后让它的前两个数字,分别加2*d,和d,找出序列中的最小值的最大值. 题解: ...

  9. C语言小游戏: 推箱子 支线(一)--1

    好家伙,考完试了 回顾一下2021 回顾一下某次的作业 妙啊 所以, 做一个推箱子小游戏 1.先去4399找一下关卡灵感 就它了 2.在百度上搜几篇推箱子, 参考其中的"■ ☆"图 ...

  10. flutter系列之:UI layout简介

    目录 简介 flutter中layout的分类 常用layout举例 总结 简介 对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了.布局的英文名叫做layout,就是用来 ...