泛览天下

阅读,看尽天下事

Docker之初级实战(二)--终端操作容器、执行命令!

2022-08-04 02:28:51


所以接下来,在操作终端输入下面命令:docker run -i -t --name brados1 centosimage.pngdocker run -i -t --name brados1 centos:终端运行 docker run


通过上一节,我们已经在自己的环境中安装了Docker,并通过阿里云镜像服务拉取了一个测试镜像进行测试。当然,我们也可以用官方纯净的镜像制作我们自定义的镜像,我们这里暂时还是使用现成的镜像学习,后面我们再花时间专门制作自己镜像。

一、拉取官方镜像,运行

1、首先进入阿里云镜像搜索,找到一个Docker官方的纯净centos 7镜像,在操作终端按提示拉取。
image.png
docker pull centos    #拉取镜像`
image.png

上节课我们 run -d -p 映射端口,但是今天我们的centos是纯净的。
所以接下来,在操作终端输入下面命令:

docker run -i -t --name brados1 centos
image.png

docker run -i -t --name brados1 centos:
终端运行 docker run --help ,可以查询到参数用法:
-i : 打开stdin,用于和容器进行交互,通常与 -t 同时使用;
-t : 为容器创建虚拟终端,我们就可以登录终端了通常与 -i 同时使用;
--name : 譬如 --name xxoo: 为容器指定一个名称

2、这时你会发现,突然进入了一个新的终端,我们进入到了这个容器镜像的命令终端。

GO,ON.在容器终端输入 ctrl+d
退出该容器终端,同时我们会发现容器停止运行了。

docker ps -a  #可以查看到 当前所有容器。

image.png

SO,我们手动启动这个新的容器。
docker start brados1
启动之后,我们如何再次进入该容器的命令终端呢?
操作终端输入: docker attach 容器ID

docker attach brados1 -a -i
docker attach [OPTIONS] CONTAINER
你会发现当你 CTRL+D 退出后,容器又停止了.
所以得使用组合命令
docker start 容器ID -a -i

注意:-a 只能打开容器的输出流。要想打开输入流,需要同时加上参数-i。
我们如何去找到这些命令的?进入这里:
https://docs.docker.com/engine/reference/commandline/attach/

3、docker exec使用

那么我们如果想更便捷的操作容器,比如在运行中的容器中执行命令,如何操作呢?比如:

docker exec brados1 /bin/bash`    #在运行的容器中执行命令

不过好像终端没什么显示。
加入-i -t 参数就可以了

docker exec -i -t brados1 /bin/bash

这样执行 ctrl+d 后,也不会引起容器停止 ,

docker exec :在运行的容器中执行命令
语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
-d :分离模式: 在后台运行。
-i :即使没有附加也保持STDIN 打开。
-t :分配一个伪终端。

二、Dockerfile使用,创建Apache镜像。

1、前面我们pull了一个纯净镜像,如果要部署网站、安装一些软件的话, 如何操作呢?

现在我们利用Dockerfile创建一个镜像。
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
官方文档在
https://docs.docker.com/engine/reference/builder/#usage
下面我们创建一个apache(httpd)环境容器。

进入操作终端创建一个空文件夹build,CD进入。
然后创建一个文件叫做Dockerfile(注意大小写),插入内容如下(大小写严格):
FROM centos:latest #用REPOSITORY :TAG精准镜像
RUN yum -y install httpd #后面用分号分割多个可安装程序
RUN systemctl enable httpd.service #应用开启自启动
EXPOSE 80 #暴露80端口

2、用docker build命令读取Dockerfile创建镜像
docker build -t centos:httpd . (这里有个点,很重要。代表当前文件夹)

当然也可以指定Dockerfile

docker build -f /path/to/a/Dockerfile .(#这里还是有点)

通过 docker images 可以看到出现了一个新镜像叫做centos,只不过标签变成httpd了。

image.png

3、OK,现在我们可以启动我们的容器

正确的容器启动方式:

docker run -i -t -p 8080:80 --name bradhttpd centos:httpd

接下来我们使用exec来交互一下(或者用attach)

 docker exec -i -t myhttpd /bin/bash

进入容器后,可以执行 systemctl start httpd

image.png

结果,出现了上图的错误提示。

解决办法如下:
1、关闭容器,并删掉这个容器
docker stop bradhttpd
docker rm bradhttpd
2、给容器加特权启动
docker run --privileged -d -p 8080:80 --name bradhttpd centos:httpd /usr/sbin/init

现在我们进入容器终端,在操作终端输入:

docker exec -i -t bradhttpd /bin/bash

查看httpd运行状态:


image.png

docker rmi :删除本地一个或多少镜像。
docker rmi [OPTIONS] IMAGE [IMAGE...]
-f :强制删除;
--no-prune :不移除该镜像的过程镜像,默认移除;

docker logs : 获取容器的日志
docker logs [OPTIONS] CONTAINER
OPTIONS说明:
-f : 跟踪日志输出
--since :显示某个开始时间的所有日志

-t : 显示时间戳
--tail :仅列出最新N条容器日志