Docker プロジェクトのデプロイメント バックエンド/フロントエンド

1. フロントエンドの展開

1. まず、フロントエンド プロジェクトを dist ファイルにパッケージ化します。

npm run build

2. まず nginx をインストールし、正常に実行します。

docker pull nginxnginx イメージをプルする
docker images既存のイメージを表示する
docker run --name nginx-test -p 9091:80 -d nginxnginx を開始する

--name  #给你启动的容器起个名字,以后可以使用这个名字启动或者停止容器
-p #映射端口,将docker宿主机的9091端口和容器的80端口进行绑定,物理宿主机通过9091端口来访问容器的80端口
-v #挂载文件用的
-d #表示启动的是哪个镜像。

ここに画像の説明を挿入します

3. Nginx サービスの構成とデプロイメント

3.1 コンテナから nginx.conf 構成ファイルをコピーする

docker cp 容器ID:/etc/nginx/nginx.conf /home/docker/nginx/conf
(nginx コンテナを実行して、コンテナ内のデフォルト構成ファイルをホスト システム ディレクトリにコピーしました)

 后边宿主机目录要提前创建好
在home下创建一个docker文件夹,用来专门存docker容器的映射文件。
在docker下创建一个nginx的文件夹,用于存nginx的映射文件。
在nginx下创建三个关键的映射文件。
html映射html目录,也就是网页目录。
logs文件映射日志目录。
conf文件映射配置目录

ここに画像の説明を挿入します

コピーを開始する

[root@localhost nginx]# docker cp b56ec16a3be9:/etc/nginx/nginx.conf /home/docker/nginx/conf
Successfully copied 2.56kB to /home/docker/nginx/conf

3.2 Docker コンテナとホスト ファイルのマッピング

なぜマッピングするのでしょうか?
dockerfile、docker-compose、nginx dist およびその他のファイルは、特定のコンテナーではなくホスト ディレクトリに配置されます。

コンテナを利用する過程で、コンテナ内のファイルを変更・管理する必要がある場合がありますが、ファイルマッピングを行わない場合は、 docker exec -it コンテナID/コンテナ名/bin/bash を使用してnginx上のファイルにアクセスします。内部でのみ操作可能であり、ホストディレクトリの内容を変更してコンテナ内の内容を変更することはできません。
では、コンテナに直接書き込んではどうでしょうか?
コンテナは可変であるため、コンテナが削除されると、コンテナ内のデータも削除されます。これについて言及されていますマウント、コンテナ内のデータは仮想マシンのディレクトリにマウントされるため、コンテナに何かを書き込むと、実際には Docker ホスト (仮想マシン) のパスに書き込まれるため、コンテナが削除されても大丈夫です。 、データは Docker ホスト内に保存されます。Docker ホスト上のファイルも削除しない限り、データは常に存在します。

OK、以下に進んでください

マッピングルールは次のとおりです

宿主机                                              容器
/home/docker/nginx/html                           /usr/share/nginx/html #网页文件
/home/docker/nginx/conf/nginx.conf               /etc/nginx/nginx.conf#配置文件
/home/docker/nginx/logs                          /var/log/nginx#日志文件

デフォルト設定ファイルをコピーした後、以前のコンテナは役に立たなくなりますので、削除してください。
docker stop 容器ID
docker rm 容器ID
別の nginx コンテナを作成してファイルをマウントし (ホスト ディレクトリとコンテナ ディレクトリは双方向バインドされています)、
docker run -d -p 9091:80 --name nginx-test -v /home/docker/nginx/html:/usr/share/nginx/html -v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/docker/nginx/logs:/var/log/nginx nginx
ホスト ディレクトリに不足しているものが転送されるようにします。 . 、ファイルが変更されると、コンテナー ディレクトリも変更されます。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
成功しましたが、バックエンドは

2. バックエンドのデプロイメント

バックエンド展開プロセス

/home/docker パスの下で、root ユーザーの使用を試みます
ここに画像の説明を挿入します
1. プロジェクトの jar パッケージをパックします
ここに画像の説明を挿入します
パックされたパッケージはターゲット内にあり
ここに画像の説明を挿入します
、xftp 経由で仮想マシンに転送されます。
docker-compose ファイルがない場合は、事前に application.yml 内の mysql アドレスを localhost ではなく IP アドレスに変更する必要があることに注意してください。
ここに画像の説明を挿入します

2.Dockerfileを書く

FROM java:8
VOLUME /tmp
ADD swagger2-demo-0.0.1-SNAPSHOT.jar app.jar
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 暴露17080端口
EXPOSE 8081
ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar" ]

3. build jar package
docker build -t api .## は現在のディレクトリを参照するため、Dockerfile のディレクトリに cd します
4. イメージを表示します
docker images
5. イメージを実行します
docker run -d -p 8081:8081 --name httpapi api## -d: バックグラウンドでコンテナを実行します、-p: 内部ポートコンテナのホストポートにランダムにマッピングされます

docker ps 実行中のコンテナ コマンドの表示
docker ps -aすべてのコンテナの表示
docker rm 容器IDコンテナの
docker rmi 镜像ID削除 画像の削除
mkdir 文件名新しいファイルの作成
mv 原文件地址 现文件地址ファイル名の移動/変更

これで、ホストは swagger にアクセスできるようになります。
アクセス アドレス:
http://192.11.11 (仮想マシンの IP アドレス):8081/swagger-ui.html#/
ここに画像の説明を挿入します
--------2023 年 6 月 23 日更新---- -----

ドッカー構成

①docker-composeのインストール

①docker-composeコマンドをダウンロードする
curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-'uname -s'-'uname -m' > /usr/local/bin/docker-compose
docker-composeコマンドを使用してダウンロードするため、502エラーが発生します。

したがって、ダウンロードへの直接リンク
https://github.com/docker/compose/releases/download/1.14.0-rc2/docker-compose-Linux-x86_64

② 次に、それを /usr/local/bin/ ディレクトリにコピーし、xftp を使用して /usr/local/bin/ に移動できます。

③権限を付与する
chmod +x /usr/local/bin/docker-compose
④インストールが成功したか確認する
docker-compose -v

ここに画像の説明を挿入します

②docker-compose使用

上記がインストールで、
/usr/local/bin/ 配下にありますが、
ここに画像の説明を挿入します
使用するには docker-compose.yml ファイルが必要で、パスは以前バックエンドにデプロイした Dockerfile と同じフォルダーにあります。すべては home/docker の下にあります。
ここに画像の説明を挿入します
次のステップは、docker-compose.yml ファイルを作成することです。

version: '3'

services:
  swagger2-demo:
    image: swagger2-demo:0.0.3
    container_name: swagger2-demo
    build:
      dockerfile: Dockerfile
      context: ./
      args:
        JAR_RELEASE_PATH: swagger2-demo-0.0.1-SNAPSHOT.jar
        JAR_POSE: 8081
    links:
      - redis
    ports:
      - 8081:8081
    restart: always
    volumes:
      - ./log:/log
    environment:
      file.encodin: utf-8
      server.port: 8081
      spring.datasource.url: jdbc:mysql://数据库地址:3306/ludaTest?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
      spring.datasource.username: root
      spring.datasource.password: 数据库密码
      spring.profiles.active: dev
      logging.file.max-history: 100
      SPRING_REDIS_HOST: redis
    networks:
      mynet:
        aliases:
          - swagger2-demo

  redis:
    image: redis:latest
    container_name: redis-demo
    restart: always
    networks:
      mynet:
        aliases:
          - redis

  nginx:
    image: nginx
    container_name: nginx
    expose:
      - 80
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /home/docker/nginx/html:/usr/share/nginx/html
      - /home/docker/nginx/logs:/var/log/nginx
    networks:
      mynet:
        aliases:
          - nginx

networks:
  mynet:
    external: true

ここに画像の説明を挿入します

ここには、カスタム イメージ swagger2-demo、redis、nginx、およびホストのデータベース アドレスがあります (データベースは仮想マシン上ではなくホスト上にあります)。

知らせ!
yml ファイル内のインデントされたスペースに特に注意してください。このファイルを gpt に送信して、変更を依頼することができます。

バックグラウンドで実行したい場合は、
docker-compose を開始するコマンドがいくつかあります。
docker-compose up

docker-compose up -d
ここに画像の説明を挿入します

docker-compose ps正常に起動すると、
ここに画像の説明を挿入します

この時点で、docker-compose は成功します。
2 つのデプロイメント方法を実践することにより、最初の方法では、各コンテナーを手動で開始する必要があり、データベースの変更など、jar パッケージ コードに変更があった場合は、アイデアを開いて再度パッケージ化しなければなりません。元のコードをカバーするこのような変更には、docker-compose ファイルの変更のみが必要です。

これまでのところ、フロントエンドとバックエンドの両方にアクセスできます
-------------2023-6-25--------- ----- --------------------------------------

問題 1: ビルドの問題

ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 668a7264-5d0b-45a6-b547-fa8fff014bda::g00ukurq2ipxuvrrz8rnpyskp: "/swagger2-demo-0.0.1-SNAPSHOT.jar": not found

[root@localhost /]# docker build  -f ./home/docker/Dockerfile -t api .
[+] Building 0.0s (6/8)                                                                                                                                                                      
 => [internal] load build definition from Dockerfile                                                                                                                                    0.0s
 => => transferring dockerfile: 410B                                                                                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                                                         0.0s
 => [internal] load metadata for docker.io/library/java:8                                                                                                                               0.0s
 => [internal] load build context                                                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                                                         0.0s
 => [1/4] FROM docker.io/library/java:8                                                                                                                                                 0.0s
 => ERROR [2/4] ADD swagger2-demo-0.0.1-SNAPSHOT.jar app.jar                                                                                                                            0.0s
------
 > [2/4] ADD swagger2-demo-0.0.1-SNAPSHOT.jar app.jar:
------
Dockerfile:3
--------------------
   1 |     FROM java:8
   2 |     VOLUME /tmp
   3 | >>> ADD swagger2-demo-0.0.1-SNAPSHOT.jar app.jar
   4 |     # 设置时区
   5 |     RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
--------------------
ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 668a7264-5d0b-45a6-b547-fa8fff014bda::g00ukurq2ipxuvrrz8rnpyskp: "/swagger2-demo-0.0.1-SNAPSHOT.jar": not found

形而上学的には、現時点では Dockerfile のパスを入力してビルドし直すことはできますが、-f で直接パスを指定してもまだ見つかりません。
docker build コマンド:

docker build  -t api .

ターミナル

[root@localhost /]# cd /home
[root@localhost home]# ls
docker  redis  website  za
[root@localhost home]# cd docker
[root@localhost docker]# ls
bk  docker-compose.yml  Dockerfile  nginx  swagger2-demo-0.0.1-SNAPSHOT.jar
[root@localhost docker]# docker build  -t api .
[+] Building 0.0s (9/9) FINISHED                                                                                                                                                             
 => [internal] load build definition from Dockerfile                                                                                                                                    0.0s
 => => transferring dockerfile: 410B                                                                                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                                                         0.0s
 => [internal] load metadata for docker.io/library/java:8                                                                                                                               0.0s
 => [internal] load build context                                                                                                                                                       0.0s
 => => transferring context: 115B                                                                                                                                                       0.0s
 => [1/4] FROM docker.io/library/java:8                                                                                                                                                 0.0s
 => CACHED [2/4] ADD swagger2-demo-0.0.1-SNAPSHOT.jar app.jar                                                                                                                           0.0s
 => CACHED [3/4] RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime                                                                                                            0.0s
 => CACHED [4/4] RUN echo 'Asia/Shanghai' >/etc/timezone                                                                                                                                0.0s
 => exporting to image                                                                                                                                                                  0.0s
 => => exporting layers                                                                                                                                                                 0.0s
 => => writing image sha256:9d4269948f2d634446a5180c8b0d7fb5219f6246c5cf8a5aa437ce8354ca588e                                                                                            0.0s
 => => naming to docker.io/library/api                                                                                                                                                  0.0s
[root@localhost docker]# docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
api            latest    9d4269948f2d   15 minutes ago   725MB
swagger-demo   latest    9d4269948f2d   15 minutes ago   725MB
nginx          latest    7d3c40f240e1   8 days ago       143MB
redis          latest    0ec8ab59a35f   4 weeks ago      117MB
hello-world    latest    9c7a54a9a43c   6 weeks ago      13.3kB
openjdk        17        5f94f53bbced   18 months ago    471MB
mysql          latest    3218b38490ce   18 months ago    516MB
mysql          8.0.23    cbe8815cbea8   2 years ago      546MB
java           8         d23bdf5b1b1b   6 years ago      643MB

問題 2: カスタム イメージが実行後に停止する

ここに画像の説明を挿入します
これは通常、ビルド中に問題があり、Dockerfile に問題があることを意味します。

Dockerfileは正しいです

FROM java:8
VOLUME /tmp
ADD swagger2-demo-0.0.1-SNAPSHOT.jar app.jar
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 暴露17080端口
EXPOSE 8081
ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar" ]

ここで、ビルド後にパッケージ化されたjarパッケージjarパッケージを追加します

一般に、パッケージ化した jar パッケージはパスの問題により見つからず、app.jar も見つからないため、
戻って再パッケージ化する必要があります。Dockerfile ファイルを確認してください。
前に jar パッケージを指定していませんでした。そこで、
ARG JAR_RELEASE_PATH=swagger2-demo-0.0.1-SNAPSHOT.jar
== docker run command ==に変更しました。

docker run -d -p 8090:8090 --name music api

Dockerfileが間違っています

FROM java:8

ARG JAR_RELEASE_PATH

ARG JAR_POSE=8081

RUN echo "ARGS is ${JAR_RELEASE_PATH}"

COPY ${JAR_RELEASE_PATH}  app.jar

ENTRYPOINT ["java","-jar","-Duser.timezone=GMT+8","/app.jar"]

EXPOSE ${JAR_POSE}

起動成功の表示

[root@localhost docker]# docker run -d -p 8081:8081 --name music api
f57245ddf45b7709906dadc8d663244079f04154677eb2a1a02d9bafcc0e1a55
[root@localhost docker]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS          PORTS                                       NAMES
f57245ddf45b   api       "java -Djava.securit…"   3 seconds ago   Up 2 seconds    0.0.0.0:8081->8081/tcp, :::8081->8081/tcp   music
4cc0e3a49eff   redis     "docker-entrypoint.s…"   8 days ago      Up 40 minutes   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   myredis

カスタムネットワークを補完(今のところあまり役に立たないようです)

これは、docker run を通じてコン​​テナーを作成するときにデフォルトで使用されます。ドッカーブリッジネットワーク;
但是docker0,是无法容器之间互通的,需要--link设置,才能互相ping通
したがって、コンテナを作成するときに、コンテナが使用するネットワークを指定すると、カスタムネットワーク
カスタマイズされたネットワークが 2 つのコンテナ間で使用されるため、これはコンテナ間に双方向リンクを追加することと同じです。つまり合格できるIPアクセス、渡すこともできますコンテナ名アクセス

① docker-compose.ymlを修正する
docker-composeで作成するコンテナのネットワークを設定します。カスタマイズされたネットワーク mynet

services:
  api:
    image: api
    container_name: music
    build:
      dockerfile: Dockerfile
      context: ./
      args:
        JAR_RELEASE_PATH: swagger2-demo-0.0.1-SNAPSHOT.jar
        JAR_POSE: 8081
    links:
      - redis
    ports:
      - 8081:8081
    restart: always
    volumes:
      - ./log:/log
    environment:
      file.encodin: utf-8
      server.port: 8081
      spring.datasource.url: jdbc:mysql://你的数据库ip:3306/ludaTest?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
      spring.datasource.username: root
      spring.datasource.password: 密码
      spring.profiles.active: dev
      logging.file.max-history: 100
      SPRING_REDIS_HOST: redis
    networks:    修改这里
      - mynet
  
      
  redis:
    image: redis
    container_name: myredis
    restart: always
    # ports:
    #   - 6379:6379
    networks:    修改这里
      - mynet

  nginx:               #定义一个名为nginx-server的service
    image: nginx    #容器镜像
    container_name: nginx       #容器名称
    expose:   #容器要暴露的端口
    - 80
    ports:     #容器的端口映射, host_port:container_port
      - "80:80"
      - "443:443"
    volumes:
      - /home/docker/nginx/html:/usr/share/nginx/html 
      - /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
      -  /home/docker/nginx/logs:/var/log/nginx
    networks:   修改这里
        - mynet 
networks:   修改这里
  mynet:
    external: true


セットアップ後、すべてのコンテナとすべてのイメージを削除します
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -aq)

docker-compose を再度
docker-compose up -d
ここに画像の説明を挿入します
正常に起動して
、すべてのネットワークを表示します
docker network ls
ここに画像の説明を挿入します

特定のネットワークの詳細情報を確認します。
docker network inspect f9dc86662e23
ここに画像の説明を挿入します
現在、フロントエンドとバックエンドのコンテナーはカスタマイズしたネットワークの下にあり、相互に ping できます。途中に小さな
ここに画像の説明を挿入します
エピソードがあります。nginx は音楽を ping できません。
ここに画像の説明を挿入します

[root@localhost docker]# docker exec -it nginx ping music
OCI runtime exec failed: exec failed: unable to start container process: exec: "ping": executable file not found in $PATH: unknown

解決策:
docker container exec -it nginx bash
apt-get update
apt-get install iputils-ping
OK注意してください
! bash を次のように入力する必要がありますroot@01d54de815b2:/#
以下のように見える場合、[root@01d54de815b2:/#]
ここに画像の説明を挿入します
上記は機能しません
が、以下は機能します。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
コマンドを入力してください

docker container exec -it nginx bash
apt-get update
apt-get install iputils-ping

ここに画像の説明を挿入します
続く
ここに画像の説明を挿入します

質問 3:docker exec -it 873619784f58 bash コマンドがコンテナに入ると、[root@873619784f58 /] の代わりに bash-4.4# が表示されます。

原因: 現在のユーザーのルート ディレクトリに 2 つのファイルがないため、コマンド ラインには -bash-4.4# が表示されます。
はい。ただし、bash を終了したり、[root@localhost ~] に戻ったりしないでください。
我之前反复在[root@localhost ~]处执行下面命令,没效果
解決:

  1. コマンドを実行します: docker exec -it 873619784f58 bash コンテナーに入る
  2. 次のコマンドを実行します: (この手順では .bashrc ファイルと .bash_profile を追加します)
    bash-4.4# cp /etc/skel/.bashrc /root/
    bash-4.4# cp /etc/skel/.bash_profile /root/
    bash-4.4# exit
    、次に (.bashrc ファイルと .bash_profile を永続化します)
    [root@6829a4eaef65 /]# source ~/.bashrc
    [root@6829a4eaef65 /]# source ~/.bash_profile
    コンテナーを再起動し、コンテナーが正しく使用されているかどうかを確認します。
    [root@localhost ~]# docker restart 873619784f58

わかりました
ここに画像の説明を挿入します

質問 4: しかし、フロントエンドは単なるログイン ページであり、インターフェイスが失敗し、ネットワーク エラーが表示されます。

意思说 我的前端nginx容器无法访问后端api容器
フロントエンド ページによって呼び出されるインターフェイス アドレスが、物理ホストの実際のデータベース アドレスではなく、仮想マシンのアドレスである必要がある場合、実際のインターフェイスではなく、バックエンド インターフェイスを介して実際の物理ホストのデータベース アドレスに転送されます。物理
ここに画像の説明を挿入します
ホストのデータベース アドレス10.53.16.11間違っている場合の修正方法は次のとおりです。 dist のバックエンド アドレスが192.168.2.131:8081仮想マシンのバックエンド アドレスである場合は、nginx イメージを削除し、上記の nginx の実行に従って新しいコンテナーを作成し、マウントし、コンテナーを削除します。次に docker-compose up -d を実行します

これで、
フロントエンド ページに再度アクセスすると、インターフェイス データにアクセスできるようになります。
ここに画像の説明を挿入します

質問 5: nginx 構成ファイルの変更が機能しない

問題分析: nginx コンテナーがシステム ファイルとともにマウントされているかどうかを確認します。

このコマンドでマウントしただけではありませんか?
docker run -d -p 9091:80 --name nginx-test / -v /home/docker/nginx/html:/usr/share/nginx/html / -v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf/ -v /home/docker/nginx/logs:/var/log/nginx nginx

マウント後、コンテナの詳細を確認し、マウントを見るとバインドマウントされていることがわかります。
docker inspect 容器ID
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ポイント!
/var/log/nginx /usr/share/nginx/html に直接アクセスしないでください。
要进入容器后再看

コンテナにファイルを追加します (ファイルではなくディレクトリをマウントすることをお勧めします)。
マウントがマウントされたことが確認できたら、txt を追加して効果を試してください。
ここに画像の説明を挿入します
最終的な
展開の問題:
1. 他の LAN にある物理マシンは、展開された仮想マシンのアドレスに接続できない
2. Nginx の展開プロセス 時々 10.53.11.11:8080 (物理マシンのアドレス) にアクセスするのはなぜですか?
フロントエンド調整のバックエンド インターフェイス アドレスは変更されていません。仮想マシンのバックエンド アドレスに変更する必要があります。
デプロイ中の 9091:80 は何を意味しますか? 変更できますか? 2 つの nginx が 1 つの仮想マシンにデプロイされ、コンテナがデフォルトでポート 80 に設定され、競合が発生しないのはなぜですか?
9091: 80 コンテナ ポート 80 はホスト ポート 9091 にマッピングされており、ホストは 9091 経由でそれにアクセスできます。
nginx.conf をマウントする場合は、このファイルの nginx ポートを変更し、docker-compose を 81 に変更するだけです。500502 が表示される場合は、dist ファイルのマッピングに問題がある可能性があります。
3. Ping が失敗する場合は重要ですか? dist のバックエンド アドレスを直接変更することに加えて、他のファイルも変更できますか? nginx.conf 内の場所のマッピングは機能せず、/etc/
nginx も機能しません。はい、ただしコンテナに入る必要があります
ネットワークのカスタマイズは展開とは何の関係もありません。nginx.conf のロケーション マッピング/フロントエンド ページは正常ですが、バックエンド プロキシが正常に動作していません。
4.Nginxのマウントとは何を意味しますか?お互いにバインドする
5. クラウドサーバーにデプロイするとはどういう意味ですか?
仮の

おすすめ

転載: blog.csdn.net/zhangaob/article/details/131330752