Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save imrexhuang/630c7d368c67e756ee8eefc926d4f108 to your computer and use it in GitHub Desktop.

Select an option

Save imrexhuang/630c7d368c67e756ee8eefc926d4f108 to your computer and use it in GitHub Desktop.
使用podman指令建立Persistent Storage的MySQL容器資料庫,並藉由systemctl設為Host重開機自動啟動
#環境:RHEL 8.3
#目的:透過podman建立一個Persistent Storage的MySQL 8.0資料庫,並藉由systemctl設為Host重開機自動啟動
#備註1:podman run指令不支援--restart=always(因為podman有別於Docker架構,不使用Daemon機制(daemonless Container),無法透過Daemon機制去自動重啟)
#參考資料 https://igene.tw/podman-intro
#備註2:如果rm刪除容器重新建立,需要重新產生 podman generate systemd --name mysql-80-persist > mysql80-container.service
#建立Permanent Storage Location
sudo mkdir -p /var/podmandata/db/mysql80
#加入合適的SELinux context
sudo semanage fcontext -a -t container_file_t '/var/podmandata/db/mysql80(/.*)?'
#生效SELinux container policy
sudo restorecon -Rv /var/podmandata/db/mysql80
#確認SELinux context type是container_file_t
ls -ldZ /var/podmandata/db/mysql80
sudo chown -Rv 27:27 /var/podmandata/db/mysql80
#備註:可以建立容器後,進入容器用cat /etc/password確認uid
#登入
sudo podman login registry.redhat.io
sudo podman pull registry.redhat.io/rhel8/mysql-80
#確認images已經下載到本地端
sudo podman images
#建立容器
#podman run指令不支援--restart=always(因為podman有別於Docker架構,不使用Daemon機制(daemonless Container),無法透過Daemon機制去自動重啟)
# https://igene.tw/podman-intro
sudo podman run --name mysql-80-persist \
-d \
-t \
-p 3306:3306 \
-v /var/podmandata/db/mysql80:/var/lib/mysql \
-e MYSQL_USER=mysqluser1 -e MYSQL_PASSWORD=自訂密碼 \
-e MYSQL_DATABASE=testdb -e MYSQL_ROOT_PASSWORD=自訂密碼 \
registry.redhat.io/rhel8/mysql-80
#確認有看到剛剛起的容器
sudo podman ps --format="{{.ID}} {{.Names}} {{.Status}}"
#如果啟動失敗查看log
#sudo podman logs -f mysql-80-persist
#開通host主機防火牆讓外界連線
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
#進入容器內
sudo podman exec -it mysql-80-persist /bin/bash
# 開放非本機連線
vi /etc/my.cnf
vi後,檔案最後請加入以下內容
bind-address = 0.0.0.0
#!wq存檔
mysql -uroot
#備註:容器內執行指令
### 以下是進入容器MySQL內,執行MySQL指令 ###
# MySQL 8.0預設密碼加密方式由原本mysql_native_password 改成 caching_sha2_password
# 怕Client端連線有問題,先設定為IDENTIFIED WITH mysql_native_password
ALTER USER 'mysqluser1'@'%' IDENTIFIED WITH mysql_native_password BY '自訂密碼';
GRANT ALL ON *.* TO 'mysqluser1'@'%';
CREATE USER 'mysqluser2'@'%' IDENTIFIED WITH mysql_native_password BY '自訂密碼';
GRANT ALL ON *.* TO 'mysqluser2'@'%';
FLUSH PRIVILEGES;
# 確認有剛剛建立的testdb資料庫
show databases;
use testdb;
CREATE TABLE Testtable (id int(3) NOT NULL,
name varchar(50) DEFAULT NULL,
address varchar(255) DEFAULT NULL,
PRIMARY KEY (id));
確認有剛剛建立的Testtable資料表
show tables;
insert into Testtable (id, name, address) values (1,'Rex','country road');
select * from Testtable;
離開MySQL介面
exit
### 以上是MySQL指令 ###
離開容器,回到host主機
exit
#備註:容器內執行指令
確認testdb的資料是存在host主機,表示Persistent Storage有設定成功
sudo ls -ld /var/podmandata/db/mysql80/data/testdb
### 設定開機啟動容器
cd /etc/systemd/system/
#使用最高權限
su
# 如果rm刪除容器重新建立,需要重新產生
podman generate systemd --name mysql-80-persist > mysql80-container.service
systemctl daemon-reload
# 透過disable移除舊的設定
systemctl disable mysql80-container.service
systemctl enable mysql80-container.service
systemctl start mysql80-container.service
#查看service的狀態,確認狀態是Active: active (running)
systemctl status mysql80-container.service
#離開最高權限身分
exit
# 檢查服務是否有設定開機自動啟動
systemctl is-enabled mysql80-container.service
#不需要執行
#sudo chmod 755 /etc/systemd/system/mysql80-container.service
#不需要執行
#sudo setsebool -P container_manage_cgroup on
#確認設定是on
#sestatus -b | grep container_manage_cgroup
# Client端連線字串還需要加入SslMode=none
# 否則會有錯誤:SSL Authentication Error - A call to SSPI failed, see inner exception.(呼叫 SSPI 失敗,請查看內部例外狀況)
# https://github.com/mysql-net/MySqlConnector/issues/428
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment