准备在windows本地docker容器里跑个mysql,因为没有源拉取镜像,遂从已有mysql镜像的服务器打包到本地安装
打包已有镜像
查看服务器中mysql的docker镜像列表:
shell
$ docker images | grep mysql
mysql 8.0.39 f5da8fc4b539 7 months ago 573MB
打包镜像
shell
$ docker save -o mysql-8.0.39.tar mysql:8.0.39
把镜像下载到本地,使用scp命令或用FTP图形软件
导入镜像
回到windows打开Powershell,导入镜像:
powershell
# 导入镜像
docker load -i E:\DockerDesktop\mysql-8.0.39.tar
# 查看导入结果
docker images
补充一个linux服务器导入镜像的方式:
shell
# 先上传mysql-8.0.39.tar到linux服务器,scp命令或ftp软件(此处省略)
# 或者直接从镜像源下载一个(当前在/root/mysql路径中)
wget https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql-8.0.27.tar.gz
# 然后load,注意linux路径与windows的差异
docker load -i /root/mysql/mysql-8.0.27.tar
启动容器
写了一个docker-compose.yaml
文件来快速启动:
yaml
version: '3'
services:
mysql:
image: mysql:8.0.39
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: root #root用户密码,必须
TZ: Asia/Shanghai # 容器时区设置,建议,其必要性见文章末尾
MYSQL_DATABASE: mydatabase #可选
MYSQL_USER: myuser #可选
MYSQL_PASSWORD: mypassword #可选
ports:
- "3406:3306" # 将本地端口 3406 映射到容器的 3306 端口
volumes:
- //e/DockerDesktop/volumes/mysql8/mysql-data:/var/lib/mysql # 把容器里/var/lib/mysql绑定挂载到 Windows E盘路径
restart: always # 容器重启时自动启动
应用compose文件(默认命名docker-compose.yaml):
powershell
docker-compose up -d
当compose文件并非默认命名时,需要指定文件启动:
shell
docker-compose -f docker-mysql8-compose.yaml up -d
# -f: 或--file,参数后指定compose文件。单条命令可以用多个-f指定多个文件
此外,单个compose文件可声明多个服务,若要指定启动某个服务:
shell
docker-compose -f docker-mysql8-compose.yaml up -d mysql8
# 将仅启动docker-mysql8-compose.yaml文件中定义的名为mysql8的服务
验证容器已启动:
powershell
docker ps
连接mysql
宿主机连接容器mysql服务:
shell
# 注意端口号是对外映射的端口号
mysql -h 127.0.0.1 -P 3406 -u root -p
其他命令
宿主机连接docker容器终端:
shell
docker exec -it mysql8 bash
mysql8
是容器名称
在容器内连接 MySQL:
shell
mysql -u root -p
时区异常问题
数据表定义了current_timestamp
类型的字段,发现插入数据的时间与宿主机时间并不一致,因为未给容器设置时间
-
进入容器
shelldocker exec -it mysql8 bash
-
查看容器内时间
shelldate # Thu Feb 6 11:40:16 CST 2025这是输出
-
使用下面命令修改容器时区为中国上海
shellln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
-
重启容器,mysql会自动更新历史数据,无需手动更新数据时间!
永久解决该问题,在docker-compose.yaml
文件里应该把时区定义为环境变量:
yaml
services:
mysql:
image: mysql:8.0.39
container_name: mysql8
environment:
MYSQL_ROOT_PASSWORD: root #root用户密码,必须
TZ: Asia/Shanghai