docker的基本用法

vmware下的RHEL/CentOS的网络配置请参考:[url]http://jisonami.iteye.com/blog/2306735[/url]

RHEL/CentOS在7系列才完全的原生支持docker,以前全部例子均使用CentOS7演示,并且所有操作在root权限下进行。
本文介绍docker最常用的基本用法,包括
一、docker简介与安装
二、docker镜像与容器

一、docker简介与安装

1、docker简介
docker是轻量级的容器技术,直接使用操作系统的资源而不是是虚拟机的方式。
docker是操作系统级别的虚拟化技术,它模拟了操作系统的运行环境。而虚拟机则是虚拟了一个操作系统。前者占用的资源比后者少,所以效率很高。
docker容器的启动比虚拟机快很多,一般以秒来计算的。

2、docker安装
yum install docker

二、docker镜像与容器
docker的三个关键词:仓库、镜像、容器
这三者的关系是这样的,仓库存放着很多镜像,每个镜像可以运行很多个容器
官方仓库是http://index.docker.io

1、操作docker镜像的相关命令及用法演示
1)从仓库查找镜像
命令:docker search 镜像名
以查找redis为例
docker search docker.io/redis

2)从仓库下载镜像到本地
命令:docker pull 镜像名
带标签名,以下载redis镜像为例,
docker pull redis:2.8.21
若不带标签名,则默认下载最新(latest)版本
docker pull redis

3)查看镜像列表
命令:docker images

4)删除镜像
命令:docker rmi 镜像id
已删除redis镜像为例
先查看镜像列表,找到要删除的镜像id
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/redis 2.8.21 1a721decd792 10 months ago 109 MB
删除IMAGE ID为1a721decd792的redis镜像
docker rmi 1a721decd792

5)删除所有镜像
docker rmi $(docker images -q)

6)镜像的导出导入
导出命令:docker save -o tar包名字 镜像仓库:镜像标签
示例:
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/redis 2.8.21 1a721decd792 10 months ago 109 MB
# docker save -o redis2.8.21.tar docker.io/redis:2.8.21
# ls
anaconda-ks.cfg redis2.8.21.tar

导入命令:docker load < tar包名字
示例:先删除原有的镜像再导入,删除镜像前需要先删除基于该镜像的而所有容器
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
985b07080de0 1a721decd792 "/entrypoint.sh redis" 52 minutes ago Exited (0) 26 minutes ago tiny_mccarthy
# docker rm 985b07080de0
985b07080de0
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/redis 2.8.21 1a721decd792 10 months ago 109 MB
# docker rmi 1a721decd792
Untagged: docker.io/redis:2.8.21
Deleted: 1a721decd792ad1d3c4ebc315d34b1f8d4dfb97e6d8013efe6c523e637361bd6
Deleted: 1e0f123a26af5e26e27b7bcef888957657e21992f94beeb7f15b311731a94522
Deleted: 917499e60e0beb9aef579ab3bda18852c3dae3068608464a442fd1004929f350
Deleted: bdd393eaafef5acb1fa55708831d05d4203619bb46a84cf687fe9d85ce01d4e7
Deleted: 3d78ebcf73261a592159a96275f31eb08165ed128d7a775d97725d8d11e7e1ef
Deleted: 2da1436f270c273773122e93f8668672b8b7923af8d68374de4cfa5feeaeccd3
Deleted: fb03d161db1463c2208715b1df9af461a00cb2b74b64478ec131f727c5204629
Deleted: 87b88b774507ab4e2ee76c90b00f6fd9a0c8e7457c265e8256fcb6ac4fef8e28
Deleted: 6846105605cc29e8e7a65244961d5f82343ec2fb2ac824372ec23c198318a3b4
Deleted: d60d207d76b30a03d1da1100a2ed24f8a798104c73be5058ddb30abc6145be48
Deleted: b2508f29bec6010c47e4ca1ebd899252baa8e0645421017728897322368bbb34
Deleted: 7bf6d72c51dd7602557d3f7c1474f659d56819444a49a7f924df8e014cd756c3
Deleted: 2658b5be63c6886e82374815fd97e0593976fda3c749f531c88d2ec968d40709
Deleted: 047a294381b2ec81cbfb1d5710b65d641548b99d5e35dab761179ccddc36bacd
Deleted: 9bce9474876b400ca739a85e246c2677ebacc8440558fab04c764a76c7a52d78
Deleted: bbe78c1a5a535fac669e3225d5c3bb4396b6b2f9decb560ffb6351396da8c345
Deleted: 9d3ceacde91b4c7d6c1275032adb558d668afd5489c007f3512b39793ddf992d
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
# docker load < redis2.8.21.tar
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/redis 2.8.21 1a721decd792 10 months ago 109 MB

注意:
使用镜像id代替“镜像仓库:镜像标签”导出镜像也是可以的,但是会丢失元数据(即仓库信息和标签名等)
重新导入后看到的信息如下
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
<none> <none> 1a721decd792 10 months ago 109 MB

可以看到导入的镜像居然没有元数据(即仓库信息和标签名等),这是因为导出的时候使用的是镜像id导致的
解决方式是导出镜像时使用“镜像仓库:镜像标签”而不是镜像id

2、操作docker容器的相关命令及用法演示
1)查看运行中的容器
docker ps
查看所有容器包括已关闭的容器
docker ps -a

2)从镜像中启动一个容器
命令:docker run 选项 镜像名 <命令>
镜像后的命令可省略

以启动redis容器为例
docker run -d -p 6379:6379 1a721decd792
启动redis容器后,我们可以使用redis-cli命令行客户端连接redis服务器
# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
参数解释:
-d 表示启动一个后台运行的容器
-p 表示指定容器端口号,指定的格式可以是
ip:主机端口:容器端口| ip::容器端口 | 主机端口:容器端口 | 容器端口
若没有指定主机端口,则随机生成

以启动bash并获得控制台标准输入为例
docker run -t -i 1a721decd792 /bin/bash
参数解释:
-t 让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-i 让容器的标准输入保持打开

3、关闭运行中的容器
命令:docker stop 容器id
以关闭刚刚启动的redis容器为例
首先通过docker ps命令查找运行中的容器信息,根据查找的容器id关闭该容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
985b07080de0 1a721decd792 "/entrypoint.sh redis" 6 seconds ago Up 4 seconds 0.0.0.0:6379->6379/tcp tiny_mccarthy
# docker stop 985b07080de0
985b07080de0

4、启动已关闭的容器
命令:docker start 容器id
以启动刚刚关闭的redis容器为例
首先通过docker ps -a命令查找所有的容器信息,根据查找的容器id关闭该容器
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
985b07080de0 1a721decd792 "/entrypoint.sh redis" 2 minutes ago Exited (0) 2 minutes ago tiny_mccarthy
# docker start 985b07080de0
985b07080de0

5、重启正在运行中的容器
命令:docker restart 容器id
首先通过docker ps命令查找运行中的容器信息,根据查找的容器id关闭该容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
985b07080de0 1a721decd792 "/entrypoint.sh redis" 6 seconds ago Up 4 seconds 0.0.0.0:6379->6379/tcp tiny_mccarthy
# docker restart 985b07080de0
985b07080de0

6、进入运行中的后台docker容器
1)attach命令
docker attach 容器id
(以redis为例,若使用docker attach命令则直接连到redis-server那个输入流,不管开几个docker attach都只连接到该输入流,并且同步刷新所有窗口)
这里以启动bash并获得控制台标准输入为例,以为redis容器不直观
# docker run -d -t -i 1a721decd792 /bin/bash
168a188ae07eb437d2ef33f22a30624c667c3eea2be5300ef51641df440c1610 #启动容器是返回的完整的容器id,这里使用docker ps查询的短容器id
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
168a188ae07e 1a721decd792 "/entrypoint.sh /bin/" 22 seconds ago Up 21 seconds 6379/tcp clever_saha
# docker attach 168a188ae07e
root@168a188ae07e:/data# pwd
/data

2)nsenter命令
安装util-linux包,nsenter命令在这个包里面,centos7仓库里的util-linux正好是连接docker容器所需的2.23版本
yum install util-linux
docker获取pid
docker inspect --format "{{ .State.Pid}}" 容器id
使用nsenter命令连接
nsenter --target 3212 --mount --uts --ipc --net --pid

完整的例子:(以redis为例,若使用docker attach命令则直接连到redis-server那个输入流,不管开几个docker attach都只连接到该输入流,并且同步刷新所有窗口)
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
985b07080de0 1a721decd792 "/entrypoint.sh redis" 20 minutes ago Up 6 seconds 0.0.0.0:6379->6379/tcp tiny_mccarthy
# docker start 985b07080de0
985b07080de0
# docker inspect --format "{{ .State.Pid}}" 985b07080de0
8660
# nsenter --target 8660 --mount --uts --ipc --net --pid
root@985b07080de0:/# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>

7、删除已关闭的容器
命令:docker rm 容器id
这里以删除第一条记录为例
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
168a188ae07e 1a721decd792 "/entrypoint.sh /bin/" 4 minutes ago Exited (130) 33 seconds ago clever_saha
985b07080de0 1a721decd792 "/entrypoint.sh redis" 16 minutes ago Exited (0) 7 minutes ago tiny_mccarthy
# docker rm 168a188ae07e
168a188ae07e

8、删除所有已关闭的容器
docker rm $(docker ps -a -q)

9、容器导出和导入
1)容器导出为tar包
命令:docker export 容器id > 导出tar包名字
示例:
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
985b07080de0 1a721decd792 "/entrypoint.sh redis" 27 minutes ago Exited (0) 18 seconds ago tiny_mccarthy
# docker export 985b07080de0 > redis.tar
# ls
anaconda-ks.cfg redis.tar

2)从tar包导入镜像
这里导入之后是镜像,而不是容器,并且需要重命名镜像元数据
命令:cat export导出的tar包 | docker import - 本地仓库名:标签名
示例:
# cat redis.tar | docker import - testimport/redis:2.8.21
3d970cce18b58b71b5f83cb2778649a5b36c07de5cc824a758dcc2000668740b
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
testimport/redis 2.8.21 3d970cce18b5 6 seconds ago 107.3 MB
docker.io/redis 2.8.21 1a721decd792 10 months ago 109 MB

3)从导入的镜像启动容器
前面演示的时候启动redis容器是没有加命令的,导入的镜像启动容器时必须在末尾加上命令,否则会启动失败
即原先是这样的docker run -d -p 6379:6379 3d970cce18b5
现在必须这样docker run -d -p 6379:6379 3d970cce18b5 redis-server
示例:
# docker run -d -p 6379:6379 3d970cce18b5 redis-server
7ad52d24fb8cad1d4bcb302355cbcd3e3d0ccb44ff6bdf5cb096271ecfc92419
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ad52d24fb8c 3d970cce18b5 "redis-server" 3 seconds ago Up 2 seconds 0.0.0.0:6379->6379/tcp cranky_poincare

这里有一个坑
docker ps查看到的命令也许是错的,可能是因为显式的长度限制,比如
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
168a188ae07e 1a721decd792 "/entrypoint.sh /bin/" 4 minutes ago Exited (130) 33 seconds ago clever_saha
985b07080de0 1a721decd792 "/entrypoint.sh redis" 16 minutes ago Exited (0) 7 minutes ago tiny_mccarthy
启动时使用的是/bin/bash命令,这里显式的是"/entrypoint.sh /bin/",按道理应该是"/entrypoint.sh /bin/bash"
启动redis时没带命令,这里显式的是"/entrypoint.sh redis",按道理应该是"/entrypoint.sh redis-server"

请注意,save/load导出导入镜像和export/import导出容器快照导入镜像是不能混用的
redis2.8.21.tar 是save导出的镜像
redis.tar是export导出的容器快照
# ls
anaconda-ks.cfg redis2.8.21.tar redis.tar
# cat redis2.8.21.tar | docker import - docker.io/redis:2.8.21
Error response from daemon: EOF
# docker load < redis.tar
Error response from daemon: open /var/lib/docker/tmp/docker-import-994843880/repo/bin/json: no such file or directory
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值