1.创建容器
docker run 命令,是把两个单独的步骤融合到一起了:
- 第一步使用底层的映像创建容器,这一步可以单独执行docker create命令完成
- 第二步是启动容器,这一步可以执行docker start命令完成
参数:
-p:把容器的端口映射到宿主机的端口上
-e:把环境变量传入容器
容器的名字
默认情况下,Docker使用一个形容词和一个名人的名字随机命名容器。
如果想指定容器的名字,可以使用--name选项:
docker create --name="awesome-service" ubuntu:latest
一个宿主机中只能运行一个有特定名字的容器。
标注
标注可以作为Docker映像和容器元数据的键值对。创建容器时,容器会自动继承映像的全部标注。
也可以为容器添加新标注,为具体的容器添加特定的元数据:
docker run -d --name labels -l deployer=Ahmed -l tester=Asako ubuntu:latest sleep 1000
有了标注,执行docker ps等命令时可以使用元数据搜索和过滤容器:
docker ps -a -f label=deployer=Ahmed
执行docker inspect命令可以查看容器的所有标注:
docker inspect abc71b41e6b8
主机名
默认情况下,启动容器时,Docker会把宿主机系统中特定的系统文件(如/etc/hostname)复制到宿主机中保存容器配置的目录里,然后使用绑定挂载把副本链接到容器里。
执行下述命令可以启动一个没有任何特殊配置的容器:
docker run --rm --ti ubuntu:latest /bin/bash
--rm:退出容器时删除这个容器
-t:让Docker分配一个伪TTY
-i:告诉Docker,这是个交互会话,让标准输出保持打开状态
查看主机名
hostname -f
若想明确指定主机名,可以使用--hostname选项设置具体的值:
docker run --rm -ti --hostname="mycontainer.example.com" ubuntu:latest /bin/bash
域名服务(DNS)
默认情况下,挂载的resolv.conf文件与Docker宿主机里的完全一样。如果不想使用宿主机里配置的域名服务,可以使用--dns和--dns-search选项修改容器里这个文件的内容:
docker run --rm -ti --dns=8.8.8.8 --dns=8.8.4.4 --dns-search=example1.com \
--dns-search=example2.com ubuntu:latest /bin/bash
如果不想设置搜索域,可以使用--dns-search=.
这时候再去查看Docker容器里resolv.conf文件的内容:
root@abc71b41e6b8:/# more /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
search example1.com example1.com
2.存储卷
有时默认为容器分配的磁盘空间或瞬息即逝的天性不能满足手头的作业需求,需要在多次运行之间持久存储一些数据。
警告⚠️:挂载Docker宿主机的存储卷通常是不明智的做法,因为这样容器的持久状态和特定的Docker宿主机绑定到一起了。不过,对临时缓存文件或不完全瞬息即逝的状态来说,可以这么做。
遇到这种情况时,可以使用-v标志,把宿主机的文件系统挂载到容器中。下面这个例子吧/mnt/session_data目录挂载到容器里的/data目录上:
docker run --rm -ti -v /mnt/session_data:/data ubuntu:latest /bin/bash
如果容器里的应用把数据写入/data目录,在宿主机文件系统的/mnt/session_data目录里能看到这些数据,而且容器停止后再重启,会继续使用这个挂载的卷。
注意:这个命令不要求容器的挂载点事先已经存在。
可以使用下面的方式禁止容器里的进程把任何数据写入根文件系统:
docker run --rm -ti --read-only=true -v /mnt/session_data:/data ubuntu:latest /bin/bash
不过,/session_data目录依然以rw方式挂载,因此应用能成功把数据写入这个卷。
3.资源配额
执行 docker create 命令创建容器时,可以直接配置分配给容器的CPU和内存容量
CPU份额
Docker把CPU等分成一定的份额,把系统中所有CPU内核的计算能力分成若干份,总量是1024份。
[图片上传失败...(image-4717a7-1546611254121)]
如果没使用cgroup功能限制资源,执行stress命令时指定多少资源就会使用多少。下述命令会创建两个CPU密集型进程、一个I/O密集型进程和两个占用内存的进程,因此平均负载为5:
docker run --rm -ti progrium/stress \
--cpu 2 --io 1 --vm 2 --vm-bytes 128M --timeout 120s
[图片上传失败...(image-153f21-1546611254121)]
[图片上传失败...(image-adc8ed-1546611254121)]
如果想执行相同的stress命令,但是把CPU时间减半,可以执行下述命令:
docker run --rm -ti -c 512 progrium/stress \
--cpu 2 --io 1 --vm 2 --vm-bytes 128M --timeout 120s
Warning: '-c' is deprecated, it will be replaced by '--cpu-shares' soon. See usage.
Error response from daemon: Cannot start container c1cb9b3e549fc24cb62093038fcfd9476ba5eefbed1c4f5a024a45b34daa596a: [8] System error: open /run/lxcfs/controllers/cpu,cpuacct/init.scope/system.slice/docker-c1cb9b3e549fc24cb62093038fcfd9476ba5eefbed1c4f5a024a45b34daa596a.scope/cpu.shares: no such file or directory
CPU关联
容器还可以关联到一个或多个CPU内核上。关联后,调度程序只会把容器安排在所关联的CPU内核中运行。
docker run --rm -ti -c 512 --cpuset=0 progrium/stress \
--cpu 2 --io 1 --vm 2 --vm-bytes 128M --timeout 120s
警告⚠️:--cpuset选项的值从零开始,因此第一个CPU内核的编号是0.如果让Docker使用宿主系统没有的CPU内核,会导致“Cannot start container"错误。
注意:如果关联了CPU,容器的CPU份额限制就只对运行在同一个CPU内核中的其他容器有影响。
内存
容器使用的内存量可以像限制CPU那样控制。不过,两种控制方式有一个重大区别:
CPU限额只影响应用使用CPU时间的优先级,而内存是硬性限制。
即便内存充足,有96GB闲置内存,但是如果只让容器使用24GB,那么不管系统有多少闲置内存,容器最多只能使用24GB。
鉴于Linux虚拟内存系统的工作方式,为容器分配的内存量可以多于物理内存(即RAM)的大小。此时,容器像普通的Linux进程一样,用完物理内存之后会使用交换空间。
下面执行docker run命令启动一个容器,并且传入-m选项,设置内存限额:
docker run --rm -ti -m 512m progrium/stress \
--cpu 2 --io 1 --vm 2 --vm-bytes 128M --timeout 120s
如果想单独设置交换空间的大小,或者彻底禁用交换空间,还要使用 --memory-swap 选项。这个选项的值是容器可用内存量和交换空间的大小之和。
docker run --rm -ti -m 512m --memory-swap=768m progrium/stress \
--cpu 2 --io 1 --vm 2 --vm-bytes 128M --timeout 120s
把--memory-swap 选项的值设为-1,则完全禁止容器使用交换空间。
如果内存不足,会抛出OOM异常,病导致容器退出。
用户权限
限制UNIX进程的可用资源还有一种常用方式——使用用户权限(user limits)功能,使用ulimit命令通常可以对下述各项做软性限制和硬性限制:
[图片上传失败...(image-26afbd-1546611254121)]
可以设置Docker守护进程为各个容器分配的默认用户权限。下述命令告诉Docker守护进程,每个容器可以打开150个文件,可以运行20个进程,而且这是硬性限制:
sudo docker -d --default-ulimit nofile=50:150 --default-ulimit nproc=10:20
启动容器时可以使用 --ulimit 选项覆盖默认的用户权限:
docker run -d --ulimit nproc=100:200 nginx
网友评论