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
posted @ 2022-02-23 23:46  suyanhj  阅读(134)  评论(0)    收藏  举报