一 命令格式

docker的命令分老版命令格式和新版命令格式,新版命令主要是更直观了,添加了镜像[image]和容器[container]来区分命令,简单举例对比:

1.显示容器命令
老版命令:docker ps
新版命令:docker container ls
2.显示镜像命令
老版命令: docker images
新版命令: docker image ls
3.删除镜像命令
老版命令: docker rmi centos:latest
新版命令: docker image rm centos:latest

二 镜像相关命令

1.搜索镜像:

docker search xxx
选镜像的建议:优先考虑官方镜像,然后是starts数量多的镜像

2.拉取/推送镜像:

1.拉取镜像到本地
docker image pull centos
2.推送centos镜像到仓库
docker image push centos

3. 镜像加速器

/etc/docker/daemon.json文件中写上仓库和地址,详见docker部署章节

4. 查看/删除镜像

1.查看镜像
docker image ls
2.删除镜像
docker image rm centos

5. 导入导出镜像

1.导出镜像
docker image save centos > docker-centos7.4.tar.gz
2.导入镜像
docker image load -i docker-centos7.4.tar.gz

三 容器相关命令

1. 创建启动容器

1.创建容器并启动

1
2
3
4
5
6
#创建并启动容器
docker container run -d -p 80:80 nginx:latest {cmd}
#单独创建容器
docker container create -p 80:80 nginx
#单独启动容器
docker container start -d 容器ID|容器名

2.常规参数

参数名 功能 不带此参数时
-d 将容器放在后台运行 前台运行,会占用终端
-p 进行端口映射 有些复杂,单独说明
-it 分配新终端并进入容器 不会进入容器内部
–name 指定容器的名字 随机命名
cmd 覆盖容器的初始命令 使用容器的初始命令
–cpus 限定cpu的权重 不限制
-memory 限定内存的大小 不限制
-h 指定容器的主机名 以容器端ID命名

2. 停止删除容器

1.停止容器
docker container stop 容器ID|容器名
2.杀死容器
docker container kill 容器ID|容器名
3.删除容器
docker container rm 容器ID|容器名
4.批量删除容器
docker container rm -f $(docker container ls -a -q)

3. 查看容器

1.查看容器

1
2
3
4
#查看运行中的容器
docker container ls
#查看所有容器
docker container ls -a

2.查看指定容器详细信息
以下命令可以查看容器的超详细信息,以json格式显示
docker container inspect 容器ID|容器名

4. 进入容器的方法

进入容器的目的:排错,调试

1.attach 方法[不常用]
docker container attach [OPTIONS] 容器ID|容器名
此方法会是进入容器当前终端,会实时打印容器的输出信息,退出很麻烦[Ctrl+p Ctrl+q ],容易按成[Ctrl+c]导致容器被关闭
2.exec方法
docker container exec [OPTIONS] 容器ID|容器名 {命令}
常用docker exec -it xxx /bin/bash 的方法打开新终端进入容器

四 端口映射

1.docker容器为什么要使用端口映射

默认情况下,容器使用的ip网段是172.17.0.0/16,外界的用户只能访问宿主机的10.0.0.0/24网段,无法访问172.17.0.0/16网段。
而我们运行容器的目的,是希望运行在容器中的服务,能够被外界访问,这里就涉及到了外网10.0.0.0/24到容器内网172.17.0.0/16网段的转换,所以需要做端口映射。

2.docker容器端口映射的方法

docker 的端口映射是通过自动添加一条iptables规则实现的

1.指定映射端口

语法 举例 说明
-p hPort:cPort -p 8800:80 主机8800映射容器80
同上,指定多个-p -p 81:80 -p 443:443
-p ip:hPort:cPort -p 10.0.0.11:8800:80 指定主机IP
-p crPort -p 80 随机端口映射容器80
-p ip::crPort -p 10.0.11::80 IP指定,主机端口随机
-p hPort:cPort:udp -p 8800:80:udp 默认tcp映射,改为UDP

2.完全随机映射
docker run -P
dockerfile创建镜像时指定的,需要映射出来的内网端口,做外网随机映射

五 docker资源限额

一个 docker host 上会运行若干容器,每个容器都需要 CPU、内存和 IO 资源,Docker 提供了资源限制的机制避免某个容器因占用太多资源而影响其他容器乃至整个 host 的性能。

A. 内存限额

与操作系统类似,容器可使用的内存包括两部分:物理内存和 swap。

  1. -m--memory:设置内存的使用限额,例如 100M, 2G。
  2. --memory-swap:设置 内存+swap 的使用限额。
  3. 默认情况下都为为 -1,即对容器内存和 swap 的使用没有限制。
  4. 如果只指定 -m 参数,那么 --memory-swap 默认为 -m 的两倍

命令案例:

1
docker run -m 200M --memory-swap=300M ubuntu

允许该容器最多使用 200M 的内存和 100M 的 swap。

A1 动态修改内存限额

动态修改运行中的容器内存限额,需要用到update参数,并且不能只修改内存限制,需要同步修改swap限制,否则会报错,报错详见:
参考链接

1
docker update  --memory 2048m --memory-swap -1 gitlab

B. cpu限额

通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。

  1. 默认所有容器可以平等地使用 host CPU 资源 ,并且没有限制。
  2. 通过 -c--cpu-shares 设置容器使用 CPU 的权重。
  3. 如果不指定,默认值为 1024。
  4. 通过 cpu share 可以设置容器使用 CPU 的优先级。

案例:在 host 中启动了两个容器:

1
2
docker run --name "container_A" -c 1024 ubuntu
docker run --name "container_B" -c 512 ubuntu

container_A 的 cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。

这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 container_A 处于空闲状态,这时,为了充分利用 CPU 资源,container_B 也可以分配到全部可用的 CPU。

C. 磁盘限额

Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽,下面分别讨论。

目前 Block IO 限额只对 direct IO(不使用文件缓存)有效。

1.block IO 权重
默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block IO 的优先级。
--blkio-weight--cpu-shares 类似,设置的是相对权重值,默认为 500。
在下面的例子中,container_A 读写磁盘的带宽是 container_B 的两倍。

1
2
docker run -it --name container\_A --blkio-weight 600 ubuntu   
docker run -it --name container\_B --blkio-weight 300 ubuntu

2.限制 bps 和 iops
bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数。

  • --device-read-bps,限制读某个设备的 bps。
  • --device-write-bps,限制写某个设备的 bps。
  • --device-read-iops,限制读某个设备的 iops。
  • --device-write-iops,限制写某个设备的 iops。

下面这个例子限制容器写 /dev/sda 的速率为 30 MB/s

1
docker run -it --device-write-bps /dev/sda:30MB ubuntu

六 数据卷与挂载

A.常见的docker数据卷命令

  • 创建一个数据卷
    docker volume create xxx
  • 查看数据卷列表
    docker volume ls
  • 删除一个数据卷
    docker volume rm
  • 查看一个数据卷的属性
    docker volume inspect

B.数据卷与容器卷挂载

  1. 绑定卷
1
docker run -d -p 80:80  -v /data/test/:/usr/share/nginx/html nginx
  1. 容器管理卷
1
2
docker run -d -p 180:80 -v         /usr/share/nginx/html nginx
docker run -d -p 380:80 -v noah-v1:/usr/share/nginx/html nginx
  1. 容器卷
1
2
docker volume create noah-v2
docker run -d -p 801:80 --volumes-from vc_data nginx