コンテナからイメージファイルを作成
どうも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
この通り、オリジナルのイメージを作成出来ました。 イメージは公開・配布も出来たりするので、かなり便利です。 では、今回はこれにて。