2020年6月30日火曜日

Ubuntu 20.04でシステム領域のディスク容量の拡張を行う

Ubuntu 20.04を仮想環境で動かしているのだが、システム領域のディスク容量はデフォルトの16GBで運用していた。しかし、Linuxとはいえ、各種GUIのソフトウェアをインストールすることで、残り容量が心もとなくなってきた。

そこで、ディスク容量を拡張をすることにしたのだが、UbuntuではRHEL系のLinuxとはパーティションの切り方が異なっており、手順にも差異があった。Ubuntuにおけるディスク容量の拡張手順を本記事にて記載することにする。

環境

  • Ubuntu 20.04 LTS

ディスク容量拡張手順

UbuntuはRHEL系のLinuxとは異なり、LVMが使用されていない。以下、dfコマンドの結果となるが、マウントポイント「/」には「/dev/sda5」が直接マウントされていることがわかる(★箇所)。今回は、この領域を16GBから18GBに拡張することにする。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           394M  1.8M  392M   1% /run
/dev/sda5        16G   10G  4.5G  70% /   ★
tmpfs           2.0G  274M  1.7G  14% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/loop1       55M   55M     0 100% /snap/core18/1754
/dev/loop0      243M  243M     0 100% /snap/gnome-3-34-1804/27
/dev/loop2       63M   63M     0 100% /snap/gtk-common-themes/1506
/dev/loop3       50M   50M     0 100% /snap/snap-store/433
/dev/loop4       28M   28M     0 100% /snap/snapd/7264
/dev/sda1       511M  4.0K  511M   1% /boot/efi
tmpfs           394M   36K  394M   1% /run/user/125
tmpfs           394M   48K  394M   1% /run/user/1000

1. 拡張したディスクを認識

仮想ディスクを拡張しても容量を自動認識しなかったため、拡張したディスクをコマンドにて認識させる。コマンド自体はRHEL系のLinuxと同様のコマンドとなるが、Ubuntuでは、原則sudoを使って実行する必要があるため、sudo sh -c <command>といった形で実行する。このように実行しないと、リダイレクトやパイプを含むコマンドが正常に実行できない

$ sudo sh -c "echo 1 > /sys/class/block/sda/device/rescan"

2. パーティションを拡張

パーティションの拡張はpartedコマンドで行う。

Ubuntu 20.04では、2番目のパーティションが拡張パーティション (extended) となっており、5番目のパーティションが論理パーティション (logical) として作成されている。

$ sudo parted /dev/sda
GNU Parted 3.3
/dev/sda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
(parted) p free                                                           
モデル: VMware Virtual disk (scsi)
ディスク /dev/sda: 19.3GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ    ファイルシステム  フラグ
      1024B   1049kB  1048kB            空き容量
 1    1049kB  538MB   537MB   primary   fat32             boot
      538MB   539MB   1048kB            空き容量
 2    539MB   17.2GB  16.6GB  extended
 5    539MB   17.2GB  16.6GB  logical   ext4
      17.2GB  19.3GB  2149MB            空き容量

まずは、拡張パーティションから拡張する。「使用中です。それでも実行しますか?」というメッセージが表示されるが、パーティションの拡張はオンラインで実行可能であるため、「y」を選択し続行すれば問題ない。

(parted) resizepart 2
警告: パーティション /dev/sda2 は使用中です。それでも実行しますか?
はい(Y)/Yes/いいえ(N)/No? y                                               
終了?  [17.2GB]? 100%
(parted) p free                                                           
モデル: VMware Virtual disk (scsi)
ディスク /dev/sda: 19.3GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ    ファイルシステム  フラグ
      1024B   1049kB  1048kB            空き容量
 1    1049kB  538MB   537MB   primary   fat32             boot
      538MB   539MB   1048kB            空き容量
 2    539MB   19.3GB  18.8GB  extended
 5    539MB   17.2GB  16.6GB  logical   ext4
      17.2GB  19.3GB  2149MB            空き容量

拡張パーティションの容量が拡張された後、論理パーティションを拡張する。

(parted) resizepart 5
警告: パーティション /dev/sda5 は使用中です。それでも実行しますか?
はい(Y)/Yes/いいえ(N)/No? y                                               
終了?  [17.2GB]? 100%                                                     
(parted) p free                                                           
モデル: VMware Virtual disk (scsi)
ディスク /dev/sda: 19.3GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ    ファイルシステム  フラグ
      1024B   1049kB  1048kB            空き容量
 1    1049kB  538MB   537MB   primary   fat32             boot
      538MB   539MB   1048kB            空き容量
 2    539MB   19.3GB  18.8GB  extended
 5    539MB   19.3GB  18.8GB  logical   ext4

以上でパーティション拡張が完了となるので、partedコマンドを終了する。

(parted) q                                                                
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。

3. ファイルシステムを拡張

Ubuntu 20.04のファイルシステムはext4を使用しているので、resize2fsを使って拡張する。拡張する対象は、論理パーティションの「/dev/sda5」となる。

$ sudo resize2fs /dev/sda5
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/sda5 is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/sda5 is now 4587008 (4k) blocks long.

4. 拡張後の確認

最後にdfコマンドで確認すると、★箇所の「/dev/sda5」の容量が16GBから18GBに拡張されていることがわかる。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           394M  1.8M  392M   1% /run
/dev/sda5        18G   10G  6.4G  62% /   ★
tmpfs           2.0G  222M  1.8G  12% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/loop1       55M   55M     0 100% /snap/core18/1754
/dev/loop0      243M  243M     0 100% /snap/gnome-3-34-1804/27
/dev/loop2       63M   63M     0 100% /snap/gtk-common-themes/1506
/dev/loop3       50M   50M     0 100% /snap/snap-store/433
/dev/loop4       28M   28M     0 100% /snap/snapd/7264
/dev/sda1       511M  4.0K  511M   1% /boot/efi
tmpfs           394M   36K  394M   1% /run/user/125
tmpfs           394M   48K  394M   1% /run/user/1000

以上で、Ubuntu 20.04におけるディスク容量の拡張作業は完了となる。

【注意事項】「エラー: 重なりのあるパーティションは持てません。」のエラーについて

拡張パーティションの前に論理パーティションを拡張しようとすると、「エラー: 重なりのあるパーティションは持てません。」と表示され失敗する。手順で説明したとおり、必ず拡張パーティションを拡張してから論理パーティションを拡張するようにしよう。

$ sudo parted /dev//sda
GNU Parted 3.3
/dev/sda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
(parted) p free                                                           
モデル: VMware Virtual disk (scsi)
ディスク /dev/sda: 19.3GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ    ファイルシステム  フラグ
      1024B   1049kB  1048kB            空き容量
 1    1049kB  538MB   537MB   primary   fat32             boot
      538MB   539MB   1048kB            空き容量
 2    539MB   17.2GB  16.6GB  extended
 5    539MB   17.2GB  16.6GB  logical   ext4
      17.2GB  19.3GB  2149MB            空き容量

(parted) resizepart 5                                                     
警告: パーティション /dev/sda5 は使用中です。それでも実行しますか?
はい(Y)/Yes/いいえ(N)/No? y                                               
終了?  [17.2GB]? 100%                                                     
エラー: 重なりのあるパーティションは持てません。
2020年6月21日日曜日

Ubuntu 20.04のGoogle Chromeで、プロキシ経由でインターネット接続できなくなった場合の対処手順

Ubuntuをメインのデスクトップ環境として、日々使うようにしているのだが、ある日突然Google Chromeにプロキシ設定が適用されなくなり、インターネット閲覧ができなくなる事象が発生した。本件の解消方法について、簡単ではあるが記載する。

環境

  • Ubuntu 20.04 LTS

Google Chromeをプロキシ経由で接続できるようにする手順

CLIでGoogle Chromeを起動する際にプロキシ設定を行う

Google Chromeを実行する際に、--proxy-server="<Proxy IP Address>:<Proxy Port>"のオプションを付与することで、プロキシ設定を行った上でGoogle Chromeを起動することができる。

$ /usr/bin/google-chrome-stable --proxy-server="<Proxy IP Address>:<Proxy Port>" &

しかし、毎回ターミナルからコマンドを実行するのも手間がかかるので、次にGUIのアプリケーションメニューからGoogle Chromeを起動する際にプロキシ設定がされるように設定を行う。

GUIのアプリケーションメニューの設定を修正する

Ubuntuのアプリケーションメニューの起動オプションに、CLIで実施したのと同様に--proxy-server="<Proxy IP Address>:<Proxy Port>"オプションを付与することで対処する。しかし、Ubuntuのアプリケーションのメニューは、そのままではGUIで編集することができない(おそらく設定ファイルを直接修正すれば対処できるが未検証)ので、アプリケーションメニューの管理ツールである「メニューエディター (MenuLibre)」をインストールする。

$ sudo apt install menulibre -y

インストール後、アプリケーションメニューに「メニューエディター」が追加されているので選択する。

左メニューの「インターネット」→「Google Chrome」を選択する。

「アクション」ボタンを押すと、「新しいウインドウ」と「新しいシークレット ウインドウ」の2つが設定されているので、それぞれの起動コマンドに、--proxy-server="<Proxy IP Address>:<Proxy Port>"のオプションを追加する。私の環境では以下のように設定した。

  • 新しいウインドウ:/usr/bin/google-chrome-stable --proxy-server="192.168.33.23:8080"
  • 新しいシークレット ウインドウ:/usr/bin/google-chrome-stable --incognito --proxy-server="192.168.33.23:8080"

上記設定を実施したのち、左上の「ランチャーを保存」ボタンを押して設定を保存する。

設定後、メニューからGoogle Chromeを起動すると、問題なくプロキシ経由でインターネット接続できるようになった。

2020年6月17日水曜日

DockerでDebianコンテナを作成して、Squidを動かす

先日Dockerfileを使って「CentOSコンテナ+Squid」を構築してみたが、その際に「Dockerfile のベストプラクティス」として、ベースに使うイメージは「Debian」が推奨との記載があった。

可能であれば、自分のイメージの元として現在の公式レポジトリを使います。私たちは Debian イメージ を推奨します。これは、非常にしっかりと管理されており、ディストリビューションの中でも最小(現在は 100 MB 以下)になるよう維持されているからです。

今回はDockerの推奨に従い、「Debianコンテナ+Squid」の環境をDockerfileを使って、サクッと作ってみたいと思う。

環境

  • OS : CentOS 7.8
  • Docker : 19.03.10
  • コンテナ上のDebian: latest (最新を指定。バージョンは10.4であることを確認)

手作業でコンテナを作ってみる

Dockerfleを作成する前に、必要な作業を確認するため、手作業でコンテナを作ってみることにする。

1. Debianイメージを入手

docekr searchコマンドでDebianコンテナを確認してみる。ubuntuもあるようだが、今回はdebianのイメージを使用する。

# docker search debian
NAME                                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                             Ubuntu is a Debian-based Linux operating sys…   10991               [OK]
debian                                             Debian is a Linux distribution that's compos…   3511                [OK]
arm32v7/debian                                     Debian is a Linux distribution that's compos…   66                    

~(以下略)~

docker pullコマンドでDebianコンテナのイメージを入手する。Debianコンテナのイメージサイズは114MBであり、CentOSコンテナよりも小さいことがわかる。

# docker pull debian
Using default tag: latest
latest: Pulling from library/debian
e9afc4f90ab0: Pull complete
Digest: sha256:46d659005ca1151087efa997f1039ae45a7bf7a2cbbe2d17d3dcbda632a3ee9a
Status: Downloaded newer image for debian:latest
docker.io/library/debian:latest

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian              latest              1b686a95ddbf        2 days ago          114MB
centos              7.6.1810            f1cb7c7d58b7        15 months ago       202MB

2. コンテナを起動

docker runコマンドでコンテを作成・起動する。DebianやCentOSコンテナのデフォルトのコマンド(DockerfileのCMD命令で定義されたコマンド)は、bashが実行されるようだが、対話型コマンドとなるので、-itオプションを付けて起動させること。このオプションを付けない場合は、コンテナを起動できないので注意。

# docker run -it -d -p 8081:3128 --name "docker-squid-2" debian
be8ca382678a458d99471a93e526c13977123250ac292d6021c79785cfa0fe3c

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
be8ca382678a        debian              "bash"                   4 seconds ago       Up 2 seconds        0.0.0.0:8081->3128/tcp   docker-squid-2

docker execコマンドでDebianコンテナにログインする。Debianのバージョンは10.4のようだ。

# docker exec -it docker-squid-2 bash
root@be8ca382678a:/# uname -a
root@be8ca382678a:/# cat /etc/debian_version
10.4

3. Squidをインストール

squidをインストールする。Debianなのでaptを使ってインストールとなるが、一番最初にapt updateしないとインストールが成功しないので注意しよう。

root@be8ca382678a:/# export http_proxy=http://192.168.33.23:8080
root@be8ca382678a:/# export https_proxy=http://192.168.33.23:8080

root@be8ca382678a:/# apt update
root@be8ca382678a:/# apt install squid -y

root@be8ca382678a:/# apt install -y procps
Reading package lists... Done
Building dependency tree
Reading state information... Done
procps is already the newest version (2:3.3.15-2).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
root@be8ca382678a:/# squid -v
Squid Cache: Version 4.6

~(以下略)~

Debianコンテナでは、psviすら使用できないので、以下も必要に応じてインストールしておく。

root@be8ca382678a:/# apt install vim -y
root@be8ca382678a:/# apt install procps -y
root@be8ca382678a:/# apt install curl -y

4. squid.confを編集

最終的にDockerfileでコンテナを構築できるよう、可能な限りsedコマンドを使って設定ファイルを編集する。

DebianでインストールされるSquidはCentOSと異なり、大量のコメントが記載されているので、まずはそれを削除する。

root@be8ca382678a:/# sed -i -e '/^#/d' -e '/^$/d' /etc/squid/squid.conf

次に、acl localnetの記載を自身の環境に合わせて置換する。なお、DebianのSquidでは「http_access allow localnet」がないため追加も忘れないこと。これを追加しない場合は、ローカルからのアクセス以外は、「403 Forbidden」でアクセス拒否されてしまう。

root@be8ca382678a:/# sed -ie 's#^acl localnet src 192.168.0.0/16.*#acl localnet src 192.168.33.0/24\nacl localnet src 192.168.11.0/24#g' /etc/squid/squid.conf
root@be8ca382678a:/# sed -i '/^http_access allow localhost$/i http_access allow localnet' /etc/squid/squid.conf

最後に、文末に上位プロキシを指定するための設定を追加する。

root@be8ca382678a:/# sed -i '$ a cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange\nnever_direct allow all' /etc/squid/squid.conf

最終的に、squid.confは以下のようになる。★箇所が追加箇所となる。

root@be8ca382678a:/etc/squid# cat /etc/squid/squid.conf
acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8             # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
acl localnet src 192.168.33.0/24   ★
acl localnet src 192.168.11.0/24   ★

~(中略)~

cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange   ★
never_direct allow all   ★

5. Squidを起動

Squidをバックグラウンドで起動させる。

root@be8ca382678a:/etc/squid# /usr/sbin/squid -N -f /etc/squid/squid.conf &
[1] 3995
root@be8ca382678a:/etc/squid# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 21:23 pts/0    00:00:00 bash
root      3821     0  0 21:36 pts/1    00:00:00 bash
proxy     3995  3821  4 22:38 pts/1    00:00:00 /usr/sbin/squid -N -f /etc/squid/squid.conf
proxy     3996  3995  0 22:38 ?        00:00:00 (logfile-daemon) /var/log/squid/access.log
proxy     3997  3995  0 22:38 ?        00:00:00 (pinger)
root      3998  3821  0 22:39 pts/1    00:00:00 ps -ef

これにて、手作業でDebianコンテナ+Squid構築が完了となる。

Dockerfileを作ってコンテナを作成

1. Dockerfileを作成

先ほどの手作業で確認したコマンドをDockerfileに落とし込む。sedコマンドは1コマンドで実行するように修正した。注意事項として、sedのコメントと空白行の削除処理は、最後に実施するようにすること。そうしないと、文末に設定追加がうまく動作しない

また、aptを使うと「WARNING: apt does not have a stable CLI interface. Use with caution in scripts.」の警告が表示される。どうらやコマンドラインで人が実行する際はaptコマンドが推奨で、スクリプトで使用する場合はapt-getコマンドが推奨のようだ。そのため、Dockerfileでもapt-getコマンドに修正している。

ちなみに、apt-getコマンドに修正しても「debconf: delaying package configuration, since apt-utils is not installed」の警告が表示されるが、これは無視しても問題ないようだ。

FROM debian

ENV http_proxy=http://192.168.33.23:8080 https_proxy=http://192.168.33.23:8080
RUN apt-get update && apt-get install squid vim procps curl -y && apt-get clean
RUN sed -i \
        -e 's#^acl localnet src 192.168.0.0/16.*#acl localnet src 192.168.33.0/24\nacl localnet src 192.168.11.0/24#g' \
        -e '/^http_access allow localhost$/i http_access allow localnet' \
        -e '$ a cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange\nnever_direct allow all' \
        -e '/^#/d' -e '/^$/d' \
    /etc/squid/squid.conf

EXPOSE 3128
CMD /usr/sbin/squid -N -f /etc/squid/squid.conf

2. 作成したDockerfileを使って、イメージをビルド

Dockerfileを保存したディレクトリに移動し、docker buildコマンドを使ってイメージをビルドする。

# cd debian-squid/
# docker build -t debian-squid:1 .
Sending build context to Docker daemon   2.56kB
Step 1/6 : FROM debian
 ---> 1b686a95ddbf
Step 2/6 : ENV http_proxy=http://192.168.33.23:8080 https_proxy=http://192.168.33.23:8080
 ---> Running in 64de1ce30c0b
Removing intermediate container 64de1ce30c0b
 ---> b9f23e0c03dc

~(中略)~

Step 6/6 : CMD /usr/sbin/squid -N -f /etc/squid/squid.conf
 ---> Running in 3d9df1d00113
Removing intermediate container 3d9df1d00113
 ---> 520b5db11824
Successfully built 520b5db11824

作成したイメージを確認してみると、「debian-squid」のイメージが作成された。ただ、残念ながらSquidをインストールしたことによって、CentOSコンテナよりも容量は大きくなるという結果になってしまった。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian-squid        1                   520b5db11824        7 minutes ago       359MB
debian              latest              1b686a95ddbf        4 days ago          114MB
centos              7.6.1810            f1cb7c7d58b7        15 months ago       202MB

3. コンテナを起動

docker runコマンドで作成したイメージからコンテナを作成・起動する。

# docker run -d -p 8081:3128 --name "debian-squid" debian-squid:1
da4d21364aee5785c8ced2997757ba793d42dfdc59b03bac1bb25ddefe7e5b1c

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
da4d21364aee        debian-squid:1      "/bin/sh -c '/usr/sb…"   4 seconds ago       Up 3 seconds        0.0.0.0:8081->3128/tcp   debian-squid
96b890f0e14d        docker-squid:1      "/bin/sh -c '/usr/sb…"   6 days ago          Up 6 days           0.0.0.0:8080->3128/tcp   docker-squid

4. Squidの動作確認

最後に、ホストOSの8081番ポートにてプロキシが正常に機能していることを確認してみる。curlコマンドを使って確認すると「HTTP/1.1 200 OK」が返ってきており、正常に動作していることが確認できた。

# export http_proxy=https://127.0.0.1:8081
# export https_proxy=https://127.0.0.1:8081

# curl -v http://www.google.co.jp
* About to connect() to proxy 127.0.0.1 port 8081 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8081 (#0)
> GET http://www.google.co.jp/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.google.co.jp
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK

まとめ

前回のCentOSコンテナに引き続き、Debianコンテナでも同様にSquidを構築することができた。yumではなくapt-get(およびapt)を使うことが大きな違いで、それ以外は細かい差異はあるものの、問題なく構築することができた。

Dockerfileを作成する際には、設定ファイル編集の処理などでsedを駆使する必要があるので、sedの使い方や正規表現の理解が重要と感じた。

2020年6月13日土曜日

【PowerCLI】仮想マシンに対してファイルコピー・取得をする「Copy-VMGuestFile」

PowerCLIでは、直接仮想マシンにコマンドを実行する機能がある。この機能を使うと、全仮想マシンの設定変更や情報取得を一発で行うことができたり、仮想マシンにログインせずともファイルをコピー・取得することが実現できる

Invoke-VMScriptと同様に、このコマンドは非常に有用なので、コマンドの使い方を調べて、実際に試してみた。

環境及び前提条件

環境

  • vSphere 6.7 Update 3

前提条件

  • vCenter ServerでESXi管理されていること (要するに無償版のESXiライセンスの環境ではないこと)
  • 仮想マシンにVMware Toolsがインストールされていること

仮想マシンに対してファイルコピー・取得をするCopy-VMGuestFile

PowerCLIを実行する環境 (ローカル) からファイルを仮想マシンにコピーしたり、逆に仮想マシンのファイルを取得するコマンドレットとして、Copy-VMGuestFileが用意されている。構文は以下の通り。

# ローカルから仮想マシンへファイルをコピー
Copy-VMGuestFile [-Source] <String[]> [-Destination] <String> -LocalToGuest [-Force] [-VM] <VirtualMachine[]> [-HostCredential <PSCredential>] [-HostUser <String>] [-HostPassword <SecureString>] [-GuestCredential <PSCredential>] [-GuestUser <String>] [-GuestPassword <SecureString>] [-ToolsWaitSecs <Int32>] [-Server <VIServer[]>] [-WhatIf] [-Confirm] [<CommonParameters>] 

# 仮想マシンからローカルへファイルを取得
Copy-VMGuestFile [-Source] <String[]> [-Destination] <String> -GuestToLocal [-Force] [-VM] <VirtualMachine[]> [-HostCredential <PSCredential>] [-HostUser <String>] [-HostPassword <SecureString>] [-GuestCredential <PSCredential>] [-GuestUser <String>] [-GuestPassword <SecureString>] [-ToolsWaitSecs <Int32>] [-Server <VIServer[]>] [-WhatIf] [-Confirm] [<CommonParameters>]

必要となるパラメータの説明を以下に記載する。

パラメータ 内容
LocalToGuest ローカルから仮想マシンにコピーする際に指定。GuestToLocalとは同時に使用できない。
GuestToLocal 仮想マシンからローカルにコピーする際に指定。LocalToGuestとは同時に使用できない。
VM 仮想マシン名を指定する。
GuestUser 仮想マシンのユーザを指定する。
GuestPassword 仮想マシンのパスワードを指定する。
Source ローカルのファイル配置場所を指定。間違いを防ぐために、フルパス指定を推奨
Destination 仮想マシンのファイル配置場所を指定。間違いを防ぐために、フルパス指定を推奨
(Optional) Force ファイルを上書きする場合や、保存先フォルダを自動生成してファイルコピーする場合に指定する。誤ってフォルダ作ったりファイルを上書きする危険なパラメータなので、利用する際は注意すること

ローカルから仮想マシンへファイルをコピー

テスト用のファイルとして、「text.txt」を用意し、ローカルから仮想マシンへコピーしてみることにする。

まずはファイルが存在しないことを確認する。

PS C:\> $str = "dir c:\Users\Administrator\Desktop"
PS C:\> Invoke-VMScript -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd" -ScriptText $str

ScriptOutput
---------------------------------------------------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------------------------------------------------

Copy-VMGuestFileにて、仮想マシンにファイルをコピーする。

PS C:\> Copy-VMGuestFile -LocalToGuest -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd" -Source "c:\work\test.txt" -Destination "c:\Users\Administrator\Desktop\"

コピー後に再度ファイルの確認をすると、「text.txt」が仮想マシンにコピーされていることがわかる。

PS C:\> Invoke-VMScript -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd" -ScriptText $str

ScriptOutput
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
|      ディレクトリ: C:\Users\Administrator\Desktop
|
|
|  Mode                LastWriteTime         Length Name
|  ----                -------------         ------ ----
|  -a----       2020/05/23     16:42             27 test.txt
|
|
|
---------------------------------------------------------------------------------------------------------------------------------------------

仮想マシンからローカルへファイルを取得

今度は逆に仮想マシンからファイルを取得してみる。テスト用のファイルとして、「text2.txt」を仮想マシン上に用意しておく。

まずはローカルにファイルが存在しないことを確認する。

PS C:\> dir c:\work


    ディレクトリ: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/05/23     16:09             27 test.txt

Copy-VMGuestFile`にて、ファイルを取得する。

PS C:\> Copy-VMGuestFile -GuestToLocal -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd" -Source "c:\Users\Administrator\Desktop\test2.txt" -Destination "c:\work\"

コピー後に再度ファイルの確認をすると、「text2.txt」をローカルに取得できていることがわかる。

PS C:\> dir c:\work


    ディレクトリ: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/05/23     16:09             27 test.txt
-a----       2020/05/23     18:30             27 test2.txt

コピー時にファイルを上書きする

すでにファイルが存在する場合の動作を確認しておこう。ファイルが存在する場合は、上書きできず失敗する。

PS C:\> Copy-VMGuestFile -LocalToGuest -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd" -Source "c:\work\test.txt" -Destination "c:\Users\Administrator\Desktop\"
Copy-VMGuestFile : 2020/05/23 16:16:44  Copy-VMGuestFile                The specified file 'c:\Users\Administrator\Desktop\test.txt' exists in VM 'win2016'.
 Specify 'Force' parameter in order to override it.
発生場所 行:1 文字:1
+ Copy-VMGuestFile -LocalToGuest -VM win2016 -GuestUser "Administrator" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (c:\Users\Administrator\Desktop\:String) [Copy-VMGuestFile]、ViError
    + FullyQualifiedErrorId : Client20_VmGuestServiceImpl_CopyFileFromHostToGuest_DestinationFileExists,VMware.VimAutomation.ViCore.Cmdlets.
   Commands.CopyVMGuestFile

この場合は。-Forceを付けて実行する。

PS C:\> Copy-VMGuestFile -LocalToGuest -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd" -Source "c:\work\test.txt" -Destination "c:\Users\Administrator\Desktop\" -Force

以下の通りファイルが上書きでコピーされる (LastWriteTimeが更新されることからファイル上書きを確認できる)。

PS C:\> Invoke-VMScript -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd" -ScriptText $str

ScriptOutput
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
|      ディレクトリ: C:\Users\Administrator\Desktop
|
|
|  Mode                LastWriteTime         Length Name
|  ----                -------------         ------ ----
|  -a----       2020/05/23     16:48             27 test.txt
|
|
|
---------------------------------------------------------------------------------------------------------------------------------------------

コピー先にフォルダを自動作成する

コピー先にフォルダが存在しない場合も、当然失敗するが、-Forceを付ければ、フォルダを作成したうえでファイルをコピーしてくれる。

PS C:\> Copy-VMGuestFile -LocalToGuest -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd" -Source "c:\work\test.txt" -Destination "c:\Users\Administrator\Desktop\folder\" -Force

以下の通り「folder」フォルダを作ったうえで、ファイルがコピーされた。

PS C:\> Invoke-VMScript -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd" -ScriptText $str

ScriptOutput
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
|      ディレクトリ: C:\Users\Administrator\Desktop\folder
|
|
|  Mode                LastWriteTime         Length Name
|  ----                -------------         ------ ----
|  -a----       2020/05/23     16:50             27 test.txt
|
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
2020年6月9日火曜日

Docker入門 (Dockerfileを作ってコンテナを作成する)

前回はDocker入門として、Dockerのインストールと各種コマンドを使ってCentOS 7のコンテナを作成し、Squidを動作させる手順を記事にした。

★前回の記事はこちら↓
Docker入門 (CentOS 7にDocker CEインストール&CentOSコンテナを作成してSquidを動かす)

上記において、CentOSのコンテナ作成後に、yumによるパッケージインストールや設定ファイルの修正などの各種処理を実施している。Dockerではこれらの手作業で実施していた処理を自動化することができ、「Dockerfile」と呼ばれる定義ファイルにあらかじめ処理を記載しておくことで実現する。

今回は前回手作業で作成したCentOS 7 + SquidのコンテナをDockerfileを使って自動作成する手順について記載する。

環境

  • OS : CentOS 7.8
  • Docker : 19.03.10
  • コンテナ上のCnetOS : 7.6 (あえてホストとは別バージョンにしてみた)

Dockerfile作成

Dockerfileでは、「命令」として定義された文字列の後に、実際にコンテナで実行したいコマンドなどを記述することで作成される。主な「命令」は以下の通りとなる。

命令 説明
FROM ベースとするイメージを指定する。今回はCentOS 7を使用するが、Docker推奨はDebianのイメージを使うことらしい。
ENV 環境変数を設定。
RUN イメージ作成のためのコマンドを記載する。
CMD 作成したイメージからコンテナを作成する際に実行するデフォルトのコマンドを記載する。Dockerfile内に1個だけ記載することができる。RUNと似ているが、RUNはイメージ作成時に実行するコマンドに対し、CMDはコンテナ作成時に実行するデフォルトのコマンドとなる。したがって、CMDで定義したコマンドはイメージ作成時には実行されることはない
EXPOSE コンテナが使用する(LISTENする)ポートを指定する。実際は記載しなくてもdocker run実行時に-pでポートを指定すればコンテナの任意のポートをホストに公開できるため、あくまでも人間がDockerfileを見た際に、コンテナが使用するポートを理解するための命令として用意しているようだ。

Dockerfileにて必要な命令を記述し、上から順に実行していくことでコンテナのイメージを作成していくことができる。この際に、可能な限り命令は少なくなるよう構成することが望ましい。というのもDockerでは、Dockefileの各命令が実行される際に再利用を目的として、「レイヤ」と呼ばれる命令実行時点のイメージの静止点を保持するのだが、このレイヤが多くなればなるほど、処理に時間を要するためである。

例として、実際のDockerfileで見てみよう。以下は私が最初に作成したCentOS 7でSquidを動作させるイメージを作成するためのDockerfileとなる。FROMENVRUNEXPOSEの命令が合計8個定義されていることがわかる。

FROM centos:7.6.1810

ENV http_proxy http://192.168.33.23:8080
ENV https_proxy http://192.168.33.23:8080
RUN yum install squid -y
RUN yum clean all
RUN systemctl enable squid
RUN echo $'\n\
acl localnet src 192.168.33.0/24\n\
acl localnet src 192.168.11.0/24\n\
cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange\n\
never_direct allow all\n\
' >> /etc/squid/squid.conf

EXPOSE 3128

最終的に整理したDockerfileは以下の通り。命令は6つに集約されていることがわかる。また、以下もあわせて改善した。

  • squid.confへの追記において、一部設定ファイルの途中に追記が必要な設定があるためsedによる追記に修正
  • echoを視認性の高い記載に変更
  • docker runコマンド時に--privilegedオプション使わないようにするため、CMD命令にてSquidを実行する形式に変更
FROM centos:7.6.1810

ENV http_proxy=http://192.168.33.23:8080 https_proxy=http://192.168.33.23:8080
RUN yum install squid -y && yum clean all
RUN sed -ie "/^acl SSL_ports port 443$/i acl localnet src 192.168.33.0/24\nacl localnet src 192.168.11.0/24\n" /etc/squid/squid.conf && \
    { \
      echo ; \
      echo "cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange"; \
      echo "never_direct allow all"; \
    } >> /etc/squid/squid.conf

EXPOSE 3128
CMD /usr/sbin/squid -N -f /etc/squid/squid.conf

イメージをビルド

イメージのビルドはdocker buildコマンドで行う。指定したディレクトリにあるファイルをすべて読み取ってしまうことから、ビルドは必ずDockerfileだけが置いてあるディレクトリを作成したうえで実行すること。ビルドを実行すると、定義した命令単位でStepとして実行していくことがわかる。

# cd docker-squid/
# docker build -t docker-squid:1 .
Sending build context to Docker daemon   2.56kB
Step 1/6 : FROM centos:7.6.1810
 ---> f1cb7c7d58b7
Step 2/6 : ENV http_proxy=http://192.168.33.23:8080 https_proxy=http://192.168.33.23:8080
 ---> Running in 286323b4dd03
Removing intermediate container 286323b4dd03
 ---> e7e0e325cbc6
Step 3/6 : RUN yum install squid -y && yum clean all
 ---> Running in e647c5926282
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: ftp-srv2.kddilabs.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
Resolving Dependencies
--> Running transaction check
---> Package squid.x86_64 7:3.5.20-15.el7_8.1 will be installed
--> Processing Dependency: squid-migration-script for package: 7:squid-3.5.20-15.el7_8.1.x86_64
--> Processing Dependency: perl(warnings) for package: 7:squid-3.5.20-15.el7_8.1.x86_64

~(中略)~

  perl-threads.x86_64 0:1.87-4.el7
  perl-threads-shared.x86_64 0:1.43-6.el7
  squid-migration-script.x86_64 7:3.5.20-15.el7_8.1

Complete!
Loaded plugins: fastestmirror, ovl
Cleaning repos: base extras updates
Cleaning up list of fastest mirrors
Removing intermediate container e647c5926282
 ---> bfded9857d0d
Step 4/6 : RUN sed -ie "/^acl SSL_ports port 443$/i acl localnet src 192.168.33.0/24\nacl localnet src 192.168.11.0/24\n" /etc/squid/squid.conf &&     {       echo ;       echo "cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange";       echo "never_direct allow all";     } >> /etc/squid/squid.conf
 ---> Running in 1d6f2d20160e
Removing intermediate container 1d6f2d20160e
 ---> f24da713ae42
Step 5/6 : EXPOSE 3128
 ---> Running in ac90cbd1e261
Removing intermediate container ac90cbd1e261
 ---> 5bc1a6aecb60
Step 6/6 : CMD /usr/sbin/squid -N -f /etc/squid/squid.conf
 ---> Running in 3c8415dcd16e
Removing intermediate container 3c8415dcd16e
 ---> 5df56d944119
Successfully built 5df56d944119
Successfully tagged docker-squid:1

作成したイメージを確認してみると、「docker-squid」のイメージが作成された。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker-squid        1                   5df56d944119        18 seconds ago      275MB
centos              7.6.1810            f1cb7c7d58b7        14 months ago       202MB

コンテナ作成

作成したイメージからコンテナを作成する。systemctlを使う場合はdocker runコマンド実行時に--privilegedオプションが必要だったが、今回はsystemctlを使用しないため不要となる。

# docker run -d -p 8080:3128 --name "docker-squid" docker-squid:1
96b890f0e14df96a433014cd42eecc37d587aa210dd92846840d02268c7e06ca

docker psコマンドでコンテナを確認する。コンテナが正常に起動していることを確認できる。

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
96b890f0e14d        docker-squid:1      "/bin/sh -c '/usr/sb…"   7 seconds ago       Up 6 seconds        0.0.0.0:8080->3128/tcp   docker-squid

動作確認

実際にコンテナにログインして、設定状況などを確認してみよう。

まず、squid.confを確認すると、必要な設定が追記されていることが確認できる。

# docker exec -it docker-squid bash
[root@96b890f0e14d /]# cat /etc/squid/squid.conf
#
# Recommended minimum configuration:
#

~(中略)~

acl localnet src 192.168.33.0/24
acl localnet src 192.168.11.0/24

~(中略)~

cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange
never_direct allow all

squidのプロセスも問題なく起動している。

[root@96b890f0e14d /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
squid        1     0  0 09:12 ?        00:00:00 /usr/sbin/squid -N -f /etc/squid/squi
squid        6     1  0 09:12 ?        00:00:00 (logfile-daemon) /var/log/squid/acces
root        27     0  0 09:15 pts/0    00:00:00 bash
root        42    27  0 09:16 pts/0    00:00:00 ps -ef

最後に、ホストOSの8080番ポートにてプロキシが正常に機能していることを確認してみる。curlコマンドを使って確認すると「HTTP/1.1 200 OK」が返ってきており、正常に動作していることが確認できた。

# export http_proxy=https://127.0.0.1:8080
# export https_proxy=https://127.0.0.1:8080
# curl -v http://www.google.co.jp
* About to connect() to proxy 127.0.0.1 port 8080 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET http://www.google.co.jp/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.google.co.jp
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK

~(以下略)~

まとめ

前回は手作業で実施していたコンテナ作成後の各種処理をDockerfileにて自動化することができた。Dockerfileは、参考サイトに記載した「Dockerfile のベストプラクティス」に、各種ベストプラクティスがまとめられているので、作成する際には一読しておいたほうがよいだろう。

参考

2020年6月6日土曜日

Docker入門 (CentOS 7にDocker CEインストール&CentOSコンテナを作成してSquidを動かす)

Docker自体には興味があったのだが、なかなか時間が取れず、検証することを避けてきていたのだが、そろそろ基本的なところだけでも押さえておきたいと思い始めた。

今回、CentOS 7の環境にDockerのコンテナ環境を構築し、Docker上にCentOSコンテナを立ち上げてSquidのプロキシサーバを構築してみるという検証を実施した。

環境

  • OS : CentOS 7.8
  • Docker : 19.03.10
  • コンテナ上のCnetOS : 7.6 (あえてホストとは別バージョンにしてみた)

Dockerインストール手順

Docker CEのインストール

現在Dockerは、有償版のDcoker EE (Enterprise Edition)と無償版のDcoker CE (Community Edition)の2つに分かれており、通常使うものは当然、Docker CEとなる。

CentOSインストール後にyum install dockerを実行することでもインストールされるが、この手順ではDockerのバージョンが1.13.1という古いバージョンがインストールされてしまう。したがって、本家サイトの手順に従いインストールを行うことが推奨される。
※なお、バージョン1.13.1は、Dcoker EE/CE分割前の最終バージョンとなる。

yum-config-managerを使ってDockerのレポジトリ登録するため、yum-utilsをインストールする。

# yum install yum-utils -y

yum-config-managerを使ってDockerのレポジトリ登録する。

# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Docker CEをインストールする。

# yum install docker-ce docker-ce-cli containerd.io -y

Dockerを起動させてみる。

# systemctl start docker
# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2020-05-31 16:16:14 JST; 3s ago
     Docs: https://docs.docker.com
 Main PID: 1698 (dockerd)
    Tasks: 8
   Memory: 37.8M
   CGroup: /system.slice/docker.service
           mq1698 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/cont...

~(以下略)~

# systemctl enable docker

docker -vコマンドでバージョンを確認すると、Docker version 19.03.10がインストールされていることが確認できる。

# docker -v
Docker version 19.03.10, build 9424aeaee9

docker versionコマンドを使うと、さらに詳細な情報を確認することができる。

# docker version
Client: Docker Engine - Community
 Version:           19.03.10
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        9424aeaee9
 Built:             Thu May 28 22:18:06 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.10
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       9424aeaee9
  Built:            Thu May 28 22:16:43 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

プロキシ環境がある場合の設定

Dockerは「Docker Hub」と呼ばれる、Dockerのイメージが保存されているサイトからインターネット経由でイメージのダウンロードを行いコンテナを作成する。

直接インターネットと通信できる環境であれば問題ないが、プロキシ環境がある場合は、Dockerのサービス起動ファイル「/usr/lib/systemd/system/docker.service」の[Service]句に、以下のようにプロキシ用の環境変数を設定を追加する。

[Service] ←★Service句の配下に追記
Environment="http_proxy=http://192.168.33.23:8080" "https_proxy=http://192.168.33.23:8080"

設定反映のため、Dockerを再起動する。

# systemctl daemon-reload
# systemctl restart docker

docker infoコマンドで環境変数が反映されていることを確認する。

# docker info

~(中略)~

 HTTP Proxy: http://192.168.33.23:8080
 HTTPS Proxy: http://192.168.33.23:8080

~(以下略)~

「hello-world」コンテナを作成・起動

Dockerの動作確認のためのテスト用コンテナである「hello-world」コンテナを作成・起動してみる。docker runコマンドにてコンテナを作成・起動できる。

# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

docker psコマンドでコンテナの確認ができる。停止状態のコンテナ含め表示させるには、-aオプションを付けて実行する。

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
bf385414bac4        hello-world         "/hello"            19 seconds ago      Exited (0) 18 seconds ago                       magical_roentgen

docker imagesコマンドで保持しているイメージを確認できる。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

コンテナやイメージの削除は本題から逸れるので、また別の機会に記載することにし、先に進むことにする。

CentOS 7のイメージ取得とコンテナ作成・起動

コンテナのイメージ取得

Docker Hubのイメージを検索するにはdocker searchコマンドを使う。「centos」で検索すると複数出てくるが、今回は1つ目に表示される「centos」イメージを使ってコンテナを作成する。

# docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   6020                [OK]
ansible/centos7-ansible            Ansible on Centos7                              129                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session …   115                                     [OK]
jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos -  …   114                                     [OK]
centos/mysql-57-centos7            MySQL 5.7 SQL database server                   76
imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              58                                      [OK]
tutum/centos                       Simple CentOS docker image with SSH access      46
centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relational  …   44
kinogmt/centos-ssh                 CentOS with SSH                                 29                                      [OK]
pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag names …   12
guyton/centos6                     From official centos6 container with full up …   10                                      [OK]
centos/tools                       Docker image that has systems administration …   6                                       [OK]
drecom/centos-ruby                 centos ruby                                     6                                       [OK]
pivotaldata/centos                 Base centos, freshened up a little with a Do …   4
darksheer/centos                   Base Centos Image -- Updated hourly             3                                       [OK]
mamohr/centos-java                 Oracle Java 8 Docker image based on Centos 7    3                                       [OK]
pivotaldata/centos-mingw           Using the mingw toolchain to cross-compile t …   3
pivotaldata/centos-gcc-toolchain   CentOS with a toolchain, but unaffiliated wi …   3
miko2u/centos6                     CentOS6 日本語環境                                   2                                       [OK]
indigo/centos-maven                Vanilla CentOS 7 with Oracle Java Developmen …   1                                       [OK]
blacklabelops/centos               CentOS Base Image! Built and Updates Daily!     1                                       [OK]
mcnaughton/centos-base             centos base image                               1                                       [OK]
pivotaldata/centos7-dev            CentosOS 7 image for GPDB development           0
pivotaldata/centos6.8-dev          CentosOS 6.8 image for GPDB development         0
smartentry/centos                  centos with smartentry                          0

なお、イメージにはバージョンがあり、「centos」の場合は、7.1、7.2、…7.7といった複数バージョンを選択できる。バージョンの確認は残念ながらdockerコマンドでは実装されていないようなので、ブラウザなので直接確認する。

今回は、あえてバージョン指定をして、「centos:7.6.1810」にてコンテナ作成をすることにする。docker pullコマンドで、Docker Hubからイメージを取得する。

# docker pull centos:7.6.1810

イメージを確認するには、docker imagesコマンドを使用する。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.6.1810            f1cb7c7d58b7        14 months ago       202MB

なお、取得したイメージの総容量を表示したい場合は、docker system dfコマンドを使用する。

# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              1                   0                   201.8MB             201.8MB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B

コンテナ作成・起動

それではコンテナを作成しよう。docker runコマンドにてイメージからコンテナを作成し起動することができる。最後に付与している/sbin/initsystemctlを使うための指定となる。

# docker run -d --privileged -p 8080:3128 --name "docker-squid" centos:7.6.1810 /sbin/init
4cb7fd3a1bc43aecea24ea23c5f8b318c3a9be45a08698eaa7a254cef7800af6

オプションの説明は以下の通り。

オプション 説明
-d コンテナをデタッチド・モード(バックグラウンド)で起動。
–privileged コンテナを特権モードで起動する。systemctlコマンドを使用するために指定が必要。
-p コンテナのポートとホスト側のポートを紐づける。:で指定。今回は、コンテナのSquidデフォルトポートである3128をホストの8080番ポートに紐づける。
–name コンテナの名前を指定。

docker psコマンドでコンテナが作成されていることを確認しておく。

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
4cb7fd3a1bc4        centos:7.6.1810     "/sbin/init"        5 seconds ago       Up 4 seconds        0.0.0.0:8080->3128/tcp   docker-squid

それではコンテナのCentOSにログインしてみよう。「docker-squid」コンテナに対して、bashでログインするには、docker execコマンドを用いて以下のように記載する。

# docker exec -it docker-squid bash
[root@4cb7fd3a1bc4 /]# ←★プロンプトが変化する

コンテナにSquidをインストール

コンテナにログインしたら、yumをつかってsquidをインストールする。特に通常のCentOSと違いはなく、問題なくインストールが完了した。

[root@4cb7fd3a1bc4 /]# yum install squid -y
[root@4cb7fd3a1bc4 /]# squid -v
Squid Cache: Version 3.5.20

squidは最低限の通信が確認できるよう、「/etc/squid/squid.conf」に対して以下を追記した。通信を許可するネットワークと上位プロキシを設定している。

acl localnet src 192.168.33.0/24
acl localnet src 192.168.11.0/24
cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange
never_direct allow all

squidを起動する。

[root@4cb7fd3a1bc4 /]# systemctl start squid
[root@4cb7fd3a1bc4 /]# systemctl enable squid

動作確認

まずは、コンテナ内でsquidの動作を確認してみる。環境変数でローカルアドレスの3128番ポートに対して、curlコマンドを使って通信確認をすると、「HTTP/1.1 200 OK」が出力されており問題なく通信できていることが確認できた。

[root@4cb7fd3a1bc4 /]# export http_proxy=http://127.0.0.1:3128
[root@4cb7fd3a1bc4 /]# export https_proxy=http://127.0.0.1:3128
[root@4cb7fd3a1bc4 /]# curl -v http://www.google.co.jp
* About to connect() to proxy 127.0.0.1 port 3128 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 3128 (#0)
> GET http://www.google.co.jp/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.google.co.jp
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK

~(以下略)~

次に、コンテナからexitコマンドでログオフしたのち、コンテナの3128番ポートと紐づいている8080番ポートを指定して再度確認すると、「HTTP/1.1 200 OK」が出力され、問題なくホストOSからコンテナのsquidに対して通信できていることが確認できた。

# export http_proxy=http://127.0.0.1:8080
# export https_proxy=http://127.0.0.1:8080
# curl -v http://www.google.co.jp
* About to connect() to proxy 127.0.0.1 port 8080 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET http://www.google.co.jp/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.google.co.jp
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK

~(以下略)~

まとめ

以上でDockerの基本的な使い方を理解することができた。最後に、今回使用したDockerのコマンドをまとめておくことにする。

コマンド 内容
docker version Dockerのバージョン表示。docker -vより詳細な出力。
docker info Dockerで設定されている各種設定値(環境変数など)の情報出力。
docker run コンテナを作成・起動。
docker ps 起動中のコンテナを一覧表示。
docker ps -a 停止中のコンテナを含め、コンテナを一覧表示。
docker images イメージを一覧表示。
docker search Docker Hubのイメージを検索。
docker pull Docker Hubからイメージを取得。
docker exec 起動中のコンテナにてコマンドを実行。

参考

人気の投稿