Linux_docker篇
欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神!
题目:Linux 系统下 Docker 安装与镜像部署全攻略
版本号 : 1.0,0 作者 : @老王要学习 日期 : 2025.05.26 适用环境 : Rocky9.5
文档说明
本文围绕 Linux 系统下 Docker 的安装、部署与管理展开,涵盖环境准备、镜像操作、容器管理等内容。详细介绍不同系统安装 Docker 步骤,阐述镜像下载、启动及容器查看、删除等操作,还涉及网络设置、镜像导出导入等知识,为 Docker 初学者提供全面指南
环境准备
硬件要求
服务器: 2核CPU、2GB内存,20GB硬盘空间 网络: 确保服务器具有固定的IP地址,并且防火墙允许FTP端口(默认22端口)的通信
软件要求
操作系统:Rocky9.5 FTP软件:SecureCRT 软件包:
服务器 IP docker-5 192.168.174.5
一、安装docker
1.0禁用防火墙
systemctl stop firewalld && systemctl disable firewalldsed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/configreboot
1.1Rocky(CentOS)
# 安装依赖工具
yum install -y yum-utils# 添加软件源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安装docker
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 开启docker服务
service docker start# 查看Docker的各种信息
docker info
1.2Ubuntu
# 安装必要的一些系统工具
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg# 信任 Docker 的 GPG 公钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg# Step 3: 写入软件源信息
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null# Step 4: 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
二、部署镜像
2.1添加docker加速器
阿里云:需登录阿里云容器镜像服务控制台获取专属地址,格式类似https://<你的加速器地址>.mirror.aliyuncs.com 。 Docker 官方中国区:https://registry.docker-cn.com 中国科学技术大学:https://docker.mirrors.ustc.edu.cn 网易 163:https://hub-mirror.c.163.com Azure 中国区:https://mirror.azure.cn DaoCloud(道客云):https://docker.m.daocloud.io
cat>>/etc/docker/daemon.json<<LW
{"registry-mirrors": ["https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://mirror.azure.cn","https://mirror.azure.cn"]
}
LW# 重载并重启docker服务
systemctl daemon-reload
systemctl restart docker# 验证配置是否生效
docker info | grep -i mirror
#输出如下: Registry Mirrors:https://docker.mirrors.ustc.edu.cn/https://hub-mirror.c.163.com/https://mirror.azure.cn/
2.2下载镜像
# 拉取 Nginx 官方镜像
docker pull nginx
#输出如下:
Using default tag: latest
latest: Pulling from library/nginx
61320b01ae5e: Pull complete
670a101d432b: Pull complete
405bd2df85b6: Pull complete
cc80efff8457: Pull complete
2b9310b2ee4b: Pull complete
6c4aa022e8e1: Pull complete
abddc69cb49d: Pull complete
Digest: sha256:fb39280b7b9eba5727c884a3c7810002e69e8f961cc373b89c92f14961d903a0
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest# 下载Ubuntu镜像
docker pull ubuntu# 下载 busybox
docker pull busybox# 查看当前下载的镜像
docker images
#输出如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest a0e45e2ce6e6 4 weeks ago 78.1MB
nginx latest be69f2940aaf 5 weeks ago 192MB
busybox latest 6d3e4188a38a 8 months ago 4.28MB
2.3启动镜像
2.3.1不进入终端执行命令
docker run ubuntu:latest cat /etc/passwd# 在后台运行
docker run -d ubuntu:latest cat /etc/passwd
2.3.2进入终端执行命令
# 启动Ubuntu镜像(进入终端)
docker run -t ubuntu:latest
root@e3b97ce230b4:/cat /etc/passwd
#输出如下:
无结果,因为不是交互式,无法执行命令# 查看正在运行的容器
docker ps
#输出如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3b97ce230b4 ubuntu:latest "/bin/bash" 5 minutes ago Up 5 minutes cool_tesla
2.3.3交互式可执行命令,并进入终端
# 启动Ubuntu镜像(交互式可执行命令,并进入终端)
docker run -it ubuntu:latest # 查看当前Ubuntu的版本
root@f4e2f1b689f0:/# cat /etc/os-release
#输出如下:
PRETTY_NAME="Ubuntu 24.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.2 LTS (Noble Numbat)"
2.3.4复合使用
# 在后台启动并启动终端且可执行
docker run -dit ubuntu:latest
#输出如下:
03acb643dd251460f51c3021e254075ec9ef8c70f529970dc209a6808add0854# 查看最近一条启动记录
docker ps -l
#输出如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03acb643dd25 ubuntu:latest "/bin/bash" 2 minutes ago Up 2 minutes optimistic_merkle
2.3.5exec
# 在运行中的容器内执行命令docker exec -it optimistic_merkle /bin/bash
root@03acb643dd25:/# # 查看当前运行的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03acb643dd25 ubuntu:latest "/bin/bash" 32 minutes ago Up 32 minutes optimistic_merkle
508cdafd51b2 ubuntu:latest "/bin/bash" 53 minutes ago Up 53 minutes distracted_keller
e3b97ce230b4 ubuntu:latest "/bin/bash" About an hour ago Up About an hour cool_tesla
2.3.6attach
# 连接容器(退出容器停止)
docker attach optimistic_merkle
root@03acb643dd25:/## 再次查看运行的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
508cdafd51b2 ubuntu:latest "/bin/bash" 55 minutes ago Up 55 minutes distracted_keller
e3b97ce230b4 ubuntu:latest "/bin/bash" About an hour ago Up About an hour cool_tesla
命令 作用 docker exec 在已运行的容器 内执行命令 docker run 创建并启动新容器 执行命令 docker attach 连接到容器的主进程(可能导致退出时容器停止)
2.3.7小结
参数 作用 示例 -i 交互式(可执行命令) docker run -i ubuntu:latest -t 分配伪终端 docker run -t ubuntu:latest -d 后台运行容器(返回容器ID) docker run -d ubuntu:latest -p 映射容器端口到主机(格式:主机端口:容器端口) docker run -p 8080:80 nginx
2.4查看容器状态
# 查看容器列表
docker ps
2.4.1小结
参数 作用 -a 显示所有容器(包括停止的) -q 只显示容器ID -s 显示文件占用的文件大小 -l 显示最近创建的容器(包括停止的) –no-trunc 不截断输出
三、镜像部署(扩展)
3.1安装MySQL镜像
# 拉取镜像
docker pull mysql:5.7# 修改登录密码
docker run -d -P -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
#输出如下:
ec4cae89c6382c4f4b54af574c299f76f4a07bb4fb885ec8a6473b9d47a52132# 查看镜像状态
docker ps -l
#输出如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec4cae89c638 mysql:5.7 "docker-entrypoint.s…" 33 seconds ago Up 33 seconds 0.0.0.0:32768->3306/tcp, [::]:32768->3306/tcp, 0.0.0.0:32769->33060/tcp, [::]:32769->33060/tcp distracted_bhaskara# 进入数据库
docker exec -it distracted_bhaskara mysql -uroot -p123456
3.2自网络设置
# 创建了一个自定义的 Docker 桥接网络
docker network create --subnet 192.168.10.0/24 --gateway 192.168.10.1 mynet02
#输出如下:
452ed1bede485d390d2435154a382eabb954d7cc4b9da99ecdb2cb0eb7b76461# 创建lw1容器,运行在mynet02,固定IP为192.168.10.10
docker run -dit --name lw1 --network mynet02 --ip 192.168.10.10 busybox:latest 42b01c619d58b559aa6843e5cdf8757919611780558b799f4c2ec7109f542a71# 进入lw1查看IP地址
docker exec -it lw1 sh
/ # ip a
#输出如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 12:ea:88:10:ed:6d brd ff:ff:ff:ff:ff:ffinet 192.168.10.10/24 brd 192.168.10.255 scope global eth0valid_lft forever preferred_lft forever
网络配置解析 驱动类型:默认使用 bridge 驱动(未指定 --driver 时),适合单机容器通信。 子网(Subnet):192.168.10.0/24,支持 254 个可用 IP(192.168.10.1 到 192.168.10.254)。 网关(Gateway):192.168.10.1,容器通过此 IP 访问外部网络。 网络名称:mynet02,用于后续容器连接。
3.3自网络设置与查看
# 在为Ubuntu设置一个IP
docker run -dit --name lw2 --network mynet02 --ip 192.168.10.11 ubuntu:latest
#输出如下:
8dda70b34df9e5a9596ce8cfe68f004c61000bcbae512aac03f5a4f2421cc7e3# 查看容器状态
docker ps -l
#输出如下: (成功启动)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8dda70b34df9 ubuntu:latest "/bin/bash" About a minute ago Up About a minute lw2
3.3.1查看容器IP方法一:
# 查看容器 lw2 的详细配置信息
docker inspect lw2
#输出如下: (如下为最后几行数据)"EndpointID": "6ffc90df2f57101db15c5029356f9d39f09a8211fbb5d81204010c9ec1994582","Gateway": "192.168.10.1","IPAddress": "192.168.10.11","IPPrefixLen": 24,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DNSNames": ["lw2","8dda70b34df9"]}}}}
]
3.3.2查看容器IP方法二:
# 查看mynet02的网络信息
docker network inspect mynet02
#输出如下: },"8dda70b34df9e5a9596ce8cfe68f004c61000bcbae512aac03f5a4f2421cc7e3": {"Name": "lw2","EndpointID": "6ffc90df2f57101db15c5029356f9d39f09a8211fbb5d81204010c9ec1994582","MacAddress": "b6:17:13:31:1b:ef","IPv4Address": "192.168.10.11/24","IPv6Address": ""}},"Options": {},"Labels": {}}
]
3.3.3查看容器IP方法三:
# 提取特定字段提取IP地址
docker inspect -f '{{.NetworkSettings.Networks.mynet02.IPAddress}}' lw2
#输出如下:
3.4共享网络栈
# 创建启动一个新的BusyBox容器,与容器 lw2 共享网络栈
docker run -it --network container:lw2 busybox:latest
/ # ip a
#输出如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether b6:17:13:31:1b:ef brd ff:ff:ff:ff:ff:ffinet 192.168.10.11/24 brd 192.168.10.255 scope global eth0valid_lft forever preferred_lft forever
3.5退出容器自动删除
docker run -it --name lw1 --rm busybox:latest # 查看变化
docker ps
3.6容器的权限
# 进入容器查看权限(此时是假root)docker run -it busybox:latest
/ # id
uid=0(root) gid=0(root) groups=0(root),10(wheel)
/ # ls /dev
console fd mqueue ptmx random stderr stdout urandom
core full null pts shm stdin tty zero# 使用root权限进入容器(显示全部文件)docker run -it --privileged busybox:latest
/ # ls /dev/
autofs nvme0n1 tty19 tty47 usbmon1
bsg nvme0n1p1 tty2 tty48 usbmon2
bus nvme0n1p2 tty20 tty49 userfaultfd
console nvram tty21 tty5 vcs
core port tty22 tty50 vcs1
四、删除容器
4.1删除单个容器
# 语法
docker rm [容器ID或名称]
4.1.1强制删除(正在运行的容器)
# 语法
docker rm -f [容器ID或名称]
4.2删除多个容器
# 停止全部容器
docker stop $(docker ps -qa)# 删除全部容器
docker rm $(docker ps -qa)# 在查看当前容器为空
docker ps -a
#输出如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
五、导出镜像(save|load)
5.1导出镜像
# 查看当前有的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest a0e45e2ce6e6 4 weeks ago 78.1MB
nginx latest be69f2940aaf 5 weeks ago 192MB
busybox latest 6d3e4188a38a 8 months ago 4.28MB
mysql 5.7 5107333e08a8 17 months ago 501MB# 导出镜像
docker save -o lwimages.tar ubuntu:latest nginx:latest busybox:latest
#输出如下: ll
total 275172
-rw-------. 1 root root 807 Mar 3 17:18 anaconda-ks.cfg
-rw------- 1 root root 281769472 May 27 22:49 lwimages.tar
5.2删除镜像
# 删除容器
docker rmi ubuntu:latest nginx:latest busybox:latest
#输出如下:
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:6015f66923d7afbc53558d7ccffd325d43b4e249f41a6e93eef074c9505d2233
Deleted: sha256:a0e45e2ce6e6e22e73185397d162a64fcf2f80a41c597015cab05d9a7b5913ce
Deleted: sha256:8901a649dd5a9284fa6206a08f3ba3b5a12fddbfd2f82c880e68cdb699d98bfb
Untagged: nginx:latest
Untagged: nginx@sha256:fb39280b7b9eba5727c884a3c7810002e69e8f961cc373b89c92f14961d903a0
Deleted: sha256:be69f2940aaf64fdf50c9c99420cbd57e10ee655ec7204df1c407e9af63d0cc1
Deleted: sha256:d4b3df3b01538a659a8990a121e2f90340dec055232275eb6e121f3af230e3c4
Deleted: sha256:8b8ba0c31936a63862b7bb3f9edd4e2721da3ccf99dc0e6dcaf289bbd212ba6f
Deleted: sha256:fcef123e6b584f68369e1c45f4e582be8391b93abd1e5be6ef674ce3459ac7fd
Deleted: sha256:ee697e6373f3f1a82f1a55fc29ef5ebc2c05158dcbfbeffcaf223406f429be8b
Deleted: sha256:d6189b151727a846370cf1355a8b5276f6c2aa41f378cc2945205a0eb03ea861
Deleted: sha256:3c1060a9ec6601e87cbcb04366f323b6383b7f605153e7df398bc1f843e36141
Deleted: sha256:ace34d1d784c01e3f9d156687089e8f58f786e23ccd097bdbbf337d6d28b3783
Error response from daemon: conflict: unable to remove repository reference "busybox:latest" (must force) - container 8a86160739ba is using its referenced image 6d3e4188a38a# 查看容器
docker images
#输出如下: (发现busybox没有删除失败)
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 6d3e4188a38a 8 months ago 4.28MB
mysql 5.7 5107333e08a8 17 months ago 501MB
5.3删除busybox
# 先查看我有哪些运行的容器
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d3030a19c7c busybox:latest "sh" 14 minutes ago Exited (0) 7 minutes ago gallant_beaver
8a86160739ba busybox:latest "sh" 18 minutes ago Exited (0) 15 minutes ago serene_yonath
d990c08cb187 busybox:latest "sh" 19 minutes ago Exited (0) 19 minutes ago angry_ride# 方法一:删除全部busybox(停止+删除)
docker rm -f $(docker ps -q --filter "ancestor=busybox")# 方法二:停止全部busybox(停止)
docker stop $(docker ps -q --filter "ancestor=busybox:latest")# 删除全部busybox
docker rm $(docker ps -aq --filter "ancestor=busybox:latest")# 删除busybox镜像
docker rmi busybox:latest
#输出如下:
Untagged: busybox:latest
Untagged: busybox@sha256:f64ff79725d0070955b368a4ef8dc729bd8f3d8667823904adcb299fe58fc3da
Deleted: sha256:6d3e4188a38af91b0c1577b9e88c53368926b2fe0e1fb985d6e8a70040520c4d
Deleted: sha256:65014c70e84b6817fac42bb201ec5c1ea460a8da246cac0e481f5c9a9491eac0# 查看当前容器
docker images
#输出如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 5107333e08a8 17 months ago 501MB
5.4导入镜像
docker load -i lwimages.tar
#输出如下:
65014c70e84b: Loading layer 4.516MB/4.516MB
Loaded image: busybox:latest
8901a649dd5a: Loading layer 80.61MB/80.61MB
Loaded image: ubuntu:latest
ace34d1d784c: Loading layer 77.88MB/77.88MB
deb7d8874f38: Loading layer 118.7MB/118.7MB
cb857378ec55: Loading layer 3.584kB/3.584kB
a8b606cdf152: Loading layer 4.608kB/4.608kB
9fd8b974f616: Loading layer 2.56kB/2.56kB
f6e33ee35fd0: Loading layer 5.12kB/5.12kB
941dd9dd8ee4: Loading layer 7.168kB/7.168kB
Loaded image: nginx:latest# 查看当前镜像[
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest a0e45e2ce6e6 4 weeks ago 78.1MB
nginx latest be69f2940aaf 5 weeks ago 192MB
busybox latest 6d3e4188a38a 8 months ago 4.28MB
mysql 5.7 5107333e08a8 17 months ago 501MB
[root@docker-5 ~]#
六、导出入镜像(expect|import会清理源数据)
6.1导出镜像
# 运行容器
docker run -itd busybox:latest
#输出如下:
9f9e83a8970c50ce2daa90a063c2bc37e2299cc9ea077fa2c51ad7ea9f70266e# 进入容器写入文件
docker exec -it 9f9e83a8 sh
/ # touch hello.txt
/ # echo "666" > hello.txt# 查看容器id
docker ps
#输出如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f9e83a8970c busybox:latest "sh" 7 minutes ago Up 7 minutes gifted_diffie# 导出镜像
docker export -o lwbusybox.tar 9f9e83a8970c
#输出如下:
ll
total 279584
-rw-------. 1 root root 807 Mar 3 17:18 anaconda-ks.cfg
-rw------- 1 root root 4515840 May 27 23:39 lwbusybox.tar
-rw------- 1 root root 281769472 May 27 22:49 lwimages.tar
6.2导入容器
# 导入镜像
docker import lwbusybox.tar lwbusybox
#输出如下:
sha256:897dd75f04317c4e28eb0e4c7e378f9f0980ed1fc6c4addde6fc8becb413e95e# 查看当前镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lwbusybox latest 897dd75f0431 28 seconds ago 4.28MB
ubuntu latest a0e45e2ce6e6 4 weeks ago 78.1MB
nginx latest be69f2940aaf 5 weeks ago 192MB
busybox latest 6d3e4188a38a 8 months ago 4.28MB
mysql 5.7 5107333e08a8 17 months ago 501MB
6.3进入容器
# 启动容器(导出丢失sh)
docker run -itd lwbusybox:latest sh
079bc58f23c18be5e053cd328c34bb8cb6350d6ad3f55976ca7327bc2b46d7b8# 进入容器查看内容
docker exec -it 079bc58f23 sh
/ # cat hello.txt
666
七、小结
7.1启动容器
选项 功能 -d 后台运行容器 -i 保持标准输入打开 -t 分配伪终端 -p 映射端口 -v 挂载卷 -e 设置环境变量 –name lw 指定容器名为lw –rm 容器退出自动删除 -it 交互式操作
# 语法
docker run [选项] 镜像名 [命令] [参数...]# 示例
docker run -d -it --rm \-p 8080:80 \-v $(pwd)/data:/app/data \-e DB_HOST=localhost \-e DB_USER=admin \-e DB_PASS=secret \--name my_container \nginx:alpine# 示例分析:
1. 以守护进程模式 (-d) 在后台运行一个交互式容器
2. 分配一个伪终端并保持标准输入打开 (-it)
3. 容器退出时自动删除 (--rm)
4. 将主机的 8080 端口映射到容器的 80 端口 (-p)
5. 将主机当前目录下的 data 目录挂载到容器内的 /app/data 目录 (-v)
6. 设置三个环境变量 (-e) 用于数据库连接配置
7. 为容器指定名称 my_container (--name)
8. 使用 nginx:alpine 镜像创建容器
方式 场景 语法 docker run 启动单个容器 docker run [选项] 镜像名 [命令] [参数…] docker start 启动已停止容器 docker start 容器名 docker-compose 多容器关联 docker-compose up -d docker exec 运行后台容器 docker exec -it [选项] 容器名 sh docker attach 连接容器(退出容器停止) docker attach 容器名
7.2查看容器
# 查看运行中的容器(语法)
docker ps [选项]# 查看容器详细信息(语法)
docker inspect [选项] 容器名
docker ps 选项 功能 -a 显示所以容器 -q 只显示容器ID -l 显示最近创建容器 –format 自定义输出(–format ‘{{.ID}} {{.Names}}’)
7.3删除容器
语法 功能 docker rm [容器ID或名称] 删除单个容器(已停止的容器) docker rm -f [容器ID或名称] -f(强制)先停止容器,在删除 docker container prune 删除所以已停止的容器 docker rm -f $(docker ps -aq) 删除所以容器(运行停止的容器都删除) docker run --rm [镜像名] 删除容器自动清理相关资料(谨慎使用) docker rm -v [容器ID或名称] 删除容器并删除关联数据卷
7.4导出入镜像
语法 功能 docker save [选项] 镜像名 > 导出路径.tar 导出完整镜像到tar文件 docker save lwimage:v1 > /root/lwimage_v1.tar 重定向导出法 docker save -o /root/lwimage_v1.tar lwimage:v1 使用–output选项 docker save -o /root/images.tar lwimage:v1 lisiimage:v2 导出多个镜像到一个tar文件 docker expect [选项] 容器名 > 导出路径.tar 导出容器快照到tar文件 docker load -i 镜像包 导入镜像包 docker import 容器快照 导入容器快照