Last active
May 2, 2022 01:18
-
-
Save imrexhuang/630c7d368c67e756ee8eefc926d4f108 to your computer and use it in GitHub Desktop.
使用podman指令建立Persistent Storage的MySQL容器資料庫,並藉由systemctl設為Host重開機自動啟動
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #環境: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