前言
Docker是基于Linux内核实现的, Docker最早采用了LXC技术, LXC是Linux原生支持的容器技术, 可以提供轻量级的虚拟化. Docker基于LXC发展, 提供了LXC的高级封装, 标准的配置方法, 在LXC的基础上, Docker提供了一系列更强大的功能. 而虚拟化技术, 比如KVM, 是基于模块实现, 后来Docker改为自己研发并开源的runc技术运行容器。
Docker 相比虚拟机,其交付速度更快, 资源消耗更低, Docker采用客户端/服务器端架构, 使用远程API来管理和创建容器, 其可以轻松的创建一个轻量级的, 可移植的, 自给自足的容器. Docker的三大理念就是build, ship, run。
Docker通过namespace和cgroup来提供容器的资源隔离与安全保障等, 所以Docker容器在运行时, 不需要类似虚拟机的额外资源开销, 因此可以大幅度提供资源利用率
优点:
资源利用率更高: 开销更小, 不需要启动单独的虚拟机OS内核占用硬件资源, 可 以将服务器性能压榨至极致. 虚拟机一般会有5-20%的损耗, 容器运行基本无损耗, 所以生产中一台物理机只能运行数十个虚拟机, 但是一般可以运行数百个容器
启动速度更快: 可以在数秒内完成启动
占用空间更小: 容器一般占用的磁盘空间以MB为单位, 而虚拟机即使是最小化安装也要占1个G多的空间
集成性更好: 和CI/CD相关技术结合性更好, 实现打包镜像发布测试可以一键运行, 做到自动化并快速的部署管理, 实现高效的开发生命周期
缺点:
隔离性: 多个容器共用宿主机的内核, 各应用之间的隔离不如虚拟机彻底
一. linux docker安装
1. 准备工作
# 查看服务器系统版本或者内核版本
cat /etc/redhat-release
# 查看服务器内核版本
uname -r
2. 安装依赖环境
yum install -y yum-utils device-mapper-persistent-data lvm2
3. 添加docker-ce镜像源
# 镜像源是阿里镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4. 安装docker
Docker从17.03版本之后分为两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。
企业版包含了一些收费服务,个人开发者一般用不到,所以我们只需要安装社区版docker-ce版本即可。
yum install -y docker-ce
5. 启动docker,并查看docker的版本信息
#启动docker命令
systemctl start docker
#查看docker版本命令
docker version
6. 配置docker daemon.json文件
# 配置文件的默认路径:/etc/docker/daemon.json
vi /etc/docker/daemon.json
{
# 镜像源管理,我增加了阿里镜像源,可以提速
"registry-mirrors": [
"https://jkfdsf2u.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http//hub-mirror.c.163.com"
],
#docker私服配置,因为不是https链接,所以在此配置
"insecure-registries": ["harbor.test.com","registry.cn-shenzhen.aliyuncs.com"] ,
#日志最大存储限制,如果不配置它,可能会导致/var/lib/docker/tmp/containers目录中的容器日志过大,挤占系统盘空间。
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "10"
}
#Docker运行时使用的根路径,默认 "/var/lib/docker"
"data-root": "/data/docker",
# 设定容器DNS的地址,在容器的 /etc/resolv.conf文件中可查看
"dns": ["192.168.1.1"],
}
7. 重载daemon文件
sudo systemctl daemon-reload
# 重启docker服务
sudo systemctl restart docker
二. docker介绍
1. 仓库 (repository)
docker仓库是用来保存镜像的地方。镜像构建完成后,可以直接在当前宿主机上运行,但是如果需要在其它服务器上使用这个镜像,
就需要一个集中存储、分发镜像的服务,docker仓库就是这样的一个服务。
2. 镜像(Image)
这里面保存了应用和需要的依赖环境,比如运行的runtime和webapp等。
为什么需要多个镜像?当开发、构建和运行容器化应用程序时,我们通常会有不同优先级。通过为这些独立的任务提供不同镜像
3. 容器(Container)
镜像的实例。一个容器代表一个正在运行的应用程序、进程或服务。它由 Docker 镜像、执行环境和标准指令集组成。需要扩展服务时,才
真正将镜像跑起来的东西,镜像在容器里面。可以看作是一个完全隔离的盒子。一个容器镜像实例代表一个独立的进程。
4. Docker常用命令
4.1 镜像相关
docker search --镜像名[:版本号] # 搜索仓库镜像
docker pull --镜像文件名|ID # 拉取镜像
docker push 镜像文件名 # 把docker长传到docker仓库,前提是有docker hub账号
docker rmi images_id/images_name # 删除镜像文件
docker save -o 路径/xxx.tar 镜像名 # 打包本地的镜像文件,并到处到linux 目录下,用于备份或者备份
docker load --input xxxx.tar # 导入tar文件到本地的镜像库
docker commit -p -a "作者名" -m "镜像的简介" container_id/container_name image_name:tag # 提交镜像文件
docker ps # 查看目前正在运行的所有容器 (-a 显示包括已经停止的容器)
docker rmi image_id/image_name # 删除镜像
docker build # 使用Dockerfile创建镜像
4.2 容器相关
docker run container_id/container_name # 运行容器
docker exec -it container_id/container_name /bin/bash # 进入容器中执行命令, /bin/bash 为脚本解释器
exit # 退出容器
docker cp 宿主路径 容器名[|容器id]:容器路径 # 将宿主的文件拷贝到容器中
docker export -o xxxx.tar container_name # 把容器打包成tar包
docker import xxxx.tar usename/程序名:tag # 把上一步的tar包,导入成镜像文件
docker logs container_id/container_name # 查看容器日志(例如:docker logs -f -t --tail 10 container_id )
docker start container_id/container_name # 启动容器
docker restart container_id/container_name # 重启容器
docker stop container_id/container_name # 停止容器
docker rm [-f] container_id/container_name # 删除容器(只能删除已停止的容器)
四. 使用docker安装部署应用
1. 部署mysql
1.1 搜索mysql镜像文件
docker search mysql:5.7 # 搜索mysql v5.7.xx版本的镜像信息
1.2 拉取镜像文件
docker pull idyci/mysql # idycu/mysql为镜像名称,idycu镜像是创建人的名称
docker images # 查看docker本地的镜像
1.3 启动mysql容器
docker run -d -p 3308:3306 --restart=always --name mysql57 --privileged=true -e MYSQL_ROOT_PASSWORD='123321' idyci/mysql
# 查看镜像的运行状态
docker ps -a # 查看所有的镜像状态,包括关闭的
-it 输出容器命令行的内容 即容器的自身的程序输出在控制台 有点类似前台运行
-d 和it相反 隐藏后台运行
-p 端口映射 3308:3306 外部(宿主机)端口:镜像里面运行的端口 将宿主机9000端口映射到镜像里面的9000端口
--restart 重启方式:always跟随docker自启
--name 启动后的容器名称
-v 挂载容器数据卷
--network 连接到某个网络(例如:--network test_net)
--network-alias 容器的网络名称(例如:--network-alias portainer)
--privileged=true 进入容器使用root权限
-e MYSQL_ROOT_PASSWORD='123321' 密码
镜像文件名:一般放在指令的最后,要和本地镜像仓库的名字一致,这里可以填写镜像ID
1.4 查看镜像是否启动成功
docker ps -a
1.5 在Navicat中导入项目所用数据库
-- 1. 创建数据库
create database [if not exists] 项目规定的数据库名 character set utf8;
-- 2 导入文件
-- 2.1 进入创建的数据库
use <dbname>
-- 导入项目sql文件
source 本地sql文件的路径
-- 2.2 或者在终端中,直接导入,前提是数据库中已经创建好了数据库
mysql -u 用户名 -p -h <ip地址> -P <端口号> 数据库名 < 存放位置
-- 到处sql文件
-- mysqldump -u 用户名 -p -h <ip地址> -P <端口号> 数据库名 > 存放位置
2. 部署tomcat项目
2.1 搜索tomcat镜像文件
docker search tomcat # 注意查看JDK的版本
2.2 拉取tomcat镜像文件
docker pull rightctrl/tomcat
2.3 启动tomcat容器
# 1. 先启动tomcat容器
docker run -d --name tomcat -p 8090:8080 image_id
# 2. 查看logs日志,找到 CATALINA_HOME的路径,例:/opt/tomcat
docker logs image_id
# 3. 删除tomcat容器
docker rm -f tomcat
# 4. 重新启动tomcat容器
mkdir -p /mnt/tomcat/webapps
mkdir /mnt/tomcat/logs
docker run -d --name tomcat -p 8090:8080 -v /mnt/tomcat/webapps:/opt/tomcat/webapps -v /mnt/tomcat/logs:/opt/tomcat/logs iamge_id
docker run -d --name tomcat -p 8090:8080 -v 宿主目录:容器目录
[-v 宿主目录:容器目录] 镜像名/镜像id
-v: 挂载目录,例如把容器中tomcat的webapps和其它需要操作的目录/文件 挂载到本地目录下
2.4 将项目的war包不是到tomcat中
# 1. 将war包部复制到本地的/mnt/tomcat/webapps中
cp war包的路径 /mnt/tomcat/webapps
# 2. 修改war包下的WEB-INF中的 db.properties的mysql配置,前提是mysql数据库文件已经导入进数据库了
vi db.properties路径 # 主要修改url和password,因为是容器的配置,不能使用localhost,必须是ip地址
# 3. 重启tomcat容器
docker restart tomcat
# 4. 查看镜像是否启动成功
docker ps -a