48小时系统班试听入口

利用Docker部署Web应用(二)

发布作者:新盟教育 发布日期:2022-04-24 浏览人数:7899人

Linux运维实战技术


五、docker初体验


1.docker基本命令


docker pull [options] NAME[:TAG]


通过此命令可以docker远程仓库拉取镜像到本地。

name是拉取镜像的名称,TAG表示是可选的,如果不选表明是latest,如果选择表明是指定版本的。

options是拉去的一些参数。

当不加请求地址的时候回去docker的官网拉取镜像。

docker images [options] [REPOSITORY[:TAG]]

options是选项,后面是指定镜像的名称。这个用的不多,可能当本地镜像非常多的时候要指定查看某一个镜像。


IMAGE ID 其实是一个64位的字符串,它可以唯一标识我们的镜像,这里只显示了16位,后面的被截掉了。


docker run [options] IMAGE[:TAG] [COMMAND] [ARG。。]

IMAGE是镜像的名字。

COMMAND是运行起来的时候要执行什么命令。

ARG表示这条命令运行需要的参数。

2.docker运行镜像流程


docker pull:首先docker pull向docker daemon发送了一条命令pull,告诉docker daemon要拉取某一个镜像,docker daemon会在本机检查镜像是否存在,如果存在且版本就是我们想要拉取的版本,它就不会做任何的操作。如果不存在下一步它会到docker的仓库中找我们要拉取的镜像名字,如果找到了就会有docker仓库传送到我们的本地,把我们要的镜像传送到我们的本地来。

docker run:首先把命令发送到我们的docker daemon,docker daemon会先检查镜像在本机是否存在,如果不存在相当于执行了一个docker pull的过程,下载回来之后会以一定方式把镜像运行起来变成docker容器。

六、docker运行nginx


1.运行nginx镜像


我们打开网易蜂巢镜像中心:c.163yun.com/hub#

搜索nginx,可以看到有两个nginx,他们的名字和头上和图标都不一样,一个是鲸鱼,一个是两个球。

带有鲸鱼的镜像表示这个镜像是从官网的镜像中心复制过来的。这个镜像与docker的镜像是一摸一样的。我们使用此镜像。

点进去,会有下载地址,复制里面的地址,然后拉取镜像。



复制到系统中运行。


运行完后可以查看镜像状态。


在前台运行容器命令如下,输入后容器就会运行,按ctrl+c可以终止容器的运行。

docker run hub.c.163.com/library/nginx


在后台运行容器:

docker run -d hub.c.163.com/library/nginx


查看运行的容器:

docker ps



更多关于运行的命令:

docker run --help


因为我们在平时运行的时候需要调试容器内部的设置、查看一下日志等等。我们可以通过如下命令进入容器内部:

命令的大体内容:


命令具体内容:

docker exec -it 02963d2002b bash


  • -i保证我们的输入有效,即使在没有detach的情况下也能运行。

  • -t表示将分配给我们一个伪终端。我们将在伪终端输入我们的内容。

后面跟着的是容器的id,即我们上面用ps查询出来的id,这个id可以少写几位,它会自动识别。

可输入如下命令了解更多:

docker exec --help


输入命令后发现我们前面的标识也变了,相当于进入了一个新的电脑。


可以查询一下nginx在什么位置:

which nginx


打开ps查看一下当前运行的进程。我这里提示没有ps命令。我从网上查了一下发现是因为当前系统没有安装这个命令,然后我安装了一下。从命令可以看出,这个nginx容器附带的系统应该是ubuntu不是centos。

安装ps命令:

apt-get update


利用ps命令查看进程,可以发现nginx已经在运行了。

ps -ef


输入 exit即可退出返回原来的系统。


七、docker网络


1)网络介绍


上面我们只运行了nginx,并没有用浏览器进行访问,这里我们尝试用浏览器访问,但是之前我们要了解一下docker网络。

我们直到docker的隔离性,网络也是个隔离性的一部分,linux使用了命名空间来进行资源的隔离,比如pid namespace就是用来隔离进程的,mount namespace是用来隔离文件系统的,network namespace 是用来隔离网络的。每一个network namespace都提供了一个独立的网络环境,包括网卡路由iptable规则等等,都是与以其它的network space隔离的。

1.docker容器在默认情况下,一般会分配一个独立的network-namespace,也就是网络类型中的Bridge模式。

在使用Bridge时就涉及到了一个问题,既然它有独立的namesapce,这就需要一种技术使容器内的端口可以在主机上访问到,这种技术就是端口映射,docker可以指定你想把容器内的某一个端口可以在容器所在主机上的某一个端口它俩之间做一个映射,当你在访问主机上的端口时,其实就是访问容器里面的端口。

2.还有一种类型是Host模式,如果在启动容器的时候指定使用Host模式,那么这个容器将不会获得一个独立的network namespace,而是和主机共同使用一个,这个时候容器将不会虚拟出自己的网卡,配置出自己的ip。而是使用宿主机上的ip和端口。也就是说在docker上使用网络和在主机上使用网络是一样的。

3.还有一种网络类型是None。也就是没有网络,这种情况docker将不会和外界的任何东西进行通讯。


2)实际访问端口


刚才我们在运行nginx镜像的时候并没有指定端口映射,所以我们这里停掉nginx容器。

docker stop containerId


1. -p(小写)是开放一个容器的端口到主机上.

在后台运行,开放主机8080端口映射到容器的80端口上:

docker run -d -p 8080:80 hub.c.163.com/library/nginx


查看主机8080端口是否开启:

netstat -na |grep 8080


是开启的那么访问 主机ip:8080 即可访问到nginx。

2. -P(大写)是开放容器所有的端口到主机上一个随机的端口。

停掉刚才的docker服务。


使用大P:

docker run -d -P hub。c。163。com/library/nginx


可以看到随机给我的端口是32768。



然后用 ip:32768去访问即可访问到nginx。

八、docker部署第一个java web应用


我们还需要学习Dockerfile,它告诉docker我们怎样制作我们的镜像,我们镜像的每一步操作分别是什么,写好Dockerfile后我们使用docker build命令执行Dockerfile里面的每一件事情。最终会把Dockerfile构建出来。

在这里因为是做一个演示,所以我们使用了一个开源的java web应用Jpress。

1. 制作自己的镜像


1)从网易的镜像中心找一个tomcat的镜像

docker pull hub。c。163。com/library/tomcat:latest


因为tomat镜像肯定有jdk,所以我们就不用单独再装jdk了。


2)编写dockerfile

我们需要建立一个dockerfile告诉docker需要做什么,这里我建立了Dockerfile,并将我们的web文件放到了和它同一个目录下。

首先我们的镜像是要运行在tomcat中的,所以填写 from tomcat,以tomcat为基础。maintainer是所有者的意思。因为war包是要放在webapps中的,所以我们使用copy命令复制到tomcat的webapps。

为什么webapps在local中?我们可以去下载镜像的网站查询,向下拉就好了。具体网址 : c.163yun.com/hub#

这里说一个个人猜想,每个容器都包含一个自己的系统,所以这里的/usr/local/tomcat/webapps指的是tomcat容器中的位置,那么哪里指定是tomcat容器呢?就是在一开始的from指定的。


from hub。c。163。com/library/tomcat


3)构建容器

注意这里是有个点的,点标明是在根据当前目录构建:

docker build .

可以使用docker images查看镜像是否build成功。

发现一个none,表明构建成功了。

可以重新构建给它起个名字 -t是给镜像指定一个tag:

docker build -t jpress:latest .

更多的参数查询:

docker build --help


2.运行自己的镜像


运行我们制作的镜像并指定端口:

docker run -d -p  8080:8080 jpress


访问我们的网站,发现网站已经可以正常访问了。

然后发现它要求我们安装自己的数据库,所以我们利用docker安装mysql。

在镜像中心搜索并拉取mysql:

 docker pull hub.c.163.com/library/mysql:latest


在镜像中心查看配置,并配置root用户密码:

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 hub.c.163.com/library/mysql


发现我们没有创建数据库,于是停止这个容器的运行,并在与剧中创建jpress数据库:

docker stop 4be94fb2df1d3a28c1


ocker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql


这样我们的数据库就建立成功了。

进入网站后要输入网站信息,输入数据库地址时,注意不要输入localhost,因为我们jpress是运行在容器内的,我们会访问tomcat容器内的3306,我们应该用ifconfig查询我们本机的ip地址。我这里的内网ip是172.17.10.68。

以上都做完后,我们的网站就可以跑起来了。


推荐阅读

>>>新手必备-Linux入门之云计算是什么

>>>红帽认证入门-Linux系统介绍及企业版本选型

>>>新手必备-Linux系统安装配置+Xshell远程连接

>>>Linux常用命令行合集之绝对路径和相对路径

>>>软连接与硬连接


运维界升职加薪必备的云计算技术,你学了吗?

学完高级运维云计算课程之后,你可以:

  • 跨越90%企业的招聘硬门槛

  • 增加70%就业机会

  • 拿下BAT全国TOP100大厂敲门砖

  • 体系化得到运维技术硬实力

  • 技术大佬年薪可达30w+


客服电话 15822722968 邮箱 799830458@qq.com 地址 天津市红桥区光荣道157号宝能创业中心2号楼-1、2门-907号
官方公众号
商务合作