1. フロントエンドの展開
1. まず、フロントエンド プロジェクトを dist ファイルにパッケージ化します。
npm run build
2. まず nginx をインストールし、正常に実行します。
docker pull nginx
nginx イメージをプルする
docker images
既存のイメージを表示する
docker run --name nginx-test -p 9091:80 -d nginx
nginx を開始する
--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 ~]处执行下面命令,没效果
解決:
- コマンドを実行します: docker exec -it 873619784f58 bash コンテナーに入る
- 次のコマンドを実行します: (この手順では .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. クラウドサーバーにデプロイするとはどういう意味ですか?
仮の