898 字
4 分钟
Docker 指南
2025-02-16

Docker 常用指令#

镜像管理类指令#

  • docker images:列出本地存储的镜像。
  • docker pull [image_name]:从仓库拉取镜像。
  • docker rmi [image_name]:删除一个或多个镜像。
  • docker search [image_name]:在 Docker Hub 上搜索镜像。
  • docker build [Dockerfile_path]:从 Dockerfile 构建镜

容器管理类指令#

  • docker ps [OPTIONS]:显示容器信息
    • -a 显示所有容器的信息(包括已开启和已关闭的)
    • -q 显示正在运行的容器的 ID
    • -S 显示正在运行的容器所占用的磁盘空间
  • docker run [OPTIONS] IMAGE [COMMAND] [ARG...]:创建并运行容器
    • docker createdocker start 组成
    • -p [host port]:[container port] 指定端口映射
    • -v [host volume]:[container volume] 将指定宿主卷挂载到容器中
  • docker create IMAGE:从镜像创建一个容器
  • docker status [CONTAINER ID]:查看容器运行状态
  • docker start [CONTAINER ID]:开启容器
  • docker restart [CONTAINER ID]:重启容器
  • docker stop [CONTAINER ID]:关闭容器
  • docker kill [CONTAINER ID]:强制关闭容器
  • docker rm [CONTAINER ID]:删除容器
  • docker attach [CONTAINER ID]:进入已开启的容器

Docker 安装#

基础#

Install Docker Engine on Ubuntu

清理冲突的软件包:

Terminal window
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)

设置 docker 仓库:

Terminal window
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update

安装 docker 及相关软件包:

Terminal window
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

验证:

Terminal window
sudo systemctl status docker
sudo docker run hello-world

镜像源#

参考: 解决docker拉取镜像报错

国内一般是连不上默认的源:

xxx@xxx:~$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: failed to resolve reference "docker.io/library/hello-world:latest": failed to do request: Head "https://registry-1.docker.io/v2/library/hello-world/manifests/latest": dial tcp 104.23.124.189:443: i/o timeout
Run 'docker run --help' for more information

更新镜像,

Terminal window
sudo vim /etc/docker/daemon.json

daemon.json 的内容替换成如下内容:

{
"registry-mirrors" : [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://dockerproxy.com",
"https://gst6rzl9.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"http://mirrors.ustc.edu.cn/",
"https://mirrors.tuna.tsinghua.edu.cn/",
"http://mirrors.sohu.com/" ],
"insecure-registries" : [
"registry.docker-cn.com",
"docker.mirrors.ustc.edu.cn"
],
"debug": true,
"experimental": false
}

重新加载并重启 docker:

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart docker

构建 Docker 容器#

准备工作#

  1. 确定运行环境
  2. 确定依赖文件
  3. 确定启动命令
  4. 确定监听端口

编写 .dockerignore#

__pycache__
*.pyc
.git
.env
.venv
venv
*.md
.gitignore
Dockerfile
.dockerignore

编写 dockerfile#

# 1. 基础镜像
FROM python:3.9-slim
# 2. 设置工作目录
WORKDIR /app
# 3. 复制依赖文件(先复制,利用缓存)
COPY requirements.txt .
# 4. 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 5. 复制代码(后复制,代码变动不影响依赖层)
COPY . .
# 6. 暴露端口
EXPOSE 8000
# 7. 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

构建镜像#

Terminal window
# 1. 基本构建
docker build -t myapp:latest .
# 2. 指定 Dockerfile 名称(如果不是默认名)
docker build -f Dockerfile.dev -t myapp:dev .
# 3. 查看构建后的镜像
docker images

运行容器#

Terminal window
# 1. 基本运行
docker run -d -p 8000:8000 myapp:latest
# 2. 带环境变量运行
docker run -d -p 8000:8000 -e DEBUG=true myapp:latest
# 3. 挂载本地代码(开发用,热重载)
docker run -d -p 8000:8000 -v $(pwd):/app myapp:latest
# 4. 查看运行中的容器
docker ps
# 5. 查看日志
docker logs -f <容器ID>

多容器需要编写 docker-compose.yml#

services:
app:
build: . # 不使用现成的容器,从当前目录的 Dockerfile 构建
ports: # 端口映射
- "8000:8000" # 宿主机端口:容器端口
depends_on: # 容器依赖
- mysql # mysql 数据库
environment: # 环境变量
DB_HOST: mysql # 用服务名作为主机名
mysql:
image: mysql:8.0 # 使用 mysql 8.0 镜像
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes: # 把容器里的数据库文件持久化到宿主机上
- mysql_data:/var/lib/mysql
volumes:
mysql_data:

运行:

Terminal window
docker compose up -d
Docker 指南
https://fuwari.vercel.app/posts/工具/docker-指南/
作者
Asuwee
发布于
2025-02-16
许可协议
CC BY-NC-SA 4.0