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的思想
- 集装箱
- 会将所有需要的内容放到不同的集装箱中, 谁需要这些环境直接拿到这个集装箱就可以了
- 标准化
- 运输的标准化: Docker有一个码头, 所有上传的集装箱都放在了这个码头上, 当谁需要某一个环境, 就直接派大鲸鱼去搬运这个集装箱
- 命令的标准化: Docker提供了一系列的命令, 帮助我们去获取集装箱
- 提供了REST的API: 衍生出了很多的图形化界面: Rancher
- 隔离性
- 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的中央仓库
Docker官方的中央仓库: 这个仓库是最全的, 但是下载速度较慢
国内的镜像: 网易蜂巢, daoCloud...
- 网易云: https://c.163yun.com/hub#/home ,需要注册
- daoCloud: http://hub.daocloud.io/ , 无需注册[推荐]
在公司内部会采用私服的方式拉取镜像 (需要添加配置)
#需要在/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 引言
- 项目部署
- 将项目通过maven进行编译打包
- 将文件上传到指定的服务器中
- 将war包放到tomcat的目录中
- 通过Dockerfile将Tomcat和war包转成一个镜像, 由DockerCompose去运行容器
- 项目更新了
- 将上述流程再次从头到尾的执行一次
6.2 CI介绍
- CI (continuous intergration) 持续集成
- 持续集成: 编写代码时, 完成了一个功能后, 立即提交代码到Git仓库中, 将项目重新的构建并且测试
- 快速发现错误
- 防止代码偏离主分支
6.3 实现持续集成
6.3.1 搭建Gitlab服务器
- 创建一个全新的虚拟机, 并且至少指定4G的运行内存
- 安装docker以及docker-compose
- 将ssh的默认22端口, 修改为60022端口
vi /etc/ssh/sshd_config
#将#Port 22 改为 Port 60022后保存退出
systemctl restart sshd
#重新启动sshd
- 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的更多相关文章
- Docker常用命令速查手册(华贵铂金版)
原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94 Docker常用命令速查手册 搜索仓库镜像 docker search nginx 获取 ...
随机推荐
- 0基础就可以上手的Spark脚本开发-for Java
前言 最近由于工作需要,要分析大几百G的Nginx日志数据.之前也有过类似的需求,但那个时候数据量不多.一次只有几百兆,或者几个G.因为数据都在Hive里面,当时的做法是:把数据从Hive导到MySQ ...
- 总结vue 需要掌握的知识点
使用的开发工具是webstorm,它是默认就安装好了vuejs插件,idea要使用的话,需要安装一下该插件 一.快速搭建项目vue-cli 脚手架(Vue2.0) 1.Vue CLI使用前提 –Nod ...
- 性能浪费的日志案例和使用Lambda优化日志案例
有些场景的代码执行后,结果不一定会被使用,从而造成性能浪费.而Lambda表达式是延迟执行的,这正好可以作为解决方案,提升性能 性能浪费的日志案例 日志可以帮助我们快速的定位问题,记录程序运行过程中的 ...
- python type 与 metaclass理解
简介 众所周知,type在一般情况下,我们都会去获取一个对象的类型,然后进行类型的比较:除此之外,type还有一个不为人知的作用:动态的创建类.在了解这个之前,首先了解以下type和isinstanc ...
- 如何设计一个分布式 ID 发号器?
大家好,我是树哥. 在复杂的分布式系统中,往往需要对大量的数据和消息进行唯一标识,例如:分库分表的 ID 主键.分布式追踪的请求 ID 等等.于是,设计「分布式 ID 发号器」就成为了一个非常常见的系 ...
- 人工智能不过尔尔,基于Python3深度学习库Keras/TensorFlow打造属于自己的聊天机器人(ChatRobot)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_178 聊天机器人(ChatRobot)的概念我们并不陌生,也许你曾经在百无聊赖之下和Siri打情骂俏过,亦或是闲暇之余与小爱同学谈 ...
- Vue 引出声明周期 && 组件的基本使用
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...
- 红黑树以及JAVA实现(一)
目录 前言 一. B树 1.1 概念 1.2 2-3-4树 1.3 2-3-4树的插入 节点分类 1.4 2-3-4树的删除 1.4.1 当删除节点是叶子节点 1.4.1.1 当删除节点为非2节点 1 ...
- Redis架构之哨兵机制与集群
Redis架构之哨兵机制与集群 哨兵机制 1.介绍: Sentinel(哨兵)是redis高可用性解决方案:由一个或多个由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个 ...
- [网鼎杯 2018]Comment-1|SQL注入|二次注入
1.打开之后只有一个留言页面,很自然的就想到了二次注入得问题,顺带查看了下源代码信息,并没有什么提示,显示界面如下: 2.那先扫描一下目录,同时随便留言一个测试以下,但是显示需要登录,账户.密码给出了 ...