1-Docker实战教程(Ubuntu24)
Docker实战教程(Ubuntu24)
一、安装Docker
1. 更新软件源
sudo apt update
2. 安装Docker
sudo apt install -y docker.io
输出:
正在设置 containerd (1.7.28-0ubuntu1~24.04.2) ...
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /usr/lib/systemd/system/containerd.service.
正在设置 ubuntu-fan (0.12.16+24.04.1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/ubuntu-fan.service → /usr/lib/systemd/system/ubuntu-fan.service.
正在设置 docker.io (28.2.2-0ubuntu1~24.04.1) ...
info: 从 100 到 999 中选择 GID...
info: 正在添加组"docker" (GID 124)...
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /usr/lib/systemd/system/docker.socket.
正在设置 git (1:2.43.0-1ubuntu7.3) ...
正在处理用于 man-db (2.12.0-4build2) 的触发器 ...
3. 验证Docker是否安装成功
docker --version
4. 查看Docker状态
systemctl status docker
5. 启动Docker(若未运行)
# 启动Docker
sudo systemctl start docker
# 设置开机启动
sudo systemctl enable docker
二、配置镜像加速
1. 镜像加速的必要性
因为docker官方仓库在国内是无法访问的,我们只能通过国内的镜像加速。
2. 配置国内镜像加速地址
# 首先创建一个文件,在其中添加国内的镜像加速地址
sudo vim /etc/docker/daemon.json
文件内容(2026年3月 当前比较推荐的可用加速地址):
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1panel.live",
"https://mirror.ccs.tencentyun.com"
]
}
3. 重启Docker服务
镜像站配置好后,重启docker:
# service配置文件已经发生变化,重新加载systemd
sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker
三、Docker命令详解
1. docker pull命令
docker pull命令用来从仓库下载镜像。
docker pull docker.io/library/nginx:latest
一个镜像有四部分内容:
- docker.io(registry:仓库地址/注册表): 这部分表示是Docker仓库的注册表地址,docker.io表示这是Docker Hub的官方仓库。官方仓库可以省略仓库地址。
- library是命名空间(作者名): library是Docker官方仓库的命名空间,官方命名空间可以省略不写。
- :latest: 这部分是Docker镜像的标签名(版本号),可以指定下载特定版本
【registry+命名空间+镜像名字=repository(镜像库)】 一个镜像库存放的是同一个镜像的不同版本
简化后的命令: 表示从Docker官方仓库的官方命名空间里面下载最新版的Nginx Docker镜像。
docker pull nginx
示例:下载一个giniclark空间里面的最新版docker_test镜像
docker pull giniclark/docker_test:latest
2. Docker官方仓库
Docker的官方仓库网站:
https://hub.docker.com/
可以在这里查找需要的镜像。
# 搜索有关nginx的镜像
eg: nginx type:image
3. 拉取镜像
# 拉取nginx镜像:
sudo docker pull nginx
4. 列出镜像
# 列出下载过的镜像:
sudo docker images
5. 删除镜像
sudo docker rmi [镜像名/ID]
6. 拉取特定CPU架构的镜像
# 拉取特定CPU架构的镜像
docker pull --platform=xxxxxx nginx
四、docker run命令详解
1. 基本运行
docker run使用镜像创建并运行容器。
# 运行nginx容器(使用run命令镜像不存在会自动拉取镜像,然后再创建并且运行容器)
sudo docker run nginx
直接使用run命令,可以看到当前窗口已经被占用了,一直在刷日志。

2. 查看运行中的容器
sudo docker ps
输出:
giniclark@giniclark-VMware-Virtual-Platform:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
462259e5e294 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp hardcore_raman
3. -d参数:后台运行
添加-d参数,在后台运行,防止阻塞当前窗口。
sudo docker run -d nginx
输出:
giniclark@giniclark-VMware-Virtual-Platform:~$ sudo docker run -d nginx
d9431b32cf8b44c40b9806a38db5127df9dc5d689df4520cad37c8703b037566
4. -p参数:端口映射
添加-p参数,它的作用是端口映射,把宿主机与容器的端口进行绑定。
讲解:每个docker容器都运行在一个独立的虚拟环境里面,容器的网络与宿主机是隔离的。
# 冒号前面是宿主机的端口,冒号后面是容器内的端口
# 讲解:把宿主机的80端口转发到容器内的80端口进行处理
docker run -p 80:80
# 可以在浏览器中进行查看
# ip地址:80
5. 删除容器
sudo docker rm 容器ID
# 删除运行中的容器要添加-f参数,强制删除
# 可以使用docker ps查看当前运行中的容器ID
sudo docker rm -f 容器ID
6. -v参数:挂载卷
(1) 绑定挂载
添加-v参数(volume 挂载卷,宿主机目录:容器内目录),它的作用是把宿主机与容器内的文件目录进行绑定,容器内对文件的修改会影响宿主机的文件夹,而在宿主机对文件夹的修改同样会影响容器内的文件夹。
宿主机与容器通过这个目录紧密联系到一起,这种目录也被称为挂载卷,挂载卷的最大作用是数据的持久化保存。这是因为删除容器时,容器内的所有数据也会被同时删除掉,如果使用了挂载卷,容器内对应目录的数据,就会保存在宿主机的对应目录里面。
示例:
# -d表示容器在后台运行,-p表示把宿主机端口与容器内的端口做一个绑定
# -v表示把宿主机的目录跟容器内的目录做一个绑定
sudo docker run -d -p 80:80 -v /website/html:/usr/share/nginx/html nginx
注意:这时候直接通过ip地址:80进行访问,页面会提示403 Forbidden看不到页面内容。
这是因为使用绑定挂载的时候,宿主机的目录会覆盖掉容器内的目录,因为宿主机这边的目录目前是空的,所以容器内也没有任何网页,所以访问时显示403。
可以直接修改宿主机目录:
# 进入目录
cd /website/html
# 编辑文件
sudo vim index.html
文件内容示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>我的第一个网页</title>
<style>
/* 简单的CSS样式,让页面看起来更舒服 */
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f4f4f9;
}
header {
background: #5c67a3;
color: white;
padding: 1rem;
text-align: center;
border-radius: 8px;
}
main {
background: white;
padding: 20px;
margin-top: 20px;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
button {
background-color: #5c67a3;
color: white;
border: none;
padding: 10px 20px;
cursor: pointer;
border-radius: 5px;
}
button:hover {
background-color: #4a538a;
}
</style>
</head>
<body>
<header>
<h1>欢迎来到我的网站</h1>
</header>
<main>
<h2>你好,世界!</h2>
<p>这是一个使用HTML5编写的简单页面。它包含了一些基础的CSS样式来美化外观。</p>
<p>当前日期是:<span id="date-display">加载中...</span></p>
<button onclick="greet()">点击打个招呼</button>
</main>
<script>
// 简单的JavaScript交互
function greet() {
alert('你好!感谢你访问这个页面!');
}
// 显示当前日期
document.getElementById('date-display').innerText = new Date().toLocaleDateString();
</script>
</body>
</html>
可以看到访问成功了

(2) 命名卷挂载
让Docker自动创建一个存储空间,为存储空间起名字,挂载的时候直接使用名字。
命名卷挂载: -v 卷的名字:容器内目录
# 新创建一个挂载卷,create后面是卷的名字
sudo docker volume create nginx_html
# 不再使用目录,使用挂载卷名字
sudo docker run -d -p 80:80 -v nginx_html:/usr/share/nginx/html nginx
# 查看挂载卷在宿主机的真实目录,inspect后面接挂载卷名字
sudo docker volume inspect nginx_html
输出:
giniclark@giniclark-VMware-Virtual-Platform:/website/html$ sudo docker volume inspect nginx_html
[
{
"CreatedAt": "2026-03-20T22:37:28+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx_html/_data",
"Name": "nginx_html",
"Options": null,
"Scope": "local"
}
]
可以看到挂载卷的真实目录在:/var/lib/docker/volumes/nginx_html/_data
进入该目录需要切换成root用户,可以使用sudo -i进行切换。
输出:
root@giniclark-VMware-Virtual-Platform:~# cd /var/lib/docker/volumes/nginx_html/_data
root@giniclark-VMware-Virtual-Platform:/var/lib/docker/volumes/nginx_html/_data# ls
50x.html index.html
编辑index.html文件,可以看到里面存在了一些内容。

这是命名卷的一个特别功能,命名卷第一次使用时,Docker会把容器的文件夹同步到命名卷里进行一个初始化,而绑定挂载没有这个功能。
(3) 卷管理命令
列出所有创建过的卷:
sudo docker volume list
删除一个卷:
sudo docker volume rm nginx_html
删除所有没有任何容器在使用的卷:
sudo docker volume prune -a
7. -e参数:传递环境变量
-e用来往容器里面传递环境变量。
示例:
MongoDB作为一个数据库,使用时一般需要设置账号名和密码,使用两个-e参数,把数据库的账号名和密码作为环境变量传递进去,这样启动的时候数据库就会预设上账号名和密码。
docker run -d \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=gwt \
-e MONGO_INITDB_ROOT_PASSWORD=gwt123 \
--name mongo-test \
mongo
使用docker ps可以查看到容器是否在运行。
使用以下命令直接在Linux中测试,连接刚刚创建的mongo容器:
# 创建的容器名:mongo-test,登录账户:gwt,登录密码:gwt123
docker exec -it mongo-test mongosh -u gwt -p gwt123
登录成功后显示:

在Windows主机上连接Linux主机上Docker运行的mongo-test容器
第一种方法:使用mongosh
需要去官网下载安装:MongoDB Shell(mongosh)
mongosh "mongodb://gwt:gwt123@192.168.157.129:27017"
第二种方法:用GUI工具(MongoDB Compass),更方便
点击新建连接,输入URI即可。
mongodb://gwt:gwt123@192.168.157.129:27017

8. --name参数:自定义容器名
给容器起一个自定义的名字。
sudo docker run -d --name my_nginx nginx
9. -it和–rm参数:交互式容器
-it:让我的控制台进入容器进行交互--rm:当容器停止时就把容器删除掉
示例:
sudo docker run -it --rm alpine
使用exit命令退出后,容器同时从宿主机上删除。
-it和--rm参数一起用,用于临时调试一个容器。

10. --restart参数:重启策略
--restart用来配置容器在停止时的重启策略。
示例:
# --restart always: 容器停止了立即重启,包含容器因为内部错误崩溃,或者宿主机断电等场景
sudo docker run -d --restart always nginx
# unless-stopped:与always相似,区别是手动停止的容器就不会尝试重启
sudo docker run -d --restart unless-stopped nginx
五、调试容器
1. 查看容器
查看docker当前正在运行的容器:
sudo docker ps
查看所有容器,添加-a参数:
sudo docker ps -a
2. 启动和停止容器
将容器重新启动起来:
sudo docker start 容器ID/容器名
停止容器运行:
sudo docker stop 容器ID/容器名
3. 查看容器详细信息
查看Docker容器的详细配置和元数据:
sudo docker inspect 容器ID/容器名
# 示例
sudo docker inspect mongo-test
# 查看之前创建的mongo-test容器时配置的环境变量(账号名和密码)
# 或者查看有没有做端口映射,有没有做挂载卷(可以将内容粘贴给ai进行询问)
查找到的账号名和密码:

4. 创建容器
# docker create命令只创建容器,但不立即启动,与docker run命令不同
sudo docker create -p 27017:27017 mongo
# 若想启动,需要再输入docker start命令
5. 查看容器日志
sudo docker logs 容器ID/容器名
# 添加-f参数,-f等于--follow,也就是追踪输出
sudo docker logs 容器ID/容器名 -f
6. docker exec命令
每个Docker容器都是一个独立的运行环境,每个容器内部表象的都像一个独立的Linux系统,docker exec可以在容器的内部执行Linux命令。
docker exec 容器ID/容器名 linux命令
示例:进入容器查看其中正在运行的进程
# 查看之前创建的mongo-test容器
sudo docker exec mongo-test ps -ef
输出:
giniclark@giniclark-VMware-Virtual-Platform:~$ sudo docker exec 7f3f9e707919 ps -ef
UID PID PPID C STIME TTY TIME CMD
mongodb 1 0 0 09:29 ? 00:00:28 mongod --auth --bind_ip_all
root 222 0 10 10:31 ? 00:00:00 ps -ef
7. 进入容器内部
进入一个正在运行的Docker容器内部,获得一个交互式的命令行环境:
docker exec -it 容器ID/容器名 /bin/sh
容器内部表现出来的就像一个独立的操作系统,可以进入容器内部执行Linux命令,查看文件系统,管理容器内的进程,或者更加深入的进行调试。
示例:创建并且运行一个nginx容器
sudo docker run -d -p 80:80 nginx
启动成功后,可以在浏览器中,通过服务器地址访问到。
进入容器中修改网页:
sudo docker exec -it 容器ID /bin/sh

然后进入存放静态网页的目录:
cd /usr/share/nginx/html
注意:直接使用vi编辑文件,会提示:
/bin/sh: 5: vi: not found
这里显示找不到vi命令,这是因为Docker为了尽量压缩镜像的大小,内部是一个极简的操作系统,很多系统工具会缺失,这时候需要手动安装。
8. 在容器内安装软件
在容器内安装软件之前,需要执行以下命令,查看容器内的Linux是什么发行版:
cat /etc/os-release
输出:
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
DEBIAN_VERSION_FULL=13.4
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
从输出中可以看到,发行版本是Debian,它安装软件的命令是apt。
先更新apt索引,输入命令:
apt update
安装vim:
apt install vim
然后使用vim修改文件:
vim index.html
修改完成后在浏览器中访问页面,可以观察到已修改后的页面。
更多推荐

所有评论(0)