Docker linux 離線部署springboot
搭建dcoker環境
1. 首先在有網絡的機器上下載Docker的離線安裝包:
???- 訪問 https://download.docker.com/linux/static/stable/x86_64/
???- 下載對應版本的 docker-<version>.tgz 文件
2. 將下載的安裝包傳輸到目標Linux機器上(可以使用U盤或其他存儲設備)
3. 在目標機器上執行以下命令:
???```bash
???# 解壓安裝包
???tar xzvf docker-<version>.tgz
???
???# 將docker二進制文件復制到系統目錄
???sudo cp docker/* /usr/bin/
???
???# 創建docker服務
???sudo groupadd docker
???sudo useradd -g docker docker
???
???# 創建docker配置文件
???sudo mkdir -p /etc/docker
???sudo touch /etc/docker/daemon.json (沒外網 刪除?不然可能會啟動不了)
???
???# 創建systemd服務文件
???sudo mkdir -p /etc/systemd/system
???sudo touch /etc/systemd/system/docker.service
4. 編輯docker.service文件,添加以下內容:
???
???[Unit]
???Description=Docker Application Container Engine
???Documentation=https://docs.docker.com
???After=network-online.target docker.socket firewalld.service
???Wants=network-online.target
???Requires=docker.socket
???[Service]
???Type=notify
???ExecStart=/usr/bin/dockerd
???ExecReload=/bin/kill -s HUP $MAINPID
???TimeoutSec=0
???RestartSec=2
???Restart=always
???StartLimitBurst=3
???StartLimitInterval=60s
???LimitNOFILE=infinity
???LimitNPROC=infinity
???LimitCORE=infinity
???TasksMax=infinity
???[Install]
???WantedBy=multi-user.target
5. 啟動Docker服務:
???```bash
???# 重新加載systemd配置
???sudo systemctl daemon-reload
???
???# 確保docker.socket服務存在
???sudo touch /etc/systemd/system/docker.socket
???
???# 編輯docker.socket文件,添加以下內容:
???
???[Unit]
???Description=Docker Socket for the API
???PartOf=docker.service
???[Socket]
???ListenStream=/var/run/docker.sock
???SocketMode=0660
???SocketUser=root
???SocketGroup=docker
???[Install]
???WantedBy=sockets.target
??????# 啟用并啟動服務
???sudo systemctl enable docker.socket
???sudo systemctl enable docker.service
???sudo systemctl start docker.socket
???sudo systemctl start docker.service
(這里報錯執行6啟動成功執行7)或者直接刪掉daemon.json 文件重新start
???```
6.修改daemon.json?
# 創建目錄
mkdir -p /etc/docker
# 復制內容 (不通外網沒啥用)
tee /etc/docker/daemon.json <<-'EOF'
{
????"registry-mirrors": [
????????"http://hub-mirror.c.163.com",
????????"https://mirrors.tuna.tsinghua.edu.cn",
????????"http://mirrors.sohu.com",
????????"https://ustc-edu-cn.mirror.aliyuncs.com",
????????"https://ccr.ccs.tencentyun.com",
????????"https://docker.m.daocloud.io",
????????"https://docker.awsl9527.cn"
????]
}
EOF
# 重新加載配置
systemctl daemon-reload
# 重啟Docker
systemctl restart docker
7. 驗證安裝:
???```bash
???docker --version
???docker info
???```
???- 使用 `systemctl status docker.service` 查看詳細錯誤信息
安裝mysql
1.在有網絡的服務器上拉取鏡像包
docker pull mysql:8.0.31
2.打包為tar上傳到目標服務器
docker save -o /home/mysql-8.0.27.tar mysql:8.0.27
3.傳輸裝載
docker load -i /home/mysql/mysql-8.0.27.tar
- 掛載啟動
docker network create my-network (創建個docker網絡)
創建掛載目錄
Mkdir /home/mysql/log
Mkdir /home/mysql/data
Mkdir /home/mysql/conf
docker run --name mysql -p 3306:3306 \??#宿主機端口和容器端口
--network my-network \
-v /home/mysql/log:/var/log/mysql \?#宿主機路徑:容器路徑
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.27?
#設置root賬號密碼和版本號 成功會返回一串編碼
56ecdc8667fa807506988884deaaa6abd824a9d0995da77bbfc4782bfcac54e9
- 連接驗證
Docker ps / docker images
登錄
docker exec -it mysql ?mysql -uroot -p123456
安裝jdk
1.jdk在線下載打包離線包
docker pull openjdk:8-jdk
docker save -o openjdk8.tar openjdk:8-jdk
2.上傳目標服務器并加載
docker load -i openjdk8.tar
- 驗證
Docker images;
編寫Dockerfile文件
1.文件路徑/home/sunplus/
2.創建文件touch Dockerfile
3.編輯文件內容
FROM openjdk:8-jdk
#時區?
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
????????echo $TZ > /etc/timezone
#容器目錄
WORKDIR /app
復制java jar包從宿主機路徑位置(/home/sunplus/sunplus-cloudclinic.jar)
到容器位置(xxxxx/app/sunplus-cloudclinic.jar)
COPY ?./sunplus-cloudclinic.jar ?./sunplus-cloudclinic.jar
RUN mkdir -p /app/logs && \?#創建容器日志目錄并授權
????????chmod -R 777 /app/logs
#變量 下面啟動用?
ENV JAVA_OPTS="-Xms512m -Xmx512m -XX:-HeapDumpOnOutOfMemoryError" \
????SPRING_PROFILES_ACTIVE=local
#指定服務端口?
EXPOSE 8089
# 指定docker容器啟動時運行jar包?(java -jar xx.jar)?./sunplus-cloudclinic.jar容器jar位置
CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar ./sunplus-cloudclinic.jar
- 構建鏡像
docker build -t sunplus:1.0 .?#最后的. 表示當前所在目錄執行不可缺少
.
:這個點表示構建上下文(context)的路徑
-
這里指的是當前目錄
-
Docker 會查找當前目錄下的 Dockerfile 文件來構建鏡像
查看是否成功
Docker images;
- 啟動java jar包
docker run -d \
?-v /home/sunplus:/app \??#掛載宿主機位置 實際啟動的是/home/sunplus/下的jar包
?-v /home/sunplus/logs:/app/logs \??#掛載宿主機日志位置
?--name sunplus \
?--network my-network \?#設置與mysql同一網絡
?-p 8089:8089 \?#端口
?sunplus:1.0?#容器名稱版本號
說明:
--network my-network \?#設置與docker容器里的mysql同一網絡
application-pr.yml 數據庫連接用myql docker容器名稱代替ip
url: jdbc:mysql://mysql:3306/database?
logback配置路徑配置為容器路徑
<property name="log.path" value="/app/logs" />
- 查看啟動日志
docker logs -f <容器名稱># 實時跟蹤日志(類似 tail -f)
并查看宿主機目錄文件是否掛載成功?/home/sunplus/logs
安裝nginx
- 創建文件目錄
Mkdir -p /home/nginx/html/
Mkdir -p /home/nginx/conf/
2.創建編輯配置文件
Touch nginx.conf
Vim nginx.conf;
以下為配置內容根據需求修改:
worker_processes ?1;
events {
????worker_connections ?1024;
}
http {
????include ??????mime.types;
????default_type ?application/octet-stream;
????sendfile ???????on;
????keepalive_timeout ?65;
????server {
types {
text/html ????????????????????????????html htm shtml;
text/css ?????????????????????????????css;
text/xml ?????????????????????????????xml;
image/gif ????????????????????????????gif;
image/jpeg ???????????????????????????jpeg jpg;
application/javascript ???????????????js;
image/png ????????????????????????????png;
}
????????listen ??????80;
????????server_name ?localhost;
???????
????????error_page ??500 502 503 504 ?/50x.html;
????????location = /50x.html {
????????????root ??html;
????????}
location ~* \.(html|htm|gif|jpg|svg|jpeg|bmp|png|ico|txt|js|css|ttf)$ ?{
????????????root ??/home/nginx/html/cloudclinich5;
????????????index ?index.html;
????????????try_files $uri $uri/ /index.html;
}
location / {
proxy_pass http://sunplus:8089;
}
????????
????}
}
3.加載上傳的nginx離線包
docker load -i xx.tar
4.創建容器掛載啟動
docker run -d \
??--name nginx \
??--network my-network \
??-p 80:80 \
??-v /home/nginx/html/cloudclinich5:/usr/share/nginx/html \?
??-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
??cmhs-nginx:1.0
安裝redis
- 在有網絡的服務器上拉取docker離線壓縮包
- 上傳到目標服務器并加載
docker load -i xx.tar
- 啟動容器
docker run -d \
??--name redis \
??--network my-network \
??-p 6379:6379 \
??-e REDIS_PASSWORD=123456\
??cmhs-redis:1.0 \
??redis-server --requirepass 123456
一些用到的命令
首先停止并刪除現有容器(保留數據卷)
docker stop sunplus
docker rm sunplus
刪除鏡像 docker rmi <IMAGE_ID>
docker build -t sunplus:1.0 .
docker images
Docker ps
Docker logs -f 容器名
chmod 755 xx 授權
docker restart sunplus ?重啟容器
查看容器ip
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名
驗證容器是否在指定網絡中
docker inspect 容器名?| grep NetworkMode
導入數據庫
docker exec -i mysql mysql -uroot -p123456
?databasename?< /home/java/xx.sql
rm -r 逐級刪除非空目錄
Rm file 刪除文件
mkdir -p ?創建多級目錄
Touch xx.file 創建文件