Docker系列(二):镜像和容器的操作
Docker的命令主要围绕镜像和容器来进行操作,另外就是查看Docker
信息的命令操作。参考官方文档-CN, 官方文档-EN
Docker信息
查看Docker详细信息
该命令可以查看Docker的详细信息,如容器数量、运行中的数量、暂停的数量、停止的数量;镜像量;服务器版本 等等。
docker info
查看Docker版本
显示Docker客户端和服务器的版本信息。
docker version
操作镜像
搜索镜像
语法和示例
语法:TERM 指要搜索的目标
docker search TERM
示例:
docker search tomcat参数
-f - -filter # 输出过滤
is-automated=true|false //仅显示自动创建的镜像,默认否。
stars=X //仅显示指定星级及以上的镜像,默认为0,即输出所有。带参搜索示例:
docker search -f is-automated=true -f stars=10 tomcat
拉取镜像
- 语法和示例
一个镜像需要包括名称+标签,name是镜像仓库名称;Tag是镜像的标签,一般用来表示版本信息。如果不显示指定Tag,则默认会选择latest标签,即最新版本的镜像,但可能是非稳定版本。Tag需要在仓库网站(docker hub,阿里容器Hub,DaoCloud)去中查看,搜索镜像并不能看到镜像的版本号。
下载镜像默认是使用Docker Hub服务,仓库地址是:registry.hub.docker
; 也可以添加其它仓库地址从指定仓库下载。语法:
docker pull name[:Tag]
示例:
docker pull tomcat:8.0
**从指定仓库下载:**从阿里容器 Hub 下载
docker pull registry.cn-zhangjiakou.aliyuncs.com/cytong/redis
docker pull daocloud.io/library/redis:3.2.9
查看镜像
docker images
docker images
可以列出本机上已有镜像的基本信息,包括来自于那个仓库、镜像标签、镜像 ID、创建时间和镜像大小。
基中镜像ID是镜像的唯一标识语法:默认是列出所有的镜像文件,等于带
-a
参数。
docker images更多参数及使用,可通过
docker images --help
和man docker-images
来查看。docker tag
docker tag
为本地镜像添加定制标签,再查看时会存在2份,一份是原生的镜像,另一份是添加定制标签的镜像,但实际上指向同一个镜像文件,镜像的 ID 是相同的,添加标签相当于类似链接的作用。示例:
docker tag redis:latest myredis:latestdocker inspect
docker inspect
命令镜像的详细信息,包括制作者,创建时间,容器配置信息,各层数据摘要等等。示例:
docker inspect redis
docker inspect daocloud.io/library/redis:3.2.9docker history
docker history
命令查看镜像历史,可以查看镜像各层的创建信息。示例:
docker history redis
docker history daocloud.io/library/redis:3.2.9docker run images_name env
docker run images_name env
调用 env 查看镜像的环境变量。docker run ubuntu env
删除镜像
docker rmi
可以删除镜像,删除镜像有两种方式。
根据标签删除镜像:当镜像只有一个标签时,该命令是彻底删除镜像,删除镜像的所有层。当一个镜像有多个标签时,该命令只是删除该镜像指定的标签,并不影响镜像文件。
根据镜像唯一ID删除镜像:当此 ID 的镜像只有一个标签时,则彻底删除该镜像;当有多个标签时,则会报存在多个引用的错误,可以使用
-f
来强行删除。删除有容器正常运行的镜像,同样使用
-f
来强制删除,但一般不推荐这么使用,容易出现人为的操作错误就麻烦了,推荐先停止容器,再删除容器,再删除镜像。语法:
docker rmi REPOSITORY[:TAG] | IMAGE_ID
示例:
使用标签删除镜像
docker rmi redis:latest
使用镜像ID删除镜像
docker rmi c5355f8853e4
强行删除镜像(可删除多个标签或有容器正在运行的镜像)
docker rmi -f c5355f8853e4
创建镜像
创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile
创建。
详细见Docker:创建镜像文章。
导出镜像
docker save
命令导出镜像到本地文件,这样该镜像就可复制共享了。
语法:
docker save -o xxx.rar REPOSITORY[:TAG] | IMAGE_ID
示例:
docker save -o redis.rar 3459037fcc3a
docker save -o redis_3.2.9.rar daocloud.io/library/redis:3.2.9
载入镜像
docker load
将导出的镜像tar
文件再导入到本地镜像库。
示例:
docker load < redis_3.2.9.rar
docker load - -input redis_3.2.9.rar //input前面是个-
可以使用docker images
查看镜像列表是否有导入的镜像。
上传镜像
docker pust
命令上传镜像到仓库,默认上传到Docker Hub官方仓库,需要先注册官方仓库的账号。
语法:
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
示例:
docker tag test:latest user/test:latest
docker push user/test:latest
第一次上传时,会提示输入登录入信息。
操作容器
查看容器
docker ps
命令可查看本机存在的容器。
语法:
docker ps [OPTIONS]**- - a, -a:**显示所有容器,包括未运行的。
**- -latest, -l:**显示最近创建的容器。
**- -last, -n:**显示最近创建的 n 个容器, 默认是 -1。
**- -quiet, -q:**只显示最近运行的容器ID。
**- -size, -s:**显示容器总的文件大小。
示例
docker ps //默认只显示正在运行的容器
docker ps -a
docker ps -n 2
创建容器
docker create
从镜像中新建一个容器,然后使用docker start
来启动容器。
创建并启动
docker run
可以直接新建并启动容器,等价于选执行docker create
命令,再扫许docker start
命令。该命令使用最多。
使用该命令来创建并启动容器,Docker会在后台进行一系列的操作:
- 检查本地是否存在指定镜像,不存在则从公有仓库下载。
- 利用镜像创建容器,并启动该容器。
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层。
- 从宿主主机配置的网桥中接一个虚拟接口到容器中。
- 从网桥的地址池配置一个ID地址给容器。
- 执行用户指定的应用程序。
- 执行完后容器被自动终止。
语法:
docker run - -name myName -d REPOSITORY[:TAG] | IMAGE_ID
示例:
docker run - -name myRedis -d redis
docker run - -name Aredis -d c5355f8853e4
docker run - -name Bredis -d daocloud.io/library/redis:3.2.9
可以通过docker ps
命令查看已运行的容器。
docker run命令有很多的参数选项,可通过docker run --help
和man docker-run
来查看。
启动容器
docker start
命令来启动一个已经创建的容器。语法:
docker start CONTAINER_ID
示例:
docker start c5355f8853e4
可以通过docker ps
命令查看已运行的容器。docker logs CONTAINER_ID
查看容器输出信息示例:
docker logs c5355f8853e4
端口映射
Docker 容器中运行的软件所使用的端口,在本机和本机的局域网是不能访问的,需要将Docker容器中的端口映射到当前主机的端口上才能访问。
Docker 端口映射通过一个P
参数来实现,如下示例:6378是本机的端口,6379是容器的端口。
语法:docker run -d -p 本地端口:容器端口 –name 新名称 镜像名称
示例:docker run -d -p 6378:6379 –name port-redis redis
重启容器
docker restart
重启运行中的容器(将运行态的容器先停止,再启动运行)。
示例:
docker restart c5355f8853e4
停止容器
docker stop
停止运行中的容器。
首 先向容器发送SIGTERM
信号,等待一段时间(默认是10稍)后,再发送SIGKILL
信号来终止容器。语法:
docker stop [-t|- -time[=10]] [CONTAINER_ID]
示例:
docker stop c5355f8853e4docker kill
强止停止运行中的容器。示例:
docker kill c5355f8853e4
删除容器
docker rm
命令删除处于停止或退出状态的容器,不能删除运行态的容器。
语法:
docker rm [-f|- -force] [-l|- -link] [-v|- -volumes] CONTAINER_ID-f, - -force=false:是否强行停止并删除一个运行中的容器,添加该参数,会先发送
SIGKILL
信号给容器终止应用,然后强行删除。
-l, - -link=false:删除容器的连接,但保留容器。
-v, - -volumes=false:删除容器挂载擞据卷。
示例:
docker rm c5355f8853e4
docker rm -f c5355f8853e4
进入容器
- 使用nsenter工具进入容器
- 首先安装nsenter工具
- wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
- tar zxvf util-linux-2.24.tar.gz
- cd util-linux-2.24
- ./configure - -without-ncurses
- make nsenter && cp nsenter /usr/local/bin
- 要查看容器进程的
PId
,使用如下两条命令解释 nsenter 指令中进程id之后的参数的含义:1
2
3
4
5
6# 查看容器进程PID
docker inspect -f '{{.State.Pid}} {{.Id}}' $(docker ps -a -q) | grep CONTAINER_ID
docker inspect -f "{{.State.Pid}}" d58c5ae4aa70
# 进入容器
nsenter --target pid --mount --uts --ipc --net --pid
- –mount参数是进去到mount namespace中
- –uts参数是进入到uts namespace中
- –ipc参数是进入到System V IPC namaspace中
- –net参数是进入到network namespace中
- –pid参数是进入到pid namespace中
- –user参数是进入到user namespace中
导出容器
当需要将容器在系统之间迁移时,就需要用到导出/导入功能。
导出容器是指导出一个已经创建的容器到一个文件,不管此时该容器是否处于运行状态。
语法:
docker export [-o|- -output[=””]] CONTAINER_ID-o,- -output:指定导出的
tar
文件名。
也可以直接通过重定向来实现导出。
示例:
docker export -o redis.tar 713033b38fde
docker export 713033b38fde > myredis.tar //重定向方式
导入容器
docker import
将导出的容器文件导入变成镜像。
语法:
docker import [-c|- -change[=[]]] [-m|- -mesage[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]]-c,- -change:可以在导入的同时执行对容器进行修改的
Dockerfile
提令。
示例:
docker import redis.tar test/redis:1.0
备注:操作镜像章节就个导入镜像文件的命令docker load
,与docker import
十分类似。但两者还是有些不同:docker import
:导入容器快照到本地镜像库,会丢弃所有历史记录和元数据信息,难保存容器当前的快照状态,还可以重新指定标签等元数据信息。docker load
:导入镜像存储文件到本地镜像库,镜像存储文件将保存完整记录,体积更大。
容器日志
查看当前容器的日志:
docker logs container-name/container-id
登录容器
运行中的容器其实是一个功能完备的Linux操作系统,可以像常规的系统一样登录并访问容器。
docker exec -it container-id/container-name bash
sudo docker exec -it container-id/container-name /bin/bash
Docker系列(二):镜像和容器的操作
http://blog.gxitsky.com/2018/04/06/docker-2-images-container-operator/