Docker实践之镜像启动及常用命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker实践之镜像启动及常用命令相关的知识,希望对你有一定的参考价值。

参考技术A 前面简单的介绍了如何在Linux中安装 Docker ,这节内容,我们学习Docker镜像启动

我们Docker启动镜像从哪里来呢?镜像由我们自己或者他人构建,构建好的镜像可以直接放在本地或者上传到远程镜像仓库。当我们运行一个Docker镜像时,会先在本地查找是否存在所要运行的镜像,如果没有则会去远程镜像仓库拉取,默认为官方的镜像仓库,当然,我们也可以改为自己的私有镜像仓库。接下来,我们先了解几个简单的命令。

我们直接在安装好Docker的主机上执行 docker run nginx

我们从运行日志可以看到这样的字眼:

docker发现本地不存在nginx的镜像文件,便直接去仓库中查找下载并运行,因为我们没有让镜像后台运行,所以这次运行起来的容器会随着这次远程连接断开而停止。当我按下 ctrl+c 时,容器便会停止

如果要让容器后台运行,则需要在启动时加 -d 这个参数,

我们来看一下当前运行中的容器

可以看到,我们的nginx是启动起来了,但是,我们并不能访问它。容器有自己的一套虚拟系统,如:网络、文件。如果我们需要访问,则需要给容器和宿主机做一个映射,让宿主机和容器能够交互。这里,我们就给nginx增加端口和配置文件映射。我为了省事,就直接把容器中的配置文件复制出来用

接下来,我们便来建立这个映射关系

来看看容器是否启动成功

这时候,我们便能访问我们的nginx服务,

前面已经说到,容器有自己的虚拟系统,如果需要持久化的数据不映射到宿主机上,那么当容器销毁时,数据也会随之丢失,所以,我们在用容器运行时,一定要做好数据的保存方式。

在前面,我们列出了几个常用的Docker命令,这里,我们把这几个常用命令稍微讲解一下,

ps主要是查询正常运行的容器
docker ps 是当前正在运行的容器

这里面的 CONTAINER ID 很重要,后面我们的很多操作都需要基于这个 CONTAINER ID 或者 NAMES 。
docker ps -a 则是列出运行中和停止中的所有容器,

这几个参数这是启动/停止/重启/删除容器的参数,如: docker restart 5ae0319e1795 ,如果要删除容器,必须要先停止,否则会提示

docker run [OPTIONS] IMAGE [COMMAND] [ARG…],它的运行参数就比较复杂了,

这里还是只介绍几个常用的命令参数吧,

运行示例 docker run -d --name nginx-cc -v /root/nginx/:/etc/nginx/ -p 9999:80 -m 256M nginx

cp命令主要是用于宿主机和容器间的文件复制,一般格式如下:
docker cp [OPTIONS] 容器名/容器Id:容器文件路径 宿主机文件路径 从容器复制到宿主机
docker cp [OPTIONS] 宿主机文件路径 容器名/容器Id:容器文件路径 从宿主机复制到容器中

inspect主要是查看容器或者镜像元数据,如:

从返回的信息中,我们可以得到,启动时所设置的启动参数。如:

如果,那天我们忘记之前容器启动的参数时,便可以通过 inspect 来帮我们找回来。

logs主要是查询docker容器的运行日志,如:

Docker 从入门到实践系列三 - Docker 常用命令

帮助命令

# 查看docker版本
docker version
# 查看docker基本信息
docker info
# 查看具体docker命令的解释
docker --help

镜像命令

镜像检索

通常情况下,Docker 的镜像都放在 Docker 的官网 Docker Hub 上,点此前往官网

docker search 镜像名称:查找镜像,会把相似的结果也查询出来

除了可以在 Docker Hub 上搜索镜像外,还可以通过命令 docker search xxx 进行搜索,下面以hello-world为例:

docker search hello-world

输出结果

在这里插入图片描述

  • NAME:镜像名称
  • DESCRIPTION:镜像描述
  • STARS:星数(点赞)
  • OFFICAL:是否是官方镜像
  • AUTOMATED:是否是自动构建的

另外,docker search -参数 含义:

  • -f, --filter filter:根据提供的条件过滤输出,比如:docker search -f stars=30 hello-world列出星数不小于30的hello-world镜像;
  • --no-trunc:显示镜像完整描述信息;
  • --limit int:最大搜索结果数(默认 25)

镜像下载

镜像下载命令为:docker pull [IMAGE_NAME]:[TAG]

其中,IMAGE_NAME:镜像名,TAG :标签,镜像版本,可选的,默认为 latest

在生产环境中,推荐指定 TAG,选择稳定版本的镜像,具体有哪些版本可以上Docker Hub去查找。

docker pull hello-world

镜像列表

获取已下载镜像列表命令:docker images

在这里插入图片描述

其中,

  • RESPOSITORY:镜像名;
  • TAG:镜像版本,latest 代表最新版;
  • IMAGE_ID :镜像唯一 ID;
  • CREATED :镜像的创建时间;
  • SIZE:镜像的大小。

docker images -参数 含义:

  • -a:all 的简写,列出本地所有镜像(包含中间映像层);
  • -q:只显示镜像 ID;
  • --digests:显示镜像摘要信息;
  • --no-trunc:显示完整的镜像信息。

镜像删除

删除指定镜像:

docker rmi image-id

删除多个镜像:

docker rmi mysql tomcat

删除所有镜像:

docker rmi $(docker images -q)

强制删除镜像:

强制删除(当前镜像启动的容器正在运行中,是无法正常删除的,可以通过 -f 强制删除)

如果删除时不指定 TAG,默认为最新版 Least。

docker rmi -f image-id

容器命令

镜像运行起来后,称为容器。 下面以 Tomcat 为例

搜索镜像

docker search tomcat

下载镜像

docker pull tomcat

运行容器

运行tomcat

docker run --name tomcat -d -p 8080:8080 tomcat

如果docker运行Tomcat后访问首页报404,详细解决方案可参考:https://cloud.tencent.com/developer/article/1704573

最简单的根据镜像新建并启动容器的命令如下:

docker run --name container-name -d image-name

运行一个容器,使用 docker run 命令即可。 另,docker run -参数 含义:

  • -- name:为容器起一个名称;
  • -d:detached,执行完这句命令后,控制台将不会阻塞,可以继续输入命令操作,不会阻塞,也就是启动守护式容器,如果执行 docker run --name tomcat -it tomcat 会进入启动容器的命令控制台,也就是启动交互式容器;
  • -i:以交互方式运行容器,通常与 -t 搭配使用;
  • -t:为容器重新分配一个伪输入终端,通常与 -i 搭配使用;
  • -P:随机端口映射;
  • -p:指定端口映射;
  • image-name:要运行的镜像名称;

端口映射

启动做端口映射的容器

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P(大写)-p (小写) 参数来指定端口映射。启动容器的时候如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

Docker 的端口映射通过 -p-P 参数实现,命令如下:

docker run --name tomcat1 -d tomcat
docker run --name tomcat2 -d -p 8888:8080 tomcat

如上,就把主机端口 8888 请求映射到 Docker 容器内部端口 8080 了。

-p-P 区别为:

-P : 随机映射一个49000~49900的端口到内部容器开放的网络端口
-p : 可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器

执行完这两条命令后,通过 docker ps 查看:

在这里插入图片描述

通过 PORTS 可以看出,tomcat2 是做了端口映射的,tomcat1 是没进行映射过的。

分别通过浏览器访问:

http://*.*.*.*:8080/ // tomcat1默认端口;

http://*.*.*.*:8888/ // 做过端口映射的 Tomcat2,8888 会转发请求到 tomcat2 的 8080。

结果如下:

第一个请求是无法请求到的,原因开篇处说过了。

第二个请求是可以正常进行请求的,会由 tomcat2 容器进行处理

端口映射格式

#指定ip、指定主机port、指定容器port
#ip:hostport:containerport   
docker run --name tomcat -d -p 127.0.0.1:8080:8080 tomcat
#指定映射使用一个特定地址,比如 localhost地址 127.0.0.1

#指定ip、未指定主机port、指定容器port
#ip::containerport           
docker run --name tomcat -d -p 127.0.0.1::8080 tomcat
#绑定 localhost 的任意端口到容器的 8080 端口,本地主机会自动分配一个端口,还可以使用 udp 标记来指定 udp 端口
docker run --name tomcat -d -p 127.0.0.1:8080:8080/udp tomcat

#未指定ip port、指定主机port、指定容器port  
#hostport:containerport          
docker run --name tomcat -d -p 8080:8080 tomcat
#将本地的 8080 端口映射到容器的 8080 端口,默认会绑定本地所有接口上的所有地址

查看端口映射

可以通过如下命令查看容器映射了哪些端口及协议:

docker port container-id

示例:

[root@iZwz9inovbad1hkjy16akvZ tmp]#docker port 1596abf8d8a3
8080/tcp -> 0.0.0.0:8888
8080/tcp -> :::8888
[root@iZwz9inovbad1hkjy16akvZ tmp]#docker port 67751753d5da

如果返回空,则代表没进行端口映射。

小结

  • 容器有自己的内部网络和 ip 地址,可以使用 docker inspect container-id 可以获取所有的变量
  • Docker 还可以有一个可变的网络配置
  • -p 标记可以多次使用来绑定多个端口 eg. docker run --name tomcat -d -p 8080:8080 -p 3000:80 tomcat

查看容器

可通过如下命令,查看运行中的容器列表:

docker ps

在这里插入图片描述

  • CONTAINER ID:启动时生成的容器 ID;
  • IMAGE:该容器使用的镜像;
  • COMMAND:容器启动时执行的命令;
  • CREATED:容器创建时间;
  • STATUS:当前容器状态;
  • PORTS:当前容器所使用的端口号;
  • NAMES:启动时给容器设置的名称。

另,docker ps -参数含义:

-a:查看所有容器,包括已停止运行的;

-q:静默模式,只显示容器编号;

-l:显示最近创建的容器;

-n 3:显示最近创建的 num(此处为 3)个容器;

--no-trunc:不截断输出,显示完整信息。

停止容器

通过以下命令来停止运行中的容器:

docker stop container-name/container-id

强制停止容器(类似强制关机):

docker kill container-name/container-id

启动容器

通过以下命令启动容器:

docker start container-name/container-id

docker run和docker start的区别:

在这里插入图片描述

1.docker run
docker run只有在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器的时候,只需要使用命令docker start就可以。
docker run相当于执行了两步操作:将镜像(Image)放到容器(Container)中,这一步过程叫做docker create,然后将容器启动,使之变成运行时容器(docker start)。

2.docker start
docker start的作用是:重新启动已经存在的容器。也就是说,如果使用这个命令,我们必须先要知道这个容器的ID、或者这个容器的名字,我们可以使用docker ps命令找到这个容器的信息。

重启容器

通过以下命令启动容器:

docker restart container-name/container-id

删除容器

删除单个容器:

docker rm container-id

删除多个容器:

docker rm container-id container-id 

删除所有容器:

docker rm $(docker ps -a -q )

另,docker rm -参数含义:

-f:强制删除,如果在运行中,先停止,再删除

其他重要命令

查看容器日志

查看当前容器日志,可通过如下命令:

docker logs container-id/container-name

另,docker logs -参数含义:

  • -t:加入时间戳;
  • -f:跟随最新的日志打印;
  • -n:显示最后多少条。

连接到正在运行容器

docker attach container-id:连接到正在运行的容器;

attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。

官方文档中说 attach 后可以通过 CTRL-Cdetach,但实际上经过我的测试,如果 container 当前在运行 bashCTRL-C 自然是当前行的输入,没有退出;如果 container 当前正在前台运行进程,如输出 nginxaccess.log 日志,CTRL-C 不仅会导致退出容器,而且还 stop 了。

这不是我们想要的,detach 的意思按理应该是脱离容器终端,但容器依然运行。好在 attach 是可以带上 --sig-proxy=false 来确保 CTRL-DCTRL-C 不会关闭容器。

docker attach --sig-proxy=false 7f237caad43b

在运行的容器中执行命令

运行中的容器其实是一个功能完备的简易版 Linux 操作系统,所以我们可以像常规系统一样进行登陆及退出操作。

命令为:

docker exec -it container-id/container-name bash

退出命令为:

exit

execattach 区别:

  • attach:直接进入容器启动命令的终端,不会启动新的进程;
  • exec:在容器中打开新的终端,并且可以启动新的进程,可在宿主机中直接执行操作容器的命令,eg. docker exec -it 7f237caad43b ls /tmp

查看容器中正在运行进程

可用通过如下命令查看容器中正在运行进程:

docker top container-id/container-top

查看容器内部细节

可用通过如下命令查看容器内部细节,返回为 json:

docker inspect container-id

容器和宿主机互相拷贝文件

宿主机拷贝文件到容器:

docker cp 文件 container-id:目标文件/文件夹

# 将宿主机tmp文件夹下test.txt文件拷贝到容器7f237caad43b中tmp目录中
docker cp /tmp/test.txt 7f237caad43b:/tmp

从容器拷贝文件到宿主机:

docker cp container-id:目标文件/文件夹 宿主机目标文件/文件夹

# 将容器7f237caad43b中tmp目录下yum.log拷贝到宿主机/tmp目录下
docker cp 7f237caad43b:/tmp/yum.log /tmp

更多操作命令

更多命令可以参考:https://docs.docker.com/engine/reference/commandline/docker/

常用命令小结

以下是 Docker 的一些常用命令,通过 docker --help 就可以查看,只是将其翻译成中文而已:

命令英文中文
attachAttach to a running container当前 shell 下 attach 连接指定运行镜像
buildBuild an image from a Dockerfile通过 Dockerfile 定制镜像
commitCreate a new image from a container changes提交当前容器为新的镜像
cpCopy files/folders from the containers filesystem to the host path从容器中拷贝指定文件或者目录到宿主机中
createCreate a new container创建一个新的容器,同 run,但不启动容器
diffInspect changes on a container’s filesystem查看 docker 容器变化
eventsGet real time events from the server从 docker 服务获取容器实时事件
execRun a command in an existing container在已存在的容器上运行命令
exportStream the contents of a container as a tar archive导出容器的内容流作为一个 tar 归档文件[对应 import]
historyShow the history of an image展示一个镜像形成历史
imagesList images列出系统当前镜像
importCreate a new filesystem image from the contents of a tarball从 tar 包中的内容创建一个新的文件系统映像[对应 export]
infoDisplay system-wide information显示系统相关信息
inspectReturn low-level information on a container查看容器详细信息
killKill a running containerkill 指定 docker 容器
loadLoad an image from a tar archive从一个 tar 包中加载一个镜像[对应 save]
loginRegister or Login to the docker registry server注册或者登陆一个 docker 源服务器
logoutLog out from a Docker registry server从当前 Docker registry 退出
logsFetch the logs of a container输出当前容器日志信息
portLookup the public-facing port which is NAT-ed to PRIVATE_PORT查看映射端口对应的容器内部源端口
pausePause all processes within a container暂停容器
psList containers列出容器列表
pullPull an image or a repository from the docker registry server从 docker 镜像源服务器拉取指定镜像或者库镜像
pushPush an image or a repository to the docker registry server推送指定镜像或者库镜像至 docker 源服务器
restartRestart a running container重启运行的容器
rmRemove one or more containers移除一个或者多个容器
rmiRemove one or more images移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
runRun a command in a new container创建一个新的容器并运行一个命令
saveSave an image to a tar archive保存一个镜像为一个 tar 包[对应 load]
searchSearch for an image on the Docker Hub在 docker hub 中搜索镜像
startStart a stopped containers启动容器
stopStop a running containers停止容器
tagTag an image into a repository给源中镜像打标签
topLookup the running processes of a container查看容器中运行的进程信息
unpauseUnpause a paused container取消暂停容器
versionShow the docker version information查看 docker 版本号
waitBlock until a container stops, then print its exit code截取容器停止时的退出状态值

以上是关于Docker实践之镜像启动及常用命令的主要内容,如果未能解决你的问题,请参考以下文章

Docker 从入门到实践系列三 - Docker 常用命令

Docker系列之基础实践篇(上)

浅谈Docker之Docker常用命令及Dockerfile基础命令(记录)

Docker Centos 64位 安装及常用命令

Docker Centos 64位 安装及常用命令

Docker学习笔记之常用命令