Fork me on GitHub

Win11运行Docker

Docker

前置条件启用WSL2:https://www.cnblogs.com/aeolian/p/18899818
image

CMD设置代理

set http_proxy=http://127.0.0.1:10809
set https_proxy=http://127.0.0.1:10809

image

Dockerfile

#克隆dockerfile
git clone https://github.com/docker/welcome-to-docker
cd welcome-to-docker

image

Dockerfile

# Start your image with a node base image
FROM node:18-alpine

# The /app directory should act as the main application directory
WORKDIR /app

# Copy the app package and package-lock.json file
COPY package*.json ./

# Copy local directories to the current local directory of our docker image (/app)
COPY ./src ./src
COPY ./public ./public

# Install node packages, install serve, build the app, and remove dependencies at the end
RUN npm install \
    && npm install -g serve \
    && npm run build \
    && rm -fr node_modules

#使用3000端口
EXPOSE 3000

# Start the app using serve command
CMD [ "serve", "-s", "build" ]

构建image镜像

#-t:tag,给这个镜像取名为welcome-to-docker
docker build -t welcome-to-docker

image

使用镜像运行容器

image
image

Docker Compose

同时管理多个容器

git clone https://github.com/docker/multi-container-app

image
包含一个应用,一个数据库
image

compose.yaml

# Comments are provided throughout this file to help you get started.
# If you need more help, visit the Docker compose reference guide at
# https://docs.docker.com/compose/compose-file/

# Here the instructions define your application as two services called "todo-app" and “todo-database”
# The service “todo-app” is built from the Dockerfile in the /app directory,
# and the service “todo-database” uses the official MongoDB image 
# from Docker Hub - https://hub.docker.com/_/mongo. 
# You can add other services your application may depend on here.

#定义了多个服务
services:
  #第一个服务todo-app
  todo-app:
    #服务是基于 ./app 目录下的 Dockerfile 来构建镜像的
    build:
      context: ./app
    #depends_on确保todo-database服务已经启动
    depends_on:
      - todo-database
    #告诉node在生产环境中
    environment:
      NODE_ENV: production
    #所需端口
    ports:
      - 3000:3000
      - 35729:35729
    #开发模式:监听变化自动操作(experimental扩展);改了 package.json → 触发重新构建镜像(rebuild);改了 ./app 文件夹的代码 → 同步更新容器内部的 /usr/src/app 目录(sync)
    develop:
      watch:
        - path: ./app/package.json
          action: rebuild
        - path: ./app
          target: /usr/src/app
          action: sync
  #服务二,mongo:6镜像并指定端口
  todo-database:
    image: mongo:6
    #volumes: 
    #  - database:/data/db
    ports:
      - 27017:27017

#挂载数据卷的配置,MongoDB 的数据将保存在主机上,不会因容器重启而丢失
#volumes:
  #database:

运行docker compose

#一键在后台启动所有服务容器,且compose会生成镜像
docker compose up -d

image
成功后会显示两个容器在运行
image

浏览器访问

image

watch

官网文档:https://docs.docker.com/compose/how-tos/file-watch/

#监听文件变动并自动同步或重建容器
docker compose watch

使用compose.yaml中的配置文件

develop:
  watch:
    - path: ./app/package.json
      action: rebuild
    - path: ./app
      target: /usr/src/app
      action: sync

image

image

数据持久化

数据持久化使用卷。卷位于本地文件系统,由 Docker 管理。
给 todo-database 容器 挂载一个本地持久化数据卷,让数据库的数据保存在宿主机,而不是仅仅存在于容器内部。

services:
  todo-app:
    build:
      context: ./app
    depends_on:
      - todo-database
    environment:
      NODE_ENV: production
    ports:
      - 3000:3000
      - 35729:35729
    develop:
      watch:
        - path: ./app/package.json
          action: rebuild
        - path: ./app
          target: /usr/src/app
          action: sync

  todo-database:
    image: mongo:6
    #todo-database使用卷database并指定位置
    volumes:
      - database:/data/db
    ports:
      - 27017:27017

#使用volumes
volumes:
  database:

命名卷位置由docker管理,简洁、安全、自动管理,适合生产环境,不知道确切位置(不方便调试)
生产环境可以使用绑定挂载,可直接操作、备份、调试
image

查看卷

docker volume ls          # 列出所有卷
docker volume inspect database  # 查看 database 卷的详细信息

访问宿主机文件夹(运行宿主项目文件)

Volumes 指示 Compose 将本地文件夹 ./app 挂载到 todo-app 服务容器中的 /usr/src/app 目录。绑定挂载会覆盖容器中 /usr/src/app 目录的静态内容。 /usr/src/app/node_modules 阻止绑定挂载覆盖容器的 node_modules 目录,以保留容器中安装的软件包。

# todo-app容器运行本地项目文件
todo-app:
    # ...
    volumes:
      - ./app:/usr/src/app
      - /usr/src/app/node_modules

docker init创建dockerfile或者compose.yml文件

#docker初始化
docker init
#修改docker文件
#构造镜像
docker build -t imagename .
#重命名镜像
docker tag IMAGENAME YOURNAME/IMAGENAME
#登录docker
docker login
#发布镜像,<用户名>/<镜像名>:<标签>
docker push YOURNAME/IMAGENAME:1.0.0

dockerfile官网文档:https://docs.docker.com/reference/dockerfile/
compose官网文档:https://docs.docker.com/reference/compose-file/
image
运行完成后,生成如下几个文件。
image

发布镜像

#给镜像重命名
docker tag docker/welcome-to-docker YOURUSERNAME/welcome-to-docker
#发布
docker push YOURUSERNAME/welcome-to-docker:1.0.0

镜像导入导出

#导出
docker save -o my-image.tar my-image:tag
#导入
docker load -i my-image.tar
posted @ 2025-05-28 14:27  秋夜雨巷  阅读(56)  评论(0)    收藏  举报