day054-阻塞容器与自定义镜像

发布于:2025-07-20 ⋅ 阅读:(17) ⋅ 点赞:(0)

0. 老男孩思想-多鼓励、多赞美

女生多为红色性格,做事没有章法、虎头蛇尾,思考不周全,特别是遇到逻辑思维很强IT工程师时,就会产生矛盾、吵架;

记得任何时候,都不要埋怨女生,即使做错事了也要多鼓励,这样比批评更容易让她改进错误。

在这里插入图片描述

1. 面试题:docker run背后发生了什么?

  • 检查本地是否有指定镜像
    • 有,则运行
    • 没有,运行docker pull下载镜像
  • docker create,创建容器
    • 根据相关参数:-d、–name、-p等创建容器
  • docker start,启动容器

2. 端口映射

  • -p,宿主机与容器端口映射;底层原理是iptables生成的nat表
    • 80-82:80-82 :范围端口映射
  • iptables是 Linux 系统中用于配置 防火墙规则 的传统工具

在这里插入图片描述

  • docker port 容器名称/ID:查看该容器的端口映射

3. 容器指令

3.1 查看容器日志

  • docker logs 容器名称/ID
    • -n 10:查看最后10行
    • -f:实时查看日志内容
    • –since “5m”:查看最近5分钟的日志

3.2 运行容器的选项

  • docker run ……
    • -e:env,指定容器环境变量
    • –privileged=true:授予容器高级权限
    • –restart:设置容器重启策略
      • no:默认参数,不自动重启容器
      • always:无论容器如何退出(包括手动停止),Docker 都会尝试重启它
      • on-failure:仅在容器非正常退出、运行失败时重启
      • unless-stopped总是自动重启,除非用户手动停止容器
    • -itd …… 命令解释器:阻塞容器,使容器一直运行

3.3 更新容器的配置参数

  • docker update:更新容器的重启规则、资源限制(cpu、内存)

3.4 查看容器占用资源情况

  • docker stats
    • –no-stream:非交互模式,直接显示容器信息

在这里插入图片描述

  • docker top 容器名字/ID
    • -efL:显示线程信息
[root@docker01 ~]# docker top mysql8 -efL
UID                 PID                 PPID                LWP                 C                   NLWP                STIME               TTY                 TIME                CMD
systemd+            4055                4036                4055                0                   37                  19:06               ?                   00:00:00            mysqld
systemd+            4055                4036                4269                0                   37                  19:06               ?                   00:00:00            mysqld
systemd+            4055                4036                4270                0                   37                  19:06               ?                   00:00:00            mysqld
systemd+            4055                4036                4271                0                   37                  19:06               ?                   00:00:00            mysqld
systemd+            4055                4036                4272                0                   37                  19:06               ?                   00:00:00            mysqld
……

3.5 根据容器创建镜像

  • docker commit 容器名字 镜像名字

4. 故障案例-mysql数据库镜像启动失败

[root@docker01 ~]# docker images |grep mysql
mysql        5.7-debian    b5d7c63fe339   2 years ago    463MB
mysql        8.0-debian    5557a1823e30   2 years ago    602MB
[root@docker01 ~]# docker run -d --name mysql8 -p 3306:3306 -p 33060:33060 mysql:8.0-debian
2d00b590cf254c88036e8fbfad4f91a9cd943074e4d466448e3eea579bfe8b13
[root@docker01 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED        STATUS          PORTS                               NAMES
fe7d1d3a9d8d   nginx:1.24   "/docker-entrypoint.…"   22 hours ago   Up 20 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx_v1
[root@docker01 ~]# docker ps -a
CONTAINER ID   IMAGE              COMMAND                   CREATED          STATUS                      PORTS                               NAMES
2d00b590cf25   mysql:8.0-debian   "docker-entrypoint.s…"   45 seconds ago   Exited (1) 41 seconds ago                                       mysql8
fe7d1d3a9d8d   nginx:1.24         "/docker-entrypoint.…"   22 hours ago     Up 21 minutes               0.0.0.0:80->80/tcp, :::80->80/tcp   nginx_v1
  • mysql8容器未启动,当前状态:已退出(Exited)
  • 查看日志

在这里插入图片描述

  • 启动容器时指定容器环境变量:
[root@docker01 ~]# docker rm mysql8
mysql8
[root@docker01 ~]# docker run -d --name mysql8 -p 3306:3006 -p 33060:33060 -e MYSQL_ROOT_PASSWORD=1 mysql:8.0-debian
319707b7b5c925e1ecf4b84c322c6302d329bbda949e63812ca6117fd68d0783
[root@docker01 ~]# docker ps
CONTAINER ID   IMAGE              COMMAND                   CREATED         STATUS             PORTS                                                                                                NAMES
319707b7b5c9   mysql:8.0-debian   "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds       3306/tcp, 0.0.0.0:33060->33060/tcp, :::33060->33060/tcp, 0.0.0.0:3306->3006/tcp, :::3306->3006/tcp   mysql8
fe7d1d3a9d8d   nginx:1.24         "/docker-entrypoint.…"   23 hours ago    Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp  

# 查看容器的环境变量
[root@docker01 ~]# docker exec -it mysql8 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=319707b7b5c9
TERM=xterm
MYSQL_ROOT_PASSWORD=1 # 刚才添加的变量
GOSU_VERSION=1.16
MYSQL_MAJOR=8.0
MYSQL_VERSION=8.0.33-1debian11
HOME=/root                    

4.1 如何判断启动容器是否需要变量?

  1. 直接查看容器错误日志
  2. 查看容器的官方说明

在这里插入图片描述

3.查看服务的官方说明;

mysql官方文档:[MySQL :: MySQL 安装指南 :: 7.6.1 使用 Docker 部署 MySQL 服务器的基本步骤](https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/docker-mysql-getting-started.html)

5. 案例-更改容器参数

5.1 更改容器的启动规则

  • 查看容器当前的启动规则
[root@docker01 ~]# docker inspect nginx_v1 |jq '.[0].HostConfig.RestartPolicy.Name'
"no"
  • 更改容器的启动规则为always
[root@docker01 ~]# docker update --restart always nginx_v1
nginx_v1
[root@docker01 ~]# docker inspect nginx_v1 |jq '.[0].HostConfig.RestartPolicy.Name'
"always"

5.2 更改容器的可用内存大小

[root@docker01 ~]# docker stats --no-stream
CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
319707b7b5c9   mysql8     0.28%     401.4MiB / 3.816GiB   10.27%    1.22kB / 0B       679MB / 3.89GB   37
fe7d1d3a9d8d   nginx_v1   0.00%     7.934MiB / 3.816GiB   0.20%     8.68kB / 4.06kB   151MB / 0B       3
[root@docker01 ~]# docker update -m 1G --memory-swap 2G nginx_v1
nginx_v1

6. 阻塞系统镜像

[root@docker01 ~]# docker images|grep centos
centos       7             eeb6ee3f44bd   3 years ago    204MB
[root@docker01 ~]# docker run -d --name centos7 centos:7
0fc11a93082e3788ee609c5fcef767aff4b75d1a3fd2b6f6ded9c8706df9540f
[root@docker01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@docker01 ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS                     PORTS     NAMES
0fc11a93082e   centos:7   "/bin/bash"   9 seconds ago   Exited (0) 8 seconds ago             centos7
[root@docker01 ~]# docker logs centos7

  • 系统镜像启动失败
  • 原因:容器启动后,没有程序去阻塞该容器,所以容器直接退出。
  • 阻塞:容器中有某个进程或命令一直运行,使得容器一直保持运行状态。
  • 解决方法:
[root@docker01 ~]# docker run -itd --name centos7_v2 centos:7 /bin/bash
e4018ba6f8588d8f88c9df70ed5da7ec815f1e80f04b8335d024657f7e0ce7e5
[root@docker01 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
e4018ba6f858   centos:7   "/bin/bash"   3 seconds ago   Up 3 seconds             centos7_v2
  • 阻塞nginx容器命令:nginx -g 'daemon off;'

7. 数据卷

数据卷(Volume) 是一种用于持久化存储容器数据的机制,它独立于容器的生命周期,即使容器被删除,数据仍然可以保留。

数据卷(Volume)的本质是目录映射(挂载)。它的核心机制是将主机上的一个目录(由Docker管理)与容器内的目录建立关联,数据在两者之间实时同步。

  • -v 宿主机目录:容器目录
    • 目录最后加上斜杠

7.1 查看容器可配置的数据卷

  • 有些服务会显示主要数据的目录
[root@docker01 ~]# docker run -d --name mysql8 --restart=always -p 3306:3306 -p 33060:33060 -e MYSQL_ROOT_PASSWORD=1 mysql:8.0-debian
9a4dfbd96fdbe43ff58f1ba80fdb3f5fe727a64058bd38368ff2d0fae2dbe27c
[root@docker01 ~]# docker ps
CONTAINER ID   IMAGE              COMMAND                   CREATED          STATUS          PORTS                                                                                      NAMES
9a4dfbd96fdb   mysql:8.0-debian   "docker-entrypoint.s…"   2 seconds ago    Up 2 seconds    0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 0.0.0.0:33060->33060/tcp, :::33060->33060/tcp   mysql8
[root@docker01 ~]# docker inspect mysql8 |jq '.[0].Config.Volumes' 
{
  "/var/lib/mysql": {}
}

7.2 配置数据卷

[root@docker01 ~]# docker rm -f mysql8
mysql8
[root@docker01 ~]# mkdir -p /app/data/mysql8
[root@docker01 ~]# docker run -d --name mysql8 -p 3306:3306 -p 33060:33060 -e MYSQL_ROOT_PASSWORD=1 --restart=always -v /app/data/mysql8/:/var/lib/mysql mysql:8.0-debian
1128b9913df7b8504120b392f51e82c59aa805460a8bdb966151e6181addf186
[root@docker01 ~]# ll /app/data/mysql8/
总用量 99636
-rw-r----- 1 systemd-coredump input       56  716 21:49  auto.cnf
-rw-r----- 1 systemd-coredump input  2994206  716 21:49  binlog.000001
-rw-r----- 1 systemd-coredump input      157  716 21:49  binlog.000002
-rw-r----- 1 systemd-coredump input       32  716 21:49  binlog.index
-rw------- 1 systemd-coredump input     1680  716 21:49  ca-key.pem
……

8. 自定义镜像

在这里插入图片描述

  • 以制作小鸟飞飞镜像为例

8.1 准备配置文件和代码

  • 小鸟飞飞代码:bird.tar.gz 链接: https://pan.baidu.com/s/1ifPCOaauhQkAyK831BGe6g?pwd=8dw1 提取码: 8dw1
  • nginx子配置文件:
server {
	listen 80;
	server_name bird.oldboy.cn;
	root /app/code/bird/;
	location / {
		index index.html;
	}
}
  • 上传到服务器
[root@docker01 /app/code/bird]# ll
总用量 96
-rw-r--r-- 1 root root 91622  715 09:21 bird.tar.gz
-rw-r--r-- 1 root root   112  717 07:29 default.conf

8.2 启动基础镜像

[root@docker01 /app/code/bird]# docker images |grep nginx
nginx        alpine        77656422f700   3 weeks ago    52.5MB
web_nginx    1.29          77656422f700   3 weeks ago    52.5MB
nginx        1.24          b6c621311b44   2 years ago    142MB
nginx        1.24-alpine   55ba84d7d539   2 years ago    41.1MB
[root@docker01 /app/code/bird]# docker run -d --name nginx_1.24_bird -p 80:80 nginx:1.24
dd56def5428f68dca085b9a614e78ee064a83ebe83bd0a5df67549e9afbd6325
[root@docker01 /app/code/bird]# docker ps
CONTAINER ID   IMAGE              COMMAND                   CREATED         STATUS         PORTS                                                                                      NAMES
dd56def5428f   nginx:1.24         "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp                                                          nginx_1.24_bird

8.3 部署容器环境

# 上传基础文件
[root@docker01 /app/code/bird]# docker cp bird.tar.gz nginx_1.24_bird:/root/
Successfully copied 93.2kB to nginx_1.24_bird:/root/
[root@docker01 /app/code/bird]# docker cp default.conf nginx_1.24_bird:/root/
Successfully copied 2.05kB to nginx_1.24_bird:/root/
# 进入容器
[root@docker01 /app/code/bird]# docker exec -it nginx_1.24_bird /bin/bash
root@dd56def5428f:/# mkdir -p /app/code/bird
root@dd56def5428f:/# cd /app/code/bird
root@dd56def5428f:/app/code/bird# mv ~/bird.tar.gz ./
root@dd56def5428f:/app/code/bird# tar xf bird.tar.gz
root@dd56def5428f:/app/code/bird# mv ~/default.conf /etc/nginx/conf.d/
# 测试,重启服务
root@dd56def5428f:/app/code/bird# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@dd56def5428f:/app/code/bird# nginx -s reload
2025/07/16 23:43:10 [notice] 43#43: signal process started
  • 浏览器访问

在这里插入图片描述

8.4 生成自定义镜像

[root@docker01 ~]# docker commit nginx_1.24_bird web:bird_v1
sha256:9b574adf2007a994abd36584442ac2dec46742be3d7259ea092ea94eda138850
[root@docker01 ~]# docker images |grep web
web          bird_v1       9b574adf2007   7 seconds ago   142MB

9. 思维导图

https://kdocs.cn/join/gpuxq6r?f=101\r\n邀请你加入共享群「老男孩教育Linux运维99期-孙克旭」一起进行文档协作


网站公告

今日签到

点亮在社区的每一天
去签到