8.Docker基本使用
容器管理
docker [container] COMMAND IMAGE
其中有标记*;代表image可省略或替换早起版本写法
指令 command | 描述 | |
---|---|---|
attach | Attach local standard input, output, and error streams to a running container | |
commit | Create a new image from a container's changes | 创建一个新镜像来自一个容器 |
cp | Copy files/folders between a container and the local filesystem | 拷贝文件/文件夹到一个容器 |
*create | Create a new container | 创建新容器 |
diff | Inspect changes to files or directories on a container's filesystem | |
exec | Run a command in a running container | 在容器中运行命令 |
export | Export a container's filesystem as a tar archive | |
inspect | Display detailed information on one or more containers | |
kill | Kill one or more running containers | 杀死一个或多个容器 |
logs | Fetch the logs of a container | 获取一个容器日志 |
*ls[ps] | List containers | 列出容器 |
pause | Pause all processes within one or more containers | 暂停一个或多个容器 |
port | List port mappings or a specific mapping for the container | 列出或指定容器端口映射 |
prune | Remove all stopped containers | 删除所以停止容器 |
rename | Rename a container | 重命名容器 |
restart | Restart one or more containers | 重启一个或多个容器 |
*rm | Remove one or more containers | 删除一个或多个容器 |
run | Run a command in a new container | 创建并运行一个容器 |
start | Start one or more stopped containers | 启动一个或多个容器 |
stats | Display a live stream of container(s) resource usage statistics | 显示容器资源使用统计 |
stop | Stop one or more running containers | 停启动一个或多个容器 |
top | Display the running processes of a container | 查看容器运行过程 |
unpause | Unpause all processes within one or more containers | 取消暂停一个或多个容器 |
创建容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker [container] run --help
选项 | 描述 |
---|---|
-i, -interactive | 交互式 |
-t, -tty | 分配一个伪终端 |
-d, -detach | 运行容器到后台 |
-e, -env | 设置环境变量 |
-p, -publish list | 发布容器端口到主机 |
-P, -publish-all | 发布容器所有EXPOSE的端口到宿主机随机端口 |
-name string | 指定容器名称 |
-h, -hostname | 设置容器主机名 |
-ip string | 指定容器IP,只能用于自定义网络 |
-network | 连接容器到一个网络 |
-mount mount | 将文件系统附加到容器 |
-v, -volume list | 绑定挂载一个卷 |
-restart string | 容器退出时重启策略,默认no,可选值:[always |
容器内部PID=1进程(main process)宕掉,容器即停止,内部进程成为孤岛无法提供服务
即容器里必须有一个可以长久执行的进程
- 以服务类型的命令;需要有镜像有相关的服务,并且服务支持前台运行;例如Nginx
daemon off
- shell命令;例如
tail -f
- 执行脚本,主要是可以在容器启动的时候执行比较多的操作;可以修改配置文件,启动服务等
临时测试启动
#直接进入容器,并随机生成容器ID和名称
docker run -it docker.io/centos bash
#退出容器不注销
crtl + p + q
创建容器
docker run nginx:latest
#指定镜像名称
docker run --name gms_web01 nginx:latest
启动&关闭容器
#启动容器
docker start [NAMES]/[CONTAINER ID]
#关闭容器
docker stop [NAMES]/[CONTAINER ID]
暂停&恢复容器
#暂停容器
docker pause [CONTAINER ID]
#取消暂停
docker unpause [CONTAINER ID]
删除容器
docker rm --help
docker rm [OPTIONS] CONTAINER [CONTAINER...]
选项 | 描述 |
---|---|
-f, --force | 强制删除 |
-l, --link | 删除link |
-v, --volumes | 删除容器数据卷 |
#不能删除正在运行的容器,需要在之前停止或加-f;慎重使用
docker rm -v [CONTAINER NAME]
容器状态转换
Docker封装了对容器底层的管理,只提供简单的操作接口,也就意味着Docker里对容器的一些运行细节会被更加严格的定义,其中就包括了容器的生命周期,也即图中色块表示的:Created、Running、Paused、Stopped、Deleted。
查看容器
显示本机运行的容器状态
Usage: docker ps [OPTIONS]
选项 | 描述 |
---|---|
-a, --all | 显示所有的容器,包括未运行的。 |
-f, --filter | 根据条件过滤显示的内容。 |
--format | 指定返回值的模板文件。 |
-l, --latest | 显示最近创建的容器。 |
-n,last int | 列出最近创建的n个容器。 |
--no-trunc | 不截断输出。 |
-q, --quiet | 静默模式,只显示容器编号。 |
-s, --size | 显示总的文件大小 |
显示所有容器
#包括当前正在运行以及已经关闭的所有容器
docker ps -a
在同一个宿主机行,容器名称是独一无二不可重复的,而且端口映射也不能重复
查看容器详细状态
#查看inspect使用
docker inspect --help
Options:
-f, --format string Format the output using the given Go template
-s, --size Display total file sizes if the type is container
--type string Return JSON for specified type
#查看容器信息,会显示出所有信息
docker inspect [CONTAINER ID]
docker inspect 5a31e04d6d9d
#查看容器指定信息,json格式
查看日志
docker logs IMAGENAME
#一次查看
docker logs nginx
#持续查看
docker logs -f nginx
端口映射
#指定宿主机80端口访问容器80端口
docker run -d -it -p 宿主机端口:容器端口 nginx
docker run -d -it -p 80:80 nginx
#本质上是在宿主机上做了目标ip地址转换
iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 33 packets, 2581 bytes)
pkts bytes target prot opt in out source destination
1038K 62M DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 8 packets, 480 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 8 packets, 480 bytes)
pkts bytes target prot opt in out source destination
1 52 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 8 packets, 480 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:80
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
#指定宿主机随机端口访问容器
docker run -d -it -P nginx
#指定本地IP端口
docker run -d -it --name gms_web02 -p 192.168.10.205:8080:80 nginx
#如果未指定端口则为随机主机端口
docker run -d -it --name gms_web03 -p 192.168.10.205::80 nginx
#指定映射协议,例如dns服务
docker run -d -it --name gms_web04 -p 8553:53/udp nginx
#映射多个端口
docker run -d -it -p 86:80/tcp -p 10086:52/tcp
查看容器映射端口
docker port [CONTAINER ID]/[NAMES]
#示例
docker port sharp_benz
80/tcp -> 0.0.0.0:80
命令传递
容器需要一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令
容器内默认不适用systemd作为PID为1的守护进程,因为容器里没有kerner
容器里必须有一个进程可以一直运行下去,这个进程就会被封装为PID为1的守护进程
docker run -d centos /usr/bintail -f '/etc/hosts'
#给nginx传递命令
docker run -it nginx echo "123456"
docker run -it nginx nginx "nginx -g daemon off"
传递的命令的优先级高于镜像默认的启动命令而且是默认的启动命令
资源限制
选项 | 描述 |
---|---|
-m,–memory | 容器可以使用的最大内存量 |
-memory-swap | 允许交换到磁盘的内存量 |
-memory-swappiness=<0-100> | 容器使用SWAP分区交换的百分比(0-100,默认为-1) |
-oom-kill-disable | 禁用OOM Killer |
--cpus | 可以使用的CPU数量 |
-cpuset-cpus | 限制容器使用特定的CPU核心,如(0-3, 0,1) |
-cpu-shares | CPU共享(相对权重) |
内存限额:
允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer:
docker run -d --name nginx03 --memory="500m" --memory-swap=“600m" --oom-kill-disable nginx
CPU限额:
允许容器最多使用一个半的CPU:
docker run -d --name nginx04 --cpus="1.5" nginx
允许容器最多使用50%的CPU:
docker run -d --name nginx05 --cpus=".5" nginx
进入容器
attache命令
类似于vnc,操作会在各个容器界面显示,所有使用此方式进入容器的操作都是同步显示的,且exit后容器将被关闭使用exit退出后容器关闭,不推荐使用
#以centos为例
docker run -it centos bash
#新开一个终端执行
docker attach [CONTAINER ID]
exec命令
执行单词命令进入容器,exit退出后容器还在运行
docker exec -it centos_test03
nsenter命令
需要通过PID进入到容器内部,不过可以使用docker inspect
获取到容器PID
#安装util-linux包
yum install util-linux -y
#查看容器Pid
docker inspect -f "{{.State.Pid}}" 5a31e04d6d9d
476
#查看容器IP
docker inspect -f "{{.NetworkSettings.Networks.bridge.IPAddress}}" 5a31e04d6d9d
172.17.0.2
#查看使用方法
nsenter --help
Options:
-t, --target <pid> target process to get namespaces from
-m, --mount[=<file>] enter mount namespace
-u, --uts[=<file>] enter UTS namespace (hostname etc)
-i, --ipc[=<file>] enter System V IPC namespace
-n, --net[=<file>] enter network namespace
-p, --pid[=<file>] enter pid namespace
-U, --user[=<file>] enter user namespace
-S, --setuid <uid> set uid in entered namespace
-G, --setgid <gid> set gid in entered namespace
--preserve-credentials do not touch uids or gids
-r, --root[=<dir>] set the root directory
-w, --wd[=<dir>] set the working directory
-F, --no-fork do not fork before exec'ing <program>
-Z, --follow-context set SELinux context according to --target PID
-h, --help display this help and exit
-V, --version output version information and exit
#进入容器
nsenter -t 476 -m -u -i -n -p
编写脚本
mkdir /root/scripts
cat docker_in.sh
#!/bin/bash
docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID} )
nsenter -t ${PID} -m -u -i -n -p
}
docker_in $1
chmod +x docker_in.sh
补充说明
#在docker镜像;会缺乏一些基础命令
#例如debian系统中缺乏一些基础命令,安装
apt update
apt install procps(top 命令)
apt install iputils-ping(ping 命令)
apt install net-tool(网络工具)
批量操作
#批量停止
docker stop `docker ps -a -q`
#批量启动
docker start `docker ps -a -q`
#批量重启
docker restart `docker ps -a -q`
#批量杀死运行的容器:
docker kill `docker ps -a -q`
#批量删除所有容器:
docker rm `docker ps -a -q`
#批量删除已退出容器
docker rm `docker ps -a -q -f status=exited`
#批量强制删除所有镜像:
docker rmi -f `docker images -q`
#批量删除所有未打 dangling 标签的镜像
docker rmi `docker images -q -f dangling=true`
域名解析
查看容器内部hosts文件
#即以[CONTAINER ID]为主机名称
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
881b9e87b73e nginx ......
......
#进入nginx
docker exec -it 881b9e87b73e /bin/bash
root@881b9e87b73e:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 881b9e87b73e
指定DNS
#使用宿主机dns,注意内网环境解析问题
root@5a31e04d6d9d:/# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 114.114.114.114
#创建容器时指定dns
docker run -d -it --dns 172.31.7.254 nginx
#进入nginx
docker exec -it 881b9e87b73e /bin/bash
root@881b9e87b73e:/# cat /etc/resolv.conf
nameserver 172.31.7.254