使用Mac M1,通过Docker Desktop在Db2上运行

Db2不支持macOS操作系统,但使用Docker可以在Mac上运行Db2。
我安装了Docker Desktop在M1 Mac上,并尝试运行Db2 Community Edition for Docker,现在向大家介绍一下。

章节索引

以下是中文本地化的重述版本,只提供一个选择:

1. 首先
2. 安装Docker Desktop
3. 下载并创建Db2 for Docker容器
4. 使用Db2 for Docker
5. 使用Docker Desktop

首先

Db2有一个Docker版叫做Db2 Community Edition for Docker(以下简称Db2 for Docker)。
关于Db2 for Docker的信息如下。
Db2 Community Edition for Docker
有关在macOS上安装Db2 Community Edition Docker映像的步骤可在此处找到。

总结起来,可以分为以下两个步骤。

    1. Docker Destop的安装

 

    下载Db2 for Docker镜像并创建容器。

在Docker中,需要注意的是Db2只有amd64、ppc64le (IBM Power System Little Endian Linux)和s390x (IBM Z, LinuxOne)版本可用。
由于Mac M1/M2需要使用arm64的Docker镜像,所以似乎无法运行Db2 for Docker。然而,通过在docker pull和docker run命令中加入–platform选项可以解决这个问题。
以下是在M1 Mac上使用Docker Desktop并运行Db2 for Docker的步骤概述。

此外,在本文中使用了以下环境:
– Mac Book Pro 2020
芯片:Apple M1
内存:8G
操作系统:macOS Ventura 13.5.1
– Docker 上的 Db2 Community Edition
版本:11.5.8(目前最新版本)
架构:amd64

1. Docker Desktop的安装

image.png

(1). 安装Rosetta 2
在上述URL的“系统要求”下,查看“Apple Silicon的Mac”选项卡,推荐安装Rosetta 2。请按以下步骤安装Rosetta 2。

% softwareupdate --install-rosetta
I have read and agree to the terms of the software license agreement. A list of Apple SLAs may be found here: https://www.apple.com/legal/sla/
Type A and press return to agree: a
Install of Rosetta 2 finished successfully

从Docker Desktop的Mac安装界面上选择“Mac用Appl芯片”进行下载。

スクリーンショット 2023-09-15 19.13.36.png
image.png
image.png

(4). 确认Docker的运行情况
在这里,确认已经安装的Docker可以在终端中使用。
打开终端,尝试运行”Docker version”命令确认。

% docker version
Client:
 Cloud integration: v1.0.35+desktop.4
 Version:           24.0.6
 API version:       1.43
 Go version:        go1.20.7
 Git commit:        ed223bc
 Built:             Mon Sep  4 12:28:49 2023
 OS/Arch:           darwin/arm64
 Context:           desktop-linux

Server: Docker Desktop 4.23.0 (120376)
 Engine:
  Version:          24.0.6
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.7
  Git commit:       1a79695
  Built:            Mon Sep  4 12:31:36 2023
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.6.22
  GitCommit:        8165feabfdfe38c65b599c4993d227328c231fca
 runc:
  Version:          1.1.8
  GitCommit:        v1.1.8-0-g82f18fe
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

安装了Docker Desktop之后,可以开始使用Docker了。

2. 下载 Db2 for Docker 并创建容器。

请按照上述的手册页面,在 macOS 系统上安装 Db2 Community Edition Docker 镜像来进行操作。

(1). 拉取 Docker 镜像

使用docker pull命令下载Db2 for Docker镜像。

% docker pull --platform=linux/amd64 icr.io/db2_community/db2 
Using default tag: latest
latest: Pulling from db2_community/db2
20270d11ada0: Pull complete 
c5eac4706f98: Pull complete 
6a61e43fbbe8: Pull complete 
1b76a59db2b7: Pull complete 
21e0bc77e537: Pull complete 
f0519f8d2d69: Pull complete 
2a8bfb7e103b: Pull complete 
7d9f144c10a5: Pull complete 
b9e3cafdc1f2: Pull complete 
bb7800c71111: Pull complete 
572de593c4f0: Pull complete 
b217e986c2dc: Pull complete 
Digest: sha256:9002c04b6c0f11e72531b6bb72f33119aaf25f965afb29d8951cfb4a2f5d715c
Status: Downloaded newer image for icr.io/db2_community/db2:latest
icr.io/db2_community/db2:latest

重点是,正如我之前所说的那样,需要添加–platform=linux/amd64。

如果不添加此参数,则会尝试拉取arm64版本,从而引发以下错误。

% docker pull --platform=linux/amd64 icr.io/db2_community/db2
Using default tag: latest
latest: Pulling from db2_community/db2
no matching manifest for linux/arm64/v8 in the manifest list entries

(2). 运行 Docker

使用先前使用docker pull命令获取的镜像,并通过docker run命令创建并启动容器。

(a). 准备环境变量

创建用于运行docker run的环境变量列表。即使不创建,只需在docker run命令行中传递所需的变量即可启动。但是,如果有许多环境变量,创建一个环境变量文件会更加可靠。可以使用vi编辑环境变量文件。

% vi .env_list

填写以下内容。

LICENSE=accept
DB2INSTANCE=db2i115
DB2INST1_PASSWORD=db2i115Pwd
DBNAME=
BLU=false
ENABLE_ORACLE_COMPATIBILITY=false
UPDATEAVAIL=NO
TO_CREATE_SAMPLEDB=false
REPODB=false
IS_OSXFS=true
PERSISTENT_HOME=true
HADR_ENABLED=false
ETCD_ENDPOINT=
ETCD_USERNAME=
ETCD_PASSWORD=

这里只解释必需或主要变量。

LICENSE=accept(必需):接受许可证。必须按照此规定进行编写,否则无法启动。

DB2INSTANCE=实例名称:在容器内创建的Db2实例的名称。默认值为db2inst1。

DB2INST1_PASSWORD=任意字符串(必需):成为DB2INSTANCE指定的实例名称的用户(即实例所有者)的密码。即使实例名称不是db2inst1,环境变量名仍然使用DB2INST1_PASSWORD。

DBNAME=数据库名称(可选):如果要创建数据库,指定数据库名称。如果不指定,则不会创建数据库。

TO_CREATE_SAMPLEDB=false:是否创建示例数据库。

IS_OSXFS=true:在macOS中为true。

PERSISTENT_HOME=true:是否将主目录设为持久存储。

HADR_ENABLED=false:是否采用HADR高可用性配置。如果不使用HADR,则不需要设置ETCD_xxx变量。

在这个环境变量列表中,设置了在启动时不创建数据库的配置(未指定DBNAME,TO_CREATE_SAMPLEDB=false)。当首次启动Db2 docker容器时,首先会创建Db2实例并尝试创建数据库。为了缩短初始设置时间并快速启动,此时不会创建数据库。数据库将在容器启动后进入容器后再进行创建。

(b). 音量的准备

在手册中,为了将数据库等容器数据放在一个地方,我们创建了一个文件夹,并使用 docker run -v 选项将其作为容器内的/database挂载点。然而,为了方便后续查看,最好提前创建一个卷,所以我们在这里创建了一个卷。
卷的名称可以任意指定,但由于计划中容器名称为db2server,我们将卷名称命名为v_db2server。

% docker volume create v_db2server

确认已创建的卷v_db2server的信息。

% docker volume inspect v_db2server
[
    {
        "CreatedAt": "2023-09-19T01:59:07Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/v_db2server/_data",
        "Name": "v_db2server",
        "Options": null,
        "Scope": "local"
    }
]

v_db2server被创建在/var/lib/docker/volumes目录下。

(c). 运行docker run

% docker run -itd -h db2server --name db2server --restart=always \
--privileged=true -p 50000:50000 --env-file .env_list \
-v v_db2server:/database --platform=linux/amd64 \
icr.io/db2_community/db2
dbd8738c4d29dc90a2ea5f10ea0e707c16f68c6a9d737d984c5153e5c6334d12
%

用以下命令以本地的方式重写这句话:
创建名为db2server的容器,并以后台模式(-d)和特权模式(–privileged=true)运行。
使用-p选项指定要分配的端口号。
(a). 使用环境变量的准备创建的环境变量文件.env_list,并通过–env-file选项提供。
通过-v选项指定将容器内的/database目录挂载到准备好的v_db2server卷中。
使用–platform=linux/amd64启动amd64版本的镜像。
由于是后台模式运行,docker run命令会立即结束,但在容器内,将创建Db2实例。 这需要一段时间,所以执行以下命令以等待实例创建完成。

docker logs -f db2server
(*) Previous setup has not been detected. Creating the users... 
(*) Creating users ...
(*) Creating instance ... 
DBI1446I  The db2icrt command is running.


DB2 installation is being initialized.

 Total number of tasks to be performed: 4 
Total estimated time for all tasks to be performed: 309 second(s) 

Task #1 start
Description: Setting default global profile registry variables 
Estimated time 1 second(s) 
Task #1 end 

Task #2 start
Description: Initializing instance list 
Estimated time 5 second(s) 
Task #2 end 

    :
    中略
    :

The execution completed successfully.

For more information see the DB2 installation log at "/tmp/db2icrt.log.237".
DBI1070I  Program db2icrt completed successfully.


(*) Fixing /etc/services file for DB2 ... 
09/19/2023 05:51:07     0   0   SQL1032N  No start database manager command was issued.
SQL1032N  No start database manager command was issued.  SQLSTATE=57019
(*) Cataloging existing databases
ls: cannot access '/database/data/db2i115/NODE0000': No such file or directory
(*) Applying Db2 license ...

LIC1402I  License added successfully.

    :
      中略
    :

DB2 State : Operable
DB2 has not been started
Starting DB2...

09/19/2023 05:52:18     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519 
(*) All databases are now active. 
(*) Setup has completed.

如果出现以下消息,则结束。

2023年9月19日05:52:18 0 0 SQL1063N DB2START处理成功。
SQL1063N DB2START处理成功。
ssh-keygen:生成新的主机密钥:RSA DSA ECDSA ED25519。
()所有数据库现在已激活。
()设置已完成。

3. 使用 Docker 上的 Db2

(1). 进入Db2容器

使用以下命令,进入Db2容器并切换到实例所有者。
在这里,容器名称为db2server,实例所有者名称为db2i115。

% docker exec -it db2server /bin/bash
[root@db2server /]# su - db2i115
Last login: Tue Sep 19 07:19:18 UTC 2023
[db2i115@db2server ~]$ 

在初始设置中,没有创建数据库,所以Db2实例已经被创建/启动,但数据库不存在。请确认当前情况。

[db2i115@db2server ~]$ db2start
09/19/2023 07:23:33     0   0   SQL1026N  The database manager is already active.
SQL1026N  The database manager is already active.
[db2i115@db2server ~]$ db2 list db directory
SQL1031N  The database directory cannot be found on the indicated file system. 
SQLSTATE=58031
[db2i115@db2server ~]$ 

db2start命令用于启动实例。如果实例已经处于活动状态,将返回”already active”(已经活动)的消息。
此外,db2 list db directory命令用于显示现有数据库的列表,但目前没有数据库。

(2). 数据库的创建和操作

没有数据库,需要创建一个。

[db2i115@db2server ~]$ db2 create db testdb
DB20000I  The CREATE DATABASE command completed successfully.

连接到数据库。

[db2i115@db2server ~]$ db2 connect to testdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.8.0
 SQL authorization ID   = DB2I115
 Local database alias   = TESTDB

[db2i115@db2server ~]$ 

创建一个表格,随意填入数据,然后尝试进行选择查询。

[db2i115@db2server ~]$ db2 "create table testtbl (id int not null, txt varchar(256))"
DB20000I  The SQL command completed successfully.
[db2i115@db2server ~]$ db2 "insert into testtbl values(1, 'コンテナ動いてます。')"
DB20000I  The SQL command completed successfully.
[db2i115@db2server ~]$ db2 "select * from testtbl"

ID          TXT             
----------- ----------------------------------------------------------
          1 コンテナ動いてます。                                                                            
  1 record(s) selected.

[db2i115@db2server ~]$ 

如果对Db2的操作不熟悉,请参考以下的Quiita文章。
初次使用Db2 – 执行命令,基本操作。

(3) 重新启动容器并验证数据。

确认之前输入的数据是否持久存在。
首先退出容器。

[db2i115@db2server ~]$ exit
logout
[root@db2server /]# exit
exit
% 

停止容器。

% docker stop db2server
db2server

启动容器。

% docker start db2server
db2server

进入集装箱。

% docker exec -it db2server /bin/bash -c "su - db2i115"
Last login: Tue Sep 19 07:44:08 UTC 2023 on pts/0

(c). 在执行docker run命令创建容器时,当容器启动时,Db2实例已经处于运行状态。而通过docker start启动容器时,默认情况下实例不会被启动,只有容器启动后才会启动实例。因此,首先需要启动实例。

[db2i115@db2server ~]$ db2start
09/19/2023 07:44:52     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.

在数据库的创建和操作中选择创建的表,并查看数据。

[db2i115@db2server ~]$ db2 connect to testdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.8.0
 SQL authorization ID   = DB2I115
 Local database alias   = TESTDB

[db2i115@db2server ~]$ db2 "select * from testtbl"

ID          TXT                                       
----------- ----------------------------------------------------------
          1 コンテナ動いてます。                                                                        

  1 record(s) selected.

无论停止/重启容器,数据都会持久保存。

4. 使用Docker Desktop

可以使用命令行操作Docker,但既然已经安装了Docker Desktop,就可以总结一下如何使用GUI进行操作。
在Mac的应用程序或者Dock中启动Docker Desktop。将会显示Docker仪表板的界面,从这里可以查看和执行容器、镜像、卷的状态,并进行简单操作。

(1). 确认形象

スクリーンショット 2023-09-19 17.01.46.png

检查和操作容器

image.png

(3)音量的检查和操作

image.png

迄今为止,在Mac上使用Docker Desktop启动Db2 for Docker的方法已经介绍完毕。

以上

以上

广告
将在 10 秒后关闭
bannerAds