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/init
もsystemctl
を使うための指定となる。
# 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 |
起動中のコンテナにてコマンドを実行。 |
このコメントはブログの管理者によって削除されました。
返信削除