898 字
4 分钟
Docker 指南
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 create和docker 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
清理冲突的软件包:
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)设置 docker 仓库:
# Add Docker's official GPG key:sudo apt updatesudo apt install ca-certificates curlsudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:sudo tee /etc/apt/sources.list.d/docker.sources <<EOFTypes: debURIs: https://download.docker.com/linux/ubuntuSuites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")Components: stableArchitectures: $(dpkg --print-architecture)Signed-By: /etc/apt/keyrings/docker.ascEOF
sudo apt update安装 docker 及相关软件包:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin验证:
sudo systemctl status dockersudo docker run hello-world镜像源
参考: 解决docker拉取镜像报错
国内一般是连不上默认的源:
xxx@xxx:~$ sudo docker run hello-worldUnable to find image 'hello-world:latest' locallydocker: 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更新镜像,
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:
sudo systemctl daemon-reloadsudo systemctl restart docker构建 Docker 容器
准备工作
- 确定运行环境
- 确定依赖文件
- 确定启动命令
- 确定监听端口
编写 .dockerignore
__pycache__*.pyc.git.env.venvvenv*.md.gitignoreDockerfile.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"]构建镜像
# 1. 基本构建docker build -t myapp:latest .
# 2. 指定 Dockerfile 名称(如果不是默认名)docker build -f Dockerfile.dev -t myapp:dev .
# 3. 查看构建后的镜像docker images运行容器
# 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:运行:
docker compose up -d