一、引言
1.1 环境不一致
我本地运行没问题啊:由于环境不一致,导致相同的程序,运行结果却不一致。
1.2 隔离性
哪个哥们又写死循环了,怎么这么卡:在多用户的操作系统下,会因为其他用户的操作失误影响到你自己编些的程序。
1.3 弹性伸缩
淘宝在双11的时候,用户量暴增:需要很多很多的运维人员去增加部署的服务器,运维成本过高的问题。
1.4 学习成本
学习一门技术,得先安装啊:学习每一门技术都要先安装响应的软件,但是还有他所依赖的各种环境,安装软件成本快高过学习成本啦。
二、Docker介绍
2.1 Docker的由来
一帮年轻人创业,创办了一家公司,2010年的专门做PAAS平台。但是到了2013年的时候,像亚马逊,微软,Google都开始做PAAS平台。到了2013年,公司资金链断裂,不得不倒闭,于是将公司内的核心技术对外开源,核心技术就是Docker。由于开源了Docker,到了2014年的时候,得到了C轮的融资 $4000W,2015年的时候,得到了D轮的融资.$9500W。于是公司开始全神贯注的维护Docker。
Docker主要作者-所罗门 |
---|
Docker的作者已经离开了维护Docker的团队 |
---|
2.2 Docker的思想
集装箱:会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了。
标准化:
运输的标准化:Docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接指派大海疼去搬运这个集装箱就可以了。
命令的标准化:Docker提供了一些列的命令,帮助我们去获取集装箱等等操作。
提供了REST的API:衍生出了很多的图形化界面,Rancher。
隔离性:Docker在运行集装箱内的内容时,会在Linux的内核中,单独的开辟一片空间,这片空间不会影响到其他程序。
中央仓库|注册中心:超级码头,上面放的就是集装箱
镜像:就是集装箱
容器:运行起来的镜像
三、Docker的安装
前提条件:
一定要
1.访问外网 ping www.baidu.com
查看网络
2.关闭防火墙(linux )
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
3.1 下载Docker依赖的环境
想安装Docker,需要先将依赖的环境全部下载,就像Maven依赖JDK一样
yum -y install yum-utils device-mapper-persistent-data lvm2
3.2 指定Docker镜像源
默认下载Docker回去国外服务器下载,速度较慢,我们可以设置为阿里云镜像源,速度更快
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.3 安装Docker
依然采用yum的方式安装
yum makecache fast
yum -y install docker-ce
3.4 启动Docker并测试
安装成功后,需要手动启动,设置为开机自启,并测试一下Docker
# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
# 测试
docker run hello-world
四、Docker的中央仓库【重点
】
Docker官方的中央仓库:这个仓库是镜像最全的,但是下载速度较慢。
国内的镜像网站:网易蜂巢,daoCloud等,下载速度快,但是镜像相对不全。
Hub · DaoCloud (推荐使用)
在公司内部会采用私服的方式拉取镜像,需要添加配置,
drocker配置阿里云镜像
#创建一个文件夹
sudo mkdir -p /etc/docker
# 将 阿里云的 镜像配置写到 daemon.json
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://66zydtxx.mirror.aliyuncs.com"]
}
EOF
# 重置
sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker
五、镜像的操作【重点
】
5.1 拉取镜像
从中央仓库拉取镜像到本地
docker pull 镜像名称[:tag]
# 举个栗子:
docker pull daocloud.io/library/tomcat:8.5.15-jre8
5.2 查看本地全部镜像
查看本地已经安装过的镜像信息,包含标识,名称,版本,更新时间,大小
docker images
5.3 删除本地镜像
镜像会占用磁盘空间,可以直接手动删除,表示通过查看获取
docker rmi 镜像的标识
可以看到没办法删除正在运行中的镜像
这时候可以使用强制删除
删除运行中的镜像
[root@qianwz ~]# docker rmi -f feb5d9fea6a5
再查看存在的镜像发现已经没了
5.4 镜像的导入导出
如果因为网络原因可以通过硬盘的方式传输镜像,虽然不规范,但是有效,但是这种方式导出的镜像名称和版本都是null,需要手动修改
# 将本地的镜像导出
docker save -o 导出的路径 镜像id
# 加载本地的镜像文件
docker load -i 镜像文件
docker load -i /root/images/hello-world.tar.gz
可以先讲之前的镜像文件删除,然后在重新加载
# 镜像名称
docker tag 镜像id 新镜像名称:版本
docker tag bf756fb1ae65 hello-world:v1
六、容器操作【重点
】
6.1 运行容器
运行容器需要制定具体镜像,如果镜像不存在,会直接下载
# 简单操作
docker run 镜像的标识|镜像名称[:tag]
# 常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
# -d:代表后台运行容器
# -p 宿主机端口:容器端口:为了映射当前Linux的端口和容器的端口
# --name 容器名称:指定容器的名称
docker run --name tomcat -p 8089:8080 -d daocloud.io/library/tomcat:8.5.15-jre8
6.2 查看正在运行的容器
查看全部正在运行的容器信息
docker ps [-qa]
docker ps -a:查看全部的容器,包括没有运行
docker ps -q:只查看在运行容器的标识
查看所有的容器的标识号
docker ps -qa
6.3 查看容器日志
查看容器日志,以查看容器运行的信息
docker logs 标识号
这个只是显示最近的日志文件
docker logs -f 容器id
# -f:可以滚动查看日志的最后几行
这是最后几行日志,如果有新的日志产生就会显示出来,也就是即使更新
6.4 进入容器内容部
可以进入容器内部进行操作
docker exec -it 容器id bash
exit
退出操作
6.5 复制内容到容器
将宿主机的文件复制到容器内部的指定目录
docker cp 文件名称 容器id:容器内部路径
[root@qianwz ~]# docker cp a.txt dda1b82eb269:usr/local/tomcat/
6.6 重启&启动&停止&删除容器
容器的启动,停止,删除等操作,后续经常会使用到
# 重新启动容器
docker restart 容器id
# 停止指定的容器(删除容器前,需要先停止容器)
docker stop 容器id
# 启动停止运行的容器
docker start 容器id
# 停止全部容器
docker stop $(docker ps -qa)
(docker ps -qa 是获取所有的容器标识)
# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)
#删除运行中的容器
docker rm -f 7dc71755d22c
七、Docker应用
7.1 Docker安装Tomcat
运行Tomcat容器,为部署SSM工程做准备
docker run -d -p 8080:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
7.2 Docker安装MySQL
运行MySQL容器,为部署SSM工程做准备
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4
7.3 部署SSM工程
修改SSM工程环境,设置为Linux中Docker容器的信息
通过Maven的package重新打成war包
讲Windows下的war包复制到Linux中
通过docker命令将宿主机的war包复制到容器内部
测试访问SSM工程
八、数据卷【重点
】
为了部署SSM的工程,需要使用到cp的命令将宿主机内的ssm.war文件复制到容器内部。
数据卷:将宿主机的一个目录映射到容器的一个目录中。
可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着一起改变。
8.1 创建数据卷
创建数据卷之后,默认会存放在一个目录下 /var/lib/docker/volumes/数据卷名称/_data
docker volume create 数据卷名称
docker volume create vdata1
8.2 查看数据卷详情
查看数据卷的详细信息,可以查询到存放路径,创建时间等等
docker volume inspect 数据卷名称
docker volume inspect vdata1
8.3 查看全部数据卷
查看全部数据卷信息
docker volume ls
8.4 删除数据卷
删除指定数据卷
docker volume rm 数据卷名称
8.5 容器映射数据卷
映射有两种方式:
通过数据卷名称映射,如果数据卷不存在。Docker会帮你自动创建,会将容器内部自带的文件,存储在默认的存放路径中。
通过路径映射数据卷,直接指定一个路径作为数据卷的存放位置。但是这个路径下是空的。
# 通过数据卷名称映射
docker run -v 数据卷名称:容器内部的路径 镜像id
-d 后台运行
-p 端口映射
--name
docker run -v vdata1:/usr/local/tomcat/conf -d -p 8089:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
#可以去vdata1 查看文件是否同步
cd /var/lib/docker/volumes/vdata1/_data
可以看到这就是tomcat中conf文件中的内容
在容器中新添加一个hello.txt 文件,在数据卷文件中也会出现
# 通过路径映射数据卷
docker run -v 路径:容器内部的路径 镜像id
centos7 中禁止直接挂在文件,需要时需放开权限,并重启docker
[root@localhost ~]# chcon -Rt svirt_sandbox_file_t /tmp/conf
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker run -it -v /tmp/conf:/soft centos /bin/bash
十. Docker-Compose【重点
】
之前运行一个镜像,需要添加大量的参数,可以通过Docker-Compose编写这些参数。而且Docker-Compose可以帮助我们批量的管理容器。这些信息只需要通过一个docker-compose.yml文件去维护即可。
10.1 下载并安装Docker-Compose
10.1.1 下载Docker-Compose
去github官网搜索docker-compose,下载1.24.1版本的Docker-Compose
下载路径:https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64
10.1.2 设置权限
需要将DockerCompose文件的名称修改一下,给予DockerCompose文件一个可执行的权限
mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-compose
10.1.3 配置环境变量
方便后期操作,配置一个环境变量
将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
10.1.4 测试
新建一个文件夹
[root@qianwz ~]# mkdir docker-com
[root@qianwz ~]# cd docker-com
10.2 Docker-Compose管理MySQL和Tomcat容器
yml文件以key: value方式来指定配置信息
多个配置信息以换行+缩进的方式来区分
在docker-compose.yml文件中,不要使用制表符
输入
[root@qianwz docker-com]# vim docker-compose.yaml
讲下面的信息复制上
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.15-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
10.3 使用docker-compose命令管理容器
在使用docker-compose的命令时 ,默认会在当前目录下找docker-compose.yml文件
注意可能有其他容器或者本地的端口号占用导致启动失败,这时候可以修改端口号或者清理掉之前的重复的容器,同时如果是阿里云的话需要更改安全组
# 1. 基于docker-compose.yml启动管理的容器
docker-compose up // 前台运行
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
运行之后如下:
可以测试一下 看的到可以连接