Docker | AWS EC2を使用したDockerの基本的な利用方法

AWSとは,Amazon Web Servicesの略であり,アマゾンが提供するクラウドサービスである.AWSを利用してWebサーバーを構築する代表的な方法は,以下2通りある.

・Amazon Simple Storage Service (Amazon S3)
・Amazon Elastic Compute Cloud (Amazon EC2)

Amazon S3ではアプリケーションサーバを動かすことができないので,PHPなどのサーバーサイドプログラムなどを動かすことはできず,静的ファイルしか扱えない.Amazon EC2ではApacheなどのアプリケーションサーバをインストール可能なので,Pythonなどのバックエンド言語を利用することができる.S3では静的Webサイトをホスティングし,EC2ではWordPressなどの動的Webサイトを構築する.

Dockerとは,動作が非常に軽量であり,コンテナを使用してアプリケーションを構築,テスト,デプロイできるソフトウェアプラットフォームである.

今回は,AWS EC2を利用したDockerの一通りの利用方法をこの記事にて記す.

AWS EC2を使用したDockerの利用方法

AWS EC2でインスタンス作成

AWSにログインすると,以下画面になるので,"Launch instances"をクリックする.なお,AWSのアカウントおよびIAMユーザーの作成方法はこちらの記事で説明した.

以下画面に遷移するので,今回作成するインスタンスの名前を入力し,スクロールダウンする.

以下画面に遷移する.今回,Amazon Linuxを選択した.スクロールダウンする.

以下画面に遷移する.私の場合,すでに取得しているキーペアを利用した.その後,スクロールダウンする.なお,キーペアの作成方法は,こちらの記事の1(1)を参照すること.

以下画面になるので,希望する項目にチェックを入れ,スクロールダウンする.なお,私の場合,デフォルトのままで変更はしていない.

以下画面になるので,スクロールダウンする.

最下部である以下画面になるので,"Launch instance"をクリックする.

以下画面に遷移する.赤枠の"Instance ID"をクリックする.

以下画面に遷移する.今回作成したインスタンス(docker_test)が表示されている.赤枠の"Instance ID"をクリックする.

以下画面に遷移する."Action"をクリックし,"Connect"を選択する.

以下画面に遷移するので,"Connect"をクリックする.

新しいタブでターミナルが開かれるので,ここでコマンド操作をする.

Dockerの基本コマンド

Docker Run

以下コマンドを実行し,Rootに変更する.

$ sudo -i

以下コマンドを実行し,Dockerをインストールする.途中で問題ないか質問されるので,"y"ボタンをクリックすると,インストールが完了する.

# yum install docker

Dockerのインストールが完了したので,以下コマンドを実行すると,Dockerのバージョンが表示される.

# docker --version
Docker version 20.10.17, build 100c701

以下コマンドを実行すると,現在のdockerの情報が表示される.現状docker daemonに接続することができないことがわかる.

# docker info
Client:
 Context:    default
 Debug Mode: false

Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info

以下コマンドを実行し,dockerのサービスを始める.

# service docker start
Redirecting to /bin/systemctl start docker.service

再度以下コマンドを実行すると,以下のように表示される.なお,表示させたくない箇所には,手動で"xxx"に変更している(以降でも同様に対応済み).

まだ作成していないので,Containerの数は0になっており,Docker Swarm(Docker社が提供しているオーケストレーションツール)は現状inactiveになっている.

# docker info
Client:
 Context:    default
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.17
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: xxx
 runc version: xxx
 init version: xxx
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.10.162-141.675.amzn2.x86_64
 Operating System: Amazon Linux 2
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 964.8MiB
 Name: ip-xxx
 ID: xxx
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  xxx
 Live Restore Enabled: false

以下コマンドを実行し,hello-worldイメージをpullする.

# docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
xxx: Pull complete 
Digest: sha256:xxx
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のイメージ一覧を表示させる.以下のようにイメージの一覧が表示される.

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

“docker run hello-world"を実行後に出力した内容に記載のある"docker run -it ubuntu bash"(“docker run -i -t ubuntu bash"の省略形)を実行する.

ubuntuのコンテナを起動させることができる.

# docker run -it ubuntu bash

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
677076032cca: Pull complete 
Digest: sha256:xxx
Status: Downloaded newer image for ubuntu:latest

ubuntuのディレクトリに移動するので,以下(“pwd"=>"ls")を実行すると,docker container内のubuntuの各ディレクトリを表示させることができた.抜け出す場合には,"exit"を実行する.

# pwd
/

# ls
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr

# exit

以下を実行すると,ubuntuイメージが表示される.

# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
ubuntu        latest    xxxxxxxxxxxx   13 days ago     77.8MB
hello-world   latest    xxxxxxxxxxxx   16 months ago   13.3kB

以下を実行すると,version 10.3のmariadbイメージがpullされる.

# docker pull mariadb:10.3

以下を実行すると,dockerで実行したコマンドを確認できる.

# history
    1  yum install docker
    2  docker --version
    3  docker info
    4  start docker.service
    5  service docker start
    6  docker info
    7  exit
    8  docker images
    9  docker run my-docker-test
   10  docker images
   11  docker run hello-world
   12  docker images
   13  docker run -it ubuntu bash
   14  docker images
   15  docker pull mariadb:10.3
   16  docker images
   17  history

以下を実行すると,docker runのオプションがすべて表示される.

# docker run --help

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to
                                       disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device weight) (default [])
      --cap-add list                   Add Linux capabilities
      --cap-drop list                  Drop Linux capabilities
      --cgroup-parent string           Optional parent cgroup for the container
      --cgroupns string                Cgroup namespace to use (host|private)
                                       'host':    Run the container in the Docker host's cgroup
                                       namespace
                                       'private': Run the container in its own private cgroup
                                       namespace
                                       '':        Use the cgroup namespace as configured by the
                                                  default-cgroupns-mode option on the daemon (default)
      --cidfile string                 Write the container ID to the file
      --cpu-period int                 Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int                  Limit CPU CFS (Completely Fair Scheduler) quota
      --cpu-rt-period int              Limit CPU real-time period in microseconds
      --cpu-rt-runtime int             Limit CPU real-time runtime in microseconds
  -c, --cpu-shares int                 CPU shares (relative weight)
      --cpus decimal                   Number of CPUs
      --cpuset-cpus string             CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string             MEMs in which to allow execution (0-3, 0,1)
  -d, --detach                         Run container in background and print container ID
      --detach-keys string             Override the key sequence for detaching a container
      --device list                    Add a host device to the container
      --device-cgroup-rule list        Add a rule to the cgroup allowed devices list
      --device-read-bps list           Limit read rate (bytes per second) from a device (default [])
      --device-read-iops list          Limit read rate (IO per second) from a device (default [])
      --device-write-bps list          Limit write rate (bytes per second) to a device (default [])
      --device-write-iops list         Limit write rate (IO per second) to a device (default [])
      --disable-content-trust          Skip image verification (default true)
      --dns list                       Set custom DNS servers
      --dns-option list                Set DNS options
      --dns-search list                Set custom DNS search domains
      --domainname string              Container NIS domain name
      --entrypoint string              Overwrite the default ENTRYPOINT of the image
  -e, --env list                       Set environment variables
      --env-file list                  Read in a file of environment variables
      --expose list                    Expose a port or a range of ports
      --gpus gpu-request               GPU devices to add to the container ('all' to pass all GPUs)
      --group-add list                 Add additional groups to join
      --health-cmd string              Command to run to check health
      --health-interval duration       Time between running the check (ms|s|m|h) (default 0s)
      --health-retries int             Consecutive failures needed to report unhealthy
      --health-start-period duration   Start period for the container to initialize before starting
                                       health-retries countdown (ms|s|m|h) (default 0s)
      --health-timeout duration        Maximum time to allow one check to run (ms|s|m|h) (default 0s)
      --help                           Print usage
  -h, --hostname string                Container host name
      --init                           Run an init inside the container that forwards signals and
                                       reaps processes
  -i, --interactive                    Keep STDIN open even if not attached
      --ip string                      IPv4 address (e.g., 172.30.100.104)
      --ip6 string                     IPv6 address (e.g., 2001:db8::33)
      --ipc string                     IPC mode to use
      --isolation string               Container isolation technology
      --kernel-memory bytes            Kernel memory limit
  -l, --label list                     Set meta data on a container
      --label-file list                Read in a line delimited file of labels
      --link list                      Add link to another container
      --link-local-ip list             Container IPv4/IPv6 link-local addresses
      --log-driver string              Logging driver for the container
      --log-opt list                   Log driver options
      --mac-address string             Container MAC address (e.g., 92:d0:c6:0a:29:33)
  -m, --memory bytes                   Memory limit
      --memory-reservation bytes       Memory soft limit
      --memory-swap bytes              Swap limit equal to memory plus swap: '-1' to enable
                                       unlimited swap
      --memory-swappiness int          Tune container memory swappiness (0 to 100) (default -1)
      --mount mount                    Attach a filesystem mount to the container
      --name string                    Assign a name to the container
      --network network                Connect a container to a network
      --network-alias list             Add network-scoped alias for the container
      --no-healthcheck                 Disable any container-specified HEALTHCHECK
      --oom-kill-disable               Disable OOM Killer
      --oom-score-adj int              Tune host's OOM preferences (-1000 to 1000)
      --pid string                     PID namespace to use
      --pids-limit int                 Tune container pids limit (set -1 for unlimited)
      --platform string                Set platform if server is multi-platform capable
      --privileged                     Give extended privileges to this container
  -p, --publish list                   Publish a container's port(s) to the host
  -P, --publish-all                    Publish all exposed ports to random ports
      --pull string                    Pull image before running ("always"|"missing"|"never")
                                       (default "missing")
      --read-only                      Mount the container's root filesystem as read only
      --restart string                 Restart policy to apply when a container exits (default "no")
      --rm                             Automatically remove the container when it exits
      --runtime string                 Runtime to use for this container
      --security-opt list              Security Options
      --shm-size bytes                 Size of /dev/shm
      --sig-proxy                      Proxy received signals to the process (default true)
      --stop-signal string             Signal to stop a container (default "SIGTERM")
      --stop-timeout int               Timeout (in seconds) to stop a container
      --storage-opt list               Storage driver options for the container
      --sysctl map                     Sysctl options (default map[])
      --tmpfs list                     Mount a tmpfs directory
  -t, --tty                            Allocate a pseudo-TTY
      --ulimit ulimit                  Ulimit options (default [])
  -u, --user string                    Username or UID (format: <name|uid>[:<group|gid>])
      --userns string                  User namespace to use
      --uts string                     UTS namespace to use
  -v, --volume list                    Bind mount a volume
      --volume-driver string           Optional volume driver for the container
      --volumes-from list              Mount volumes from the specified container(s)
  -w, --workdir string                 Working directory inside the container

以下コマンドを実行すると,nginxのイメージが起動する.nginxの名前を自分で名前を付けたい場合は,"docker run -i -d -t –name=mycontainer -p 80:80 nginx"を実行する.

  • -i: Keep STDIN open even if not attached (接続されていなくとも標準入力を開いたままにする)
  • -d: Run container in background and print container ID (バックグラウンドでコンテナーを動かし,コンテナIDを表示する)
  • -t: Allocate a pseudo-TTY (疑似端末を割り当てる; pseudo=疑似, tty=text-termial=標準入出力となっている端末デバイス)
  • -p: Publish a container’s port(s) to the host (ホストにコンテナポートを発行する)
  • 80(ホストのポート):80(コンテナのポート); ホスト80番ポートへの通信はすべてコンテナのポートへ転送している
# docker run -i -d -t -p 80:80 nginx

以下を実行し,イメージ一覧を出力する.

# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mariadb       10.3      xxxxxxxxxxxx   36 hours ago    369MB
nginx         latest    xxxxxxxxxxxx   4 days ago      142MB
ubuntu        latest    xxxxxxxxxxxx   13 days ago     77.8MB
hello-world   latest    xxxxxxxxxxxx   16 months ago   13.3kB

以下を実行すると,process statusが出力される.

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
xxxxxxxxxxxx   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   busy_wright

AWSにログインし,"docker_test"の"Instance ID"をクリックする.

Instance IDの画面に遷移し,スクロールダウンすると以下画面になるので,Security groupsをクリックする.

以下画面に遷移するので,スクロールダウンする.

以下画面になるので,"Edit inbound rules"をクリックする.

以下画面に遷移するので,"Add rule"をクリックする.

上記でコンテナのポート番号を80にしたので,Port rangeを80と入力,Source typeを以下に選択し,"Save rules"をクリックする.

以下画面が出力したら,Inbound security group rulesの変更が成功となる.

以下画面に遷移し,"docker_test"の"Instance ID"をクリックする.

以下画面に遷移するので,"Public IPv4 DNS"のURLをコピーする.

ブラウザに貼り付けると,以下のようにnginxが起動する.

以下を実行すると,process statusが出力される.その後,"docker stop <CONTAINER ID>"(“docker stop <NAME>"すなわち"docker stop busy_wright"でも可能)を実行すると,nginxのコンテナはストップする.

再度起動させる際は,"docker start <NAME>"を実行する.

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
xxxxxxxxxxxx   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   busy_wright

# docker stop <CONTAINER ID>

以下のようにnginxはストップする.

“dokcer ps"ではコンテナ一覧が出力されなくなったが,"docker ps -a"を実行すると,以下のようにすべてのコンテナ一覧が出力される.

# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED             STATUS                     PORTS     NAMES
xxxxxxxxxxxx   nginx         "/docker-entrypoint.…"   About an hour ago   Exited (0) 4 minutes ago             busy_wright
xxxxxxxxxxxx   ubuntu        "bash"                   2 hours ago         Exited (0) 2 hours ago               dazzling_antonelli
xxxxxxxxxxxx   hello-world   "/hello"                 3 hours ago         Exited (0) 3 hours ago               amazing_edison

Docker Clean Up

以下コマンドを実行すると,現在のコンテナやイメージの状況が出力される.

# docker info
Client:
 Context:    default
 Debug Mode: false

Server:
 Containers: 3
  Running: 0
  Paused: 0
  Stopped: 3
 Images: 4
 Server Version: 20.10.17
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc io.containerd.runc.v2 io.containerd.runtime.v1.linux
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: xxx
 runc version: xxx
 init version: xxx
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.10.162-141.675.amzn2.x86_64
 Operating System: Amazon Linux 2
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 964.8MiB
 Name: xxx
 ID: xxx
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

以下コマンドにより,Dockerの"CONTAINER ID"が出力される.

# docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED             STATUS                      PORTS     NAMES
xxxxxxxxxxxx   nginx         "/docker-entrypoint.…"   About an hour ago   Exited (0) 15 minutes ago             busy_wright
xxxxxxxxxxxx   ubuntu        "bash"                   3 hours ago         Exited (0) 3 hours ago                dazzling_antonelli
xxxxxxxxxxxx   hello-world   "/hello"                 3 hours ago         Exited (0) 3 hours ago                amazing_edison

以下のように,"docker rm <CONTAINER ID 1> <CONTAINER ID 2> <CONTAINER ID 3>"を実行すると,対象のコンテナは削除される.

# docker rm <CONTAINER ID 1> <CONTAINER ID 2> <CONTAINER ID 3>

以下コマンドを実行すると,イメージの一覧が出力される.

# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mariadb       10.3      xxxxxxxxxxxx   37 hours ago    369MB
nginx         latest    xxxxxxxxxxxx   4 days ago      142MB
ubuntu        latest    xxxxxxxxxxxx   13 days ago     77.8MB
hello-world   latest    xxxxxxxxxxxx   16 months ago   13.3kB

以下のように,"docker rmi <IMAGE ID 1> <IMAGE ID 2> <IMAGE ID 3> <IMAGE ID 4>"を実行すると,対象のイメージは削除される.

# docker rmi <IMAGE ID 1> <IMAGE ID 2> <IMAGE ID 3> <IMAGE ID 4>

以下コマンドを実行すると,全てのイメージが削除されたことがわかる.

# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

Docker Pause

dockerの再起動する際には,以下いずれかを実行する.

# docker restart <CONTAINER ID>
or
# docker restart <NAME>

dockerを一時停止する際には,以下いずれかを実行する.

# docker pause <CONTAINER ID>
or
# docker pause <NAME>

dockerを一時停止から戻す際には,以下いずれかを実行する.

# docker unpause <CONTAINER ID>
or
# docker unpause <NAME>

Docker Commit

“Docker commit"をすることでコンテナをシェアすることができる.このシェア方法を以下に説明する.

以下コマンドを実行し,ubuntuをpullする.

# docker pull ubuntu

以下コマンドを実行し,ubuntuを起動させる.

# docker run -dit ubuntu

以下コマンドを実行し,ubuntuの"CONTAINER ID"を把握する.

# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
37d4fcbf3c06   ubuntu    "/bin/bash"   2 minutes ago   Up 2 minutes             cranky_vaughan

以下コマンドを実行すると,起動しているubuntuコンテナの中に入る.

# docker exec -it 37d4fcbf3c06 bash

以下コマンドを実行することで,ubuntuを更新させ,その後,コンテナの上にApache2をインストールする.

# apt-get update
# apt-get install apache2

以下コマンドを実行することで,ubuntuを更新させ,その後,コンテナの上にApache2をインストールする.

# apt-get update
# apt-get install apache2

以下コマンドを実行することで,apache2が起動する.

# service apache2 start
 * Starting Apache httpd web server apache2
AH00558: apache2:
Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message 

以下コマンドを実行することで,apache2が起動したことが確認できる.

# service apache2 status
 * apache2 is running

以下コマンドを実行することで,"docker_test"という名のディレクトリを作成し,ubuntuディレクトリから出る.

# mkdir docker_test

# ls
bin   dev          etc   lib    lib64   media  opt   root  sbin  sys  usr
boot  docker_test  home  lib32  libx32  mnt    proc  run   srv   tmp  var

# exit

以下コマンドを実行することで,"CONTAINER ID"を取得し,その後,当該IDを利用してdocker commitを実行すると,新たなイメージ(mydocker)を取得することができる.

# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
37d4fcbf3c06   ubuntu    "/bin/bash"   21 minutes ago   Up 21 minutes             cranky_vaughan

# docker commit 37d4fcbf3c06 mydocker
sha256:59184a0cdbe4e28ac398cdf2dc23ae5d08cd1dade28bca30d5bae00679fa6e8e

以下コマンドを実行すると,新たなイメージが表示される.

# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mydocker     latest    59184a0cdbe4   3 minutes ago   227MB
nginx        latest    9eee96112def   4 days ago      142MB
ubuntu       latest    58db3edaf2be   13 days ago     77.8MB

以下を実行することで,新たなコンテナ(mydockercontainer)を起動させることができる.

# docker run -dit --name mydockercontainer mydocker
14465ceb1684f83c259eadf9f2dec7d561425e852c7e462e0c6028a9bd880d19

以下コマンドを実行することで,コンテナが作成されたことが確認できた.

# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
14465ceb1684   mydocker   "/bin/bash"   34 seconds ago   Up 33 seconds             mydockercontainer
37d4fcbf3c06   ubuntu     "/bin/bash"   45 minutes ago   Up 45 minutes             cranky_vaughan

上記で実行したことと同じように,以下コマンドを実行し,起動しているコンテナ(mydockercontainer)の中に入る.

# docker exec -it mydockercontainer bash

以下コマンドを実行することで,コンテナ(mydockercontainer)の中のディレクトリの一覧を確認することができる.ubuntuディレクトリの中で作成した"docker_test"ディレクトリを確認することができる.

# ls
bin   dev          etc   lib    lib64   media  opt   root  sbin  sys  usr
boot  docker_test  home  lib32  libx32  mnt    proc  run   srv   tmp  var

以下コマンドを実行することで,コンテナ(mydockercontainer)の中のapache2が起動する.

# service apache2 start
 * Starting Apache httpd web server apache2
AH00558: apache2:
Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message 

以下コマンドを実行することで,apache2が起動したことが確認できる.

# service apache2 status
 * apache2 is running

MariaDB Containerの実行

以下コマンドを実行すると,mariadbのイメージが起動する.コマンドの詳細については以下に記載をする.

  • -i: Keep STDIN open even if not attached (接続されていなくとも標準入力を開いたままにする)
  • -d: Run container in background and print container ID (バックグラウンドでコンテナーを動かし,コンテナIDを表示する)
  • -t: Allocate a pseudo-TTY (疑似端末を割り当てる; pseudo=疑似, tty=text-termial=標準入出力となっている端末デバイス)
  • -p: Publish a container’s port(s) to the host (ホストにコンテナポートを発行する)
  • “3306(ホストのポート):3306(コンテナのポート)": ホスト3306番ポートへの通信はすべてコンテナのポートへ転送している
  • –name=sk-mariadb: コンテナの名前を"sk-mariadb"に設定する
  • –env="MARIADB_ROOT_PASSWORD=docker1234″: root向けのパスワードを"pass1234″に設定する
  • –env="MARIADB_DATABASE=kumadb": Mariadbの名前を"kumadb"に設定する

オプションについては,以下URLを参照する.

dockerhub | mariadb

MariaDB | MariaDB Docker Environment Variables

# docker run -i -d -t -p 3306:3306 --name=sk-mariadb --env="MARIADB_ROOT_PASSWORD=docker1234" --env="MARIADB_DATABASE=kumadb" mariadb

その後,以下コマンドを実行すると,"sk-mariadb"という名前のコンテナが作成されたことがわかる.

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                       NAMES
75281612c6bd   mariadb   "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   sk-mariadb

以下コマンドを実行すると,"sk-mariadb"コンテナの中に入ることができる.

# docker exec -it sk-mariadb bash

以下コマンドを実行することで,MariaDBに接続することができる.passwordを求められるので,上記で作成した"docker1234″を入力する.

# mariadb -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.10.3-MariaDB-1:10.10.3+maria~ubu2204 mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

以下コマンドを実行すると,kumadbと名付けたデータベースを確認できる.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kumadb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.000 sec)

“use kumadb;"を実行すると,データベースが変更され,"show tables;"を実行すると,テーブルがないことが確認できる."exit"を実行すると,データベースから抜け出し,MariaDBに戻る.

MariaDB [(none)]> use kumadb;
Database changed

MariaDB [kumadb]> show tables;
Empty set (0.000 sec)

MariaDB [kumadb]> exit
Bye

Volumesの利用

dockerにおいて,Volumeは以下URLで詳細を確認することができる.Volumeを利用すると,ホストマシン上のDockerストレージディレクトリ内に新たなディレクトリが作成され,Dockerは当該ディレクトリのコンテンツを管理する.

docker docs | Volumes

以下コマンドを実行すると,volume nameが出力される.

# docker volume ls
DRIVER    VOLUME NAME
local     4ee8e3a102e2b23fd4804898f7ac9c8177a7e08b29298df75487a7be2a7b470f
local     a41da385d9d18a35b72f2191f88b37ff8375977296dd3d82b7988dc8e66936a0

以下コマンドを実行すると,volumeを作成することができる.当該volume名は"mydockervolume"とした.

# docker volume create mydockervolume
mydockervolume

新たなvolumeを作成後,以下コマンドを実行すると,新たなvolumeが追加されていることが確認できる.

# docker volume ls
DRIVER    VOLUME NAME
local     4ee8e3a102e2b23fd4804898f7ac9c8177a7e08b29298df75487a7be2a7b470f
local     a41da385d9d18a35b72f2191f88b37ff8375977296dd3d82b7988dc8e66936a0
local     mydockervolume

以下コマンドを実行する.

# docker run -dit --mount source=mydockervolume,destination=/tmp nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
bb263680fed1: Pull complete 
258f176fd226: Pull complete 
a0bc35e70773: Pull complete 
077b9569ff86: Pull complete 
3082a16f3b61: Pull complete 
7e9b29976cce: Pull complete 
Digest: sha256:cb88ec9163d5e3641b75e3489916ecae847c93f75f2401ad562da91b29e9cabe
Status: Downloaded newer image for nginx:latest
d5196aeccb71962f743c6ae7f4383e9d574f894998ace24536a4b94fe1524893

以下コマンドを実行すること,当該フォルダが空であることがわかる.

# ls /var/lib/docker/volumes/mydockervolume/_data/

以下コマンドを実行し,コンテナの詳細を確認できる.

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                                       NAMES
d5196aeccb71   nginx     "/docker-entrypoint.…"   2 minutes ago       Up 2 minutes       80/tcp                                      competent_agnesi
75281612c6bd   mariadb   "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   sk-mariadb

以下コマンドを実行し,nginxのコンテナの中に入る.

# docker exec -it d5196aeccb71 bash

以下コマンドを実行すると,コンテナのディレクトリ構造がわかる.

# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr

以下コマンドを実行し,tmpディレクトリに移動し,中身を確認すると空であることがわかる.

/# cd /tmp
/tmp# ls

以下コマンドを実行し,tmpディレクトリに3つのファイルを作成する.その後,当該ディレクトリから出る.

/tmp# touch test1.txt test2.txt test3.txt

/tmp# ls
test1.txt  test2.txt  test3.txt

/tmp# exit
exit

以下コマンドを実行し,"_data"ディレクトリに移動し,中身を確認するとtmpディレクトリに3つのファイルを確認することができる.

# cd /var/lib/docker/volumes/mydockervolume/_data

# ls
test1.txt  test2.txt  test3.txt

以下コマンドを実行し,"_data"ディレクトリでtest4.txtを作成する.

[~_data]# echo "volumes function is testing" > test4.txt

[~_data]# cat test4.txt
volumes function is testing

以下コマンドを実行し,再度nginxのコンテナの中に入る.

[~_data]# docker exec -it d5196aeccb71 bash

以下コマンドを実行し,tmpディレクトリに戻り,中身を確認すると,test4.txtが表示されている.test4.txtの内容も入力した通りになっている.

/# cd /tmp

/tmp# ls
test1.txt  test2.txt  test3.txt  test4.txt

# cat test4.txt
volumes function is testing

Bind Mountsの利用

dockerにおいて,Bind Mountsは以下URLで詳細を確認することができる.Bind Mountsを利用すると,ホストマシン上のファイルやディレクトリがコンテナにマウントされる.

docker docs | Bind Mounts

以下コマンドを実行し,rootディレクトリ内に"bm_test"ディレクトリを作成する.

# pwd
/root

# mkdir bm_test

# ls
bm_test

以下コマンドを実行すると,mariadbのイメージが起動する.コマンドの詳細については以下に記載をする.

  • -v: Bind mount a volume (ファイルやディレクトリをコンテナ内にマウントする)
# docker run -dit -v /root/bm_test:/tmp ubuntu

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
677076032cca: Already exists 
Digest: sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f
Status: Downloaded newer image for ubuntu:latest
9d53bfb5785b07f0f9dd8e34783564ffb431151d5bfb57fe7e11099c457f2511

以下コマンドを実行すると,"CONTAINER ID"を取得できる.

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                       NAMES
9d53bfb5785b   ubuntu    "/bin/bash"              48 seconds ago   Up 47 seconds                                               infallible_mcnulty
d5196aeccb71   nginx     "/docker-entrypoint.…"   5 hours ago      Up 5 hours      80/tcp                                      competent_agnesi
75281612c6bd   mariadb   "docker-entrypoint.s…"   6 hours ago      Up 6 hours      0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   sk-mariadb

以下コマンドを実行し,ubuntuコンテナ内に入る.

# docker exec -it 9d53bfb5785b bash

以下コマンドを実行すると,ubuntuコンテナのディレクトリ構成を確認でき,tmpディレクトリを確認できる.

# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

以下コマンドを実行し,tmpディレクトリ内に"test1.txt"と"test2.txt"を作成し,当該ディレクトリから抜けた.

# cd tmp

/tmp# ls
/tmp# touch test1.txt
/tmp# touch test2.txt

/tmp# ls
test1.txt  test2.txt

# exit
exit

以下コマンドを実行すると,bm_testディレクトリ内に,tmpディレクトリで作成した"test1.txt"と"test2.txt"を確認することができた.

# ls bm_test/
test1.txt  test2.txt

Docker network

dockerにおいて,networkについては以下URLで詳細を確認することができる.

docker docs | docker network

■基本

以下コマンドを実行することで,daemonが認識しているネットワークの一覧を表示する.

# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
546e0d277ed8   bridge    bridge    local
ebd687a736bf   host      host      local
78d28bc22293   none      null      local

以下コマンドを実行することで,bridgeのネットワークについての詳細を確認することができる.

# docker network inspect bridge

以下コマンドを実行することで,新たなnetwork IDを入手することができた.

# docker network create test_network --subnet=172.19.0.0/16
a8cbe5fa6dee358da46e26cc54ae6483ff0b393aee90dbf1bef57f5628629149

以下コマンドを実行すると,作成した"test_network"を確認できる.

# docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
546e0d277ed8   bridge         bridge    local
ebd687a736bf   host           host      local
78d28bc22293   none           null      local
a8cbe5fa6dee   test_network   bridge    local

以下コマンドを実行すると,新たなコンテナを作成し,コンテナ内にいることがわかる.

# docker run --name webserver999 --net test_network --ip 172.19.0.5 -h web.bharath.com -p 82:88 -ti ubuntu /bin/bash 
root@web:/# 

この際に"ctrl"キーを押したまま"p"と"q"をクリックすると,以下のようにコンテナから出て,rootに戻る.

root@web:/# [root@ip-xxx ~]#

rootの状態で以下コードを実行すると,"websever999″の中に戻る."hostname"と入力すると,上記で記載した"web.bharath.com"が出力される.

root@web:/# [root@ip-xxx ~]# docker attach webserver999

root@web:/# hostname
web.bharath.com

再度"ctrl"キーを押したまま"p"と"q"をクリックすると,"read escape sequence"が出力され,"websever999″から出て,"root"に戻る.

root@web:/# read escape sequence
#

以下コマンドを実行し,コンテナの一覧を出力する.ubuntuのコンテナが2種類あり,1つの名前は"webserver999″,もう1つが"infallible_mcnulty"となる.

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                       NAMES
1128c6a4dd59   ubuntu    "/bin/bash"              9 minutes ago   Up 9 minutes   0.0.0.0:82->88/tcp, :::82->88/tcp           webserver999
9d53bfb5785b   ubuntu    "/bin/bash"              3 hours ago     Up 3 hours                                                 infallible_mcnulty
d5196aeccb71   nginx     "/docker-entrypoint.…"   8 hours ago     Up 8 hours     80/tcp                                      competent_agnesi
75281612c6bd   mariadb   "docker-entrypoint.s…"   9 hours ago     Up 9 hours     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   sk-mariadb

上記で実行したように,以下コマンドを再度実行すると,rootからもう1つのubuntuコンテナである"infallible_mcnulty"の中に入る.

# docker attach infallible_mcnulty
root@9d53bfb5785b:/# 

以下のように,"hostname"を入力すると,以下のように出力される.

root@9d53bfb5785b:/# hostname
9d53bfb5785b

■コンテナネットワークの変更

以下コマンドを実行すると,webserver999の接続が切れる.

# docker network disconnect test_network webserver999

以下コマンドを実行すると,表示されてあったIP addressなどが表示されないことが確認できる.

# docker inspect webserver999

以下コマンドを実行すると,再接続することができる.

# docker network connect bridge webserver999

以下コマンドを実行すると,表示されてなかったIP addressなどが再度表示されることが確認できる.

# docker inspect webserver999

DockerfileとDockerHubの利用

Dockerは,Dockerfileに書かれた指示を読み込むことで自動的にイメージをビルドすることができる.Dockerfileはtext documentであり,イメージを組み立てるコマンドラインと呼ばれるコマンドすべてが記載されている.

Dockerfileで利用されるコマンドは以下があげられ,使い方を右に記す.

  • FROM: FROM ubuntu
  • COPY: COPY app.jar /server/deploy
  • ENV: ENV JAVA_HOME=/opt/java
  • RUN: RUN yum install apache2
  • CMD: CMD python3 -version
  • EXPOSE: EXPOSE 8080

なお,Dockerfileの書き方のベストプラクティスは以下URLが参考となる.

docker docs | Best practices for writing Dockerfiles

以下コマンドにより,Dockerfileの作成を開始できる.

# vi Dockerfile

作成後,以下コマンドを実行すると,Dockerfileの内容を確認できる.

# cat Dockerfile
From ubuntu
RUN yum install -y httpd
ADD index.html /var/www/html
CMD apachectl -D FOREGROUD
EXPOSE 80
MAINTAINER sk
ENV myenv myval

以下コマンドを実行し,index.htmlを編集する.

# vi index.html

作成後,以下コマンドを実行し,index.htmlの内容を確認する.

# cat index.html
Dockerfiles are so useful!!

以下コマンドを実行したが,途中で"/bin/sh: 1: yum: not found"が表示されたため,ストップしてしまった.

# docker build -t webserver_df .
Sending build context to Docker daemon  19.97kB
Step 1/7 : From ubuntu
 ---> 58db3edaf2be
Step 2/7 : RUN yum install -y httpd
 ---> Running in e53e972c0a22
/bin/sh: 1: yum: not found
The command '/bin/sh -c yum install -y httpd' returned a non-zero code: 127

以下のように修正し,再度実行する.

# cat Dockerfile
From ubuntu
RUN apt-get update && apt-get install -y apache2
ADD index.html /var/www/html
CMD apachectl -D FOREGROUND
EXPOSE 80
MAINTAINER sk
ENV myenv myval

途中以下のような警告文が発生したが,無事ビルドすることができた.

debconf: delaying package configuration, since apt-utils is not installed

Successfully built 41058ae542f4
Successfully tagged webserver_df:latest

上記の警告文をなくすためにも,最終的には,以下のようなDockerfileがよさそう.

From ubuntu
RUN apt-get update && apt-get install -y \ apache2 \ apt-utils
ADD index.html /var/www/html
CMD apachectl -D FOREGROUND
EXPOSE 80
MAINTAINER sk
ENV myenv myval

なお,以下コマンドを実行すると,"webserver_df"イメージを作成することができた.

# docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
webserver_df   latest    41058ae542f4   10 minutes ago   227MB
nginx          latest    3f8a00f137a0   17 hours ago     142MB
mariadb        latest    5986006dc2c5   2 days ago       400MB
ubuntu         latest    58db3edaf2be   2 weeks ago      77.8MB
centos         latest    5d0da3dc9764   17 months ago    231MB

以下URLにアクセスし,"Repositories"をクリックし,"Create Repository"をクリックし,repositoryを作成する.

Docker Hub

タグ付けをしエラーが出たので,ターミナルに戻り,以下コマンドを実行する.

# docker tag 230210_repository/webserver_df shiro9ma/webserver_df

以下コマンドを実行し,docker loginを行う.

# docker login

以下コマンドを実行し,イメージのレポジトリ名を取得する.

# docker images
REPOSITORY                       TAG       IMAGE ID       CREATED          SIZE
230210_repository/webserver_df   latest    62d50267fc67   41 minutes ago   227MB
webserver_df                     latest    62d50267fc67   41 minutes ago   227MB
shiro9ma/webserver_df            latest    62d50267fc67   41 minutes ago   227MB
<none>                           <none>    41058ae542f4   2 hours ago      227MB
nginx                            latest    3f8a00f137a0   19 hours ago     142MB
mariadb                          latest    5986006dc2c5   2 days ago       400MB
ubuntu                           latest    58db3edaf2be   2 weeks ago      77.8MB
centos                           latest    5d0da3dc9764   17 months ago    231MB

以下コマンドを実行し,DockerイメージをDocker Hubにプッシュすることができた.

# docker push shiro9ma/webserver_df
Using default tag: latest
The push refers to repository [docker.io/shiro9ma/webserver_df]
a39c42426029: Pushed 
9b241791ff7a: Pushed 
c5ff2d88f679: Pushed 
latest: digest: sha256:ab9ac2a89e6410c225274c476c1fed496cdadf500c1a0654f0b786efe6ff349d size: 948

Docker Hubにアクセスし,"Repositories"をクリックすると,以下のように"shiro9ma/webserver_df"を確認することができた.

参照

Udemy | Docker for Python Django Developers

docker docs | Volumes

docker docs | Bind mounts

docker hub | mariadb

以上