前言
docker是一种开源的容器化平台,可以将应用程序及其依赖项打包成一个隔离的容器,然后在任何操作系统中运行。MySQL是一个流行的开源关系型数据库管理系统。本文将介绍拉取镜像、保存镜像、创建容器、启动应用容器以及测试。
1 环境准备
- 本机器macOS 13.2
- Homebrew 3.6.15 (在macOS中主要是使用brew命令来安装docker)
- 终端(我这里使用iTerm2来代替)
1.1 检查环境
打开终端,如果没有就安装一个。在终端中,使用docker info或者docker version来检查是否安装docker工具,如果已经安装,请直接拉取。
1.2 安装docker
如果没有安装镜像工具,那么我们可以使用homebrew来安装一个docker,可以执行search,然后找到docker执行安装命令 docker install docker
即可。
$ brew search docker
Warning: Unexpected method 'on_sonoma' called on Cask safari-technology-preview.
Follow the instructions here:
https://github.com/Homebrew/homebrew-cask#reporting-bugs
==> Formulae
chipmk/tap/docker-mac-net-connect docker-compose-completion docker-machine-completion docker-machine-parallels lazydocker
docker docker-credential-helper docker-machine-driver-hyperkit docker-slim powerman-dockerize
docker-buildx docker-credential-helper-ecr docker-machine-driver-vmware docker-squash wenjunxiao/brew/docker-accessor
docker-clean docker-gen docker-machine-driver-vultr docker-swarm wenjunxiao/brew/docker-connector ✔
docker-completion docker-ls docker-machine-driver-xhyve docker2aci mockery
docker-compose docker-machine docker-machine-nfs dockerize
==> Casks
docker docker-edge docker-toolbox dockey dozer
2 联网拉取镜像
2.1 拉取远程镜像
在联网状态下,当我们使用docker拉取远程镜像,并指定版本即可。例如我这里想要拉取远程的mysql-8.0.31
,然后我们使用啦去命令 docker pull mysql:8.0.31
。下面是实践:
$ docker pull mysql:8.0.31
8.0.31: Pulling from library/mysql
0ed027b72ddc: Pull complete
0296159747f1: Pull complete
3d2f9b664bd3: Pull complete
df6519f81c26: Pull complete
36bb5e56d458: Pull complete
054e8fde88d0: Pull complete
f2b494c50c7f: Pull complete
132bc0d471b8: Pull complete
135ec7033a05: Pull complete
5961f0272472: Pull complete
75b5f7a3d3a4: Pull complete
Digest: sha256:3d7ae561cf6095f6aca8eb7830e1d14734227b1fb4748092f2be2cfbccf7d614
Status: Downloaded newer image for mysql:8.0.31
docker.io/library/mysql:8.0.31
这个阶段会有一个等待时间,等所有的拉取都执行完成后,会打印一些镜像信息,例如版本签名(Digest)、拉取镜像状态以及镜像的版本(Status)。
默认情况下,docker会拉取镜像的最新版本,当我们执行 docker pull mysql
命令等同于 docker pull mysql:latest
,他们都是拉取镜像库最新的版本。
2.2 检查拉取镜像
可以使用 docker images
来再次确认是否成功拉取、下载镜像。如果不知道想要的版本,可以去docker的官方仓库查询一下https://hub.docker.com/_/mysql/tags?page=1&name=8.0.31
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
……
mysql 8.0.31 7484689f290f 14 months ago 538MB
mysql latest 3218b38490ce 2 years ago 516MB
……
3 保存镜像到本地
检查拉取的镜像没有问题后,需要将MySQL镜像导出为文件,提供给其他无网络环境安装使用。
导出文件格式
docker save -o [保存文件全路径] [镜像名称]:[镜像版本]
一般情况下,我们会将MySQL镜像保存为tar文件,名称和版本作为镜像名称,例如:
$ docker save -o /Users/Aion/mysql-8.0.31.tar mysql:8.0.31
$ cd /Users/Aion
$ ll
4 离线环境实践
4.1 装载镜像
上传或者拷贝镜像文件到服务器的某一个位置,当然这里的离线服务器也需要安装docker环境,安装完成后,使用docker load
命令来装载即可。为了方便演示,我们将本地的镜像中的mysql删除即可,删除命令为 docker image rm [镜像容器ID|镜像名称:镜像版本]
。
$ docker image rm 3218b38490ce
Untagged: mysql:latest
Untagged: mysql@sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Deleted: sha256:3218b38490cec8d31976a40b92e09d61377359eab878db49f025e5d464367f3b
Deleted: sha256:aa81ca46575069829fe1b3c654d9e8feb43b4373932159fe2cad1ac13524a2f5
Deleted: sha256:0558823b9fbe967ea6d7174999be3cc9250b3423036370dc1a6888168cbd224d
Deleted: sha256:a46013db1d31231a0e1bac7eeda5ad4786dea0b1773927b45f92ea352a6d7ff9
Deleted: sha256:af161a47bb22852e9e3caf39f1dcd590b64bb8fae54315f9c2e7dc35b025e4e3
Deleted: sha256:feff1495e6982a7e91edc59b96ea74fd80e03674d92c7ec8a502b417268822ff
Deleted: sha256:8805862fcb6ef9deb32d4218e9e6377f35fb351a8be7abafdf1da358b2b287ba
Deleted: sha256:872d2f24c4c64a6795e86958fde075a273c35c82815f0a5025cce41edfef50c7
Deleted: sha256:6fdb3143b79e1be7181d32748dd9d4a845056dfe16ee4c827410e0edef5ad3da
Deleted: sha256:b0527c827c82a8f8f37f706fcb86c420819bb7d707a8de7b664b9ca491c96838
Deleted: sha256:75147f61f29796d6528486d8b1f9fb5d122709ea35620f8ffcea0e0ad2ab0cd0
Deleted: sha256:2938c71ddf01643685879bf182b626f0a53b1356138ef73c40496182e84548aa
Deleted: sha256:ad6b69b549193f81b039a1d478bc896f6e460c77c1849a4374ab95f9a3d2cea2
$
$ docker image rm mysql:8.0.31
Untagged: mysql:8.0.31
Untagged: mysql@sha256:3d7ae561cf6095f6aca8eb7830e1d14734227b1fb4748092f2be2cfbccf7d614
Deleted: sha256:7484689f290f1defe06b65befc54cb6ad91a667cf0af59a265ffe76c46bd0478
Deleted: sha256:fb249074ba1621ae2f0021b89488f93d6d591fd42f8bbc760be96a653d18a066
Deleted: sha256:d7912527c048a7e206c51080f7f1b6b6c383ac8954e3da7d113b00d0a96c7044
Deleted: sha256:994f05094d147f16e330dd7c9afd5e1472fbf1ce1038eb707e379ae507de6167
Deleted: sha256:1337fe7eaf3ed7bac1f1842205c3c80466781cf2ed39d755043a24939a9c4408
Deleted: sha256:4524762c7e21412b3fef00e189fe6b81e78f2751fef4f30355018dc3ab5f3cf2
Deleted: sha256:5222c8df3c5115dcf6c3bb957d5160d5d7124437fa2f214368d67b8e1e6d670e
Deleted: sha256:169fcf64e0d193fda3e49267b454ddeb4083f05e70bbcbbc6de2798944c3e555
Deleted: sha256:bc87451b8005b06fa948e48c2644bc42107cf037499d15dad7f341064035dfc2
Deleted: sha256:93c1acbf3bfcdd2a82a68687481569a07d619469a596b5f017f17cc092498eef
Deleted: sha256:29bd3d7c6e1683e422776b9d3285e8a3f1272f07656fc63a941cb7729a169100
Deleted: sha256:d3cc7b6aa7bc15725c1a856ce06fe436da3fbccf0c9c06b04e45f79b3439c154
$
装载过程界面如下所示:
装载提示信息成功后,我们检查下docker中是否准确装载,从下面的信息中,我们看到mysql被装载到docker环境中。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
……
mysql 8.0.31 7484689f290f 14 months ago 538MB
……
4.2 创建mysql容器
万事俱备,只欠东风。下面的操作步骤如我们在其他linux或windows中的操作类似。我们使用docker创建一个mysql的容器,其实是一个类似存放mysql的环境。
- 格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
如果不需要挂载则直接使用命令创建容器,并返回创建的容器的ID:
$ docker run --name mysql -p 13306:13306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.31
1b794ee4a9e6b56244cbb561b7fce88ff20a1b5dae3cd0827bd2812199d99787
如果需要挂载,例如我这里需要挂载已经装载的mysql镜像
docker run --name mysql -p 13306:13306
-v /var/mysql/log:/var/log/mysql
-v /var/mysql/data:/var/lib/mysql
-v /var/mysql/conf/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.31
参数解释和说明:
- --name mysql:指定容器的名称。
- -p 13306:13306 :将容器的13306端口映射到主机的13306端口,冒号前面是宿主机的端口,冒号后面是容器内部端口。
- -v /var/mysql/conf/my.cnf:/etc/my.cnf: 将配置文件夹挂载到主机。
- -v /var/mysql/log:/var/log/mysql: 将日志文件夹挂载到主机。
- -v /var/mysql/data:/var/lib/mysql: 将数据配置文件夹挂载到主机。
- -e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码为123456。
- -d mysql:8.0.31 :后台运行容器,并返回容器id。
4.3 连接到容器
连接容器,其实就类似我们使用mysql命令连接到mysql服务端,连接容器的格式如同非容器时差不多:
docker exec -it [容器名称] mysql -uroot -p
- 容器名称:上述所讲到的--name后的参数
- 其他参数:同mysql连接一致
执行结果如下:
$ docker exec -it mysql mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 8
Server version: 8.0.31 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>
4.4 测试安装是否成功
为了验证是否成功,我们可以执行一些命令来验证是否成功。
mysql>
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.31 |
+-----------+
1 row in set (0.00 sec)
mysql>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql>
总结
通过上面的实践,是否学会了如何在离线环境中使用Docker拉取MySQL镜像,并在离线环境中使用Docker创建、连接、使用MySQL容器。Docker提供了便捷的方式来搭建和管理容器化的MySQL环境,使得开发和部署变得更加灵活和可靠。还有一方面就是起到了隔离性,避免因为硬件问题导致的一些问题,尤其是arm内核下遇到的很多问题。