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)宕掉,容器即停止,内部进程成为孤岛无法提供服务

即容器里必须有一个可以长久执行的进程

  1. 以服务类型的命令;需要有镜像有相关的服务,并且服务支持前台运行;例如Nginx daemon off
  2. shell命令;例如 tail -f
  3. 执行脚本,主要是可以在容器启动的时候执行比较多的操作;可以修改配置文件,启动服务等

临时测试启动

#直接进入容器,并随机生成容器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
原文地址:https://www.cnblogs.com/Gmiaomiao/p/13199267.html