docker容器使用
容器管理
容器相关命令:
docker container cmd
docker cmd [options] [容器]
cmd:
attach
commit
cp
create
diff
exec
export
inspect
kill
logs
ls
pause
port 容器 查看容器端口
prune
rename
restart
rm
run 容器 自动下载运行容器
start 启动
stats
stop 停止容器
top 容器 查看容器内的进程
unpause
update
wait
启动容器:
docker run可以启动容器,进入到容器,并随机生成容器ID和名称
启动流程:
- run命令执行后,docker先在本机找镜像,本机有则直接运行;没有则去官网:docker-hub下载,官网没有则报错,有就下载到本地运行
注意:
- 容器启动后,没有进行后台运行,将自动退出
- 容器启动时,指定了shell命令,命令自行完成自动关闭
命令:
docker run [选项] [镜像名] [shell命令] [参数]
选项:
-i 进入交互模式,一般和-t一起使用
-t 分配tty终端,一般和-i使用,且对应的容器必须运行shell才支持进入,配合-d可以使系统容器持久运行
-d 后台运行(守护进程),默认前台,适合无需交互式会话,适合运行应用程序和服务
docker -td --name ngx -P nginx
wget -qO - 容器ip 用wget模仿curl查看网页
--name 名称 容器命名
-h 容器内的主机名
--rm 容器 配合交互式命令:exit,退出时删除容器
-p 主机端口:容器端口 运行容器时指定端口
-P 运行容器时,随机指定端口
--dns 设置dns
--entrypoint 使用dockerfile中的entrypoint指令
--restart=规则 容器重启规则
no 容器退出时,容器不会自动启动
on-failure[:状态码] 容器退出状态非0时,自动重启容器,指定状态码后只会退出码是这个时才重启
always 始终重启,且以守护进程方式,不论容器退出状态是什么,且开机自启
unless-stopped 始终重启,不以守护进程方式,不论容器退出状态
--privileged 允许容器中的root账号有真的root权限,特殊要求时使用
-e 传递环境变量、参数
-env-file 环境变量文件
-v 指定数据卷
--volumes-from 指定容器卷
--link 容器名 doeker自动解析别的容器ip,写入到hosts文件
--net=/--network 指定容器网络模式,默认bridge
none
brideg
host
container
--ip 运行时手动指定ip地址
-m 最大内存使用,可配合其他选项
--memory-reservation 容器最大使用内存,软限制,值要比-m小才能生效
--memory-swap 使用swap内存量,必须配合-m使用
--memory-swappiness swap使用倾向,0-100,与系统的用法一样
--kernel-memory 容器使用内核内存的最大量,因为涉及到内核态的io,当内核内存不足时,会有io阻塞,建议不改动
--oom-kill-disable omm发生时,内核默认终止容器的大占用进城,此设置为不限制容器内存使用。建议配合-m使用,否则不加限制可能把系统内存用完
--cpus= 指定容器可使用的cpu比率,如物理机总共4核,可--cpus=1.5(4个cpu中都用一点),但必须小于物理cpu个数。docker 1.13版本新增,代替period、quota
--cpu-period= 设置CFS程序调度周期,必须与--cpu-quota一起用,默认100微秒。docker 1.13以上用--cpus
--cpu-quota=
--cpuset-cpus= cpu绑定,与nginx一样,绑定在某些cpu
0开始
1,3 2和4号cpu
0-3 1到4号cpu
-c 1024 cpu使用权重。优先使用
--health-cmd 命令 健康检测命令,如curl xxx || exit 1
--health-start-period 时间 启动后多长时间内不做健康检测,默认0s为创建后就检测
--health-start-interval 时间 启动后多久后,间隔做一次检测,默认0s为创建就检测
--health-interval 时间
--health-timeout 时间
--health-retries 时间
容器内操作:
exit 退出容器并关闭容器
ctrl+q 从容器内退出,但不关闭容器
例:
docker run --name ng1 -d nginx
docker run --rm -it centos 容器中输入exit后退出容器且自动删除,用于测试
例:运行docker官方文档容器:
访问官网较慢时,可以运行一个容器,该容器专门存放官方文档
docker run -it -d -p 4000:4000 docs/docker.github.io:latest
查看容器信息:
docker ps [OPTIONS]
docker container ls [OPTIONS]
选项:
-a 显示所有
-q 只显示容器id
-s 显示所有文件大小
-f 过滤显示
status= 过滤状态
exited 退出状态的容器
running 运行状态
-n int 只显示几个容器
-l 显示最新创建的容器,关闭的也算,默认此选项
查看容器内进程信息:
docker top CONTAINER [ps OPTIONS]
例:
docker top nginx
查看容器资源使用情况:
docker stats [OPTIONS] [CONTAINER...]
选项:
-a 显示所有
--format 指定格式显示
--no-stream 静态显示,默认动态显示
--no-trunc
查看容器的详细信息:
docker inspect 可以查看docker各种对象的详细信息,包括:镜像,容器,网络等
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
选项:
-f 显示指定格式内容,相当于过滤显示,格式内容就是全部输出结果中的key,结果是key:value,指定格式是,在括号中指定key就行
例:
"{{.NetworkSettings.IPAddress}}" 容器ip
"{{.Metadata}}" 镜像元数据
"{{.Created}}" 镜像创建时间
-s 显示所有容器文件大小
删除容器:
docker rm 可以删除容器,即使容器正在运行当中,也可以被强制删除掉
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker container rm [OPTIONS] CONTAINER [CONTAINER...]
选项:
-f 强制删除一个运行中的容器
-v 删除与容器相关联的卷
例:删除所有容器
docker rm -f `docker ps -aq`
docker ps -qa |xargs docker rm -f
docker rm `docker ps -qf status=exited`
删除停止状态的容器:
docker container prune [OPTIONS]
选项:
--filter 过滤显示
-f 强制
例:删除所有停止状态的容器
docker container prune -f
容器的启动和暂停:
docker run|start|stop|restart|pause|unpause 容器ID
例:
#启动时进入容器
docker start -i nginx
docker run -it centos bash
#容器的暂停、恢复
docker pause nginx
docker unpause nginx
给容器发信号:
docker kill 可以给容器发信号,默认号SIGKILL,即9信号
docker kill [OPTIONS] CONTAINER [CONTAINER...]
选项:
-s 信号 发送信号,默认kill
进入容器:
attach命令:
类似于vnc,但所有连接同一个容器的会话,执行命令都是同步的,且exit会关闭容器,不建议使用
docker attach [OPTIONS] CONTAINER
exec命令:
在运行中的容器启动新进程,可以执行单次命令,以及进入容器,exit不会关闭容器
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
选项:
-d 后台运行
-e 设置环境变量
-i 进入交互式
-t 开启tty终端
例:
docker exec -it 容器id sh|bash
nsenter命令:
第三方工具,通过PID进入到容器内部,且退出后仍然正常运行: 不过需要事先使用docker inspect获取到容器的PID, 目前此方式使用较少,此工具来自于util-linux包
安装:
yum/apt install -y util-linux
例:
docker inspect -f "{{.NetworkSettings.IPAddress}}" cnetos 获取容器ip
docker inspect -f "{{.State.Pid}}" centos 获取容器pid
nsenter -t 18436 -m -u -i -n -p
查看容器的端口映射关系:
docker port 容器 [PRIVATE_PORT[/PROTO]]
暴露容器端口:
容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务
docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始。使用随机端口时,当停止容器后再启动可能会导致端口发生变化
启用端口后,docker自动生成iptables的nat规则
随机端口映射:
docker run -P nginx
指定端口映射:
多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同,如:容器1用80,映射物理机8080,容器2用80映射物理机9090
方法1:容器80端口映射物理机本地随机端口,等于-P
docker run -p 80 nginx
方法2:容器80端口映射物理机8080
docker run -p 8080:80 nginx
方法3:物理机ip:端口:容器端口
docker run -p 2.2.2.14:82:80 nginx
方法4:物理机ip:随机端口:容器端口
docker run -p 2.2.2.14::80 nginx
方法5:物理机ip:端口:容器端口/协议,默认tcp协议
docker run -p 2.2.2.14:85:80/tcp docker.io/httpd
方法6:一次性映射多个端口和协议
docker run -p 86:80/tcp -p 8443:443/tcp -p 53:53/udp nginx
例: 修改已将创建好的容器的端口映射
docker run -td --name ngx -p 8080:80 nginx
docker inspect ngx |grep Id 找到容器id
systemctl stop docker
cd /var/lib/docker/containers/容器id/ 进入容器配置文件目录
#修改当前容器的配置
vim hostconfig.json
#portbinding是容器内部端口,hostip是物理机端口
"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"8000"}]
systemctl start docker
docker start ngx
查看容器的日志:
docker logs 可以查看容器中运行的进程在控制台输出的日志信息
docker logs [OPTIONS] CONTAINER
选项:
--details 容器日志的其他详细信息,静态
-f 跟踪容器的日志信息,动态显示
--since 时间 显示该时间后开始的日志
--tail int 显示最后几行日志
-t 显示时间戳
--until 时间 显示该时间之前的日志
传递运行命令:
容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令
容器里的PID为1的守护进程的实现方式:
- 服务类: 如: Nginx,Tomcat,Apache ,但服务不能停
- 命令类: 如: tail -f /etc/hosts ,主要用于测试环境,
注意: 不要tail -f <服务访问日志> 会产生不必要的磁盘IO
例:
docker run -d alpine tail -f /etc/hosts
容器内部的hosts文件:
容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP
可以在容器运行的时候,就给容器添加对应的hosts解析
例:
docker run -it --rm --add-host www.hj.com:6.6.6.6 busybox
指定容器DNS:
容器的dns服务器,默认采用宿主机的dns地址,可以用下面方式指定其它的DNS地址
- 将dns地址配置在宿主机
- 在容器启动时加选项 --dns=x.x.x.x
- 在/etc/docker/daemon.json 文件中指定
查看主机dns:
ubuntu系统:
systemd-resolve --status |grep Server
rhel系统:
cat /etc/resolve
修改容器dns
运行时指定dns: 此方法优先级最高
docker run -it --rm --dns 8.8.8.8 centos bash
修改容器daemon文件:
vim /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"dns" : [ "114.114.114.114", "119.29.29.29"]
}
容器内和宿主机之间复制文件:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
选项:
-a 保留所有权限
-L 允许链接文件复制
例:
#A终端进入容器
docker run -it --name al alpine sh
#B终端复制文件
docker cp al:/etc/issue /opt/
用systemd控制容器运行:
为容器写自己的service文件,如为容器名称为hello的协议service文件管理
[Unit]
Description=Hello World
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
#pre是在start前要进行的操作
ExecStartPre=-/usr/bin/docker kill busybox-hello
ExecStartPre=-/usr/bin/docker rm busybox-hello
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox-hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/docker kill busybox-hello
[Install]
WantedBy=multi-user.target
#重载配置文件
systemctl daemon-reload
systemctl start hello.service
传递环境变量:
有些容器运行时,需要传递变量,可以使用 -e <参数> 或 --env-file <参数文件> 实现
mysql容器运行支持的环境变量参数
MYSQL_ROOT_PASSWORD root密码
MYSQL_ALLOW_EMPTY_PASSWORD root为空密码
MYSQL_RANDOM_ROOT_PASSWORD root为随机生成的密码
MYSQL_HOST mysql主机
MYSQL_DATABASE 创建数据库
MYSQL_USER, MYSQL_PASSWORD 创建新用户
MYSQL_ONETIME_PASSWORD root账号有效期开启
MYSQL_HOME my.cnf文件存放路径
MYSQL_TCP_PORT ip和端口
命令运行mysql容器:
docker run --name mysql-test1 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.30
配置文件运行mysql容器:
vim mysql_env.list
MYSQL_ROOT_PASSWORD=123456
MYSQL_DATABASE=hj
MYSQL_USER=hj
MYSQL_PASSWORD=123456
docker run --name mysql-test2 -v /root/mysql/:/etc/mysql/conf.d -v /data/mysql2:/var/lib/mysql --env-file=env.list -d -p 3307:3306 mysql:5.7.30