找回密码
 立即注册
首页 业界区 安全 docker容器管理

docker容器管理

齐娅晶 2025-6-1 18:20:29
前言

需要知道容器、镜像原理可以阅读这篇文章--->docker概述及镜像管理
容器核心指令


  • docker container --help:查看帮助文档
  • docker ps:查看运行中的容器列表,-a:查看所有容器
  • docker run:创建并运行容器
  1. 例如: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选项,容器会进入前台进程模式,这个时候当前终端会被一直占用,例如下面这样:
  1. [root@master ~]# docker run -it -p 80:80 nginx
  2. /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
  3. /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
  4. /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
  5. 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
  6. 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
  7. /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
  8. /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
  9. /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
  10. /docker-entrypoint.sh: Configuration complete; ready for start up
  11. 2025/04/12 06:22:49 [notice] 1#1: using the "epoll" event method
  12. 2025/04/12 06:22:49 [notice] 1#1: nginx/1.27.4
  13. 2025/04/12 06:22:49 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
  14. 2025/04/12 06:22:49 [notice] 1#1: OS: Linux 5.15.0-134-generic
  15. 2025/04/12 06:22:49 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
  16. 2025/04/12 06:22:49 [notice] 1#1: start worker processes
  17. 2025/04/12 06:22:49 [notice] 1#1: start worker process 28
复制代码
这个时候我们应该怎么才能让其转为后台进程运行呢?
使用CTRL+P+Q的组合键,可以让其转为后台进程
示例:运行nginx容器,指定1234端口运行
  1. [root@master ~]# docker run -d -p 1234:80 --name nginx_1234 nginx
  2. 93e4c333ecb5343f1192e927b5f737d642664853d27b78b21dc666be2e965cf5
复制代码
示例:进入nginx容器,查看主配置文件
  1. # /bin/bash指定分配一个终端
  2. [root@master ~]# docker exec -it nginx_1234 /bin/bash
  3. root@93e4c333ecb5:/# cat /etc/nginx/
  4. conf.d/         fastcgi_params  mime.types      modules/        nginx.conf      scgi_params     uwsgi_params
  5. root@93e4c333ecb5:/# cat /etc/nginx/nginx.conf
  6. user  nginx;
  7. worker_processes  auto;
  8. error_log  /var/log/nginx/error.log notice;
  9. pid        /var/run/nginx.pid;
  10. events {
  11.     worker_connections  1024;
  12. }
  13. http {
  14.     include       /etc/nginx/mime.types;
  15.     default_type  application/octet-stream;
  16.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  17.                       '$status $body_bytes_sent "$http_referer" '
  18.                       '"$http_user_agent" "$http_x_forwarded_for"';
  19.     access_log  /var/log/nginx/access.log  main;
  20.     sendfile        on;
  21.     #tcp_nopush     on;
  22.     keepalive_timeout  65;
  23.     #gzip  on;
  24.     include /etc/nginx/conf.d/*.conf;
  25. }
复制代码
容器的重启策略

Docker 容器的重启策略是指当容器退出时,Docker 守护进程如何处理容器的行为。重启策略可以确保容器在失败或退出时自动重启,从而提高服务的可用性和稳定性。
Docker 提供了几种不同的重启策略,可以通过 --restart 标志在运行容器时指定。

  • 默认不加--restart:不会自动重启
  • always:自动重启
  • unless-stopped:只在容器关闭,停止的时候重启
  • on-failure:只在失败的时候重启
示例:设置容器自动重启
  1. [root@master ~]# docker run -d -p 80:80 --name nginx --restart always nginx
  2. 471bd6bdcec1957b613951cebd3c9caa34f6268569c6e5acc286441793a49598
复制代码
查看容器日志

使用docker logs命令查看日志,其中有几个选项参数:

  • -f:查看实时日志,类似tail -f
  • --tail:指定查看最近x行的日志,--tail 20,查看最近20行的日志
  • --since:--since 5m 查看最近5分钟的日志,--since "2024-01-01T12:30:30" 查看指定时间到现在的日志
  • --until:指定日志时间,一般查看指定范围内的内容,使用--since开始,--until结束
    示例:查看最近的两行日志
  1. [root@master ~]# docker logs --tail 2 nginx
  2. 2025/04/12 06:33:48 [notice] 1#1: start worker processes
  3. 2025/04/12 06:33:48 [notice] 1#1: start worker process 28
复制代码
容器运行指定环境变量

使用-e选项指定环境变量
  1. # -e指定环境变量APP=nginx_huangSir
  2. [root@master ~]# docker run -d -p 80:80 --name nginx --restart always -e APP=nginx_huangSir nginx
  3. ad73f7b633e1bb3f298492753f980073d97a5823405c77cada43923a9feae241
  4. # 查看容器内部的环境变量
  5. [root@master ~]# docker exec -it nginx env|grep APP
  6. APP=nginx_huangSir
复制代码
在我们运行MySQL时,不指定环境变量会报错
  1. [root@master ~]# docker run -d -p 3306:3306 --name mysql --restart always mysql:5.7
  2. ee235dc693b910eb76f1318b276e151a63bfb4b4526a54efa1cc20f3a5b4f6af
  3. [root@master ~]# docker logs mysql
  4. 2025-04-12 06:42:08+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
  5.     You need to specify one of the following as an environment variable:
  6.     - MYSQL_ROOT_PASSWORD
  7.     - MYSQL_ALLOW_EMPTY_PASSWORD
  8.     - MYSQL_RANDOM_ROOT_PASSWORD
复制代码
如何解决呢?我们只需要指定其中一个环境变量即可
  1. [root@master ~]# docker run -d -p 3306:3306 --name mysql --restart always -e MYSQL_ROOT_PASSWORD=root mysql:5.7
  2. f06870615801642a61952a8fb9d725135506129e256443515116bad88b76d3c0
  3. # 查看容器,发现正常启动
  4. [root@master ~]# docker ps -a
  5. CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                    NAMES
  6. 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   mysql
复制代码
docker的exec和attach的区别

共同点:

都是进入已经运行的容器内部
区别

exec:

  • 容器不需要分配终端(运行容器时不需要加-it选项)
  • 每个连接互不影响
attach

  • 容器必须要分配个终端(运行容器时必须加上-it选项)
  • 每个连接所有的操作与输出都是一致的
宿主机与容器之间的文件互传docker cp

docker cp指令可以使宿主机的文件传输到容器中,也可以使容器的文件传输到宿主机中
示例:从容器复制文件到宿主机:
  1. #这将从名为 my_container 的容器中复制 /path/to/file 文件到宿主机的 /host/path 目录。
  2. docker cp my_container:/path/to/file /host/path
复制代码
示例:从宿主机复制文件到容器:
  1. docker cp /host/path/file my_container:/path/to/file
复制代码
查看所有容器的cpu、内存、磁盘、网络、进程等信息

可以使用docker stats命令
  1. [root@master ~]# docker stats
复制代码
1.png

容器的export和import

类似镜像的save和load
  1. #导出
  2. [root@master ~]# docker export mysql -o /data/docker/images/mysql.tar
  3. [root@master ~]# ll /data/docker/images/mysql.tar
  4. -rw------- 1 root root 495261184 Apr 12 15:13 /data/docker/images/mysql.tar
  5. #导入为镜像,导入的镜像默认没有名称和tag
  6. [root@master ~]# docker import /data/docker/images/mysql.tar
  7. sha256:4e93c24f904dcf1f69db34b14766e60c51baa2e564bc5ed4c8140bb338238a71
  8. [root@master ~]# docker images
  9. REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
  10. <none>                 <none>    4e93c24f904d   5 seconds ago   477MB
  11. #导入镜像,指定名称和tag
  12. [root@master ~]# docker import /data/docker/images/mysql.tar mysql:5.7.1
  13. sha256:2ede68ede4e15f33ae11523de116df77beb435fbd09ce88b8a37a238bca944e2
  14. [root@master ~]# docker images
  15. REPOSITORY             TAG       IMAGE ID       CREATED              SIZE
  16. mysql                  5.7.1     2ede68ede4e1   3 seconds ago        477MB
复制代码
修改容器docker update

docker update可以修改容器的重启策略、内存、cpu等信息,不能修改容器的端口号、名称等相关信息
示例:更新容器的相关重启策略
  1. docker update --memory 512m my_container
复制代码
启动容器时设置容器的相关资源限制
  1. 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容器
  1. docker run -d --name nginx_80 -p 80:80 -p 443:443 --restart always nginx:1.24
复制代码
容器映射多个端口

第一种方案,一个一个写
第二种方案:指定范围
示例:
  1. [root@master ~]# docker run -d --name nginx_test -p 8080-8090:80-90 --restart always nginx
  2. c32c696bdefdf980983ebdba3fba06eff915a9758f2c5ec3d945c10d78d6c194
  3. [root@master ~]# docker ps -a
  4. CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                                                                                                                                                                                                                                                                                                                                                                                                                               NAMES
  5. 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)

示例:
  1. [root@master ~]# docker run -d -P --name nginx_P --restart always nginx
  2. 0e5614dca0bc9e400328ec2bbcc57772a1b276e8e1a6a5987fd7de2727b3c71b
  3. [root@master ~]# docker ps -a
  4. CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS              PORTS                                                                                                                                                                                                                                                                                                                                                                                                                                                               NAMES
  5. 0e5614dca0bc   nginx       "/docker-entrypoint.…"   2 seconds ago        Up 2 seconds        0.0.0.0:32768->80/tcp, [::]:32768->80/tcp     
复制代码
容器运行指定端口映射

不指定-p选项,不会对外暴漏端口号
示例:
  1. [root@master ~]# docker run -d --name nginx_port nginx
  2. 06271faf765679d2efef23fbba28d6a08ed2bc6253057cb458b46c3b4df1bc6a
  3. [root@master ~]# docker ps -a
  4. CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS     NAMES
  5. 06271faf7656   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds   80/tcp    nginx_port
  6. [root@master ~]# curl localhost:80
  7. curl: (7) Failed to connect to localhost port 80 after 0 ms: Connection refused
复制代码
容器数据持久化-数据卷挂载

如果容器崩了,容器被误删除了,容器中的数据将会丢失,接下来解决数据不丢
如何解决数据持久化问题?数据卷挂载,让数据永久保存在宿主机中,这个时候我们需要使用存储卷
我们创建容器时可以使用-v选项指定容器的数据挂载到磁盘的哪个位置
案例:创建指定挂载目录并完成数据库持久化
  1. # 查看容器数据卷挂载位置
  2. [root@master ~]# docker inspect mysql:5.7 | jq .[].Config.Volumes
  3. {
  4.   "/var/lib/mysql": {}
  5. }
  6. #创建挂载目录
  7. [root@master ~]# mkdir -p /data/docker/mysql
  8. #创建容器
  9. [root@master ~]# 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
  10. 3da50987485b298a0622132650226b21be2e55f10f30536c2f281dff1058893f
  11. #查看挂载目录
  12. [root@master ~]# ll /data/docker/mysql/
  13. total 188484
  14. drwxr-xr-x 5  999 root       4096 Apr 12 15:38 ./
  15. drwxr-xr-x 4 root root       4096 Apr 12 15:36 ../
  16. -rw-r----- 1  999 docker       56 Apr 12 15:38 auto.cnf
  17. -rw------- 1  999 docker     1680 Apr 12 15:38 ca-key.pem
  18. -rw-r--r-- 1  999 docker     1112 Apr 12 15:38 ca.pem
  19. -rw-r--r-- 1  999 docker     1112 Apr 12 15:38 client-cert.pem
  20. -rw------- 1  999 docker     1680 Apr 12 15:38 client-key.pem
  21. -rw-r----- 1  999 docker     1318 Apr 12 15:38 ib_buffer_pool
  22. -rw-r----- 1  999 docker 50331648 Apr 12 15:38 ib_logfile0
  23. -rw-r----- 1  999 docker 50331648 Apr 12 15:38 ib_logfile1
  24. -rw-r----- 1  999 docker 79691776 Apr 12 15:38 ibdata1
  25. -rw-r----- 1  999 docker 12582912 Apr 12 15:38 ibtmp1
  26. drwxr-x--- 2  999 docker     4096 Apr 12 15:38 mysql/
  27. lrwxrwxrwx 1  999 docker       27 Apr 12 15:38 mysql.sock -> /var/run/mysqld/mysqld.sock
  28. drwxr-x--- 2  999 docker     4096 Apr 12 15:38 performance_schema/
  29. -rw------- 1  999 docker     1676 Apr 12 15:38 private_key.pem
  30. -rw-r--r-- 1  999 docker      452 Apr 12 15:38 public_key.pem
  31. -rw-r--r-- 1  999 docker     1112 Apr 12 15:38 server-cert.pem
  32. -rw------- 1  999 docker     1676 Apr 12 15:38 server-key.pem
  33. drwxr-x--- 2  999 docker    12288 Apr 12 15:38 sys/
复制代码
案例:创建数据卷空间并完成数据库持久化

做数据持久化,不关注数据放在哪里
  1. #创建数据卷
  2. [root@master ~]# docker volume create mysql_data
  3. mysql_data
  4. #查看数据卷
  5. [root@master ~]# docker volume ls
  6. DRIVER    VOLUME NAME
  7. local     5b0ac47545efbe8795586cb4c419ca104dfe7814f59ff83c323be63d5eefd879
  8. local     beba4268b0c7b99ef198fc297ba35f47b5a510bf552471c1cd580195039503ee
  9. local     mysql_data
  10. #创建容器
  11. [root@master ~]# docker run -d -p 3306:3306 --name mysql -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --restart always mysql:5.7
  12. 594a321ec3fa07da604bbc646b8cb2ad3041d3019479e9cdec43e0ce7528c8e2
  13. #查看数据卷空间的详细信息
  14. [root@master ~]# docker inspect mysql_data
  15. [
  16.     {
  17.         "CreatedAt": "2025-04-12T15:42:17+08:00",
  18.         "Driver": "local",
  19.         "Labels": null,
  20.         #存储卷的实际存放位置
  21.         "Mountpoint": "/var/lib/docker/volumes/mysql_data/_data",
  22.         "Name": "mysql_data",
  23.         "Options": null,
  24.         "Scope": "local"
  25.     }
  26. ]
  27. #删除存储卷,当卷被挂载时,删除失败
  28. [root@master ~]# docker volume rm mysql_data
  29. Error response from daemon: remove mysql_data: volume is in use - [594a321ec3fa07da604bbc646b8cb2ad3041d3019479e9cdec43e0ce7528c8e2]
复制代码
数据卷更多使用方法:https://docs.docker.com/engine/storage/volumes/#when-to-use-volumes

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册