慕课网--docker走进第一个javaweb应用
zh
docker镜像就是一系列文件的集合
docker 容器就是一个进程。将docker镜像运行起来就是一个docker容器
docker仓库就是存储docker镜像的
1、docker的安装
docker是什么?
docker是一种容器技术。
通过docker,可以将应用和开发环境打包成镜像,只要部署环境安装了docker,就可以通过简单的命令,部署镜像,不用再安装一系列复杂的软件环境(数据库、redis缓存等),从而简化了部署的过程。
docker使用go语言开发,并且运行在linux系统下,而如果想用window运行,只能在window基础上先运行一个linux虚拟机,然后再在这个linux虚拟机下运行docker。
window安装docker的原理,就是在系统里安装了一个隐式的linux虚拟机,然后在这个虚拟机里安装了docker服务。下面介绍如何在window环境安装docker。我的系统的win7,就以win7为例了。
安装环境
我本机的配置情况:win7-64位操作系统、内存16G、处理器intel(R) Core(TM) i5-6500 CPU(4核)
安装步骤
win7系统对应的docker安装包,推荐使用 Docker Toolbox 。
1.下载Docker Toolbox 安装包
官方下载地址:https://github.com/boot2docker/windows-installer/releases(这个地址国内下载很慢)
国内下载地址:
https://get.daocloud.io/toolbox/ 或者
http://get.daocloud.io/#install-docker-for-mac-windows
这里下载的是DockerToolbox-17.06.0a-ce.exe版本,最新的18 19版本在win7上安装会出现问题
下载完成之后一直安装注意:安装路径千万不要有中文!!!!
上面的都要勾选上
这里需要勾选始终信任
安装完成之后我们点击桌面上的Docker Quickstart Terminal
由于第一次运行,需要加载一些配置,耗费很长时间创建docker虚拟机,需要自动执行脚本获取boot2docker.iso,但是网络很差,我们自行去下载boot2docker.iso
提示说boot2docker.iso已经过期
解决办法:通过下载、拷贝最新版本的boot2docker.iso文件,放到安装目录和缓存目录下,可以解决此问题。
注意事项:在网上找的文章仅提到拷贝到本地缓存目录(C:\Users\admin.docker\machine\cache\)下,导致无法解决问题。
下载最新的版的boot2docker.iso镜像, 官方下载地址:https://github.com/boot2docker/boot2docker/releases
拷贝到本地缓存目录(C:\Users\admin.docker\machine\cache\)下,
并拷贝到本地的安装目录(C:\Program Files\Docker Toolbox)下,
再次运行-Docker 再次运行-Docker Quickstart Terminal终端控制台,
已经能够正常创建default虚拟机了。
这样整个docker就已经安装成功了,运行docker version 可以看到当前docker的版本信息
3。linux上安装docker
操作系统要求64位的
4、接下来进行docker,创建docker的第一个镜像
docker pull从仓库拉去docker的镜像
docker images 查看本机有哪些docker的镜像
镜像下载完成之后,需要将镜像运行起来,形成一个容器
docker client 发生一条信息给docker daemon ,消息是 docker pull hello-world,docker daemon首先在本地检查hello-wordl的镜像是否存在,如果不存在会到docker仓库去下载对于的镜像
docker client 发生一条信息给docker daemon ,消息是 docker run hello-world,docker daemon首先在本地检查hello-wordl的镜像是否存在,如果不存在会到docker仓库去下载对于的镜像,
接下来docker daemon 会将镜像运行起来
2、接下来docker允许nginx的镜像
我们进入到网易蜂巢的镜像中心下载对应的nginx的镜像
docker pull hub.c.163.com/library/nginx:latest 从网易蜂巢下载最新的docker镜像
docker images查看本地仓库存在哪些镜像
docker run hub.c.163.com/library/nginx 运行nginx的镜像
我们运行之后看到窗口没有反映,我们可以新打开一个Docker Quickstart Terminal窗口,在新窗口中使用docker ps查看当前运行了哪些docker容器
这样说明nginx已经启动了,但是这样nginx是在前台运行,把Terminal窗口关闭了对应的nginx就停止了
我们要后台启动nginx 加上-d命令
docker run -d hub.c.163.com/library/nginx
5e3a9539b69aad09b4a98e79b45e34866d78dcfe05cb966ed96fbb8b6ff2d54b是容器运行的id
接下来我们要进行运行中的容器对容器进行操作,使用下面的命令
docker exec -it 5e3a9539b69aad09b4a98e7 bash
docker exec -it
# 交互可以进入容器 ; exec 也可以在宿主机对容器执行命令;
5e3a9539b69aad09b4a98e7是容器的id
bash在docker中执行bash命令,bash是命令的参数,执行那个命令
执行exit,可以退出容器
4、接下来我们要在浏览器中访问运行的nginx,浏览器要访问docker容器,需要对docker进行网络设置
第一种模式host模式:docker容器使用主机的网卡对外进行通信,和主机具有相同的ip地址和端口容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。
例如,我们在 10.10.101.105/24 的机器上用 host 模式启动一个含有 web 应用的 Docker 容器,监听 tcp 80 端口。当我们在容器中执行任何类似 ifconfig 命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用 10.10.101.105:80 即可,不用任何 NAT 转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
第二种模式:桥接模式:docker容器会模拟出一块虚拟网卡,docker容器通过虚拟网卡和主机进行通信,需要制定docker容器的ip地址和进行端口映射
bridge 模式是 Docker 默认的网络设置,此模式会为每一个容器分配 Network namespace、设置 IP 等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。当 Docker server 启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配 IP 了,Docker 会从 RFC1918 所定义的私有 IP 网段中,选择一个和宿主机不同的IP地址和子网分配给 docker0,连接到 docker0 的容器就从这个子网中选择一个未占用的 IP 使用。如一般 Docker 会使用 172.17.0.0/16 这个网段,并将 172.17.42.1/16 分配给 docker0 网桥(在主机上使用 ifconfig 命令是可以看到 docker0 的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)
我们在设置docker网络设置的时候,我们先将之前运行的docker容器停止掉
先使用docek ps获得当前运行的nginx的id,然后使用docker stop nginxid停止使用nginx
docker run -d -p 9090:80 hub.c.163.com/library/nginx
-d表示让容器为后端运行的进行,把窗口退出之后进程依然存在
-p进行主机和容器端口的映射,80是nginx在容器中默认的端口,9090是当前安装docker主机的端口,当在浏览输入9090端口访问的时候就会映射访问docker容器中的80端口
访问之前我们首先要知道当前安装docker主机的ip地址,不能使用localhost
才知道docker是运行在linux上的,windows运行docker实质上是先开启了linux的虚拟机,然后再到上面运行的。
所以映射到"本机",实际上是映射到了linux的本机ip。(Linux和Mac能使用localhost,因为docker就是运行在本机上的)
那么这个ip是多少呢?
docker启动时,打出的相关信息就有该ip:
使用$ docker-machine ip default
这样在浏览器输入
上面使用-p指定了端口的映射,也可以使用-P大写的P,随机给docker制定一个端口的映射
随机的制定了主机的32768和docker容器的80端口进行映射
6、接下来,我们讲解如何制作自己的镜像,然后将镜像上传到对应的镜像端口
我们使用开源的jpress来制作我们的docker镜像
链接: https://pan.baidu.com/s/1DHKY5xBbcNPltJ3VZiBz8g 提取码: im4m 若链接失效,请联系海哥获取,海哥微信号:wx198819880
我们把jpress-v2.0.5.war下载完成之后复制到目录下
要运行war包需要tomcat的镜像
docker pull hub.c.163.com/library/tomcat:latest
接下来我们要制作镜像文件
vi Dockerfile
告诉docker我要制作一个镜像,这个镜像以Tomcat这个镜像为基础进行制作
COPY jpress-v2.0.5.war /usr/local/tomcat/webapps表示将当前目录下的jpress-v2.0.5.war复制到tomcat启动的webapps目录下
Dockfile的内容如下
from hub.c..com/library/tomcat
COPY jpress-v2.0.5.war /usr/local/tomcat/webapps
接下来我们就可以docker buidl来构建
使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。
docker build -t runoob/ubuntu:v1 .
docker build -t jdk_8u191:20190307 . -f jdk_dockerfile
参数解释:
-t :指定创建的镜像的名称和tag,如-t jdk_8u191:20190307
. 注意有一个.这个表示当前目录,必不可少的
-f : 指定要执行的dockerfile文件,如果文件名直接叫dockerfile,那么就不用-f参数了
我在这里执行
一致卡住,没有任何反应,定为了半天原理在于当前的
如果你很不幸地发现需要花很长时间,那么你可能是把当前文件夹里的文件都上传给 Docker Engine 了。于是赶紧取消掉,创建一个空的文件夹,把 Dockerfile 扔进来,再 build 一次吧。
漫长的等待后,镜像就生成好了。当前的Dockerfile在C:\Users\Administrator目录下,这个目录下存在30G的大小文件,将30G文件都上传到 Docker Engine,就卡了
我们在C:\Users\Administrator目录下新建立一个11的文件夹,在改文件夹下面建立dockfile文件
我们打开Docker Quickstart Terminal,进入到11目录,执行docker build命令
$ docker build -t jpress:latest .
这里镜像就创建成功了,使用docker images可以看到我们创建的jpress镜像
接下来我们运行我们创建的镜像
5.使用docker安装mysql数据库
$ docker pull hub.c.163.com/library/mysql:latest
启动mysql:$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 hub.c.163.com/library/mysql
端口映射为3306:3306
-e指定docker运行的参数指定mysql root用户的密码为123456
后面是mysq的tag
为
我们也可以在参数中指定mysql的的数据库,创建一个数据库
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=mydata hub.c.163.com/library/mysql
创建一个mydata的数据库
我们本地
对于没有私有仓库来说,将本地镜像放到其它服务器上执行时,我们可以使用save和load方法,前者用来把镜像保存一个tar文件,后台从一个tar文件恢复成一个镜像,这个功能对于我们开发者来说还是很方便的!下面我们就带大家来实现上面的过程.
docker save : 将指定镜像保存成 tar 归档文件。
-o :输出到的文件。
在外测服务器上,去load你的tar文件,把这恢复到docker列表里
然后使用docker images就可以看到自己加载的新的镜像了.
慕课网--docker走进第一个javaweb应用的更多相关文章
- newbee-mall开源项目被慕课网拿去做课程,然后我毫不知情,这又是什么骚操作?
万万没想到,这种事情会发生在我身上. 之前写过<开源囧事>系列而且已经写了四篇,四次开源囧事如下: <开源囧事(一)捅娄子了,写个bug被国家信息安全漏洞共享平台抓到了?> & ...
- 慕课网-Java入门第一季-7-2 Java 中无参无返回值方法的使用
来源:http://www.imooc.com/code/1578 如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名 ...
- 使用js脚本批量下载慕课网视频
慕课网(http://www.imooc.com/)上有很多不错的视频,当然我不是来给慕课网打广告的,我本人学习过很多慕课网上的免费的视频. 在线看如果网速慢时,可能会有卡顿,没网时无法观看.所有说下 ...
- 安卓开发_慕课网_Fragment实现Tab(App主界面)
学习内容来自“慕课网” 这里用Fragment来实现APP主界面 思路: 底部横向排列4个LinearLayout,每个LinearLayout包含一个图片按钮和一个文字 1.默认显示第一个功能(微信 ...
- 安卓开发_慕课网_ViewPager实现Tab(App主界面)
学习内容来自“慕课网” 网站上一共有4种方法来实现APP主界面的TAB方法 这里学习第一种 ViewPager实现Tab 布局文件有7个, 主界面acitivity.layout <Linear ...
- 慕课网-安卓工程师初养成-4-9 Java循环语句之 for
来源:http://www.imooc.com/code/1425 Java 的循环结构中除了 while 和 do...while 外,还有 for 循环,三种循环可以相互替换. 语法: 执行过程: ...
- 慕课网-安卓工程师初养成-4-8 Java循环语句之 do...while
do...while 循环与 while 循环语法有些类似,但执行过程差别比较大. 语法: 执行过程: <1>. 先执行一遍循环操作,然后判断循环条件是否成立 <2>. 如果 ...
- 慕课网-安卓工程师初养成-4-7 Java循环语句之 while
来源: http://www.imooc.com/code/1420 生活中,有些时候为了完成任务,需要重复的进行某些动作.如参加 10000 米长跑,需要绕 400 米的赛道反复的跑 25 圈.在 ...
- react入门——慕课网笔记
一. jsx 1. 被称为语法糖:糖衣语法,计算机语言中添加的某种语法,对语言的功能没有影响,更方便程序员使用,增加程序的可读性,降低出错的可能性 类似的还有(coffeescript,typescr ...
随机推荐
- 如何看待 HashiCorp 官宣,不允许中国境内使用其旗下产品?
欢迎转载,欢迎看官推荐. 前言 HashiCorp 官方宣布,不允许中国境内使用.部署和安装该企业旗下的企业版产品和软件.该公司比较知名的产品有:Terraform.Consul.Vagrant 等. ...
- OAuth + Security -1 - 认证服务器配置
配置 基础包依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- shell script的简单使用
shell script的简单介绍 shell变量 1.命名规则 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头 中间不能有空格,可以使用下划线(_) 不能使用标点符号. 不能使用bash ...
- jchdl - GSL Node
https://mp.weixin.qq.com/s/Oa4qgjIUccu5Y-Jlqcyn_A org.jchdl.model.gsl.core.meta.Node.java gen ...
- MethodHandle(方法句柄)系列之一:MethodHandle和MethodType
阅读此文章的作者建议先了解java反射和动态代理. java7中为间接调用方法引入了新的api,其中最关键的是java.lang.invoke包,即方法句柄.我们可以看成是java ...
- Java实现 LeetCode 767 重构字符串(ASCII的转换)
767. 重构字符串 给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同. 若可行,输出任意可行的结果.若不可行,返回空字符串. 示例 1: 输入: S = "aab&qu ...
- Java实现 LeetCode 500 键盘行
500. 键盘行 给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词.键盘如下图所示. 示例: 输入: ["Hello", "Alaska", & ...
- Java实现 LeetCode 201 数字范围按位与
201. 数字范围按位与 给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点). 示例 1: 输入 ...
- 第六届蓝桥杯JavaC组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.隔行变色 隔行变色 Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式. 小明设计的样式为:第1行蓝色, ...
- Java实现 蓝桥杯 历届试题 带分数
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...