官方文档:https://docs.docker.com/engine/reference/commandline/docker/
一.创建容器
1.搜索镜像并下载
搜索镜像可以去:https://hub.docker.com/,上面有详细的版本信息以及下载和启动的命令
docker search mysql
docker pull mysql # 下载最新版
docker pull mysql:5.7.29 # 下载执行版本
2.启动容器
# 这样启动会失败,因为启动mysql的镜像需要提供一些参数
docker run --name mysql01 -d mysql
docker ps -a # 查看启动失败后的容器id
docker logs 42f09819908b # 查看启动失败的原因
# 正确的命令,-p端口映射,--name指定容器名,-e指定参数,-d后台运行,mysql对应了镜像名
docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
# 更高级的启动命令,具体可以参考docker hub
docker run -p 13306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.29 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# -v 共享卷
docker run -d --name mrdoc -p 10086:10086 -v ~/mrdoc:/app/MrDoc/config -v ~/mrdoc/media:/app/MrDoc/media jonnyan404/mrdoc-alpine
补充
# 启动一个centos容器,--name执行容器的名字,-it支持交互模式,centos为镜像名
# 后面跟的是容器启动后执行的命令,输出的是容器的长id
[root@VM_0_46_centos ~] docker run --name "mycentos" -d -it centos
3.工具类容器:提供一个临时的工作环境,通常以 run -it 方式运行
run -it 的作用是在容器启动后就直接进入
执行 exit 退出终端,同时容器停止
[root@VM_0_46_centos ~]# docker run -it busybox
/ #
/ # wget www.baidu.com
Connecting to www.baidu.com (180.101.49.12:80)
saving to 'index.html'
index.html 100% |*****************************************************************************************************************************************************************| 2381 0:00:00 ETA
'index.html' saved
/ # exit
[root@VM_0_46_centos ~]#
3.先创建,后启动
docker run 命令实际上是 docker create 和 docker start 的组合
docker create httpd # 创建容器,这里的httpd是镜像
docker start d9e219772096 # 启动容器
二.容器的进入和退出
1.attach
# 进入容器,支持容器名或者短id
# 启动容器时如果加了-it参数,在容器内可通过ctrl+p然后ctrl+q退出
[root@VM_0_46_centos ~] docker attach mycentos
I am in container
I am in container
···
2.exec
# 第二种进入方式exec,可通过exit退出
# docker exec -it <container> bash|sh 是执行 exec 最常用的方式。
# 进入容器,打开一个bash终端
[root@VM_0_46_centos ~] docker exec -it mycentos bash
# 在容器种执行了一次ps命令
[root@d9e219772096 /] ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 2971 do_wai 14:55 pts/0 00:00:00 /bin/bash -c while true; do sleep 1; echo 'I am in container'; done
4 S root 466 0 0 80 0 - 3004 do_wai 15:02 pts/1 00:00:00 bash
4 R root 499 466 0 80 0 - 10984 - 15:03 pts/1 00:00:00 ps -elf
0 S root 500 1 0 80 0 - 5753 hrtime 15:03 pts/0 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
# 停止容器
docker stop d9e219772096
3.attach 与 exec 主要区别:
- attach 直接进入容器 启动命令 的终端,不会启动新的进程。
- exec 则是在容器中打开新的终端,并且可以启动新的进程。
- 如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。
如果只是为了查看启动命令的输出,可以使用 docker logs 命令
# -f 的作用与 tail -f 类似,能够持续打印输出。
docker logs -f mycentos
三.常用操作
1.stop/start/restart 容器
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器
docker start/stop/restart 容器名/id # 启动,停止和重启
docker kill mycentos # 快速停止容器
2.自动重启
docker run -d --restart=always httpd # 容器停止后自动重启
# 启动进程退出代码非0,则重启容器,最多重启3次。
docker run -d --restart=on-failure:3 httpd
3.暂停
让容器暂停工作一段时间,处于暂停状态的容器不会占用 CPU 资源,直到通过 docker unpause 恢复运行
docker pause mycentos
docker unpause mycentos
4.删除
使用 docker 一段时间后,host 上可能会有大量已经退出了的容器,这些容器依然会占用 host 的文件系统资源
docker ps -a
docker rm hardcore_babbage festive_leakey # 删除2个容器
docker rm -v $(docker ps -aq -f status=exited) # 批量删除所有已经退出的容器
docker images
docker rmi centos_with_vim # 删除镜像
四.资源限额
1.内存限制
计算机对内存分为物理内存与虚拟内存,物理内存就是计算机的实际内存大小,虚拟内存则是虚拟出来的、使用磁盘代替内存
swap全称为swap place,即交换区,当内存不够的时候,进程被踢出,暂时存储到交换区。当需要这条被踢出的进程时,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。
限额参数
- -m 或 --memory:设置内存的使用限额,例如 100M, 2G。
- –memory-swap:设置 内存+swap 的使用限额。
如果在启动容器时只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍
# 允许该容器最多使用 200M 的内存和 100M 的 swap。
# 默认情况下,两组参数为 -1,即对容器内存和 swap 的使用没有限制
docker run -m 200M --memory-swap=300M ubuntu
2.CPU限制
默认设置下,所有容器可以平等地使用 host CPU 资源并且没有限制。
Docker 可以通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重
换句话说:通过 cpu share 可以设置容器使用 CPU 的优先级。
docker run --name "container_A" -c 1024 ubuntu
docker run --name "container_B" -c 512 ubuntu
这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 container_A 处于空闲状态,这时,为了充分利用 CPU 资源,container_B 也可以分配到全部可用的 CPU。
3.Block IO :磁盘的读写
–blkio-weight 参数来设置容器 block IO 的优先级(权重)
docker run -it --name container_A --blkio-weight 600 ubuntu
docker run -it --name container_B --blkio-weight 300 ubuntu
bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数。
五.容器的底层实现技术
cgroup 实现资源限额, namespace 实现资源隔离。
cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。
每个容器配置的对应目录: /sys/fs/cgroup/cpu/docker/长id/
namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离。
Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、IPC、PID、Network 和 User
参考:《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html