Docker零基础入门——2.Docker之容器的使用

前言
————————————————————————————————————
本文安装docker的基础是linux centos7系统,使用终端模拟软件xshell,有需要安装教程的同鞋可以戳我之前的博客
VMware下载,安装及创建虚拟机
VMware安装Centos7 究极逐步详细图文流程
上节内容
Docker零基础入门——1.Docker安装及镜像的使用

1.容器的启动

话不多说,进入主题。
docker容器的启动我暂且将它分为三种方式

  1. 前台启动
    首先,我现在拥有两个镜像(docker容器的启动是基于镜像的)
    在这里插入图片描述
    我们以tomcat先举例,前台启动tomcat,输入命令

docker run tomcat:8.5.20

结果如下,你会发现tomcat的启动日志全部照搬打印在的我们的控制台上,并且光标没有退出。
在这里插入图片描述
我们按CTRL + C来将光标移出,并且查看容器的状态,发现容器已经退出。
在这里插入图片描述
大家都知道我们docker作为容器提供的是服务,因此是不太会需要他前台启动的,用户的体验也不是很好。像这种日志内容,我们在启动时不太关心,最多是在服务使用中会去后台查看部分log而已,这里不太推荐这种方式启动。并且这种方式启动时前台阻塞的,光标并没有退出,而光标退出之后,容器也随之退出了。

  1. 再起动
    再起动就是将已经停止的容器再次启动起来,命令如下

docker start 容器id

首先我们得知道容器的id,查看如下
在这里插入图片描述
好的,下来我们重启容器
在这里插入图片描述
重新启动成功,默认会返回启动容器的ID,我们来查看容器的状态
在这里插入图片描述
其实这里的重新启动也是一种后台启动,后台启动这个我们下一个会详细讲,这里启动的tomcat你在你本机上还是访问不到的,因为是内部容器,这个外部如何访问的内容后边会详细的给大家说明。

  1. 后台启动(主要使用)
    我们现在来后台启动tomcat,你会发现,他的启动日志是不会直接输出在控制台上的,这里输入命令,-d 就是我们后台运行的指令参数

docker run -d tomcat:8.5.20

在这里插入图片描述
另外提一下,run方法是有很多参数的,后边还可以加上命令,比如,这里会启动咱们的ubuntu,并且进入输出hello docker

docker run ubuntu:16.04 /bin/echo “hello docker”

在这里插入图片描述
当然,这里你加上-d的话就看不见hello docker的输出了,因为他在后台启动输出了,至于run方法后边可以跟的参数,后边我们会说明几个常用的,具体所有的参数,大家可以通过命令去查看:

docker run --help

命令很多,也都有说明
在这里插入图片描述
容器的启动方式大概已经有所了解了,下来我们稍微了解一下容器的启动流程,就这么一个run命令,后台的docker引擎究竟我我们执行了哪些操作

1.检查本地是否存在指定镜像,没有的话就从共有仓库下载
2.利用指定的镜像创建并启动一个容器
3.分配一个文件系统,并在只读的镜像层外挂载一层可读写层
4.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去(联网)
5.从地址池配置一个ip地址给容器
6.执行用户指定的应用程序(比如 echo “hello docker”)
7.执行完毕后容器被终止掉

像这种ubuntu提供整个系统的镜像,在run之后就自动关闭了,因为没有具体持续的进程,tomcat这类提供具体服务的镜像,会在后台一直运行,那么如何使得ubuntu在启动后不自动关闭呢,如何使得我们虚拟机上提供的内部容器tomcat服务被外部访问呢,后边我们会一一说明。
在这里插入图片描述

2.容器的查看

容器查看的命令其实上边我们已经用过了,这里详细说明一下,直接上命令
ps 命令就是来查看docker容器信息的,但是这命令默认只能查看在启动中的容器,在后边添加 -a 参数即可查看所有已经创建的容器

docker ps #查看启动中的容器
docker ps -a #查看所有的容器

如下图 docker ps -a
在这里插入图片描述
以及 docker ps
在这里插入图片描述
另外,我们可以单独查看容器的id,加上-q参数

docker ps -q #查看启动中容器的id
docker ps -aq #查看所有容器的id

如下图 docker ps -q
在这里插入图片描述
以及 docker ps -aq
在这里插入图片描述
我们还可以查看容器的log,命令如下。

docker logs 容器id

我们来查看一下之前启动的tomcat的log
在这里插入图片描述
其实容器有很多的属性,ps命令只是查看到了部分主要的属性,我们拥有一个命令可以来查看docker的详细属性

docker inspect 容器id

还是拿tomcat的那个容器举例
在这里插入图片描述
这里有非常多的属性,值太多,截屏几次也截不下,就暂时先这样了,有创建时间,启动状态,启动时间等等,还有一些不常用的,太多了,大家有兴趣可以自己下去查阅资料。

3.容器的停止与删除

因为这边停止和删除比较简单,内容比较少,所以合在一起说明。
首先,容器的停止,直接上命令

docker stop 容器id

这边我停止一下刚才启动的tomcat
在这里插入图片描述
下来是删除容器,上命令

docker rm 容器id…

这里都是可以跟复数个容器id的,如图
在这里插入图片描述
运行中的容器是没有办法是用上边命令删除的,我们重新启动一下tomcat,再使用上边的命令试一下
在这里插入图片描述
提示说你不能删除一个运行状态的容器,你可以加上 -f 参数,-f参数是干吗的呢,看一下帮助,是用来关闭运行中容器的,你可以理解为,强制删除,对启动中和没启动的容器都起到删除作用
在这里插入图片描述
下来让我们使用一下

docker rm -f 容器id…

在这里插入图片描述
这边删除成功了,有很多同学和我可能现在都很烦这个容器id,每次都得去看一下,复制过来,但其实我们上边有使用过容器id的查看命令,所以容器的删除我们可以简写一下,

docker rm -f $(docker ps -aq) #删除所有容器,无论状态
docker rm -f $(docker ps -q) #删除所有运行中的容器

这里删除的是启动中的容器还是所有的容器,主要还是看后边的查看命令返回了什么容器的id,我们起两个容器感受一下,一个启动中的,一个已经停止的
在这里插入图片描述
结果全部删除。

4.容器的进入和退出

前边我们知道了容器的后台启动,容器后台启动之后我们如何进入到容器内部呢,假如你需要修改容器内部的一些设置,比如tomcat服务的端口,你需要了解到,进入容器的方法,首先说明一下,其实前台启动容器,可以通过绑定伪终端到容器输入上来实现对容器内部的访问,也就是进入容器,我们先来看一下这个命令

docker run -t -i ubuntu:16.04 /bin/bash
-t → 参数让docker分配一个伪终端,并绑定到容器的输入上
-i → 是让容器的标准输入保持打开,就是保持用户交互状态
/bin/bash是容器启动的可选参数,作用在容器启动后自动调用

之前我们启动ubuntu之后他就自动关闭了,这次我们绑定了他的输入,这样他就不会自动关闭了,我们输入命令
在这里插入图片描述
这里我们发现我们已经离开了我们虚拟机的终端,来到了容器的输入终端,此时我们输入命令pwd,查看当前的目录,并使用ls命令查看目录下的内容
在这里插入图片描述
这里已经确认是进入到ubuntu操作系统中了,我们按下ctrl + pq退出(容器退出的第一种方式),下来就能看到容器依旧在运行,并且可以看到COMMAND属性下是我们容器启动运行时给出的命令。
在这里插入图片描述
上边是用绑定终端的方式操作了容器的输入端,下边说明一下正规提供的方法

docker attach 容器id

使用attach命令来进入容器,这边我补充一下,之前我上课的时候,老师是说这个attach命令在连接多个容器终端的时候会有问题,不推荐使用,原因我查了一下,因为当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,docker attach命令可以说是最不方便的进入后台docker容器的方法。

但是还是可以了解一下attach命令

docker attach 容器id

在这里插入图片描述
说粗来你们可能不信,我等了五分钟没反应,按了一下CTRL + C,发现进去了,吐血
在这里插入图片描述
在这里插入图片描述
进去就行了,依旧ctrl + pq退出
在这里插入图片描述
下来说一下老师推荐的进入容器方法,使用nsenter工具进入,但是比较麻烦,分为一下几步

1.下载linux nsenter工具
wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
当然你有可以下载好之后拷贝到你的虚拟机中
这里补充一下(我使用的迷你版centos7)
错误解决 wget: command not found
yum install wget -y
2.安装nsenter
解压
tar -xzvf util-linux-2.24.tar.gz
到解压目录下
cd util-linux-2.24/
./configure --without-ncurses #生成Makefile,为下一步编译做准备
make nsenter # 开始编译
这里补充一下
错误解决 no acceptable C compiler found in $PATH
yum -y install gcc
sudo cp nsenter /usr/local/bin # 编译完成将nsenter拷贝,便于使用
最后 nsenter --help 查看安装成功以及如何使用

下边和大家一下安装一下这个小工具
在这里插入图片描述
我这边建议大家下好了往虚拟机里传。。。。。。。。
这里附上两个链接,是安装VMware Tools来和宿主机进行文件共享的。
在 Linux 虚拟机中手动安装 VMware Tools(官网)
CentOS7安装VMware Tools(博客)

我这里因为使用了xshell,所以没有使用VMware Tools工具,用了一个更简单的
【Linux】1.Xshell如何连接虚拟机实现文件上传
好了这个不重要,我们继续安装nsenter,解压完毕,进入解压目录
在这里插入图片描述
执行完了./configure --without-ncurses命令
在这里插入图片描述
接下来 make nsenter # 开始编译
在这里插入图片描述
编译结束,拷贝
在这里插入图片描述
测试
在这里插入图片描述
我们之后就会使用它来进入容器,是通过进程id,也就是pid的方式进入,之前我们那在概念篇中讲过docker容器是其实是虚拟机中隔离起来的进程。下来我们来使用。

首先使用 docker inspect 容器id 来获取容器pid(容器所在的进程id)
但是由于信息太多而我们只需要pid就可以了,所以使用以下命令format
就是只获取容器的state属性下的pid
docker inspect -f { {.State.Pid}} 容器id
这里的State 和 Pid 是区分大小写的

在这里插入图片描述
这里得到pid 3090,之后使用nsenter进入

nsenter --target pid --mount --uts --ipc --net --pid

在这里插入图片描述
其实大家注意到了,这里报了个错,但是不影响使用,我们还是已经进入到了容器的内部。这里需要补充的一点是,此时使用CTRL + pq,的这种方式退出不了,好像是快捷键冲突了,CTRL + p的时候会显示出前一条指令,这边我们介绍第二种退出容器的方法,exit命令,结果输出一个logout,退出容器
在这里插入图片描述
我们以同样的方式启动一个tomcat并且进入容器,方法也是一样的
在这里插入图片描述
想必大家现在和我有同样的问号,这个nsenter进入容器也太麻烦了,先得查看容器id,再用容器id去找到对应的容器pid,然后再使用nsenter命令进入,这里我们可以简化一下,将这么一组命令打包到一个shell中去,我们要进入容器时,调用这个shell就可以省去很多步骤

shell内容如下:
#!/bin/bash
CID=$1

CPID=$(docker inspect -format “{ {.State.Pid}}” $CID)

nsenter --target “$CPID” --mount --uts --ipc --net --pid

接下来我们一起创建使用一下这个shell

cd / #到根目录
mkdir mydocker #创建文件夹
cd /mydocker #进入文件夹
vi in.sh #创建我们的shell
再把上边内容拷贝进去,保存退出
chmod 777 in.sh #给shell文件修改权限
最后使用shell进入容器

在这里插入图片描述
这边只需要调用shell,并将容器id传进去就可以了,非常的方便。最后我们把shell文件拷贝,这样我们在其他目录下也就都可以直接使用了

sudo cp in.sh /usr/local/bin
in.sh 容器id

在这里插入图片描述

5.容器的导入和导出

之前概念篇我们提到过,镜像和容器的区别,容器是在镜像的只读层基础上添加了一个读写层的结果,而读写层的添加,是在使用镜像构建容器的时候,所以容器和镜像的概念是十分接近的,所以我们可以通过将容器导出为文件再将文件导入为镜像的方式,构建和保存我们自己的镜像和容器。

将容器导出为文件
docker export 容器id > 导出文件名.tar

就比方说你获取了docker官方提供的tomcat镜像,你用它启动了一个容器,然后你进入容器,把对应的服务端口号从8080改到了8090,但是你又不想每次下载都来修改,你就可以通过导出来保存自己的容器(镜像)。如图
在这里插入图片描述
这里导出成功,容器构建的镜像越大,越费时间,现在我们来将容器导入为镜像文件

将容器导入为镜像文件
cat xxx.tar | docker import - myimage:23.33
这边myimage后边也可以不用跟版本号,默认是lasted

在这里插入图片描述
这边导入成功,可以发现我们那已经多了一个镜像了。

6.容器的网络(了解)

这边网络部分没有深入了解,大概是在集群搭建时可能才会需要大面积修改网络设置,先把我的笔记奉上,以后有机会了再深入了解一下。下次一定。。

-------查看网络-------
在安装完docker后会出现一个docker0的网桥,用来做容器的网络连接
本地host docker0 veth* → 容器containers eth0 容器网络默认是可用的
安装网桥管理工具brctl → yum install bridge-utils,然后查看网桥
brctl show

启动ubuntu容器,进入容器后
apt-get update
apt install net-tools # ifconfig
apt install iputils-ping() # ping

-------修改网络-------
修改文件 /etc/docker/daemon.json 在其中追加内容
“bip”:“ip/netmask”
→ “bip”:“192.168.100.1/24”
[切勿与宿主机同网段]

7.外部访问内部容器

直接上命令

docker run -d -P tomcat:8.5
docker run -d -p 7777:8080 tomcat:8.5
这里 -P 和 -p 大小写是区分的,
大P 是由docker去默认随机指定一个端口绑定
小p 是由我们自己指定一个端口来绑定对应容器的一个端口
这里使用的最多的当然是-p了

在这里插入图片描述
我们使用大P运行起来tomcat,查看port端口号,因为这里是docker去默认指定的随机端口,我们使用这个端口去访问一下
在这里插入图片描述
接下来我们将上个容器删除,用小p来自己指定端口访问
在这里插入图片描述
这里我们用7777端口再去访问
在这里插入图片描述

最后稍微多说两句,也算是吐槽一下,为什么我不适用tomcat:8.5版本,原因是阿里云镜像的comcat 8.5有bug,原本在webapp下的东西,全在webapp.list下边,导致启动之后无法访问,需要自己再去修正一下目录内容。希望大家注意一下。
下节再见。

猜你喜欢

转载自blog.csdn.net/cjl836735455/article/details/106363485