第 16 步:更新镜像 - 修改代码后重新构建
第 16 步:更新镜像 - 修改代码后重新构建
场景: 你修改了代码,需要更新容器。

核心原则: 不要手动进入容器改文件,而是重新构建镜像 → 删除旧容器 → 运行新容器。

第 16 步操作

1. 修改 app.py,改变返回内容

bash
cd ~/my-python-app cat > app.py << 'EOF' from http.server import HTTPServer, BaseHTTPRequestHandler
import datetime

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        message = f'<h1>Updated! Current time: {now}</h1>'
        self.wfile.write(message.encode())

if __name__ == '__main__':
    print('Starting server on port 8000...')
    HTTPServer(('0.0.0.0', 8000), Handler).serve_forever()
EOF

2. 重新构建 alpine 镜像(用同样的 tag,会覆盖旧镜像)

bash
docker build -t my-python-app:alpine -f Dockerfile.optimized .

注意:由于 COPY app.py 这一层缓存失效,Docker 会重新执行这一层和之后的层。

3. 停止并删除旧容器

bash
docker stop my-app-alpine docker rm my-app-alpine

4. 运行新容器

bash
docker run -d --name my-app-alpine -p 8001:8000 my-python-app:alpine

5. 测试更新后的内容

bash
curl http://localhost:8001


root@docker-test:~/my-python-app# cd ~/my-python-app
root@docker-test:~/my-python-app# cat > app.py << 'EOF'
> from http.server import HTTPServer, BaseHTTPRequestHandler
> import datetime
> 
> class Handler(BaseHTTPRequestHandler):
>     def do_GET(self):
>         self.send_response(200)
>         self.send_header('Content-type', 'text/html')
>         self.end_headers()
>         now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
>         message = f'<h1>Updated! Current time: {now}</h1>'
>         self.wfile.write(message.encode())
> 
> if __name__ == '__main__':
>     print('Starting server on port 8000...')
>     HTTPServer(('0.0.0.0', 8000), Handler).serve_forever()
> EOF
root@docker-test:~/my-python-app# ll
total 20
drwxr-xr-x  2 root root 4096 May 12 08:27 ./
drwx------ 11 root root 4096 May 12 08:27 ../
-rw-r--r--  1 root root  552 May 12 08:33 app.py
-rw-r--r--  1 root root  223 May 12 08:21 Dockerfile
-rw-r--r--  1 root root  201 May 12 08:27 Dockerfile.optimized
root@docker-test:~/my-python-app# docker build -t my-python-app:alpine -f Dockerfile.optimized .
[+] Building 0.2s (8/8) FINISHED                                                        docker:default
 => [internal] load build definition from Dockerfile.optimized                                    0.0s
 => => transferring dockerfile: 250B                                                              0.0s
 => [internal] load metadata for docker.io/library/python:3.9-alpine                              0.1s
 => [internal] load .dockerignore                                                                 0.0s
 => => transferring context: 2B                                                                   0.0s
 => [1/3] FROM docker.io/library/python:3.9-alpine@sha256:c99b6eb43b3ac4d750db3d6e8b22268d5ea9a9  0.0s
 => [internal] load build context                                                                 0.0s
 => => transferring context: 587B                                                                 0.0s
 => CACHED [2/3] WORKDIR /app                                                                     0.0s
 => [3/3] COPY app.py .                                                                           0.0s
 => exporting to image                                                                            0.0s
 => => exporting layers                                                                           0.0s
 => => writing image sha256:e7c452100cf157732dbf140e3c472cdb8b896562f59af5d9ca384acf04140651      0.0s
 => => naming to docker.io/library/my-python-app:alpine                                           0.0s
root@docker-test:~/my-python-app# docker stop my-app-alpine 
my-app-alpine
root@docker-test:~/my-python-app# docker rm my-app-alpine 
my-app-alpine
root@docker-test:~/my-python-app# docker run -d --name my-app-alpine -p 8001:8000 my-python-app:alpine f7905eb9dd30bf250a9c827d0fe40d3a515ccbc19b33468bf95aa8060d26bff9
root@docker-test:~/my-python-app# curl http://localhost:8001
<h1>Updated! Current time: 2026-05-12 08:35:03</h1>root@docker-test:~/my-python-app# 


推荐阅读

docker volume

第一步:创建数据卷 docker volume create my-data 部分含义docker volumeDocker 数据卷管理命令create创建新数据卷my-data数据卷名称(可自定义)作用:在 /var/lib/docker/volumes/my-data/_data 创建一个目录,用来持久化数据。第二步:查看数据卷docker volume ls第三步:查看数据卷详情docker volume inspect my

90 0 赞2026-05-20分享技术分享

24步:常用操作

容器日志问题默认情况下,容器将 stdout/stderr 输出到 json-file 日志驱动,日志文件存在宿主机 /var/lib/docker/containers/&lt;container-id&gt;/&lt;container-id&gt;-json.log。如果不加限制,日志会无限增长,占满磁盘。1. 查看日志 docker logs &lt;容器名&gt; # 打印全部 docker logs --tail 100

58 0 赞2026-05-13分享技术专题

23步:Docker 技能验证测试

第 1 题:基础命令(10分)题目: 拉取 ubuntu:22.04 镜像,并运行一个交互式容器,进入 /tmp 目录,创建一个名为 test.txt 的文件,内容为 hello docker,然后退出容器。请写出完整命令: [root@localhost ~]# docker pull ubuntu:22.04 22.04: Pulling from library/ubuntu f63eb04151bc: Pull compl

101 0 赞2026-05-13分享技术专题

第 22 步:端口映射与网络隔离原理

关键理解:默认 bridge 网络:容器 IP 是 172.17.0.x,宿主机无法直接访问容器端口,必须用&nbsp;-p 8080:80&nbsp;做端口映射自定义 bridge 网络:容器间可以通信,但外界访问仍需端口映射为什么刚才的&nbsp;my-net&nbsp;容器不能从外部访问?因为它们没有&nbsp;-p&nbsp;参数,宿主机不知道如何转发流量第 22 步操作:测试端口映射 + 自定义网络1. 运行一个 Nginx

89 0 赞2026-05-12分享技术专题

第 21 步:Docker 网络基础原理

Docker 默认提供三种网络驱动:网络模式特点适用场景bridge默认网络,容器通过 NAT 访问外网,容器间需端口映射单机、简单场景host容器直接使用宿主机网络栈(无隔离)性能敏感、端口不冲突none无网络完全隔离、特殊安全场景overlay跨多台宿主机通信(Swarm/K8s)集群场景你之前用的默认 bridge 网络的问题:容器间不能直接用容器名通信(只能用 IP)需要手动&nbsp;--link(已废弃)自定义 bridge

81 0 赞2026-05-12分享技术专题

第 18 -19步:Docker Compose 原理

问题场景:一个 Web 应用通常需要:Nginx(前端)+ Python/Node(后端)+ MySQL/Redis(数据库)手动启动 3 个容器,还要配置网络、卷、依赖顺序 → 繁琐且容易出错解决方案:docker-compose.yml一个 YAML 文件定义所有容器的配置(镜像、端口、卷、网络、依赖)一条命令&nbsp;docker compose up -d&nbsp;启动全部一条命令&nbsp;docker compose d

96 0 赞2026-05-12分享技术专题

第 20 步:修改代码并热更新(使用 Compose)

在生产开发中,你修改代码后希望快速看到效果,有两种方式:重建镜像:docker compose up -d --build(会重新构建 web 镜像)挂载源码:开发时把代码目录挂载进去,改代码自动生效(无需重建)我们演示第二种(更接近真正的开发体验)。

85 0 赞2026-05-12分享技术专题

第 17 步:上传镜像到 Docker Hub(分享给别人)

前提:&nbsp;在&nbsp;https://hub.docker.com&nbsp;注册一个免费账号(如果还没有)原理:Docker Hub 是公共镜像仓库(类似 GitHub for 镜像)上传命令:docker push 用户名/镜像名:标签上传前需要先&nbsp;docker tag&nbsp;打上正确标签第 17 步操作(如果你有 Docker Hub 账号)1. 登录 Docker Hubbash docker logi

92 0 赞2026-05-12分享技术专题

第 15 步:优化 Dockerfile(减小体积 + 利用缓存)

当前 Dockerfile 的问题:任何代码修改都会导致&nbsp;COPY . /app&nbsp;重新运行,但&nbsp;apt&nbsp;之类的不需要重新安装镜像包含 Python 编译工具链(slim&nbsp;已经较小,但还可以更小)优化技巧:问题优化方法体积大使用&nbsp;alpine&nbsp;基础镜像(约 50MB vs 122MB)依赖变化频繁先&nbsp;COPY requirements.txt&nbsp;安装依

88 0 赞2026-05-12分享技术专题

第 14 步:Dockerfile 基础原理

制作自己的镜像 是 Docker 最核心的技能,也是从“使用者”变成“创造者”的关键一步

59 0 赞2026-05-12分享技术专题
admin

发文31·粉丝0

目录

沉浸

点赞

分享

收藏

文章目录
广告