1. 简介
Docker整个体系类似于手机系统,应用与主机、应用之间都是相互隔离,采用沙盒模式运行,一键式安装和卸载;
"主机"提供基础服务给应用调用,对指定的"应用"可额外开放特定的目录,或者给与其"主机"的全部权限;
"应用"之间通过tcp/ip等通信协议相互沟通,也可以基于共享的文件达到数据交互;
2. 基本部件
"仓库"用于存放"镜像",有公有和私有,可以在"主机"中指定使用的"仓库"地址,或者在获取"镜像"时明确指定来源;
"镜像"是一些应用的打包模板,包含了运行必须的依赖,基本的配置等等;
"容器"是通过"镜像"添加一些运行时配置生成;
同一个应用会有多种多样的"镜像",用于不同的环境;
3. 镜像与容器
"镜像"都是基于另一个"镜像"包装而成,官方提供了一个Base Image,其他的"镜像"都是在它的基础一层层包裹而成;
"容器"之间基于通讯协议可以相互调用,只要不冲突,一个"容器"可以多个其他"容器"调用;
"容器"之间也可以通过主机的"共享文件"进行数据交互;
"容器"自身也可以选择共享内部的文件,让其他"容器"访问;
4. Docker集成功能
Docker-machine : 创建Docker虚拟机(适配不同的操作系统和虚拟设备)
需要注意的是docker创建的VM是只读的,VM里的硬盘操作在VM重启后不会保留,但镜像和容器会存在硬盘里
Dockerfile : 脚本化创建镜像
Docker-compose:脚本化批量创建容器
1. 运行环境
Docker体系是依托于linux系统;
对于windows/mac os 都只能通过连接本地虚拟机或者远端服务器实现Docker;
2. windows
安装 VirtualBox 4.3.12 (本机已经安装过其他版本的请先全部卸载干净,包括已经创建好的虚拟机一起删除);
安装 DockerToolbox (可选功能:Docker Compose,Git)
运行 Docker Quickstart Terminal,耐心等待,看到下面这条鲸鱼说明安装没问题,打开Oracle VM VirtualBox也能看到多了一个"default"的虚拟机
3. 安装问题
windows主机和CPU都必须是64位的
BIOS启用虚拟化支持
CPU必须支持虚拟
VirtualBox不兼容(右键属性->兼容性->windows 2008 、管理员身份运行)
win7 主题破解还原
4.3.12 之后的版本增加了安全检查机制(所以还是老老实实用4.3.12版本)
cannot access the kernel driver ( C:\Program Files\Oracle\VirtualBox\drivers\vboxdrv\VBoxDrv.inf 安装)
1 创建docker vm
显示vm列表 -- docker-machine ls
PS : docker默认会创建一个'default'的虚拟机,可以从URL中看到它的ip为'192.168.99.100',也可以通过docker-machine ip default查询;
创建VM -- docker-machine create --driver virtualbox my-test
等待执行完成
显示vm列表 -- docker-machine ls
'my-test'的IP为'192.168.99.101'
1.1 修改VM共享文件夹
开打VM virtualBox查看my-test的设置,Docker-machine默认的共享文件夹是c:\Users,在VM内部操作时会有权限问题
双击打开修改路径,注意共享文件夹名称不要修改
在控制台中重启VM -- docker-machine restart my-test
2 连接docker vm
2.1 Docker Quickstart Terminal 直接操作
查看虚拟机环境 -- docker-machine env my-test
切换虚拟机环境(使用上面所显示的命令)-- eval $("E:\Docker Toolbox\docker-machine.exe" env my-test)
查看主机docker信息 -- docker info
2.2 Docker Quickstart Terminal SSH虚拟机
ssh vm -- docker-machine ssh my-test
2.3 shell工具SSH虚拟机
IP : 192.168.99.101
user : docker
password : tcuser
3 安装docker-compose
docker-machine创建的vm的docker环境只包含了docker本身,并未集成其他的功能,如果想使用docker-compose则需要自己安装:
切换root用户 -- sudo -i
下载compose组件
-- curl -L
https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname
-s`-`uname -m` > /usr/local/bin/docker-compose
开放权限 -- chmod +x /usr/local/bin/docker-compose
PS : 国内下载compose组件可能有有点慢,耐心等待...
1 目标
建设Tomcat + jre + mysql 的运行环境,部署一个web项目
PS : 后续可以加入 nignx、redis、zookeeper等其他环境
2 准备
2.1 容器划分
Docker的容器组合方式很自由:
一个容器:[Tomcat + jre + mysql + webapp]
两个容器:[Tomcat + jre + webapp]、[mysql]
三个容器:[Tomcat + jre]、[webapp]、[mysql]
PS : 创建一个容器数据卷用于存放webapp的源码
这里使用 '两个容器' 的方案
2.2 下载镜像
我们需要下载Tomcat和mysql两个镜像,如果你不清楚docker公共仓库上有哪些镜像可以进行搜索
搜索mysql相关镜像 -- docker search mysql
下载mysql指定版本镜像 -- docker pull mysql:5.7
下载tomcat指定版本的镜像 -- docker pull tomcat:7.0
PS: 如果需要下载最新的版本则用 docker pull mysql
查看已下载的镜像 -- docker images
如果你和我一样是从公共仓库下载的Tomcat镜像,则不需要自己去安装jre,默认已经集成了,可以通过镜像信息查看:
查看镜像详细信息 -- docker inspect tomcat:7.0
2.2.1 从私有仓库下载镜像
下载私有仓库mysql镜像 -- docker pull index.alauda.cn/sameersbn/mysql
PS : 需要注意的是私有仓库的镜像不一定会与公共仓库完全一致,集成的组件可能有所不同,基础的系统也有可能不同
2.2.2 镜像的导入和导出
导出镜像 -- sudo docker save mysql > /c/Users/export/mysql.tar
导入镜像 -- docker load < /c/Users/export/mysql.tar
PS : 通过virtualbox共享文件夹拷贝
3 创建mysql容器
目标:
1). 启动mysql数据库,端口3306
2). root密码root
3). 创建test库,user表,初始化4条记录
1-init_table.sql
CREATE DATABASE IF NOT EXISTS `test`;
USE `test`;
CREATE TABLE `user` (
`id` VARCHAR(20) NOT NULL COMMENT '用户ID',
`name` VARCHAR(50) NOT NULL COMMENT '姓名'
)
COMMENT='用户表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
2-data.sql
USE `test`;
INSERT INTO `user` (`id`, `name`) VALUES ('1', 'u1');
INSERT INTO `user` (`id`, `name`) VALUES ('2', 'u2');
INSERT INTO `user` (`id`, `name`) VALUES ('3', 'u3');
INSERT INTO `user` (`id`, `name`) VALUES ('4', 'u4');
3.1 通过mysql控制台初始化数据
创建共享文件夹 -- mkdir -p /opt/tool/webapp
创建并启动(后台)mysql容器(设置端口、root密码、数据存储)
-- docker run -d --name mywebsql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -v /opt/tool/webapp/data:/var/lib/mysql mysql:5.7
PS : mysql所有的数据都存储在/opt/tool/webapp/data中,数据是可以脱离 ' 容器 ' 存在,也可以被共享。
查看启动的容器 -- docker ps
进入mysql容器的控制终端(只在容器启动状态才能使用) -- docker exec -it mywebsql /bin/bash
PS : 这里是默认以root用户进入mysql容器,默认用户在'mysql镜像'配置。如果需要以其他用户进,可以通过docker run -u otheruser ...
登录mysql -- mysql -u root -p
执行sql脚本
退出mysql -- exit
退出容器 -- exit
3.2 通过mysql镜像脚本初始化数据
初始化sql脚本放入 /opt/tool/webapp/sql
创建并启动(后台)mysql容器(设置端口、root密码、数据存储、初始化sql目录)
-- docker run -d --name mywebsql2 -p 5506:3306 -e MYSQL_ROOT_PASSWORD=root -v /opt/tool/webapp/sql:/docker-entrypoint-initdb.d \
-v /opt/tool/webapp/data2:/var/lib/mysql mysql:5.7
PS : 修改name、端口和数据卷路径
进入mysql容器的控制终端 -- docker exec -it mywebsql2 /bin/bash
登录mysql -- mysql -u root -p
查询user表 -- select * from test.user;
4 创建Tomcat容器
目标:
1). 启动Tomcat,端口8080
2). 部署web项目 -- myweb
3). 连接mysql容器
4.1 准备
把myweb项目的war包解压至共享文件夹中 :
1). war包拷入VirtualBox设置的共享文件夹(注意共享文件夹只会同步文件,内容修改不同步)
2). mkdir -p /opt/tool/webapp/myweb
3). unzip -o /c/Users/export/myweb.war -d /opt/tool/webapp/myweb
PS : 公共仓库的Tomcat镜像无法识别war包
注意修改项目的数据库的配置 :
db.jdbcUrl=jdbc:mysql://mywebsql:3306/test
db.user=root
db.password=root
PS : 使用mywebsql作为数据库的主机(后面tomcat容器启动时需要使用)
修改Tomcat的server.xml放入共享文件夹中 (/opt/tool/webapp/server.xml)
4.2 启动
创建并启动mysql容器(设置端口、数据卷、绑定mysql)
-- docker run -d --privileged=true --name myweb -p 6060:8080 \
--link mywebsql:mywebsql \
-v /opt/tool/webapp:/opt/tool/webapp tomcat:7.0
PS:
Tomcat 配置的端口是8080,希望访问的url是192.168.99.101:6060,所以端口映射是6060 到 8080;
mywebsql是容器连接的别名,在Tomcat容器内mywebsql就指向Mysql容器;
查看启动日志 -- docker logs -f myweb
查看java -- docker exec myweb whereis java / docker exec myweb which java
进入Tomcat容器控制终端 -- docker exec -it myweb /bin/bash
查看Tomcat目录 -- ls
把web项目拷入Tomcat的工作目录 -- cp -rf /opt/tool/webapp/myweb /usr/local/tomcat/webapps/
把Server.xml拷入Tomcat的conf目录 -- cp -rf /opt/tool/webapp/server.xml /usr/local/tomcat/conf/
退出容器终端 -- exit
重启容器 -- docker restart myweb
PS:遇到问题Tomcat容器无法启动,则进入目录/var/lib/docker/aufs/diff/相应容器的ID的文件夹直接修改内容(sudo -i),1.10后不再默认支持,需要取消启用AUFS文件系统
浏览器访问
1 容器备份迁移
1.1 转成镜像导出
提交容器‘myweb’的变更,创建新的镜像‘myweb:1’
docker commit myweb myweb:1
可以通过该镜像启动新的容器 ,myweb2包含了myweb的修改(server.xml和web项目代码)
docker run -d --name myweb2 -p 5050:8080 --link mywebsql:mywebsql
若要跨主机迁移,可以直接导出镜像
sudo docker save myweb:1 > /c/Users/export/myweb.tar
1.2 导出容器
2 Docker-Machine
3 Docker-Compose
4 Dockerfile