运行后内存吃满问题
在 Windows + Docker Desktop + WSL Ubuntu 这个组合下,内存瞬间到 90% 以上是非常常见的行为,解决方法如下:
- 限制 WSL2 的最大内存。在C:\Users<UserName>目录下创建.wslconfig文件,并填入以下内容
[wsl2]
memory=4GB # WSL2最大内存
processors=2 # CPU核心数
swap=2GB # 交换空间
然后重启WSL,配置生效:
wsl --shutdown
- 启动容器的时候,手动限制容器内存,例如:
docker run -m 512m --memory-swap=512m -d --name mysql_8.0.27 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:latest
以MySQL为例,容器启动后
docker run实际包含容器创建(create)和容器启动(start)两个步骤,因此不需要额外执行docker start。- 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文件,通过该文件构建和运行整个项目。
- 以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
- 根据编写的docker-compose.yml文件构建项目。
# 检查docker-compose.yml文件的语法问题
docker compose config
# 运行docker-compose.yml文件构建项目
docker compose up -d
- 其他 如果项目运行,但是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