Docker快速入门手册

发布于:2025-09-14 ⋅ 阅读:(19) ⋅ 点赞:(0)


::: tip 简介
Docker是一种开源的应用容器引擎,让开发者能够打包应用及其依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。这种技术可以保证包的快速、可靠、一致的交付,无论环境如何。
:::

一、安装

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

验证是否安装成功

sudo docker run hello-world

图片
如上所示代表安装成功。
如果出现网络原因问题如下:
图片
这个错误表明 Docker 无法从 Docker Hub (registry-1.docker.io) 拉取 hello-world 镜像,原因是 网络连接超时(context deadline exceeded)。这通常是由于 国内访问 Docker Hub 受限 或 服务器网络配置问题 导致的。
可选择阿里云加速镜像源https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,或直接开启科学上网。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://registry.docker-cn.com",
    "https://mirror.baidubce.com"
  ]
}
EOF

二、Docker命令

镜像

  • docker pull:拉取镜像
# 下载官方Nginx镜像,默认下载最新版
docker pull nginx
  • docker images:查看所有镜像
  • docker rmi xxx: 删除镜像(跟上镜像名、镜像ID前两位等均可)

容器

  • docker ps -a:查看所有容器
  • docker logs -f xxx:查看容器日志
docker run -d --name 创建的容器名 镜像名(一般镜像名放最后)
# 创建Nginx容器,把本机的80端口绑定到容器的80端口
docker run -d --name nginx -p 80:80 nginx
# `-d`:表示以后台运行的方式创建容器
  • 配置环境变量
    • -e:设置MySQL连接密码、时区
docker run --name mysql -e MYSQL_ROOT_PASSWORD=admin111 -e TZ=Asia/Shanghai -d -p 3307:3306 mysql
  • 配置restart重启策略
    • always: 只要docker重启那么容器就重启
    • unless-stopped: 除了手动停止容器后,不会重启外,其他情况docker重启,容器重启
docker run -d --restart unless-stopped nginx
  • 进入容器
# 以交互模式进入创建的Nginx容器
docker exec -it nginx bash
  • 停止容器
docker stop nginx
  • 启动容器
docker start nginx
# 重启容器
docker restart nginx
  • 基于容器创建新的镜像
docker commit -m '说明' 容器ID 新镜像名

数据卷管理

  • 创建容器时挂载数据卷,如果实在Windows上用的Docker Desktop,请注意挂载路径写法
# 将宿主机上的`/root/shared_file`目录挂载到容器的`/home/shred_file`下
docker run -d --name ubuntu -v /root/shared_file:/home/shred_file ubuntu

网络模式

默认三种模式:

  1. bridge: 网桥模式。即每个容器都会有一个独立的IP,容器之间,容器与宿主机之间可通过网桥实现通信。默认创建的容器都是网桥模式
  2. host: 主机模式。容器没有独立的IP地址,直接使用宿主机的IP地址,该容器就相当于宿主机的一个进程
  3. none: none模式,通常不用,代表该容器没有网络,宿主机和容器,容器和容器之间没法通过网络通信
    图片
    通过docker inspect xxx查看容器配置信息如下
    图片
  • 创建子网
# 创建一个自定义网络network1
docker network create network1

三、Dockerfile

  • 以在Docker中运行一个Flask项目为例
    图片
  • Dockerfile构建代码如下:
# 拉取镜像
FROM python:3.13-slim

# 切换到即将创建容器中的app目录下
WORKDIR /app/

# 将当前目录下文件拷贝到容器所在目录下(即上面的app目录)
COPY . .

# 下载依赖包
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt

# 定义环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
ENV TZ=Asia/Shanghai


# 声明会使用的端口
EXPOSE 5000

# 运行的命令
CMD ["flask","run"]
  • 然后构建镜像
docker build -t flask-demo .
  • 启动容器
docker run -d --name flask-web -p 5000:5000 flask-demo

推送至镜像仓库

以阿里云镜像仓库为例,如果使用的是阿里云系列产品,可选择切换内网地址,速度会快些。

docker login --username=子午技术组 crpi-xxx.cn-hangzhou.personal.cr.aliyuncs.com
docker tag [ImageId] crpi-xxx.cn-hangzhou.personal.cr.aliyuncs.com/ziwu/ziwu-docker:[镜像版本号]
docker push crpi-xxx.cn-hangzhou.personal.cr.aliyuncs.com/ziwu/ziwu-docker:[镜像版本号]

阿里云ECI弹性容器部署

如果需要把容器运行时,公网可以访问到,那么可以借助阿里云ECI容器部署https://www.aliyun.com/product/eci, 然后通过生成的IP地址就可以访问到了。
图片
图片

阿里云Serverless应用引擎SAE部署

参考:https://saenext.console.aliyun.com/
注意:需要提前配置好弹性IP,安全组
这个相比于ECI部署,可以动态进行弹性扩容,多实例运行,直接通过compose文件生成容器等。

阿里云FC函数部署容器

这个相比于其他两个价格最低,但是功能受限,仅适合部署API服务等接口。并且经过实践FC3.0的版本好像一直部署不成功,2.0版本可以。

四、Docker Compose

在实际的部署工作中,需要使用到多种服务,比如mysql、nginx等,那这么多镜像如何进行组合编排呢,这就是Docker-Compose需要解决的问题。

使用+典型案例:

使用Docker-Compose编排容器时,可以将编排指令放到compose.yaml文件中。这里以构建一个构建Flask+Redis的服务的过程为例来讲解Docker-Compose的使用。

创建一个文件夹,叫做app文件夹,并在里面创建一个app.py文件,目录结构如下:

flask-redis-demo/
│── app/
│   ├── app.py
│   ├── requirements.txt
│   └── Dockerfile
│── docker-compose.yml

  • Flask 应用 (app/app.py)
from flask import Flask
import redis
import os

app = Flask(__name__)

# 连接 Redis
redis_host = os.getenv("REDIS_HOST")
r = redis.Redis(host=redis_host, port=6379, decode_responses=True)

@app.route("/")
def hello():
    # 自增计数器
    count = r.incr("hits")
    return f"Hello! This page has been visited {count} times."

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)
  • 依赖文件 (app/requirements.txt)
flask
redis
  • Flask 的 Dockerfile (app/Dockerfile)
# 拉取镜像
FROM python:3.13-slim

# 切换到即将创建容器中的app目录下
WORKDIR /app/

# 将当前目录下文件拷贝到容器所在目录下(即上面的app目录)
COPY . .

# 下载依赖包
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt

# 定义环境变量
ENV TZ=Asia/Shanghai


# 声明会使用的端口
EXPOSE 5000

# 运行的命令
CMD ["python3","app.py"]
  • Docker Compose 配置 (docker-compose.yml)
# 名称
name: demo
# 服务列表
services:
    # web服务配置
  web:
      # web服务的Dockerfile文件路径
    build: ./app
    # 端口映射
    ports:
      - "5000:5000"
    # 容器名称
    container_name: "web"
    # 环境变量传递 Redis 服务名
    environment:
      - REDIS_HOST=redis  
    # 在遇到意外情况退出后是否重启
    restart: unless-stopped
    # 本服务依赖的服务,必须redis服务启动后,web服务才会启动
    depends_on:
      - redis

  # redis服务
  redis:
        # 使用的镜像,如本地没有,则会从docker官网上拉取
    image: "redis:alpine"
    # 容器名称
    container_name: "web_redis"
    # 是否重启
    restart: unless-stopped

compose相关命令

  1. 检查配置是否有错
docker compose config
  1. 创建和启动容器
docker compose up -d
  1. 停止和移除容器(尽量不要用这个停止,因为会删除容器)
docker compose down
  1. 停止compose
docker compose stop 【service name】
  1. 启动compose
docker compose start 【service name】
  1. 查看运行中的compose
# 加上 -a可以查看所有compose
docker compose ls 

网站公告

今日签到

点亮在社区的每一天
去签到