三、docker 容器管理(常用命令篇)
docker --help
:查看帮助
man docker
1.获取docker镜像
docker search [image name]
,搜索相关镜像。如果下载镜像速度慢,可以考虑更换源。
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh |sh -s http://04be47cf.m.daocloud.io
docker pull [image name]
,下载指定镜像。
2.查看本地镜像
docker images
3.创建|启动容器(docker create --help|docker run --help)
man docker run
-
docker create 创建后不会启动
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
-
docker run 创建后启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-
OPTIONS 容器的常用参数 (docker create 和docker run 创建时参数相同。)
- 数据持久化
- 数据卷(将外部存储挂载到容器内。
- 相当于nfs挂载的效果,可以多容器共享使用。
-v
--mount
(最初,-v或--volume用标志独立的容器和--mount用于群服务标志。但是,从Docker 17.06开始,您也可以使用--mount独立的容器。一般来说, --mount更明确和详细。最大的区别在于,-v 语法将所有选项组合在一个字段中,而--mount 语法将它们分开。以下是每个标志的语法比较。提示:新用户应使用--mount语法。有经验的用户可能更熟悉-v或--volume语法,但鼓励使用--mount,因为研究表明,它更容易使用。如果您需要指定音量驱动程序选项,则必须使用--mount。
)docker run -itd -v /data:/home [image name]
-itd
常用-i (interactive)
开启容器标准输入(后期可以进入容器)-t
伪终端-d (detach)
后台运行--name
指定容器名docker run -itd --name myfirstdocker [image name]
-h (--hostname)
指定主机名docker run -itd -h test_001 [image name]
--add-host list
给运行容器动态添加hosts记录dcoker run -itd --add-host test_001:192.168.1.102 [image name]
--link
通过link方式创建容器,然后我们可以使用被link容器的别名进行访问。从而解除应用对IP的依赖。不幸的是,link方式只能解决单机容器间的互联。多机情况下,容器的互联需要其他的方式。(警告:该--link标志是Docker的旧版功能。它可能最终被删除。除非您绝对需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信,而不是使用 --link。用户定义的网络不支持的一个功能--link是在容器之间共享环境变量。但是,您可以使用其他机制(如卷)以更受控制的方式共享容器之间的环境变量。)docker run -itd --link [CONTAINER id]:myfirstdocker [image name]
-a (--attach list)
--cap-add list
设置容器中使用的cgroups的特定Capablity。若设置为ALL,则使用所有的Capablity--cap-drop list
从容器删除cgroup的特定Capablitycidfile string
将container id写入文件docker run -itd -cidfile /path.cid [image name]
--pid
PID namespace to usedevice list
把一个主机设备添加到容器--dns list
指定容器dns (内部集成,也可以用外部。)docker run -itd --dns 114.114.114.114 [image name]
--dns-search=[]
设置docker要使用的DNS搜索域-e (--env list)
设置环境变量(警告:重要的是要明白,一个容器内的所有源自Docker的环境变量都可供任何链接到它的容器使用。如果敏感数据存储在其中,这可能会带来严重的安全隐患。)docker run -itd -e "TEST=12345" [image name]
env-file list
--entrypoint=""
忽略Dockerfile的ENTRYPOINT设置,强制设置为其他值。--expose list
声明映射端口,只用于记录,并不是真的。-p (小写)(--publish list)
映射宿主机端口到容器(是否起作用,也要看情况,是否被占用端口。)docke run -itd -p 8080:80 [image name]
-P (大写)(--publish-all=true|false)
映射容器端口到宿主机随机端口docker run -itd -P 80 [image name]
--net="bridge" (--network)
设置容器的网络模式(选项可以是:bridge,none,container,host)docker run -itd --network net_192_168_100 [image name]
--ip string
分配指定网络中的ipdocker run -itd --network net_192_168_100 --ip 192.168.1.1 [image name]
--restart [always|on-failure:3]
当容器停止时自动重启,重启3次。docker run -itd --restart on-failure:3 [image name]
--ulimit nproc=9999 nofile=9999
用户打开最大进程数/最大打开文件数。docker run -itd --ulimit nproc=9999 nofile=9999 [image name]
--oom-kill-disable
关闭linix oomkill机制(物理内存不足时,清理高内存进程。)docker run -itd --oom-kill-disable [image name]
--log-driver [none|json-file|syslog|fluentd|splunk]
日志输出docker run -itd --log-driver syslog [image name]
--log-opt NAME=VALUE
标志指定其他journald日志记录驱动程序选项。-W (--workdir)
指定进入容器后的工作目录--cpu-period int
限制cpu周期--cpu-quota int
限制cpu使用量-c (--cpu-shares int)
设置cup资源分配。默认是这值为1024,各值为相对值--cpuset-cpus string
限制cpu个数--cpuset="0,1" 则使用第一与第二个cup
--cupset="0-2" 则使用从第一到第三个cup
--device-read-bps list
限制磁盘读取--device-write-bps list
限制磁盘写入--device-read-iops list
限制磁盘读取io--device-write-iops list
限制磁盘写入io-m (--memory bytes)
限制容器内存--memory-reservation bytes
容器内存软限制,允许突破限制memory-swap bytes
限制虚拟内存memory-swappiness int
设置swap权重 【0-10】 0禁止使用--storage-opt list
限制磁盘使用(只支持devicemapper存储驱动)
4.查看运行中容器
docker ps -a
5.查看所有运行中容器id
docker ps -a -q
6.删除镜像
docker rmi [REPOSITORY|image id]
7.删除容器
-
删除未运行容器。
docker rm [CONTAINER ID|NAMES]
- 删除运行中的容器
docker rm -f [CONTAINER ID|NAMES]
docker rm -f $(docker ps -a -q)
8.进入容器
1.使用ssh登陆进容器
- 需要在容器中启动sshd,存在开销和***面增大的问题。同时也违反了Docker所倡导
的一个容器一个进程的原则。
2.使用nsenter、nsinit等第三方工具。
- 需要额外学习使用第三方工具。
3.使用docker本身提供的工具(常用)
docker attach [CONTAINER ID|NAMES]
- Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。
但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。
- Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。
-
docker exec [CONTAINER ID|NAMES] [COMMAND]
-
docker exec执行后,会命令执行返回值。
docker exec [CONTAINER ID|NAMES] [COMMAND]
- 关于-i、-t参数.
- 只用-i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令.返回值都可以正确获取。
- 如果只使用-t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin 的输出,无法看到命令执行情况。
- 使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致整个容器退出。这种方式可以替代ssh或者nsenter、nsinit方式,在容器内进行操作。
docker exec -it [CONTAINER ID|NAMES] [COMMAND]
相当于将容器执行效果反馈到当前终端。
- 关于-d参数
- 在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回。 程序在后台运行。
- 如果不使用-d参数,由于命令需要长时间执行,docker exec会卡住,一直等命令执行完成才返回。
-
9.退出容器
ctrl+p --> ctrl+q
exit
会停止容器
10.显示更底层的容器或image信息
docker inspect [CONTAINER ID|NAMES]
-
显示实例ip:
sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' $INSTANCE_ID
-
列出绑定端口:
sudo docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID
-
获取特殊端口映射
sudo docker inspect --format='{{(index (index .NetworkSettings.Ports "8787/tcp") 0).HostPort}}' $INSTANCE_ID
- 获取配置信息:
sudo docker inspect --format='{{json .config}}' $INSTANCE_ID
11.docker网络管理
-
docker network create [options]
创建网络,默认闯将出来是bridgedocker network create --subnet=192.168.100.0/24 network_192.168_100
创建名称为‘network_192.168_100’ 网络范围为192.168.100.0/24的网络。(注意:强烈建议--subnet在创建网络时使用该选项。如果--subnet未指定,则docker守护程序会自动选择并为网络分配一个子网,并且可能会与您的基础架构中不由docker管理的另一个子网重叠。当容器连接到该网络时,这种重叠会导致连接问题或故障。除了--subnet选项,你也可以指定--gateway, --ip-range和--aux-address选项。)-d overlay (--driver=overlay)
overlay属性的驱动。docker network ls
查看网络--network-alias string
指定容器在网络中的别名docker network connect [networkname] [CONTAINER ID|NAMES]
将容器加入到网络中docker network disconnect [option](-f 强制) [networkname] [CONTAINER ID|NAMES]
将容器从网络中断开。docker network rm [networkname]
删除网络
12.docker拷贝
-
拷贝容器内的文件到宿主
docker cp [CONTAINER ID|NAMES]:$path $path
- 拷贝宿主文件到容器中
docker cp $path [CONTAINER ID|NAMES]:$path
13.docker diff
- 比较一个容器不同版本提交的文件差异
docker diff [CONTAINER ID|NAMES]
14.docker容器重命名
docker rename [CONTAINER ID|NAMES]
15.docker获取容器终端日志
docker logs [CONTAINER ID|NAMES]
16.docker动态获取容器负载情况
docker top [CONTAINER ID|NAMES]
17.docker动态获取容器性能使用情况
docker status [CONTAINER ID |NAMES]
18.docker获取映射端口信息
docker port [CONTAINER ID|NAMES]
19.更新docker资源和参数限制
docker update [OPTIONS] [CONTAINER ID|NAMES]
20.docker整体事件日志
docker events [OPTIONS]