Linux运维实战技术
Linux运维实战技术
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表示这条命令运行需要的参数。
docker pull:首先docker pull向docker daemon发送了一条命令pull,告诉docker daemon要拉取某一个镜像,docker daemon会在本机检查镜像是否存在,如果存在且版本就是我们想要拉取的版本,它就不会做任何的操作。如果不存在下一步它会到docker的仓库中找我们要拉取的镜像名字,如果找到了就会有docker仓库传送到我们的本地,把我们要的镜像传送到我们的本地来。
docker run:首先把命令发送到我们的docker daemon,docker daemon会先检查镜像在本机是否存在,如果不存在相当于执行了一个docker pull的过程,下载回来之后会以一定方式把镜像运行起来变成docker容器。
我们打开网易蜂巢镜像中心:https://c.163yun.com/hub#/m/home/
搜索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即可退出返回原来的系统。
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。
我们还需要学习Dockerfile,它告诉docker我们怎样制作我们的镜像,我们镜像的每一步操作分别是什么,写好Dockerfile后我们使用docker build命令执行Dockerfile里面的每一件事情。最终会把Dockerfile构建出来。
在这里因为是做一个演示,所以我们使用了一个开源的java web应用Jpress。
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中?我们可以去下载镜像的网站查询,向下拉就好了。具体网址 : https://c.163yun.com/hub#/m/repository/?repoId=2955
这里说一个个人猜想,每个容器都包含一个自己的系统,所以这里的/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
运行我们制作的镜像并指定端口:
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系统安装配置+Xshell远程连接
运维界升职加薪必备的云计算技术,你学了吗?
学完高级运维云计算课程之后,你可以:
跨越90%企业的招聘硬门槛
增加70%就业机会
拿下BAT全国TOP100大厂敲门砖
体系化得到运维技术硬实力
技术大佬年薪可达30w+