Mac电脑m1版本基于docker部署软件时的变化
2022 年 3 月底,个人第三台笔电来到了 Mac-2021-m1 款 14 英寸版本,使用折腾过程中,遇到不少新的架构兼容方面的问题,这里单独记录在本地通过 docker 部署应用时遇到的一些问题。
# 1,部署 MySQL(此方案废弃)
原本通过docker-compose
部署MySQL
步骤如下。
首先创建配置文件:
$ cat my.cnf
[client]
port = 3306
socket = /var/lib/mysql/data/mysql.sock
[mysqld]
# 针对5.7版本执行group by字句出错问题解决
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
# 一般配置选项
basedir = /var/lib/mysql
datadir = /var/lib/mysql/data
port = 3306
socket = /var/lib/mysql/data/mysql.sock
lc-messages-dir = /usr/share/mysql # 务必配置此项,否则执行sql出错时,只能显示错误代码而不显示具体错误消息
character-set-server=utf8mb4
back_log = 300
max_connections = 3000
max_connect_errors = 50
table_open_cache = 4096
max_allowed_packet = 32M
#binlog_cache_size = 4M
max_heap_table_size = 128M
read_rnd_buffer_size = 16M
sort_buffer_size = 16M
join_buffer_size = 16M
thread_cache_size = 16
query_cache_size = 64M
query_cache_limit = 4M
ft_min_word_len = 8
thread_stack = 512K
#tx_isolation = READ-COMMITTED
tmp_table_size = 64M
#log-bin=mysql-bin
long_query_time = 6
server_id=1
innodb_buffer_pool_size = 1024M
innodb_thread_concurrency = 16
innodb_log_buffer_size = 16M
wait_timeout= 31536000
interactive_timeout= 31536000
lower_case_table_names = 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
然后添加 docker-compose 的主配置文件:
$ cat docker-compose.yaml
version: '3'
services:
mysql:
hostname: mysql
image: mysql:5.7.26
# network_mode: "host" # 如果需要容器使用宿主机IP(内网IP),则可以配置此项
container_name: mysql # 指定容器名称,如果不设置此参数,则由系统自动生成
restart: unless-stopped # 设置容器自启模式
command: mysqld
ports:
- '3306:3306'
environment:
- TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
- MYSQL_ROOT_PASSWORD=123465 # 设置root密码
volumes:
# 数据挂载目录自行修改哦!
- /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
- ./data:/var/lib/mysql/data # 映射数据库保存目录到宿主机,防止数据丢失
- ./my.cnf:/etc/mysql/my.cnf # 映射数据库配置文件
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
然后执行部署,会发现报了如下错误:
Pulling mysql (mysql:5.7.26)...
5.7.26: Pulling from library/mysql
ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries
2
3
那么此时可以将镜像换成mysql/mysql-server:5.7
,再次运行,就没问题了。
注意:
默认拉起之后,如果想在本地通过工具连接 MySQL,则会遇到如下报错:
Host '172.22.0.1' is not allowed to connect to this MySQL server
这是因为 MySQL 默认的用户不允许远程连接访问,可以进行如下配置:
# 进入容器
$ docker exec -it mysql bash
# 登陆MySQL
$ mysql -p123465
# 查看用户
mysql> SELECT host, user FROM mysql.user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| localhost | healthchecker |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+---------------+
4 rows in set (0.02 sec)
# 调整权限允许远程
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123465' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.04 sec)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
然后再用工具连接就不会报错了。
还有一种方式,可以通过添加环境变量以及指定直接拉起允许远程连接的容器,对应的 yaml 信息如下:
version: "3"
networks:
go-ldap-admin:
driver: bridge
services:
mysql:
image: mysql/mysql-server:5.7
container_name: go-ldap-admin-mysql # 指定容器名称,如果不设置此参数,则由系统自动生成
hostname: go-ldap-admin-mysql
restart: always # 设置容器自启模式
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai # 设置容器时区与宿主机保持一致
MYSQL_ROOT_PASSWORD: 123456 # 设置root密码
MYSQL_ROOT_HOST: "%" # 设置允许远程访问
MYSQL_DATABASE: go_ldap_admin
volumes:
# 数据挂载目录自行修改哦!
- /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
- ./mysql/data:/var/lib/mysql/data # 映射数据库保存目录到宿主机,防止数据丢失
- ./mysql/config/my.cnf:/etc/mysql/my.cnf # 映射数据库配置文件
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问,与上边MYSQL_ROOT_HOST 变量配合使用才能生效。
networks:
- go-ldap-admin
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 1,新的拉起 MySQL 方案
原本上边的文档是之前我一直使用的,然而最近上边的方案却无法正常使用了,拉起 MySQL 总是失败。
后来跑到 dockerhub 看了一下,发现 mysql/mysql-server:5.7
镜像竟然没有了 arm 版本的了,而我分明记得,之前是有的,也许是我记错了,总之使用如上方式已无法正常拉起,现在调整拉起方式如下:
$ cat docker-compose.yaml
version: '3'
services:
mysql:
image: registry.cn-hangzhou.aliyuncs.com/eryajf/mysql:5.7
container_name: mysql
restart: always # 设置容器自启模式
ports:
- '3306:3306'
environment:
TZ: Asia/Shanghai # 设置容器时区与宿主机保持一致
MYSQL_ROOT_PASSWORD: 123456 # 设置root密码
volumes:
- ./data:/var/lib/mysql
2
3
4
5
6
7
8
9
10
11
12
13
14
这个镜像源自于 daocloud.io/library/mysql:5.7
,我担心后期镜像有变,因此自己单独 push 了一下,此镜像为公开镜像,大家可以直接使用。
# 2,部署 OpenLdap
原来部署 ldap 都是在 CentOS 中部署的,现在在 Mac-arm 架构系统中,需要注意使用更新的镜像,之前因为使用的 1.2.0,而开源镜像是从 1.3.0 开始支持 arm 架构的,参考issue (opens new window)。
新的启动脚本如下:
$ cat start-eryajf.sh
#!/bin/bash -e
SERVICE=ldap-service-eryajf
HOST_NAME=ldap-server-eryajf
LDAP_DOMAIN=eryajf.net
LDAP_DC=eryajf
LDAP_DC_ORG=net
NETWORK_ADAPTER=eth0
PASSWORD=123465
OPENLDAP="1.5.0"
PHPLDAPADMIN="0.9.0"
HTTPS_PORT=8089
OPENLDAP_PORT=390
docker run \
-p ${OPENLDAP_PORT}:389 \
--name ${SERVICE} \
--hostname ${HOST_NAME} \
--env LDAP_ORGANISATION="Eyajf-Group" \
--env LDAP_DOMAIN=${LDAP_DOMAIN} \
--env LDAP_ADMIN_PASSWORD=${PASSWORD} \
--detach osixia/openldap:${OPENLDAP}
docker run \
-p ${HTTPS_PORT}:80 \
--name ${SERVICE}-admin \
--hostname ${HOST_NAME}-admin \
--link ${SERVICE}:${HOST_NAME} \
--env PHPLDAPADMIN_LDAP_HOSTS=${HOST_NAME} \
--env PHPLDAPADMIN_HTTPS=false \
--detach \
osixia/phpldapadmin:${PHPLDAPADMIN}
sleep 1
echo "-----------------------------------"
PHPLDAP_IP=$(docker inspect -f "{{ .NetworkSettings.IPAddress }}" ${SERVICE})
docker exec ${SERVICE} ldapsearch -x -H ldap://${PHPLDAP_IP}:389 -b "dc=${LDAP_DC},dc=${LDAP_DC_ORG}" -D "cn=admin,dc=${LDAP_DC},dc=${LDAP_DC_ORG}" -w ${PASSWORD}
echo "-----------------------------------"
PUB_IP="localhost"
echo "Go to: https://${PUB_IP}:${HTTPS_PORT}"
echo "Login DN: cn=admin,dc=${LDAP_DC},dc=${LDAP_DC_ORG}"
echo "Password: ${PASSWORD}"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
然后直接运行即可。
# 3,部署 Jenkins
Jenkins 官方提供的镜像,后来的新版本中,几乎都支持 arm 架构的,因此直接运行即可。
$ cat start.sh
docker run -itd -u root -p 9090:8080 -p 9091:50000 --name jenkins \
--privileged=true --restart always \
-e TZ=Asia/Shanghai \
-v $(which docker):/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /Users/eryajf/software/docker/jenkins/software:/var/software \
-v /Users/eryajf/software/docker/jenkins/home:/var/jenkins_home \
jenkins/jenkins:2.343
2
3
4
5
6
7
8
9
根据情况调整你挂在的目录即可,此部署仅作为本地学习研究之用,不作为生产部署参考。
启动完毕之后,直接访问localhost:9090
即可,通过docker logs -f jenkins
可以看到 Jenkins 运行之后的密码。
# 4,部署 nexus
目前使用官方提供的镜像,在 Mac-m1 上使用没有遇到什么问题,当然也有一些开发者提供了 arm 版本的镜像,如果你遇到问题,获取可以试试他的镜像:nexus3-docker (opens new window)
version: "3"
services:
nexus:
image: "sonatype/nexus3"
container_name: nexus
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- "8931:8081"
volumes:
- "/Users/eryajf/software/docker-compose/nexus/data:/nexus-data"
2
3
4
5
6
7
8
9
10
11
12
服务启动之后,会在数据目录中生成一个 admin.password 的文件,里边存放着初始密码。