当前位置:首页 > 休闲

docker菜鸟教程

```html docker菜鸟教程

docker菜鸟教程

你写了个 Node.js 小工具,本地跑得挺欢。教程发给同事,菜鸟他装完 Node 又缺 Python 编译模块,教程折腾半小时还没跑起来。菜鸟这种破事 Docker 就是教程来终结的——它把你的应用和所有依赖打包成一个标准集装箱,谁拿到都能直接运行,菜鸟不管对方机器上装的教程是 Ubuntu 还是 Windows 11。

先记住三个词:镜像(Image)、菜鸟容器(Container)、教程仓库(Registry)。菜鸟镜像就是教程个只读模板,里面装着文件系统和运行环境。菜鸟容器是教程镜像跑起来的实例,能读能写。菜鸟仓库用来存镜像,最出名的是 Docker Hub。你写个 Dockerfile 就能造镜像,一条命令就能跑容器。

装 Docker 没你想的那么麻烦

Linux 上直接 apt install docker.io 或者 yum install docker。Windows 和 macOS 去官网下 Docker Desktop,双击安装包,一路下一步。装完打开终端敲 docker version,能看到 Client 和 Server 两段信息就算成了。我第一次在 Mac 上装的时候卡在“Docker Desktop starting...”转圈,重启一次就好了,别慌。

第一个容器:跑个 Nginx 看看

别急着写 Dockerfile,先感受下现成镜像。终端里输入:

docker run -d -p 8080:80 --name my-nginx nginx

这行命令干了四件事:从 Docker Hub 拉 nginx 镜像(没有就自动下),后台运行(-d),把容器 80 端口映射到本机 8080(-p 8080:80),给容器起名叫 my-nginx。然后浏览器打开 http://localhost:8080,那个 Welcome to nginx 页面就出来了。整个过程不到十秒,比你装个桌面版 Nginx 快得多。

想看看跑着的容器?docker ps。想停掉?docker stop my-nginx。想删掉?docker rm my-nginx。注意,删容器不会删镜像,镜像还在硬盘上躺着。

自己写 Dockerfile 才叫入门

假设你有个 Python 脚本 app.py,依赖 Flask。在同目录下建个文件叫 Dockerfile,内容这么写:

FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"]

逐行解释:FROM 指定基础镜像,slim 版本体积小;WORKDIR 设工作目录;COPY 把本地文件拷进去;RUN 在构建时执行命令;CMD 是容器启动时跑的默认命令。注意 COPY requirements.txt . 和 COPY . . 分两步,这是为了利用 Docker 的层缓存——只要 requirements.txt 没变,pip install 那层就不会重新跑,构建速度飞快。

然后 docker build -t my-python-app .,-t 给镜像起名。跑起来:docker run -p 5000:5000 my-python-app。如果 Flask 监听 5000 端口,本机就能访问了。

踩坑提醒: 容器里的 localhost 不是你的宿主机。容器里连数据库得用宿主机 IP 或者 Docker 网络别名。我当初在容器里写 localhost:3306 连 MySQL,死活连不上,后来改成 host.docker.internal 才通。

数据别丢:挂载卷

容器删了,里面写的数据也没了。想持久化?用 -v 挂载。比如 MySQL:

docker run -d -p 3306:3306 -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8

mysql_data 是 Docker 管理的卷,存在宿主机某个目录下,具体在哪用 docker volume inspect mysql_data 查。你也可以挂载本地目录:-v /home/me/mysql_data:/var/lib/mysql。后者更直观,我一般用这种。

网络:容器之间怎么聊天

默认所有容器都在 bridge 网络里,但只能通过 IP 互访,IP 还会变。最好自己建个网络:

docker network create my-net docker run -d --name db --network my-net mysql:8 docker run -d --name web --network my-net my-python-app

这样 web 容器里直接 ping db 就能通,Docker 内置 DNS 会解析容器名。省心。

最后一条实用命令

docker system prune -a 能清掉所有没在用的镜像、容器、网络。慎用,但磁盘爆了的时候真救命。我上次跑了一堆测试容器,硬盘少了 20 个 G,一条命令全回来了。

Docker 没那么玄乎,核心就是“打包—分发—运行”三步。你先跑通一个 nginx,再自己 build 一个 Python 镜像,剩下的命令边用边查。别一开始就啃官方文档几百页,容易劝退。

```

分享到: