テックブログ

技術ネタ

コンテナからイメージファイルを作成

どうもmnakamuraです。 前回の続きで、Dockerについての記事になります。 今回は自分でイメージを作成してみます。 オリジナルのイメージを作成すれば、同じ構成のコンテナを大量作成したり、 他のPCやサーバに移動する事も可能になります。

[root@mnakamura-alma-trial ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@mnakamura-alma-trial ~]# docker image ls
REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
mnakamura_apache_ex      latest    2626d3d08db4   3 hours ago     145MB
mariadb                  latest    40b966d7252f   7 days ago      383MB
dockercomposetest1_web   latest    022141557797   12 days ago     512MB
dockercomposetest1_db    latest    c3be812eda85   12 days ago     431MB
mnakamura_original       latest    201bf74f0a6d   2 weeks ago     256MB
mn_apache                latest    0f050f2f4ce3   2 weeks ago     145MB
mysql                    latest    33037edcac9b   4 weeks ago     444MB
wordpress                latest    826140609178   4 weeks ago     609MB
redmine                  latest    6f60fc01bb4a   4 weeks ago     595MB
postgres                 12        ffc079081fed   4 weeks ago     373MB
nginx                    latest    41b0e86104ba   4 weeks ago     142MB
httpd                    latest    444f7df01ce9   4 weeks ago     145MB
almalinux                latest    4580d9e4bab7   4 weeks ago     189MB
amazonlinux              latest    ef0e8aec8ddc   7 weeks ago     164MB
mariadb                  <none>    ea81af801379   2 months ago    383MB
ubuntu                   latest    27941809078c   2 months ago    77.8MB
snyk/snyk                <none>    615bce135f70   6 months ago    272MB
centos                   latest    5d0da3dc9764   10 months ago   231MB
httpd                    2.2       e06c3dbbfe23   4 years ago     171MB

まずはlatestのhttpdのイメージから、コンテナを作成します。

[root@mnakamura-alma-trial ~]# netstat -ntpluw
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      733/sshd
tcp6       0      0 :::10050                :::*                    LISTEN      13786/zabbix_agent2
tcp6       0      0 :::9090                 :::*                    LISTEN      1193/prometheus
tcp6       0      0 :::3306                 :::*                    LISTEN      837/mysqld
tcp6       0      0 :::80                   :::*                    LISTEN      735/httpd
tcp6       0      0 :::22                   :::*                    LISTEN      733/sshd
tcp6       0      0 :::3000                 :::*                    LISTEN      1195/grafana-server
udp        0      0 127.0.0.1:323           0.0.0.0:*                           654/chronyd
udp6       0      0 ::1:323                 :::*                                654/chronyd

私の検証サーバ、OS側が既に80番をhttpdで利用していますね。 なので、コンテナ側では80番ポートを利用しますが、 OS側は8080番で受けるよう設定します。 名称は「mnakamura_apache」とします。

[root@mnakamura-alma-trial ~]# docker run --name mnakamura_apache -d -p 8080:80 httpd
98d20e6ed11b82758aa9346600dc4d0a78e1dc761aee46248e4ae1bd8baff62d


[root@mnakamura-alma-trial ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED       STATUS       PORTS                                   NAMES
98d20e6ed11b   httpd     "httpd-foreground"   6 seconds ago   Up 6 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   mnakamura_apache

コンテナが作成されました。 curlコマンドでローカルアクセスすると、 httpdイメージにデフォルトで設定されているページが確認出来ます。

[root@mnakamura-alma-trial ~]# curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>

次に、今作成したコンテナ「mnakamura_apache」に接続してみます。

[root@mnakamura-alma-trial ~]# docker exec -it mnakamura_apache bash
root@98d20e6ed11b:/usr/local/apache2# ls -l
total 40
drwxr-xr-x 2 root root 4096 Jul 12 04:32 bin
drwxr-xr-x 2 root root 4096 Jul 12 04:32 build
drwxr-xr-x 2 root root 4096 Jul 12 04:32 cgi-bin
drwxr-xr-x 4 root root 4096 Jul 12 04:32 conf
drwxr-xr-x 3 root root 4096 Jul 12 04:32 error
drwxr-xr-x 2 root root 4096 Jul 12 04:32 htdocs
drwxr-xr-x 3 root root 4096 Jul 12 04:32 icons
drwxr-xr-x 2 root root 4096 Jul 12 04:32 include
drwxr-xr-x 1 root root 4096 Aug 10 05:15 logs
drwxr-xr-x 2 root root 4096 Jul 12 04:32 modules

root@98d20e6ed11b:/usr/local/apache2# cd htdocs

root@98d20e6ed11b:/usr/local/apache2/htdocs# ls -l
-rw-r--r-- 1 1001 1001 44 Nov 20  2004 index.html

root@98d20e6ed11b:/usr/local/apache2/htdocs# cat index.html
<html><body><h1>It works!</h1></body></html>

なるほど、確かにindex.htmlファイルがありますね。 これを、OS側に用意していたものと差し替えてみましょう。

コピーして上書きします。

[root@mnakamura-alma-trial ~]# docker cp /root/dockertest/index.html mnakamura_apache:/usr/local/apache2/htdocs/index.html

再度curlで確認してみましょう。

[root@mnakamura-alma-trial ~]# netstat -ntpluw
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      97894/docker-proxy
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      733/sshd
tcp6       0      0 :::10050                :::*                    LISTEN      13786/zabbix_agent2
tcp6       0      0 :::9090                 :::*                    LISTEN      1193/prometheus
tcp6       0      0 :::3306                 :::*                    LISTEN      837/mysqld
tcp6       0      0 :::8080                 :::*                    LISTEN      97899/docker-proxy
tcp6       0      0 :::80                   :::*                    LISTEN      735/httpd
tcp6       0      0 :::22                   :::*                    LISTEN      733/sshd
tcp6       0      0 :::3000                 :::*                    LISTEN      1195/grafana-server
udp        0      0 127.0.0.1:323           0.0.0.0:*                           654/chronyd
udp6       0      0 ::1:323                 :::*                                654/chronyd

[root@mnakamura-alma-trial ~]# curl http://localhost:8080
<html>
<meta charset="utf-8"/>
<body>
<div>mnakamura docker test</div>
</body>
</html>

中身が更新されています。 そしてこの更新されたコンテナから、逆にイメージを作成してみましょう。 「mnakamura_apache_ex」というイメージを作成すべく「commit」してみます。

[root@mnakamura-alma-trial ~]# docker commit mnakamura_apache mnakamura_apache_ex
sha256:2626d3d08db42988db8a3c7547c4d8f5419fda496c617c5d7fc3a7fb48b2d6a5

[root@mnakamura-alma-trial ~]# docker image ls | grep mnakamura_apache_ex
mnakamura_apache_ex      latest    2626d3d08db4   55 seconds ago   145MB

この通り、オリジナルのイメージを作成出来ました。 イメージは公開・配布も出来たりするので、かなり便利です。 では、今回はこれにて。

この記事をシェアする

  • facebook
  • twitter
  • hatena
  • line
URLとタイトルをコピーする

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください