Docker 快速入门(一):容器运行、内存限制与 Compose 基础

18 阅读3分钟

运行后内存吃满问题

Windows + Docker Desktop + WSL Ubuntu 这个组合下,内存瞬间到 90% 以上是非常常见的行为,解决方法如下:

  1. 限制 WSL2 的最大内存。在C:\Users<UserName>目录下创建.wslconfig文件,并填入以下内容
[wsl2]
memory=4GB # WSL2最大内存
processors=2 # CPU核心数
swap=2GB # 交换空间

然后重启WSL,配置生效:

wsl --shutdown
  1. 启动容器的时候,手动限制容器内存,例如:
docker run -m 512m --memory-swap=512m -d --name mysql_8.0.27 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:latest

以MySQL为例,容器启动后

  1. docker run实际包含容器创建(create)和容器启动(start)两个步骤,因此不需要额外执行docker start
  2. MySQL容器运行后,容器内的MySQL服务随容器一起启动并开始监听端口;若已通过端口映射(如-p 3307:3306),即可在宿主机(如powershell或wsl)中使用mysql client通过tcp连接该服务:
mysql -h 127.0.0.1 -P 3307 -u root -p

关于Docker Compose

Docker Compose以项目的方式定义和管理多个相关容器,统一编排和控制项目中各容器的生命周期。在wsl的Ubuntu环境中,通常在用户主目录(/home/<username>)下创建项目目录,并在该目录中编写docker-compose.yml文件,通过该文件构建和运行整个项目。

  1. 以wordpress为例,编写docker-compose.yml文件。
services:
  db:
    image: mysql:5.7
    container_name: wp_db
    environment:
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
    mem_limit: 1g

  wordpress:
    image: wordpress:6.4-php8.1-apache
    container_name: wp-app
    depends_on:
      - db
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: ${DB_NAME}
      WORDPRESS_DB_USER: ${DB_USER}
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
    volumes:
      - wp_data:/var/www/html
    mem_limit: 512m

volumes:
  db_data:
  wp_data:

在当前项目目录下,编辑.env文件,设置数据库、用户名、密码等相关信息

DB_NAME=wordpress
DB_USER=wpUser
DB_PASSWORD=wpPassword
DB_ROOT_PASSWORD=rootPassword
  1. 根据编写的docker-compose.yml文件构建项目。
# 检查docker-compose.yml文件的语法问题
docker compose config

# 运行docker-compose.yml文件构建项目
docker compose up -d
  1. 其他 如果项目运行,但是wordpress无法连接mysql,可能的原因是此前拉取的MySQL镜像已经初始化了用户名和密码,解决办法:
# 删除docker-compose.yml文件生成的wordpress、MySQL镜像以及对应的volume
docker compose down -v

# 确认 wordpress_db_data 不存在,若存在多余volume:docker volume rm volume_name
docker volume ls
docker volume prune -f

# 重新生成容器和volume
docker compose up -d

常用命令

# 列出所有容器
docker ps -a

# 列出所有镜像
docker images

# 启动/停止容器
docker start/stop 容器名称/容器ID

# 强制停止容器
docker kill 容器名称/容器ID

# 重启容器
docker restart 容器名称/容器ID

# 删除容器
docker rm 容器名称/容器ID

# 删除镜像
docker rmi 容器名称/容器ID

# 查看volumes列表
docker volume ls

# 查看网络列表
docker network ls