# view all images docker ps1. Start Nginxdocker run nginx // run in backend docker run -d -p nginx // bridge port to run docker run -d -p 8080:80 nginx1.1 How to check docker inside nginx進入docker內部 docker exec -it myerp_worker sh 或者 docker exec -it myerp_worker bash Check included configs (virtual hosts) cat /etc/nginx/conf.d/default.conf 或者 ls /etc/nginx/conf.d/1.2 支持大文件上傳如果nginx 在 docker的外部COPY nginx.conf /etc/nginx/conf.d/default.conf 在http目錄下 或者 server目錄下 client_max_body_size 100M;2. MySQL// install mysql docker pull mysql docker pull mysql:8.0 // create root database docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORDabc -e MYSQL_DATABASE123 mysql:latest //access mysql docker exec -u root -it container_name_or_id /bin/bash docker exec -it mysql_db mysql -u root -pdocker stop mysql_db docker rm mysql_db docker pull mysql:8.0 docker run -d \ -e MYSQL_ROOT_PASSWORDroot123 \ -e MYSQL_DATABASEmydb \ -e MYSQL_USERuser1 \ -e MYSQL_PASSWORDpass123 \ --name mysql_db \ -p 3306:3306 \ -v /opt/workspa/rp:/var/lib/mysql \ mysql:8.02.1 創建一個管理員賬號CREATE USER openerp_user% IDENTIFIED BY StrongPass123; GRANT ALL PRIVILEGES ON openerp_vb.* TO openerp_user%; FLUSH PRIVILEGES; 查看 SHOW GRANTS FOR openerp_user%;2.2 重启mysql# Restart container docker restart mysql_openerp # Check container logs docker logs -f mysql_openerp2.3 Docker 分配管理員權限給用戶docker exec -u root -it mysql_openerp /bin/bash 鏈接MySQL bash-5.1# mysql -u root -p 授權 GRANT ALL PRIVILEGES ON flole.* TO myaccounttest%;2.4 創建docker networkdocker network create erp-network 配置docker docker run -d \ --name mysql-db \ --network erp-network \ -e MYSQL_ROOT_PASSWORDStrongPassword \ -e MYSQL_DATABASEerpdb \ mysql:83. go to continerdocker exec -it 72(container ID) bash4. git clone from github// update to new cd /opt/openerp git fetch origin git reset --hard origin/dev This will replace all local changes with the dev branch from GitHub. Safe if you don’t need local modifications.sudo mkdir -p /opt/openerp sudo chown -R $USER:$USER /opt/openerp sudo chmod -R 777 /opt/openerp cd /opt/openerp touch Dockerfile // edit file cd /opt/openerp touch Dockerfile nano Dockerfile Press Ctrl O → Enter → Ctrl X5. Create Dockerfilesudo mkdir -p /opt/openerp sudo chown -R $USER:$USER /opt/openerp sudo chmod -R 777 /opt/openerp6. Build dockerfiledocker build -t app /opt/app docker build -t openerp . docker run -d --name openerp -p 8080:8080 openerp docker run -d \ -p 8888:8888 \ -v /opt/openerp/static:/opt/openerp/static \ --name openerp-dev openerp #optional -v /opt/workspace/openerp/application-dev.yml:/opt/app/application.yml \ -e SPRING_PROFILES_ACTIVEdev \7. view all continersdocker ps -a docker logs -f openerp8. log# Viewing Docker Logs (All Containers) docker logs $(docker ps -q) docker logs --details openerp # 最新100 docker logs container --tail 100 # 第一行 docker logs container | head -n 1按照时间查日志 docker logs ope --since 30m # last 30 minutes docker logs ope --since 2h # last 2 hours docker logs ope --since 1d # last 1 day docker logs ope --since 2026-06-24T10:00:00 --until 2026-06-24T12:00:00按照内容查日志 docker logs ope 21 | grep -i OutOfMemoryError9. 进入 App Container 测试docker exec -it openerp bash curl http://localhost:8080在Container内部查看资源是否存在docker exec -it openerp bash ls /opt/openerp/static0 normal exit 1 application error 127 file not found (wrong CMD) 137 killed (OOM) 143 graceful shutdown10. Install JDKsudo apt update sudo apt install openjdk-21-jdk -y temurin-XX-jdk absolute newest version which java eadlink -f $(which java) export JAVA_HOME/usr/lib/jvm/java-21-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATHStop Dockerdocker stop 容器IDDelete Docker11 通過openssl製作證書mkdir -p /opt/workspace/worker_myerp/ssl openssl req -x509 -newkey rsa:4096 -nodes \ -keyout /opt/workspace/worker_myerp/ssl/privkey.pem \ -out /opt/workspace/worker_myerp/ssl/fullchain.pem \ -days 365查詢證書設定的domainopenssl x509 -in /opt/workspace/worker_myerp/ssl/fullchain.pem -noout -text | grep DNS:通過腳本openssl.cnf製作證書openssl req -x509 -nodes -days 365 \ -newkey rsa:2048 \ -keyout ./ssl/privkey.pem \ -out ./ssl/fullchain.pem \ -config openssl.cnf \ -extensions req_ext生成CSR 發送給第三方They check your domain and then they issue a real certificate.Let’s EncryptGlobalSignGoDaddyetc.openssl req -new -nodes \ -newkey rsa:2048 \ -keyout privkey.pem \ -out cert.csr \ -config openssl.cnfInstall certbot on Ubuntusudo apt install certbot python3-certon-nginx -y讓nginx 有權限讀sudo chown root:root /opt/workspace/ssl/*.pem sudo chmod 600 /opt/workspace/ssl/*.pem檢查公鑰和私有是否是一對Both commands must output thesame hash.If they differ → certificate and key donot match.# Check certificate modulus openssl x509 -noout -modulus -in /etc/letsencrypt/live/wcom/fullchain.pem | openssl md5 # Check private key modulus openssl rsa -noout -modulus -in /etc/letsencrypt/live/wcom/privkey.pem | openssl md512 製作腳本chmod x /opt/workspace/worker_myerp/script_build_myerp# 授予可讀權限 sudo chmod 644 /opt/myerp/ssl/privkey.pem sudo chmod 644 /opt/myerp/ssl/fullchain.pemchmod13 install node npmcurl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs node -v npm -v13. Restart Docker13.1 Auto restart after server rebootdocker update --restart unless-stopped dockername1 docker update --restart unless-stopped dockername2 docker update --restart unless-stopped dockername313.2 Restart ALL running containersdocker restart $(docker ps -q) 或者 docker restart docker3 docker2 docker113.3 restart first order先啟動database_name后再啟動其它docker restart database_name sleep 10 docker restart dockername2 docker restart dockername314. Application14.1 restart Ubuntu# check docker的狀態 sudo systemctl status docker # 檢查目前已啟動的docker docker ps # 找到沒有啟動的docker docker ps -a # 重啟 docker docker restart myApp # 80 端口被佔用 sudo netstat -tulpn|grep :80 或者 sudo lsof -i :80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 8404/docker-proxy tcp6 0 0 :::80 :::* LISTEN 8411/docker-proxy #如果Ubuntu的Ngnix 佔用80端口停掉Nginx sudo systemctl stop nginx14.2 Docker Automation File14.2.1 restart File#!/bin/bash echo Starting MySQL... docker start mysql echo Waiting for MySQL to be ready... sleep 20 echo Starting backendApp... docker start backendApp echo Checking port 80... PID$(sudo lsof -t -i:80) if [ ! -z $PID ]; then echo Port 80 occupied by PID $PID. Stopping... sudo kill -9 $PID fi echo Restarting frontendApp... docker restart frontendApp echo All done.14.2.2 Make it executablex 執行權限 777 全部權限sudo chmod x /usr/local/bin/docker-startup.sh14.2.3 Create systemd servicesudo nano /etc/systemd/system/docker-startup.service [Unit] DescriptionDocker ERP Startup Sequence Afterdocker.service Requiresdocker.service [Service] Typeoneshot ExecStart/usr/local/bin/docker-startup.sh RemainAfterExittrue [Install] WantedBymulti-user.target14.2.4 Enable servicesudo systemctl daemon-reload sudo systemctl enable docker-startup.service14.2.5 Test執行服務 sudo systemctl start docker-startup.service 或者 重新系統 sudo reboot14.2.6 Check# Check Status systemctl status docker-startup.service # Stop docker-startup sudo systemctl stop docker-startup.service # 註銷docker-startup sudo systemctl disable docker-startup.service15. Memory查看Server 本身的物理内存free -h15.1 Check Memorydocker inspect ope | grep -i Memory 或者 每个docker的资源使用情况 docker stats15.2 Check 环境变量有环境变量并不代表Java会有效docker exec ope env | grep JAVA15.3 Check docker的启动app的命令docker image inspect worker-openerp | grep -A 10 Entrypoint相当于 java -jar app.jar 没有参数 -e JAVA_OPTS-Xms512m -Xmx2g