docker容器管理
前言需要知道容器、镜像原理可以阅读这篇文章--->docker概述及镜像管理
容器核心指令
[*]docker container --help:查看帮助文档
[*]docker ps:查看运行中的容器列表,-a:查看所有容器
[*]docker run:创建并运行容器
例如:docker run -d -p 80:80 --name nginx_1 nginx:latest
[*]docker create:创建容器 -- name
[*]docker start :启动容器
[*]docker restart:重启容器
[*]docker stop:停止容器
[*]docker kill:用于结束指定的容器,stop无法关闭,可以使用kill
[*]docker rm:删除容器 -f 强制删除容器
[*]docker exec:进入正在运行的容器(分配一个终端,和-it搭配起来使用)
[*]docker attach:进入正在运行的容器,使用相同的终端。
[*]docker cp:宿主机与容器之间文件传递
[*]docker logs:查看容器日志
[*]docker top:查看指定容器进程信息
[*]docker stats:查看所有容器的cpu,内存,磁盘,网络,进程信息
[*]docker update:修改运行中的容器的参数,cpu限制,内存限制,修改重启规则
[*]docker pause/unpause:将容器挂起/取消挂起,类似虚拟机的挂起
[*]docker commit:将容器保存为镜像
[*]docker export:将容器导出
[*]docker import:将export导出的容器导入为镜像
[*]docker ps -f:过滤容器
docker run指令详解
docker run指令过程
使用docker run时会有以下的几个步骤
[*]如果本地没有镜像的话,会使用docker pull指令将镜像拉取下来
[*]然后通过docker create指令创建容器
[*]最后通过docker start指令运行容器
[*]最后通过映射的端口进行访问
docker run常用选项
[*]-d:后台运行
[*]-p:指定映射的端口号,宿主机端口:容器端口
[*]--name:指定容器的名字
[*]-i:进入交互模式,进入这个容器中,一般与-t一起使用
[*]-t:分配一个终端
[*]-v:挂载数据卷
[*]-e:创建修改容器的环境变量
[*]--restart:设置容器的重启策略
[*]--rm:容器退出时自动删除容器
[*]--cpus:限制容器可以使用的 CPU 数量
[*]--memory:限制容器可以使用的内存量
[*]--net:连接容器到用户定义的网络
[*]--link:添加链接到另一个容器(不推荐使用,建议使用用户定义的网络)
[*]--user:指定容器运行时的用户
[*]--workdir:设置容器内的工作目录
容器前台执行转为后台进程运行
当我们使用docker run命令时,没有加上-d选项,容器会进入前台进程模式,这个时候当前终端会被一直占用,例如下面这样:
# docker run -it -p 80:80 nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2025/04/12 06:22:49 1#1: using the "epoll" event method
2025/04/12 06:22:49 1#1: nginx/1.27.4
2025/04/12 06:22:49 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2025/04/12 06:22:49 1#1: OS: Linux 5.15.0-134-generic
2025/04/12 06:22:49 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2025/04/12 06:22:49 1#1: start worker processes
2025/04/12 06:22:49 1#1: start worker process 28这个时候我们应该怎么才能让其转为后台进程运行呢?
使用CTRL+P+Q的组合键,可以让其转为后台进程
示例:运行nginx容器,指定1234端口运行
# docker run -d -p 1234:80 --name nginx_1234 nginx
93e4c333ecb5343f1192e927b5f737d642664853d27b78b21dc666be2e965cf5示例:进入nginx容器,查看主配置文件
# /bin/bash指定分配一个终端
# docker exec -it nginx_1234 /bin/bash
root@93e4c333ecb5:/# cat /etc/nginx/
conf.d/ fastcgi_paramsmime.types modules/ nginx.conf scgi_params uwsgi_params
root@93e4c333ecb5:/# cat /etc/nginx/nginx.conf
usernginx;
worker_processesauto;
error_log/var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections1024;
}
http {
include /etc/nginx/mime.types;
default_typeapplication/octet-stream;
log_formatmain'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log/var/log/nginx/access.logmain;
sendfile on;
#tcp_nopush on;
keepalive_timeout65;
#gzipon;
include /etc/nginx/conf.d/*.conf;
}容器的重启策略
Docker 容器的重启策略是指当容器退出时,Docker 守护进程如何处理容器的行为。重启策略可以确保容器在失败或退出时自动重启,从而提高服务的可用性和稳定性。
Docker 提供了几种不同的重启策略,可以通过 --restart 标志在运行容器时指定。
[*]默认不加--restart:不会自动重启
[*]always:自动重启
[*]unless-stopped:只在容器关闭,停止的时候重启
[*]on-failure:只在失败的时候重启
示例:设置容器自动重启
# docker run -d -p 80:80 --name nginx --restart always nginx
471bd6bdcec1957b613951cebd3c9caa34f6268569c6e5acc286441793a49598查看容器日志
使用docker logs命令查看日志,其中有几个选项参数:
[*]-f:查看实时日志,类似tail -f
[*]--tail:指定查看最近x行的日志,--tail 20,查看最近20行的日志
[*]--since:--since 5m 查看最近5分钟的日志,--since "2024-01-01T12:30:30" 查看指定时间到现在的日志
[*]--until:指定日志时间,一般查看指定范围内的内容,使用--since开始,--until结束
示例:查看最近的两行日志
# docker logs --tail 2 nginx
2025/04/12 06:33:48 1#1: start worker processes
2025/04/12 06:33:48 1#1: start worker process 28容器运行指定环境变量
使用-e选项指定环境变量
# -e指定环境变量APP=nginx_huangSir
# docker run -d -p 80:80 --name nginx --restart always -e APP=nginx_huangSir nginx
ad73f7b633e1bb3f298492753f980073d97a5823405c77cada43923a9feae241
# 查看容器内部的环境变量
# docker exec -it nginx env|grep APP
APP=nginx_huangSir在我们运行MySQL时,不指定环境变量会报错
# docker run -d -p 3306:3306 --name mysql --restart always mysql:5.7
ee235dc693b910eb76f1318b276e151a63bfb4b4526a54efa1cc20f3a5b4f6af
# docker logs mysql
2025-04-12 06:42:08+00:00 : Database is uninitialized and password option is not specified
You need to specify one of the following as an environment variable:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD如何解决呢?我们只需要指定其中一个环境变量即可
# docker run -d -p 3306:3306 --name mysql --restart always -e MYSQL_ROOT_PASSWORD=root mysql:5.7
f06870615801642a61952a8fb9d725135506129e256443515116bad88b76d3c0
# 查看容器,发现正常启动
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f06870615801 mysql:5.7 "docker-entrypoint.s…" 19 seconds ago Up 18 seconds 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp mysqldocker的exec和attach的区别
共同点:
都是进入已经运行的容器内部
区别
exec:
[*]容器不需要分配终端(运行容器时不需要加-it选项)
[*]每个连接互不影响
attach
[*]容器必须要分配个终端(运行容器时必须加上-it选项)
[*]每个连接所有的操作与输出都是一致的
宿主机与容器之间的文件互传docker cp
docker cp指令可以使宿主机的文件传输到容器中,也可以使容器的文件传输到宿主机中
示例:从容器复制文件到宿主机:
#这将从名为 my_container 的容器中复制 /path/to/file 文件到宿主机的 /host/path 目录。
docker cp my_container:/path/to/file /host/path示例:从宿主机复制文件到容器:
docker cp /host/path/file my_container:/path/to/file查看所有容器的cpu、内存、磁盘、网络、进程等信息
可以使用docker stats命令
# docker stats
容器的export和import
类似镜像的save和load
#导出
# docker export mysql -o /data/docker/images/mysql.tar
# ll /data/docker/images/mysql.tar
-rw------- 1 root root 495261184 Apr 12 15:13 /data/docker/images/mysql.tar
#导入为镜像,导入的镜像默认没有名称和tag
# docker import /data/docker/images/mysql.tar
sha256:4e93c24f904dcf1f69db34b14766e60c51baa2e564bc5ed4c8140bb338238a71
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 4e93c24f904d 5 seconds ago 477MB
#导入镜像,指定名称和tag
# docker import /data/docker/images/mysql.tar mysql:5.7.1
sha256:2ede68ede4e15f33ae11523de116df77beb435fbd09ce88b8a37a238bca944e2
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.1 2ede68ede4e1 3 seconds ago 477MB修改容器docker update
docker update可以修改容器的重启策略、内存、cpu等信息,不能修改容器的端口号、名称等相关信息
示例:更新容器的相关重启策略
docker update --memory 512m my_container启动容器时设置容器的相关资源限制
docker run -d --name container_name -p 80:80 --cpu 2 --memory 512m my_container容器的端口映射
使用docker的时候,外界访问docker容器中的服务或端口,需要使用端口映射,本质类似于iptables防火墙的端口映射。
什么情况下会使用端口映射呢?
[*]容器需要被外界访问(80端口),需要暴露在外界的一个端口
[*]用户通过端口访问容器中的某个端口
容器端口映射原理
[*]容器网络命名空间:每个 Docker 容器都在其自己的网络命名空间中运行,这意味着容器内的网络栈与宿主机的网络栈是隔离的。容器内部的服务只能通过容器的 IP 地址访问。
[*]端口映射规则:当你创建或运行一个 Docker 容器时,可以通过 -p 或 --publish 选项指定端口映射规则。这个规则告诉 Docker 如何将宿主机的端口映射到容器的端口。
[*]虚拟网络接口:Docker 在宿主机上创建一个虚拟网络接口(如 veth 接口),这个接口连接了宿主机和容器的网络命名空间。Docker 还使用 iptables 或 nftables 规则来管理数据包的路由。
[*]数据包转发:当外部请求到达宿主机的映射端口时,Docker 通过虚拟网络接口和 iptables/nftables 规则将数据包转发到容器的内部端口。
容器一对一端口映射
使用-p选项映射,-p 宿主机端口:容器端口
示例:将主机的80和443端口映射到nginx容器
docker run -d --name nginx_80 -p 80:80 -p 443:443 --restart always nginx:1.24容器映射多个端口
第一种方案,一个一个写
第二种方案:指定范围
示例:
# docker run -d --name nginx_test -p 8080-8090:80-90 --restart always nginx
c32c696bdefdf980983ebdba3fba06eff915a9758f2c5ec3d945c10d78d6c194
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c32c696bdefd nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp, 0.0.0.0:8081->81/tcp, [::]:8081->81/tcp, 0.0.0.0:8082->82/tcp, [::]:8082->82/tcp, 0.0.0.0:8083->83/tcp, [::]:8083->83/tcp, 0.0.0.0:8084->84/tcp, [::]:8084->84/tcp, 0.0.0.0:8085->85/tcp, [::]:8085->85/tcp, 0.0.0.0:8086->86/tcp, [::]:8086->86/tcp, 0.0.0.0:8087->87/tcp, [::]:8087->87/tcp, 0.0.0.0:8088->88/tcp, [::]:8088->88/tcp, 0.0.0.0:8089->89/tcp, [::]:8089->89/tcp, 0.0.0.0:8090->90/tcp, [::]:8090->90/tcp nginx_test容器随机映射端口:-P(大写的P)
示例:
# docker run -d -P --name nginx_P --restart always nginx
0e5614dca0bc9e400328ec2bbcc57772a1b276e8e1a6a5987fd7de2727b3c71b
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e5614dca0bc nginx "/docker-entrypoint.…" 2 seconds ago Up 2 seconds 0.0.0.0:32768->80/tcp, [::]:32768->80/tcp 容器运行指定端口映射
不指定-p选项,不会对外暴漏端口号
示例:
# docker run -d --name nginx_port nginx
06271faf765679d2efef23fbba28d6a08ed2bc6253057cb458b46c3b4df1bc6a
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06271faf7656 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 80/tcp nginx_port
# curl localhost:80
curl: (7) Failed to connect to localhost port 80 after 0 ms: Connection refused容器数据持久化-数据卷挂载
如果容器崩了,容器被误删除了,容器中的数据将会丢失,接下来解决数据不丢
如何解决数据持久化问题?数据卷挂载,让数据永久保存在宿主机中,这个时候我们需要使用存储卷
我们创建容器时可以使用-v选项指定容器的数据挂载到磁盘的哪个位置
案例:创建指定挂载目录并完成数据库持久化
# 查看容器数据卷挂载位置
# docker inspect mysql:5.7 | jq .[].Config.Volumes
{
"/var/lib/mysql": {}
}
#创建挂载目录
# mkdir -p /data/docker/mysql
#创建容器
# docker run -d -p 3306:3306 --name mysql -v /data/docker/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --restart always mysql:5.7
3da50987485b298a0622132650226b21be2e55f10f30536c2f281dff1058893f
#查看挂载目录
# ll /data/docker/mysql/
total 188484
drwxr-xr-x 5999 root 4096 Apr 12 15:38 ./
drwxr-xr-x 4 root root 4096 Apr 12 15:36 ../
-rw-r----- 1999 docker 56 Apr 12 15:38 auto.cnf
-rw------- 1999 docker 1680 Apr 12 15:38 ca-key.pem
-rw-r--r-- 1999 docker 1112 Apr 12 15:38 ca.pem
-rw-r--r-- 1999 docker 1112 Apr 12 15:38 client-cert.pem
-rw------- 1999 docker 1680 Apr 12 15:38 client-key.pem
-rw-r----- 1999 docker 1318 Apr 12 15:38 ib_buffer_pool
-rw-r----- 1999 docker 50331648 Apr 12 15:38 ib_logfile0
-rw-r----- 1999 docker 50331648 Apr 12 15:38 ib_logfile1
-rw-r----- 1999 docker 79691776 Apr 12 15:38 ibdata1
-rw-r----- 1999 docker 12582912 Apr 12 15:38 ibtmp1
drwxr-x--- 2999 docker 4096 Apr 12 15:38 mysql/
lrwxrwxrwx 1999 docker 27 Apr 12 15:38 mysql.sock -> /var/run/mysqld/mysqld.sock
drwxr-x--- 2999 docker 4096 Apr 12 15:38 performance_schema/
-rw------- 1999 docker 1676 Apr 12 15:38 private_key.pem
-rw-r--r-- 1999 docker 452 Apr 12 15:38 public_key.pem
-rw-r--r-- 1999 docker 1112 Apr 12 15:38 server-cert.pem
-rw------- 1999 docker 1676 Apr 12 15:38 server-key.pem
drwxr-x--- 2999 docker 12288 Apr 12 15:38 sys/案例:创建数据卷空间并完成数据库持久化
做数据持久化,不关注数据放在哪里
#创建数据卷
# docker volume create mysql_data
mysql_data
#查看数据卷
# docker volume ls
DRIVER VOLUME NAME
local 5b0ac47545efbe8795586cb4c419ca104dfe7814f59ff83c323be63d5eefd879
local beba4268b0c7b99ef198fc297ba35f47b5a510bf552471c1cd580195039503ee
local mysql_data
#创建容器
# docker run -d -p 3306:3306 --name mysql -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --restart always mysql:5.7
594a321ec3fa07da604bbc646b8cb2ad3041d3019479e9cdec43e0ce7528c8e2
#查看数据卷空间的详细信息
# docker inspect mysql_data
[
{
"CreatedAt": "2025-04-12T15:42:17+08:00",
"Driver": "local",
"Labels": null,
#存储卷的实际存放位置
"Mountpoint": "/var/lib/docker/volumes/mysql_data/_data",
"Name": "mysql_data",
"Options": null,
"Scope": "local"
}
]
#删除存储卷,当卷被挂载时,删除失败
# docker volume rm mysql_data
Error response from daemon: remove mysql_data: volume is in use - 数据卷更多使用方法:https://docs.docker.com/engine/storage/volumes/#when-to-use-volumes
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]