首页 快讯正文

洛阳纸贵的故事:Docker基础修炼3--Docker容器及常用命令

admin 快讯 2020-05-15 4 0

前文解说了Docker镜像的原理和常用下令,本文继续通过官方的Apache镜像演示Docker容器相关的常用操作及下令。

我之前的Linux入门系列文章中“linux入门系列18--web服务之apache服务1”,演示了在CentOS7下安装和使用Apache服务,本次我们仍然接纳官方的Apache镜像来举行演示,通过这个案例,人人自行对比这两种方式的差别,从而加倍深刻明白Docke醒目什么,以及Docker带来的利益。

接下来我们就来演示下容器若何建立、若何住手、若何删除等操作。

一、Docker容器简介

容器是Docker中的另外一个焦点观点,容器是镜像的一个运行实例。

Docker镜像是静态的,只有从Docker镜像建立容器并运行起来,容器内的程序会运行,从而完成特定的功效。

我们要完成营业功效的程序就是在容器中运行。镜像自己是静态的只读文件,而容器带有运行时所需的可写文件层,同时容器内的应用历程处于运行状态。

通过下边的演示,将会明白的加倍深刻。

二、Docker容器常用下令

2.1 apache镜像准备

我们后续的演示是基于Docker Hub上官方提供的apache镜像举行。

镜像名称为httpd,该镜像并不包罗php的环境只能运行静态的HTML页面,因此若是你是想运行php的动态网站则需要选择PHP镜像,而本文只是为了演示容器的相关操作,因此接纳静态页面即可。

[root@docker ~]# docker pull httpd:2.4
2.4: Pulling from library/httpd
68ced04f60ab: Pull complete 
35d35f1e0dc9: Pull complete 
8a918bf0ae55: Pull complete 
d7b9f2dbc195: Pull complete 
d56c468bde81: Pull complete 
Digest: sha256:946c54069130dbf136903fe658fe7d113bd8db8004de31282e20b262a3e106fb
Status: Downloaded newer image for httpd:2.4
docker.io/library/httpd:2.4
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               2.4                 c5a012f9cf45        2 days ago          165MB

下载完成后我们可以看到httpd镜像巨细为165M,里边事实包罗了什么内容呢?文章最后我们再来仔细分析一下。

2.2 建立容器并后台运行

镜像下载完成后,就需要通过docker run下令建立容器。

语法:

docker run [选项] 镜像名称 [下令] [参数]

选项许多,可以执行通过辅助下令举行查看,以下列出最常用的几个选项

选项 作用
--name 指定容器的名称
-d 容器后台运行,不在控制台打印新闻
-i 即--interactive,交互式运行
-t 分配伪终端
-p 指定宿主机与容器端口的映射,宿主机端口:容器内端口
-P 指定宿主机与容器端口映射,宿主机端口随机指定

其中-it参数和-d参数一样平常差别时使用,而且代表了两种启动容器的差别方式:交互式启动容器守护式启动容器

所谓交互式启动就是在容器启动后直接进入容器,并会自动分配一个伪终端,可以在容器内执行种种下令;而守护式启动容器则是容器启动后无需进入容器,容器在后台运行,默默的提供服务。

至于若何选择使用哪一种方式就看是否需要进入容器,若是要进入就选择交互式,若是只是希望容器后台运行提供服务那就选择守护式

接下来通过-d参数,以守护历程方式建立基于httpd镜像的容器并后台运行

[root@docker ~]# docker run -d --name mywebsit -p 8888:80 httpd:2.4
783b46f5cddcc3ea919329a99f83a783da98bce4abce05ccc9b3f27fda859b09
[root@docker ~]# docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED   STATUS   PORTS   NAMES
783b46f5cddc  httpd:2.4   "httpd-foreground"  6 seconds ago   Up 4 seconds        0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]

只需要做这一步操作,基于Apache的web环境就搭建好了,此时在CentOS7上就可以通过浏览器接见适才搭建的基于apahce的网站了。

若是设置了防火墙,也可以在宿主机举行接见。

接下来就可以修改容器内网站目录里的数据,替换为自己的web页面即可。轻轻松松就搭建了一个apache的web静态网站,这是不是很利便呢?甚至都无须设置任何环境。迁徙也异常利便,好比想换到另外一台主机运行该网站,也只需要下载该镜像,然后run起来即可。

这就是docker的壮大之处,另有许多更壮大的功效,后续逐步演示。

说明一下我内陆的环境,人人一定要理清晰物理机、虚拟机、容器之间的关系。我内陆物理机系统是win10,在其上装了VMware虚拟机,在虚拟机中建立了一个Centos7的实例,然后在其中安装Docker,并运行mywebsite容器。由于我内陆没有装Centos7,以是在虚拟机中虚拟一个来举行演示,固然你也可以直接在windows上装docker或直接在内陆的centos上安装docker。

外部接见是接见在run容器是指定映射到的Centos7的宿主机端口8888,而非mywebsite容器的80端口。

特别注意:此处之以是接纳-d在后台以守护历程的方式运行容器,缘故原由就是当一个容器没有前台历程执行的时刻,建立容器后立马就会住手。以是你可以用交互式的方式建立一个容器试试,docker run -it --name mywebsit1 -p 8888:80 httpd:2.4 ,建立后你用docker ps下令查看基本看不到容器,用docker ps -a下令查看,你就会发现容器建立后,短暂启动后立马就住手了,就是这个缘故原由。

2.3 查看容器下令

查看内陆有哪些正在运行的容器,或者是曾经建立过的容器可以通过docker ps下令

语法

docker ps [选项]

常用参数

参数 作用
-a --all,查看所有容器,默认情况下只显示正在运行的容器
-l --latest,查看最近建立的容器
-n 显示最后建立的n个容器
--no-trunc 不截断显示

案例:

(1)查看正在运行的容器

[root@docker ~]# docker ps
CONTAINER ID    IMAGE     COMMAND     CREATED  STATUS   PORTS    NAMES
783b46f5cddc        httpd:2.4           "httpd-foreground"   4 hours ago         Up 4 hours          0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]# 

可以看到只有适才建立的mywebsit容器在运行。

2.4 在容器外部查看容器信息

2.4.1 查看容器日志下令

语法

docker logs [选项] 容器名或id

常用参数

参数 作用
-f 动态跟踪打印日志信息,一旦有新日志会继续打印
-t 在每行日志前面打印出时间
--tail 指定显示的行数

案例

(1)查看mywebsit的日志,只显示2行

[root@docker ~]# docker logs -t --tail 2 mywebsit
2020-02-29T03:09:57.654372509Z 192.168.78.1 - - [29/Feb/2020:03:09:57 +0000] "-" 408 -
2020-02-29T03:09:57.854284777Z 192.168.78.1 - - [29/Feb/2020:03:09:57 +0000] "-" 408 -
[root@docker ~]# 
2.4.2 查看容器内历程下令

语法

docker top

案例

(1)查看mywebsit内部的历程

[root@docker ~]# docker top mywebsit
UID      PID     PPID    C     STIME     TTY       TIME      CMD
root     3673    3655    0     10:29     pts/0     00:00:01  httpd -DFOREGROUND
bin      3708    3673    0     10:29     pts/0     00:00:00  httpd -DFOREGROUND
...省略部门输出

此下令类似于Linux下的top下令。

2.4.3 查看容器内部细节

语法

docker inspect 容器名称或id

案例

(1)查看mywebsit容器内部信息

[root@docker ~]# docker inspect mywebsit
...省略输出

由于输出内容太多就不粘贴了。

执行下令后将获得一个详细描述容器信息的JSON字符串工具,该工具中包罗了容器的详细信息,包罗容器端口映射、挂载信息、卷信息、网络ip等信息。

2.5 退出容器下令

若是进入了容器,退出方式有如下两种:

exit下令

按快捷键:ctrl+p+q

2.6 进入容器内部与之交互

进入正在运行的容器并以下令行交互

2.6.1 docker exec下令

接纳docker exec下令可以进入容器或不进入容器直接执行下令

语法

docker exec [选项] 容器名或id 下令 [参数...]

选项与docker run下令类似,也有-itd等参数。

用此下令进入容器后,用exit下令或快捷键退出容器后,容器不会住手。

案例

(1)不进入容器直接执行下令

[root@docker ~]# docker exec -it mywebsit pwd
/usr/local/apache2
[root@docker ~]# 

该下令的寄义查看mywebsit容器内的当前目录,可以看到下令执行竣事后我们没没有进入到容器内部。

pwd是linux的下令,但此处为何能执行呢?缘故原由是httpd镜像是由debian基镜像继续而来,人人知道debian也是linux的一个刊行版本,因此该容器就有debian的功效。简单说就是你可以以为mywebsit容器就是跑在docker上的一个小linux系统。

(2)进入容器执行下令

[root@docker ~]# docker exec -it mywebsit /bin/bash
root@783b46f5cddc:/usr/local/apache2# pwd
/usr/local/apache2
root@783b46f5cddc:/usr/local/apache2# exit
exit
[root@docker ~]# 

这个历程的作用给前面的案例是一样的,只不过这里是进入到容器内部,然后打印当前目录,然后在退出容器,返回到centos7宿主机。

通过这两个案例的对比,应该很清晰他们的区别了吧。

2.6.2 docker attach下令

语法

docker attach [选项] 容器名或id

用此下令重新进入容器,进入容器后若是用exit下令退出,则容器会住手。

2.7 容器与宿主机之间数据拷贝

docker cp下令可以实现宿主机与主机之间的数据拷贝,即使是容器住手的情况下也可以执行拷贝操作。

语法

docker cp 容器id:容器内路径 宿主机路径

案例

(1)修改容器内的首页内容

首先:httpd镜像网站的目录为:/usr/local/apache2/htdocs/index.html

其次:由于httpd镜像基于debian制作,内部并没有包罗vi/vim等工具。

再次:正好可以用docker cp演示宿主机与容器之间文件的相互拷贝。

因此我们将网页文件拷贝到宿主机然后修改后在拷贝回容器网站目录下,已达到修改首页的目的。(在后续的解说中也可以通过数据卷的方式将网站目录映射到宿主机上实现共享和修改)

[root@docker ~]# docker cp mywebsit:/usr/local/apache2/htdocs/index.html /
[root@docker ~]# ll /index.html 
-rw-r--r-- 1 root root 45 Jun 12  2007 /index.html
[root@docker ~]# echo "my websit is updating">/index.html
[root@docker ~]# cat /index.html 
my websit is updating
[root@docker ~]# docker cp /index.html mywebsit:/usr/local/apache2/htdocs/index.html
[root@docker ~]# 

再次在浏览器中查看网页,就会发现已经被修改过了。

2.8 住手容器下令

住手容器可以通过stop和kill两个下令

kill是强制住手容器,stop会稍微过一小会住手容器,二者都可以指定容器住手前守候的时间。

docker stop|kill 容器id或容器名

案例

(1)住手容器

[root@docker ~]# docker ps
CONTAINER ID   IMAGE   COMMAND   CREATED   STATUS  PORTS   NAMES
783b46f5cddc   httpd:2.4    "httpd-foreground"   6 hours ago  Up 21 minutes  0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]# docker stop mywebsit 
mywebsit
[root@docker ~]# docker ps
CONTAINER ID  IMAGE   COMMAND   CREATED   STATUS   PORTS  NAMES
[root@docker ~]# 

2.9 启动容器下令

可以通过start或restart启动或重启容器

语法

docker start|restart 容器id或容器名

案例

(1)启动住手的容器

[root@docker ~]# docker ps -a
CONTAINER ID  IMAGE  COMMAND   CREATED    STATUS   PORTS    NAMES
783b46f5cddc        httpd:2.4           "httpd-foreground"   6 hours ago         Exited (0) 2 minutes ago                       mywebsit
[root@docker ~]# docker start mywebsit 
mywebsit
[root@docker ~]# docker ps
CONTAINER ID    IMAGE   COMMAND   CREATED    STATUS   PORTS   NAMES
783b46f5cddc        httpd:2.4           "httpd-foreground"   6 hours ago         Up 1 second         0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]#  

可以看到刚住手的mywebsit容器为exited状态,重启后又重新运行起来。

2.10 删除容器下令

语法

docker rm [选项] 容器名或id

常用选项

选项 作用
-f --forece,强制删除,当容器在运行时只能强制删除
-v --vomumes,删除数据卷

案例

(1)删除正在运行容器

[root@docker ~]# docker rm mywebsit
Error response from daemon: You cannot remove a running container 783b46f5cddcc3ea919329a99f83a783da98bce4abce05ccc9b3f27fda859b09. Stop the container before attempting removal or force remove
[root@docker ~]# docker rm -f mywebsit
mywebsit
[root@docker ~]# docker ps
CONTAINER ID   IMAGE   COMMAND   CREATED  STATUS   PORTS  NAMES
[root@docker ~]# 

可以看到当容器运行时不能删除,需要添加-f参数强制删除。

(2)强制删除所有容器

慎用,仅供演示,他会删除所有的容器,包罗正在运行的和已经住手的。

[root@docker ~]# docker rm -f $(docker ps -aq) 
3d228a470c53
[root@docker ~]# docker ps 
CONTAINER ID   IMAGE    COMMAND    CREATED    STATUS   PORTS   NAMES
[root@docker ~]#

上边这个删除语句也可以写为:docker ps -a -q | xargs docker rm

三、容器内部窥探

以上基于httpd镜像建立了容器举行种种容器操作的演示,接下来我们在通过centos镜像,研究下镜像内部的结构和原理

[root@docker ~]# docker images
REPOSITORY    TAG       IMAGE ID        CREATED           SIZE
centos        latest    470671670cac    6 weeks ago       237MB

若是你内陆还没有centos举行,先用docker pull下令下载到内陆,接下来我们用它来建立一个名为mycentos的容器,然后进入容器查看结构

[root@docker ~]# docker run -it --name mycentos centos
[root@bda9ff3abfd9 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@bda9ff3abfd9 /]# pwd
/
[root@bda9ff3abfd9 /]# cat /etc/redhat-release 
CentOS Linux release 8.1.1911 (Core) 
[root@bda9ff3abfd9 /]# 

进入容器后,我们可以看到,实在它就是运行着的一个centos系统,里边可以执行种种centos下令,也可以查看到内核版本。

若是你想象力在扩展一下,那很容易想到,镜像实在就是把种种操作系统环境以及我们运行所需要的软件包打包在一起,然后上传到堆栈中,需要的时刻直接pull下来,在运行run下令建立容器即可。这也正是我们前二篇文章频频提到的内容,若是现在在返回去看之前的文章,应该会有更深刻的明白。

本文演示完容器相关操作下令后,docker三要素就还差堆栈了,下一篇解说堆栈相关理论和操作,敬请期待。

,

Sunbet

Sunbet www.6358917.com Sunbet(www.sunbet.in)是进入Sunbet的主力站点。Sunbet开放Sunbet会员开户网址、Sunbet代理开户、Sunbet手机版下载、Sunbet电脑客户端下载等业务。

版权声明

本文仅代表作者观点,
不代表本站诚信在线的立场。
本文系作者授权发表,未经许可,不得转载。