LoginSignup
51
38

More than 5 years have passed since last update.

alpine linux+Dockerでmysqlを使用したアプリを作る際に気をつけたいこと

Last updated at Posted at 2016-03-05

概要

alpine linuxでDockerコンテナを作るとなると大抵は「できるだけ容量を小さくしたい」という考えがあると思います。

大抵のアプリではデータベースを使うと思うので、mysqlの開発ライブラリを入れた上でそれぞれの言語用の接続ライブラリを作ると思います。alpine linuxでのmysqlライブラリはmariadb-devですがこいつが異様にfatです。

接続ライブラリだけなはずなのになんでこんなに重いんだと思ったので。

結論

alpine linuxのmariadb-devはserverごと入るのでデカイ。Dockerコンテナを作る時でmariadb-devを使う際はサーバのライブラリと実行ファイルは要らないのでDockerfilerm /usr/lib/mysqld*rm /usr/bin/mysql*を追加する。

以下調査内容と削除前後のビフォーアフター。

犯人探し

適当にalpineのコンテナを作り、mysqlのdevパッケージだけ入れる。

docker run -dit alpine ash
apk add --update mariadb-dev

ディレクトリの容量を調査

/ # du -sh /
380.5M  /

/ # du -sh /*
796.0K  /bin
0       /dev
400.0K  /etc
4.0K    /home
3.5M    /lib
0       /linuxrc
16.0K   /media
4.0K    /mnt
0       /proc
8.0K    /root
4.0K    /run
216.0K  /sbin
0       /sys
4.0K    /tmp
374.8M  /usr
808.0K  /var

/ # du -sh /usr/*
118.5M  /usr/bin
12.0K   /usr/data
6.6M    /usr/include
234.4M  /usr/lib
16.0K   /usr/local
5.4M    /usr/mysql-test
4.0K    /usr/sbin
9.9M    /usr/share
/ # ls -lah /usr/lib/
total 233036
drwxr-xr-x    6 root     root        4.0K Mar  5 01:51 .
drwxr-xr-x   13 root     root        4.0K Mar  5 01:51 ..
drwxr-xr-x    2 root     root        4.0K Mar  5 01:50 engines
lrwxrwxrwx    1 root     root          15 Mar  5 01:50 libaio.so.1 -> libaio.so.1.0.1
-rwxr-xr-x    1 root     root        5.2K Oct 29 19:39 libaio.so.1.0.1
-rw-r--r--    1 root     root        4.1M Mar  1 16:17 libcrypto.a
lrwxrwxrwx    1 root     root          18 Mar  5 01:50 libcrypto.so -> libcrypto.so.1.0.0
lrwxrwxrwx    1 root     root          28 Mar  5 01:50 libcrypto.so.1.0.0 -> ../../lib/libcrypto.so.1.0.0
lrwxrwxrwx    1 root     root          15 Mar  5 01:50 libformw.so.6 -> libformw.so.6.0
-rwxr-xr-x    1 root     root       58.9K Dec 18 16:06 libformw.so.6.0
-rw-r--r--    1 root     root       73.8K Dec 16 10:40 libgcc_s.so.1
lrwxrwxrwx    1 root     root          15 Mar  5 01:50 libmenuw.so.6 -> libmenuw.so.6.0
-rwxr-xr-x    1 root     root       25.9K Dec 18 16:06 libmenuw.so.6.0
-rw-r--r--    1 root     root       10.6M Feb 10 09:16 libmysqlclient.a
lrwxrwxrwx    1 root     root          20 Mar  5 01:51 libmysqlclient.so -> libmysqlclient.so.18
lrwxrwxrwx    1 root     root          24 Mar  5 01:50 libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
-rwxr-xr-x    1 root     root        3.2M Feb 10 09:18 libmysqlclient.so.18.0.0
lrwxrwxrwx    1 root     root          16 Mar  5 01:51 libmysqlclient_r.a -> libmysqlclient.a
lrwxrwxrwx    1 root     root          17 Mar  5 01:50 libmysqlclient_r.so -> libmysqlclient.so
-rw-r--r--    1 root     root      194.0M Feb 10 09:18 libmysqld.a
lrwxrwxrwx    1 root     root          15 Mar  5 01:51 libmysqld.so -> libmysqld.so.18
-rwxr-xr-x    1 root     root       13.1M Feb 10 09:18 libmysqld.so.18
-rw-r--r--    1 root     root       38.0K Feb 10 09:14 libmysqlservices.a
lrwxrwxrwx    1 root     root          18 Mar  5 01:50 libncursesw.so.6 -> libncursesw.so.6.0
-rwxr-xr-x    1 root     root      338.5K Dec 18 16:06 libncursesw.so.6.0
lrwxrwxrwx    1 root     root          16 Mar  5 01:50 libpanelw.so.6 -> libpanelw.so.6.0
-rwxr-xr-x    1 root     root       13.5K Dec 18 16:06 libpanelw.so.6.0
-rw-r--r--    1 root     root      719.1K Mar  1 16:17 libssl.a
lrwxrwxrwx    1 root     root          15 Mar  5 01:50 libssl.so -> libssl.so.1.0.0
lrwxrwxrwx    1 root     root          25 Mar  5 01:50 libssl.so.1.0.0 -> ../../lib/libssl.so.1.0.0
lrwxrwxrwx    1 root     root          19 Mar  5 01:50 libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x    1 root     root        1.3M Dec 16 10:40 libstdc++.so.6.0.21
drwxr-xr-x    3 root     root        4.0K Mar  5 01:50 mysql
drwxr-xr-x    2 root     root        4.0K Mar  5 01:50 pkgconfig
lrwxrwxrwx    1 root     root          17 Mar  5 01:50 terminfo -> ../share/terminfo

そうか、devパッケージだからサーバ(mysqld)も入ってるのか。
接続のライブラリだけ欲しいから/usr/lib/mysqld*は削除してよさそう。
ということは

/ # ls -lah /usr/bin/mysql*
-rwxr-xr-x    1 root     root       13.1M Feb 10 09:18 /usr/bin/mysql_client_test_embedded
-rwxr-xr-x    1 root     root        4.4K Feb 10 09:14 /usr/bin/mysql_config
-rwxr-xr-x    1 root     root        4.1K Feb 10 09:14 /usr/bin/mysql_convert_table_format
-rwxr-xr-x    1 root     root       13.1M Feb 10 09:18 /usr/bin/mysql_embedded
-rwxr-xr-x    1 root     root       16.3K Feb 10 09:14 /usr/bin/mysql_install_db
-rwxr-xr-x    1 root     root        3.0M Feb 10 09:18 /usr/bin/mysql_plugin
-rwxr-xr-x    1 root     root       11.7K Feb 10 09:14 /usr/bin/mysql_secure_installation
-rwxr-xr-x    1 root     root       17.1K Feb 10 09:14 /usr/bin/mysql_setpermission
-rwxr-xr-x    1 root     root        3.0M Feb 10 09:18 /usr/bin/mysql_tzinfo_to_sql
-rwxr-xr-x    1 root     root        3.1M Feb 10 09:18 /usr/bin/mysql_upgrade
-rwxr-xr-x    1 root     root        3.8K Feb 10 09:14 /usr/bin/mysql_zap
-rwxr-xr-x    1 root     root        3.2M Feb 10 09:18 /usr/bin/mysqlbinlog
-rwxr-xr-x    1 root     root       13.6M Feb 10 09:18 /usr/bin/mysqld
-rwxr-xr-x    1 root     root       24.2K Feb 10 09:14 /usr/bin/mysqld_multi
-rwxr-xr-x    1 root     root       30.8K Feb 10 09:14 /usr/bin/mysqld_safe
-rwxr-xr-x    1 root     root       34.1K Feb 10 09:14 /usr/bin/mysqlhotcopy
-rwxr-xr-x    1 root     root        3.1M Feb 10 09:18 /usr/bin/mysqlslap
-rwxr-xr-x    1 root     root        3.6M Feb 10 09:18 /usr/bin/mysqltest
-rwxr-xr-x    1 root     root       13.0M Feb 10 09:18 /usr/bin/mysqltest_embedded

CLIを使わないので/usr/bin/mysql*も削除してよいですね。

ビフォーアフター

下記はGomitterというクソアプリを普通にDocker化した時の容量

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
celeron1ghz/gomitter      latest              ba4aa7c1e2cb        32 minutes ago      492.7 MB
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
celeron1ghz/gomitter      latest              703a02f09970        4 minutes ago       200 MB

半分以下!!

51
38
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51
38