Docker 入门

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 有关docker的介绍啊,为什么 要使用docker啊这些就不说了,因为当你点开这篇作文的时候,你自己心里已经有了...
    叶同学阅读 8,196评论 6 15
  • docker这几年越来越热,大家肯定都听说过, 今天就来聊下docker到底是啥,docker为什么能这么流行,它...
    ytfrank阅读 296评论 0 0
  • 一 颜府的正殿今儿个收到了一大堆贺礼。 这贺礼当然不是为我而贺,自然是为了我那才貌双绝的姐姐而来。前几日是石城三年...
    大小姐玫瑰阅读 432评论 0 6
  • 文/西西 枣花已谢 村南村北 春水涨,秋叶落 亲爱的妈妈 你在山的那边 海的那边 还好吗 我数着日子 过着春夏 草...
    花语清溪阅读 236评论 4 8
  • 我是一个90后。 “90后”这个词,在我心里一直是一个很普通的词汇,直到我有一天步入职场 才知道,原来“90”后...
    拙武阅读 5,026评论 0 2