Docker 入門(1) ~ Docker インストールから apache サービスが稼働しているコンテナの生成まで ~

とりあえず Docker 動かしてみる的な手順のまとめです。

環境

Docker for Mac を使います。
コンテナ側の OS は CentOS 7.6 です。

  • ホスト OS: macOS Mojava
  • Docker バージョン
    • docker: 18.09.2
    • docker-compose: 1.23.2
    • docker-machine: 0.16.1

Docker インストール

Homebrew*1 でインストールします。

$ brew install docker  
$ brew cask install docker  

Docker.app 初回起動時に Docker ID でのログインを求められます。

コンテナの生成

$ docker container run -it --name centos-base centos:7.6.1810 /bin/bash   

コンテナが起動すると、プロンプトが root@xxxxxxxxxxxx(container id) になります。

@コンテナ
# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)

status が up なコンテナが起動しています。

@ホスト
$ docker container ls -a  
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
xxxxxxxxxxxx        centos:7.6.1810     "/bin/bash"         About a minute ago   Up About a minute                       centos-base

コンテナに httpd パッケージをインストール

OS を最新版にして、httpd をインストールします。

@コンテナ  
# yum check-update     
# yum update -y   
# yum install -y httpd   
# systemctl enable httpd.service   

Docker イメージの作成

httpd をインストールしたコンテナを Docker イメージ化します。
exit を実行して、コンテナを停止します。

@コンテナ
# exit

次のコマンドで Docker イメージ(centos:7.6.1810-httpd)を作成します。

@ホスト
$ docker container commit centos-base centos:7.6.1810-httpd   
$ docker images  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.6.1810-httpd      xxxxxxxxxxxx        2 minutes ago       422MB

systemd に対応したコンテナの生成

これまではコンテナ生成時に /bin/bash を起動していましたが、systemd で httpd を起動するようにコンテナを生成します。
CentOS 7 では、/sbin/init が /lib/systemd/systemd へのシンボリックリンクになっているので、コンテナ生成時に /sbin/init を起動します。

@ホスト
$ docker container run -itd --tmpfs /tmp --tmpfs /run \   
-v /sys/fs/cgroup:/sys/fs/cgroup:ro --stop-signal SIGRTMIN+3 \   
--name centos-httpd -p 8080:80 centos:7.6.1810-httpd /sbin/init   
$ docker container ls -a   
CONTAINER ID        IMAGE                   COMMAND             CREATED              STATUS                   PORTS                  NAMES
xxxxxxxxxxxx        centos:7.6.1810-httpd   "/sbin/init"        About a minute ago   Up About a minute        0.0.0.0:8080->80/tcp   centos-httpd

今回はホストの 8080 ポートをコンテナの 80 ポートへマッピングしているので、ホスト (localhost) の 8080 へアクセスして、apache のデフォルトページが取得できることを確認します。

@ホスト
$ curl http://localhost:8080/   

systemd で起動したコンテナへのログインとコンテナ停止

コンテナ生成時に /sbin/init を起動しているので、最初に起動したコンテナのようにコンテナ側プロンプトが表示されません。
コンテナへログインしたい場合は、次のコマンドを実行します。

$ docker container exec -it centos-httpd /bin/bash

コンテナのプロンプト root@xxxxxxxxxxxx(container id) が表示されます。
コンテナからログアウトする場合は、[ control + p ] -> [ control + q] を押します。
コンテナを停止する場合は、コンテナへログインした状態で exit を実行します。

www.docker.com

*1:Homebrew は事前にインストールしてください。https://brew.sh/