# view all images docker ps1. Start Nginx
docker 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_PASSWORD=abc -e MYSQL_DATABASE=123 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_PASSWORD=root123 \ -e MYSQL_DATABASE=mydb \ -e MYSQL_USER=user1 \ -e MYSQL_PASSWORD=pass123 \ --name mysql_db \ -p 3306:3306 \ -v /opt/workspa/rp:/var/lib/mysql \ mysql:8.02.1 創建一個管理員賬號
CREATE USER 'openerp_user'@'%' IDENTIFIED BY 'StrongPass@123'; 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 network
docker network create erp-network 配置docker docker run -d \ --name mysql-db \ --network erp-network \ -e MYSQL_ROOT_PASSWORD=StrongPassword \ -e MYSQL_DATABASE=erpdb \ mysql:83. go to continer
docker 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 Dockerfile
sudo mkdir -p /opt/openerp sudo chown -R $USER:$USER /opt/openerp sudo chmod -R 777 /opt/openerp6. Build dockerfile
docker 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_ACTIVE=dev \7. view all continers
docker 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 2>&1 | grep -i "OutOfMemoryError"9. 进入 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 JDK
sudo 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 Docker
docker stop 容器IDDelete Docker
11 通過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查詢證書設定的domain
openssl 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 Encrypt
GlobalSign
GoDaddy
etc.
openssl req -new -nodes \ -newkey rsa:2048 \ -keyout privkey.pem \ -out cert.csr \ -config openssl.cnfInstall certbot on Ubuntu
sudo 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.pemchmod
13 install node npm
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs node -v npm -v13. Restart Docker
13.1 Auto restart after server reboot
docker update --restart unless-stopped dockername1 docker update --restart unless-stopped dockername2 docker update --restart unless-stopped dockername313.2 Restart ALL running containers
docker 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. Application
14.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 File
14.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 executable
+x 執行權限, 777 全部權限
sudo chmod +x /usr/local/bin/docker-startup.sh14.2.3 Create systemd service
sudo nano /etc/systemd/system/docker-startup.service [Unit] Description=Docker ERP Startup Sequence After=docker.service Requires=docker.service [Service] Type=oneshot ExecStart=/usr/local/bin/docker-startup.sh RemainAfterExit=true [Install] WantedBy=multi-user.target14.2.4 Enable service
sudo 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 Memory
docker 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"