文章目录
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 如何判断启动容器是否需要变量?
- 直接查看容器错误日志
- 查看容器的官方说明
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 7月 16 21:49 auto.cnf
-rw-r----- 1 systemd-coredump input 2994206 7月 16 21:49 binlog.000001
-rw-r----- 1 systemd-coredump input 157 7月 16 21:49 binlog.000002
-rw-r----- 1 systemd-coredump input 32 7月 16 21:49 binlog.index
-rw------- 1 systemd-coredump input 1680 7月 16 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 7月 15 09:21 bird.tar.gz
-rw-r--r-- 1 root root 112 7月 17 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期-孙克旭」一起进行文档协作