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

一个镜像有四部分内容:

  1. docker.io(registry:仓库地址/注册表): 这部分表示是Docker仓库的注册表地址,docker.io表示这是Docker Hub的官方仓库。官方仓库可以省略仓库地址。
  2. library是命名空间(作者名): library是Docker官方仓库的命名空间,官方命名空间可以省略不写。
  3. :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

修改完成后在浏览器中访问页面,可以观察到已修改后的页面。

更多推荐