Dockerコンテナデータボリュームの原理と使用法の分析

Dockerコンテナデータボリュームの原理と使用法の分析

コンテナデータボリュームとは

データがコンテナ内にある場合、コンテナを削除するとデータは失われます。

例: MySQL コンテナが削除されました。これは、データベースを削除して逃げると呼ばれることがよくあります。 要件: データを永続化できます。コンテナがすぐに削除されても、データはコンテナ内に残ります。データ共有テクノロジを実現できます。 Docker コンテナによって生成されたデータはローカル コンピューターに同期されます。

これがロールテクニックです!ディレクトリをマウントし、コンテナのディレクトリを Linux にマウントします。

概要: ボリューム テクノロジは、データの永続性と同期操作を実現するために使用され、コンテナー間でデータを共有することもできます。

データボリュームの使用

方法1: コマンドを直接使用してマウントする -v

# コマンド docker run -it -v ホストディレクトリ: コンテナディレクトリ -p ホストポート: コンテナポート # テスト # ホストのホームディレクトリは空です [root@bogon home] # ls
# contes イメージを起動して、ホストのホームをコンテナのホーム [root@bogon home] にバインドします。# docker run -v /home:/home/ -it centos 
[root@8dc073caf39c /]# cd ホーム/
# コンテナのホームディレクトリは空です [root@8dc073caf39c home]# ls
# コンテナディレクトリ [root@8dc073caf39c home] に test.java ファイルを作成します。# touch test.java
[root@8dc073caf39c ホーム]# ls
テスト
# ホストのホームディレクトリに切り替えると、test.javaファイルが表示されました [root@8dc073caf39c home]# [root@bogon home]# ls
テスト
# ホストのホームディレクトリ [root@bogon home] に test2.java ファイルを作成します。# touch test2.java
[root@bogon ホーム]# ls
テスト2.java テスト.java
[root@bogon ホーム]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
8dc073caf39c centos "/bin/bash" 3 分前 3 分前 focused_nobel
# 実行中のコンテナに入る [root@bogon home]# docker exec -it 8dc073caf39c /bin/bash
# コンテナのホームディレクトリに入る [root@8dc073caf39c /]# cd home/
# test2.java ファイルが見つかりました [root@8dc073caf39c home]# ls
テスト.java テスト2.java


# 検査コマンドでコンテナ情報を表示する [root@bogon home]# docker examine 8dc073caf39c
    「マウント」: [
      {
        「タイプ」:「バインド」
        "Source": "/home", # ホストディレクトリ "Destination": "/home", # コンテナディレクトリ "Mode": "",
        「RW」:真、
        「伝播」: 「rprivate」
      }
    ]、
## 結論: -v を使用してデータをバインドする場合# 1. コンテナが停止すると、ホストがデータに変更を加え、コンテナの起動後にデータが同期されます# 2. コンテナが削除されても、ホスト上のディレクトリ内のデータはそのまま残ります## 利点: データ ボリュームを使用した後、将来構成ファイルを変更するときは、ローカルで変更するだけで、コンテナは自動的に同期します

MySQLをインストールする

MySQL データの永続性の問題

					  					 # -e MYSQL_ROOT_PASSWORD=my-secret-pw 初期パスワードをmy-secret-pwに設定します
# 公式コマンド: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# テスト	
# 解釈 # -d バックグラウンド実行 # -p 3306:3306 バインドポート # -v /home/mysql/conf:/etc/mysql/conf.d データボリュームマウントテクノロジ bind mysql 設定ファイル # -v /home/mysql/data:/var/lib/mysql データボリュームマウントテクノロジ bind mysql データ # -e MYSQL_ROOT_PASSWORD=123456 環境設定 ---》mysql の初期パスワードを 123456 に設定
  # --name mysql0 コンテナにmysql01という名前を付けます
[root@bogon home]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
6d75b6312f725de2c71709116af5755604ea60cd073f1daf3755c578c1e64f57

名前付きマウントと匿名マウント

#匿名マウント -v コンテナパス!
docker run -d -P --name nginx01 -v /etc/nginx nginx 
# 名前付きマウント -v ボリューム名: コンテナ内のパス docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx


# 匿名マウントをテストする	
[root@localhost test]# docker run -d -P --name nginx01 -v /etc/nginx nginx
214dab398d9997a730b970b6e3bb08fa7e39bbb0ca91ad59f6b3f235d8f1b9bc

# すべてのボリュームを表示 [root@localhost test]# docker volume ls
ドライバーボリューム名	
local 2c22e1c50ff7330b815b692f8f71a1fca878209223846c95626f7efd9dc2a83b # 匿名マウント # 名前付きマウントをテスト # -v ボリューム名: コンテナー内のパス [root@localhost test] を使用 # docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
a678d79886565601bf466ff41734cb5334bdaf9e881b9cbf11edb84e9d790251
# すべてのボリュームを表示 [root@localhost test]# docker volume ls
ドライバーボリューム名
local 2c22e1c50ff7330b815b692f8f71a1fca878209223846c95626f7efd9dc2a83b # 匿名マウント local juming-nginx # 名前付きマウント # データボリュームの情報を表示する	
# コマンド docker volume examine volume name # docker コンテナ内のすべてのボリュームは、指定されたディレクトリなしで /var/lib/docker/volumes/XXX/_data にあります
[root@localhost test]# docker ボリューム検査 juming-nginx
[
  {
    「作成日時」: 「2020-08-13T09:18:34+08:00」、
    "ドライバー": "ローカル",
    「ラベル」: null、
    「マウントポイント」: 「/var/lib/docker/volumes/juming-nginx/_data」、
    「名前」: 「juming-nginx」、
    「オプション」: null、
    「スコープ」: 「ローカル」
  }
]
# 名前付きマウントを使用すると、ボリュームの 1 つを簡単に見つけることができます。ほとんどの場合、名前付きマウントを使用します。# 名前付きマウント、匿名マウント、または指定されたパスのマウントであるかどうかを判断する方法!
# -v コンテナ パス # 匿名マウント # -v ボリューム名: コンテナ パス # 名前付きマウント # -v ホスト パス: コンテナ パス # 指定パスによるマウント

拡大する

# 読み取りおよび書き込み権限を -v ボリューム名: コンテナ内のパス: ro rw で変更します # ro--->読み取り専用 読み取り専用 # rw--->読み取り 書き込み 読み取りと書き込み docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx

DockerFileを使い始める

DockerFile は、Docker イメージをビルドするために使用されるビルド ファイルです。コマンドスクリプト! まずはお試しください!

[root@localhost docker-test-volume]# cat dockerfile 
フォーム centos

ボリューム ["volume01", "volume02"]
CMD エコー "-----終了-----"
コマンド /bin/bash

# ビルド# コマンド docker build -f シェル スクリプト ファイル -t イメージ名: バージョン番号 [root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t centos:1.0 .
ビルドコンテキストを Docker デーモンに送信しています 2.048kB
ステップ 1/4: Centos から
 ---> 0d120b6ccaa8
ステップ 2/4 : ボリューム ["volume01", "volume02"]
 ---> 4e6de7bc2f15 で実行中
中間コンテナ 4e6de7bc2f15 を削除しています
 ---> f9e48207902b
ステップ 3/4: CMD echo "-----end-----"
 ---> b22adea363e5 で実行中
中間コンテナ b22adea363e5 を削除しています
 ---> a7518e2e1c72
ステップ 4/4 : CMD /bin/bash
 ---> ae1b746bef6b で実行中
中間コンテナ ae1b746bef6b を削除しています
 ---> d840628c30a9
正常に構築されました d840628c30a9
centos:1.0 のタグ付けに成功しました
# イメージを表示 [root@localhost overlay2]# docker images
リポジトリ タグ イメージ ID 作成 サイズ
centos 1.0 d840628c30a9 12 分前 215MB # 独自のイメージ centos 最新 0d120b6ccaa8 2 日前 215MB
# 生成したイメージを起動します [root@1af673cf9c88 /]# docker run -it d840628c30a9 /bin/bash
[root@1af673cf9c88 /]# ls -l
合計 0
lrwxrwxrwx. 1 ルート ルート 7 5月 11 2019 bin -> usr/bin
drwxr-xr-x. 5 ルート ルート 360 8月13日 02:18 dev
drwxr-xr-x. 1 ルート ルート 66 8月 13 02:18 など
drwxr-xr-x. 2 ルート ルート 6 5月 11 2019 ホーム
lrwxrwxrwx. 1 ルート ルート 7 2019年5月11日 lib -> usr/lib
lrwxrwxrwx. 1 ルート ルート 9 2019年5月11日 lib64 -> usr/lib64
drwx------. 2 ルート ルート 6 8月 9 21:40 lost+found
drwxr-xr-x. 2 ルート ルート 6 5月 11 2019 メディア
drwxr-xr-x. 2 ルート ルート 6 5月 11 2019 mnt
drwxr-xr-x. 2 ルート ルート 6 2019年5月11日 opt
dr-xr-xr-x. 117 ルート ルート 0 8月13日 02:18 proc
dr-xr-x---. 2 ルート ルート 162 8月 9日 21:40 ルート
drwxr-xr-x. 11 ルート ルート 163 8月9日 21:40 実行
lrwxrwxrwx. 1 ルート ルート 8 2019年5月11日 sbin -> usr/sbin
drwxr-xr-x. 2 ルート ルート 6 5月 11 2019 srv
dr-xr-xr-x. 13 ルート ルート 0 8月11日 09:58 sys
drwxrwxrwt. 7 ルート ルート 145 8月 9日 21:40 tmp
drwxr-xr-x. 12 ルート ルート 144 8月 9日 21:40 usr
drwxr-xr-x. 20 ルート ルート 262 8月 9日 21:40 var
drwxr-xr-x. 2 root root 6 Aug 13 02:18 volume01 # これは、イメージ drwxr-xr-x. 2 root root 6 Aug 13 02:18 volume02 を生成するときに自動的にマウントされるデータ ボリューム ディレクトリです。

# このボリュームには外部のディレクトリと同期されたディレクトリが必要です。調べてみましょう # 1. コンテナIDに基づいてコンテナ情報を照会する --》データボリューム情報		
	# docker 検査 1af673cf9c88
# 2. データボリューム情報に従って、volume01 に対応するデータボリューム名を検索します # docker volume examine 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3
# 3. データボリューム名に従ってデータボリューム情報を照会します--「Linux で対応するディレクトリを検索します # docker volume examine 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3

# コンテナ内にファイルを作成します。データボリューム volume01 に test.java ファイルを作成します [root@1af673cf9c88 volume01]# touch test.java
[root@1af673cf9c88 volume01]# ls
テスト
# コンテナを終了する [root@1af673cf9c88 volume01]# exit
出口
# コンテナ情報を表示する [root@localhost overlay2]# docker examine 1af673cf9c88
	# マウントされたボリューム volume01 に対応する名前を検索します。つまり、8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 です。
    「マウント」: [
      {
        「タイプ」:「ボリューム」、
        「名前」: 「8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3」、
        「ソース」: 「/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data」、
        「宛先」: 「volume01」、
        "ドライバー": "ローカル",
        "モード": "",
        「RW」:真、
        「伝播」: 「」
      },
      {
        「タイプ」:「ボリューム」、
        「名前」: 「046d0baa3cc0bc3540c5e7248808358371641bfba4e0bbd139c99fe851751da2」、
        「ソース」: 「/var/lib/docker/volumes/046d0baa3cc0bc3540c5e7248808358371641bfba4e0bbd139c99fe851751da2/_data」、
        「宛先」: 「volume02」、
        "ドライバー": "ローカル",
        "モード": "",
        「RW」:真、
        「伝播」: 「」
      }
    ]、
# データボリューム名 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 に従って、Linux の場所 [root@localhost overlay2] でボリュームを見つけます。# docker volume examine 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3
[
  {
    「作成日時」: 「2020-08-13T10:27:12+08:00」、
    "ドライバー": "ローカル",
    「ラベル」: null、
    「マウントポイント」: 「/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data」、
    「名前」: 「8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3」、
    「オプション」: null、
    「スコープ」: 「ローカル」
  }
]
# /var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data/ ディレクトリにある test.java ファイルを見つけます [root@localhost volumes]# cd /var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data/
[root@localhost _data]# ls
テスト

データボリュームコンテナ

複数の MySQL データの同期!

# コンテナ間でデータを共有するには、--volumes-from コンテナ名を使用します # docker01 という名前のイメージを起動します
[root@localhost _data]# docker run -it --name docker01 centos:1.0 /bin/bash
[root@a85fbed0ebc9 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt ​​proc root run sbin srv sys tmp usr var volume01 volume02
# docker02 という名前の同じイメージを起動し、docker01 に関連付けます。この時点で、docker01 はデータ ボリューム コンテナーと呼ばれます [root@localhost _data]# docker run -it --name docker02 --volumes-from docker01 centos:1.0
[root@a89fb82eeeb5 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt ​​proc root run sbin srv sys tmp usr var volume01 volume02
# コンテナ docker02 の volume01 ディレクトリに test.txt を作成します 
[root@a89fb82eeeb5 /]# cd volume01/
[root@a89fb82eeeb5 volume01]# ls
[root@a89fb82eeeb5 volume01]# タッチテスト.txt 
[root@a89fb82eeeb5 volume01]# ls
テスト.txt
# コンテナ情報を表示 [root@a89fb82eeeb5 volume01]# [root@localhost _data]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
a89fb82eeeb5 centos:1.0 "/bin/sh -c /bin/bash" 約 1 分前 起動 約 1 分 docker02
a85fbed0ebc9 centos:1.0 "/bin/bash" 4 分前 4 分前 docker01
# docker01 という名前のコンテナに入る [root@localhost _data]# docker exec -it a85fbed0ebc9 /bin/bash
[root@a85fbed0ebc9 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt ​​proc root run sbin srv sys tmp usr var volume01 volume02
# コンテナのvolume01ディレクトリに入る [root@a85fbed0ebc9 /]# cd volume01/
# test.txt ファイルが見つかりました [root@a85fbed0ebc9 volume01]# ls
テスト.txt
# test01.txt を作成
[root@a85fbed0ebc9 volume01]# test01.txt をタッチします
[root@a85fbed0ebc9 volume01]# ls
テスト.txt テスト01.txt
# docker02 という名前のコンテナに入る [root@localhost _data]# docker exec -it a89fb82eeeb5 /bin/bash
[root@a89fb82eeeb5 /]# ls 
bin dev etc home lib lib64 lost+found media mnt opt ​​proc root run sbin srv sys tmp usr var volume01 volume02
[root@a89fb82eeeb5 /]# cd volume01/
# test01.txt ファイルが見つかりました [root@a89fb82eeeb5 volume01]# ls
テスト.txt テスト01.txt

# docker03 という名前の同じイメージを起動し、docker01 に関連付けます
[root@localhost _data]# docker run -it --name docker03 --volumes-from docker01 centos:1.0
# volume01 ディレクトリに入り、test.txt test01.txt ファイルを見つけます [root@11d93f9bcd89 /]# cd volume01/
[root@11d93f9bcd89 volume01]# ls
テスト.txt テスト01.txt

#テストプロセス: 1. docker01 という名前の centos:1.0 イメージ コンテナを実行します。
# 2. docker02 という名前の centos:1.0 イメージ コンテナーを実行し、--volumes-from docker01 を介してデータを共有します。# 3. docker03 という名前の centos:1.0 イメージ コンテナーを実行し、--volumes-from docker01 を介してデータを共有します。# 4. docker04 という名前の centos:1.0 イメージ コンテナーを実行し、--volumes-from docker03 を介してデータを共有します。# 5. docker05 という名前の centos イメージ コンテナーを実行し、--volumes-from docker03 を介してデータを共有します。# テストの結果、次のことがわかりました。
# 1. 任意のコンテナの volume01 ディレクトリにファイルを追加すると、追加されたファイルはデータ共有のために他の 4 つのコンテナのディレクトリに表示されます。 # 2. docker01 という名前のコンテナを停止して削除すると、他の 4 つのコンテナの volume01 ディレクトリのファイルはそのまま残ります。 # 3. docker01 という名前のコンテナを停止して削除し、他の 4 つのコンテナのいずれかの volume01 ディレクトリにファイルを追加します。他の 3 つのコンテナもデータを共有します。 # 4. 各コンテナのデータ ボリュームの名前は異なりますが、Linux システム内の同じデータ ディレクトリに対応しています。つまり、各コンテナのデータ ボリューム ディレクトリは、Linux システム内の同じデータ ディレクトリを指します [root@localhost _data]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
78cd51a35c41 centos "/bin/bash" 17 分前 17 分前 trusting_tharp
e6e0988c50cd centos "/bin/bash" 17 分前 17 分前 docker05
c5ebc03e6819 centos:1.0 "/bin/sh -c /bin/bash" 19 分前 19 分前 docker04
11d93f9bcd89 centos:1.0 "/bin/sh -c /bin/bash" 22 分前 22 分前 docker03
a89fb82eeeb5 centos:1.0 "/bin/sh -c /bin/bash" 31 分前 31 分前 docker02
[root@localhost _data]# docker examine e6e0988c50cd
    「マウント」: [
      {
        「タイプ」:「ボリューム」、
        「名前」: 「fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62」、
        「ソース」: 「/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data」、
        「宛先」: 「volume01」、
        "ドライバー": "ローカル",
        "モード": "",
        「RW」:真、
        「伝播」: 「」
      },
		]
		
[root@localhost _data]# docker examine c5ebc03e6819 を実行します
    「マウント」: [
      {
        「タイプ」:「ボリューム」、
        「名前」: 「fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62」、
        「ソース」: 「/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data」、
        「宛先」: 「volume01」、
        "ドライバー": "ローカル",
        "モード": "",
        「RW」:真、
        「伝播」: 「」
      },
		]
[root@localhost _data]# docker 検査 11d93f9bcd89
    「マウント」: [
      {
        「タイプ」:「ボリューム」、
        「名前」: 「fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62」、
        「ソース」: 「/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data」、
        「宛先」: 「volume01」、
        "ドライバー": "ローカル",
        "モード": "",
        「RW」:真、
        「伝播」: 「」
      },
		]

データ共有を実現する複数のMySQL

docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql

結論は:

構成情報はコンテナ間で渡され、その場所を使用しているコンテナがなくなるまで、データ ボリューム コンテナのライフサイクルは継続されます。

ただし、ローカルに保存されると、ローカル データは削除されません。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • docker run -v はデータボリュームを異常にマウントし、コンテナのステータスは常に再起動になります。
  • Dockerはローカルディレクトリとデータボリュームコンテナ操作をマウントします
  • Docker データ管理 (データ ボリュームとデータ ボリューム コンテナー) の詳細な説明
  • Dockerコンテナデータボリュームのマウントの簡単な概要
  • Docker におけるコンテナデータボリュームとデータ管理の詳細な説明
  • Docker データボリュームとデータコンテナの詳細な紹介と例
  • Dockerデータボリューム、データボリュームコンテナの詳細な紹介
  • Docker コンテナ データ ボリュームの名前付きマウントと匿名マウントの問題

<<:  ログインと登録機能を実現するjs

>>:  JDBC-idea で mysql をインポートして java jar パッケージに接続する (mac)

推薦する

Vueプロジェクトのパッケージ化の詳細な説明

目次1. 関連構成ケース1(使用ツールはvue-cil)ケース2(使用するツールはwebpack) ...

JavaScript の寄生的構成継承についての簡単な説明

コンポジション継承組み合わせ継承は、疑似古典的継承とも呼ばれます。これは、昨日説明したプロトタイプ ...

MySqlのインストールとアンインストールに関する詳細なチュートリアル

この記事では、MySqlのインストールとアンインストールのチュートリアルを参考までに紹介します。具体...

(MariaDB) MySQL のデータ型とストレージメカニズムの包括的な説明

1.1 データ型の概要データ型は、各フィールドに保存できるデータの種類、保存できるデータの量、保存で...

良いと思う国内のデザインサイトをいくつか選んでみました。

<br />私が良いと思った国内のデザインサイトをまとめてみました。広告ではありません!...

レスポンシブ原則と Vue2.0/3.0 の違いについての簡単な分析

序文vue3.0 が正式にリリースされて以来、多くの友人が vue3.0 に切り替えました。ここでは...

Docker バインディング固定 IP/クロスホストコンテナ相互アクセス操作

序文これまでは、パイプワークで割り当てた静的 IP は一時的なものであり、再起動すると無効になってい...

Linux でのファイル コンテンツの重複排除と交差と差異の実装

1. データ重複排除日常業務では、Hive や Impala を使用してクエリとエクスポートを行う際...

Docker 実行時にユーザーとグループを管理する方法

Docker はプロセスを中核としてシステムリソースを分離する管理ツールです。分離は、オペレーティン...

win10 64 ビット システムに複数の JDK バージョンをインストールする際の切り替え問題と解決策の概要

コンピューターにmyeclipse2017とidea2017がインストールされているため、ideaが...

Web データ ストレージ: Cookie、UserData、SessionStorage、WebSqlDatabase

クッキーこれはクライアント ブラウザの状態を保存するための標準的な方法です。Cookie はブラウザ...

HTTP および HTTP コラボレーション Web サーバー アクセス フロー図

Web サーバーは、独立したドメイン名を持つ複数の Web サイトを構築できるほか、通信経路上のトラ...

uniapp 要素ノードスタイルの動的変更の詳細な説明

目次1. スタイル属性をバインドして変更するhtml:対応するjs:達成された効果:次に、refを使...

CSS3 での 2D および 3D 変換の実装

CSS3 は、要素の 2D 平面変換と視覚的な 3D 空間変換を実装します。2D 変換はより頻繁に使...

xshellを使用してLinuxサーバーに接続する

xshellを使用してLinuxに接続する利点Windows環境でLinuxを直接操作できるインター...