上文讲到了Docker的核心功能之类的介绍linux vi命令,此次或说详尽的使用技巧。

Dockerfile编写实战教程_docker dionaea_Docker基础命令操作指南

四、Docker使用方式解读4.1基础命令操作手册

把握Docker的基础命令是使用Docker的第一步。以下是最常用的Docker命令及其使用方式:

镜像管理命令:

搜索镜像:从DockerHub搜索镜像

docker search [OPTIONS] TERM
# 示例:搜索最新的Nginx镜像
docker search nginx:latest

拉取镜像:从DockerHub或私有库房拉取镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 示例:拉取Nginx最新版镜像
docker pull nginx:latest

查看本地镜像:列举本地所有镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]
# 示例:查看所有镜像
docker images
# 查看特定仓库的镜像
docker images nginx

删掉镜像:删掉指定的镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]
# 示例:删除nginx:latest镜像
docker rmi nginx:latest
# 删除所有未打标签的镜像(虚悬镜像)
docker rmi $(docker images -q -f dangling=true)

建立镜像:从Dockerfile建立镜像

docker build [OPTIONS] PATH | URL | -
# 示例:从当前目录的Dockerfile构建镜像,指定标签为myapp:v1
docker build -t myapp:v1 .

容器管理命令:

运行容器:创建并启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 示例:运行Nginx容器,映射主机80端口到容器80端口
docker run -d -p 80:80 --name mynginx nginx:latest

查看容器:列举运行中的容器

docker ps [OPTIONS]
# 查看所有容器(包括停止的)
docker ps -a
# 查看最近创建的5个容器
docker ps -n 5
# 查看状态为退出的容器
docker ps -f status=exited

启动/停止/重启容器:

docker start [OPTIONS] CONTAINER [CONTAINER...]  # 启动已停止的容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]   # 优雅停止容器(发送SIGTERM)

docker dionaea_Dockerfile编写实战教程_Docker基础命令操作指南

docker kill [OPTIONS] CONTAINER [CONTAINER...] # 强制停止容器(发送SIGKILL) docker restart [OPTIONS] CONTAINER [CONTAINER...] # 重启容器 # 示例:停止名为mynginx的容器 docker stop mynginx # 停止所有运行中的容器 docker stop $(docker ps -q)

步入容器:步入正在运行的容器

docker exec [OPTIONS] CONTAINER COMMAND
# 示例:进入mynginx容器的bash shell
docker exec -it mynginx bash

删掉容器:删掉容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 示例:删除名为mynginx的容器
docker rm mynginx
# 删除所有已停止的容器
docker rm $(docker ps -a -q)

查看容器日志:

docker logs [OPTIONS] CONTAINER
# 示例:查看mynginx容器的日志,实时输出
docker logs -f mynginx
# 查看最近100行日志
docker logs --tail 100 mynginx

系统管理命令:

查看系统信息:

docker info

清除系统资源

docker system prune [OPTIONS]
# 清理所有停止的容器、虚悬镜像、无用网络
docker system prune
# 清理所有未使用的镜像(包括中间层)
docker system prune -a
# 清理磁盘空间
docker system prune --volumes

查看资源使用情况:

docker stats [OPTIONS] [CONTAINER...]
# 实时查看所有容器的CPU、内存、网络等资源使用情况
docker stats

4.2Dockerfile编撰实战

Dockerfile是用于建立Docker镜像的文本文件,包含了一系列建立指令。把握Dockerfile的编撰是创建自定义镜像的关键。

Dockerfile基础句型:

常用指令解读:

FROM:指定基础镜像

FROM ubuntu:22.04  # 使用Ubuntu 22.04作为基础镜像
FROM alpine:latest  # 使用最新的Alpine Linux作为基础镜像

RUN:执行命令

Dockerfile编写实战教程_Docker基础命令操作指南_docker dionaea

RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*

COPY:从建立上下文复制文件到镜像

COPY requirements.txt .  # 将当前目录的requirements.txt复制到镜像根目录
COPY app/ /app/         # 将app目录复制到镜像的/app目录

ADD:类似COPY,但支持URL和压缩文件解压

ADD https://example.com/archive.tar.gz /tmp/
ADD app.tar.gz /app/    # 自动解压tar.gz文件

ENV:设置环境变量

ENV PYTHONUNBUFFERED 1  # 设置Python不缓冲输出
ENV PORT 8080

WORKDIR:设置工作目录

WORKDIR /app  # 设置工作目录为/app

EXPOSE:申明容器窃听的端口

EXPOSE 80  # 声明容器监听80端口
EXPOSE 8080/tcp  # 明确指定TCP协议

CMD:定义容器启动时执行的命令

CMD ["python", "app.py"]  # 推荐的JSON数组格式
CMD python app.py         # shell格式

ENTRYPOINT:设置容器的入口点

ENTRYPOINT ["nginx", "-g", "daemon off;"]  # 确保容器以Nginx前台进程运行

USER:设置运行容器的用户

USER nobody  # 以非root用户运行容器,提高安全性

实战案例:建立PythonFlask应用镜像

假定我们有一个简单的Flask应用,目录结构如下:

myapp/
├── app.py
├── requirements.txt
└── Dockerfile

app.py内容:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return "Hello, Docker!"
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

requirements.txt内容:

flask==2.3.3

Dockerfile内容:

# 使用Python 3.9作为基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY app.py .
# 暴露5000端口
EXPOSE 5000
# 设置环境变量
ENV FLASK_APP app.py
ENV FLASK_ENV production
# 定义容器启动命令
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]

建立和运行镜像:

# 构建镜像
docker build -t flask-app:v1 .
# 运行容器
docker run -d -p 5000:5000 flask-app:v1

访问应用:

curl http://localhost:5000
# 输出:Hello, Docker!

多阶段建立优化:

为了减少镜像容积docker dionaea,可以使用多阶段建立:

# 第一阶段:构建阶段
FROM python:3.9-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip wheel --no-cache-dir -r requirements.txt -w wheels
# 第二阶段:运行阶段
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /app/wheels /wheels
COPY app.py .
RUN pip install --no-deps --no-cache-dir /wheels/*
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]

4.3docker-compose多容器编排

DockerCompose是Docker官方提供的多容器编排工具,用于定义和运行多个互相关联的容器。它非常适宜开发、测试和大型生产环境。

docker-compose.yml文件结构:

一个典型的docker-compose.yml文件包含以下几个部份:

version:指定Compose文件格式版本services:定义各个服务(容器)networks:定义网路volumes:定义数据卷

实战案例:WordPress+MySQL布署

我们将使用docker-compose布署一个完整的WordPress站点,包含MySQL数据库和WordPress应用。

创建docker-compose.yml文件:

version: '3.8'
services:
  db:
    image: mysql:8.0
    volumes:

Docker基础命令操作指南_Dockerfile编写实战教程_docker dionaea

- db_data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=secret - MYSQL_DATABASE=wordpress - MYSQL_USER=wordpress - MYSQL_PASSWORD=wordpress restart: always wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" environment: - WORDPRESS_DB_HOST=db:3306 - WORDPRESS_DB_USER=wordpress - WORDPRESS_DB_PASSWORD=wordpress - WORDPRESS_DB_NAME=wordpress restart: always volumes: db_data:

关键配置说明:

services.db:定义MySQL数据库服务services.wordpress:定义WordPress服务volumes.db_data:定义数据卷docker dionaea中国linux操作系统,用于持久化MySQL数据

常用docker-compose命令:

启动服务:

docker-compose up [OPTIONS]
# 后台启动
docker-compose up -d
# 重新构建并启动
docker-compose up --build -d

停止服务:

docker-compose stop  # 优雅停止
docker-compose down   # 停止并删除容器、网络(默认保留数据卷)
docker-compose down --volumes  # 停止并删除所有资源(包括数据卷)

查看状态:

docker-compose ps  # 查看所有服务状态

Docker基础命令操作指南_Dockerfile编写实战教程_docker dionaea

docker-compose logs # 查看服务日志 docker-compose logs -f # 实时查看日志

步入容器:

docker-compose exec wordpress bash  # 进入WordPress容器

建立镜像:

docker-compose build  # 构建或重新构建服务镜像

多环境配置:

可以使用.env文件来管理环境变量,提升配置的灵活性。创建.env文件:

MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress
WORDPRESS_DB_HOST=db:3306

更改docker-compose.yml,使用环境变量:

services:
  db:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    environment:
      - WORDPRESS_DB_HOST=${WORDPRESS_DB_HOST}
      - WORDPRESS_DB_USER=${MYSQL_USER}
      - WORDPRESS_DB_PASSWORD=${MYSQL_PASSWORD}
      - WORDPRESS_DB_NAME=${MYSQL_DATABASE}

这样可以轻松切换不同环境的配置(开发、测试、生产)。

下一章会讲具体实战,感兴趣的同学可以关注收藏一下。

#docker#

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复