以前、docker-composeを使った記事は使ったのですが、
実際にCentOS7やMySQLを扱った時につまづいたことなどを。
CentOS7系のメモ
dockerでコンテナを起動する場合CentOS7(というかsystemctl)を使う場合、通常の起動コマンドである、 docker run -it --name centos イメージ名 /bin/bashをすると Failed to get D-Bus connection: Operation not permitted なるエラーが出て起動できません。
どうやらCentOS7系では(systemctlを使っているため)通常のコマンドでは動かないようです。
オプションとして --privileged を渡して上げるのと起動スクリプトを /sbin/init にする必要があります。
起動コマンドしては下記のようになります。
docker run --privileged -it -d --name コンテナ名 イメージ名 /sbin/init
ちなみにコンテナにログインする時は通常通り、 docker exec -it コンテナ名 /bin/bash でいいようです。
docker-compose
docker-composeの設定を書くと下記のようになります。
1 2 3 4 5 6 7 8 9 |
version: '3' services: web: container_name: "コンテナ名" build: context: "./dockerfileの入っているディレクトリ" dockerfile: "Dockerfile" privileged: true command: /sbin/init |
参考リンク
CentOS7 に Docker をインストールし、CentOS7コンテナ上で Apache を起動する
MySQLのdocker-compose
MySQLの場合、コンテナ起動時に
- 設定ファイルのコピー
- DB、テーブルの作成
- 権限の作成
などが可能です。
./mysql/Dockerfile
1 2 3 4 5 6 7 |
#debian系 FROM mysql:5.7 EXPOSE 3306 COPY my.cnf /etc/mysql/mysql.conf.d/mysqld.cnf RUN touch /var/log/mysql/mysqld.log |
mysql/init/init.sql
1 2 3 4 5 6 7 8 9 10 |
CREATE DATABASE IF NOT EXISTS sample_db; use sample_db; CREATE TABLE users ( id int(10) unsigned not null auto_increment, name varchar(255) not null, created_time datetime not null default current_timestamp, updated_time datetime not null default current_timestamp on update current_timestamp, primary key (id) ); |
./mysql/my.cnf
1 2 3 4 5 6 7 8 |
[mysqld] character-set-server=utf8 [mysql] default-character-set=utf8 [client] default-character-set=utf8 |
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
version: '3' services: db: container_name: "db" build: context: "./mysql" dockerfile: "Dockerfile" environment: MYSQL_DATABASE: sample_db MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: root volumes: # 初期データを投入するSQLが格納されているdir - ./mysql/init/:/docker-entrypoint-initdb.d/ |
上記の用に書いておくとコンテナ起動時に自動的に設定ファイルのコピー、DB、テーブル、権限の作成などを行うことができます。