[Docker] CentOSを動かしたい

Dockerfile

FROM centos:centos7
RUN yum install -y httpd
COPY . /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

※EXPOSE 80で80番ポートを開ける

$ sudo docker build -t mycentos .
$ sudo docker run -dit –name myapp -p 8080:80 mycentos

apache, nginxに比べると、若干複雑になるね

Composeのその他の機能

ComposeコマンドをリモートのDockerホストに対して実施して、1つのホストから複数のホストにアプリを展開することができる

### 環境変数

version: '3.7'
services:
  web:
    image: ${DHUB}/c5env:${IMG_VER}
    container_name: c5env

その他の命令

version: '3.7'
services:
  python:
    image: alpine:3.10.3
    container_name: alpine
    command: ["tail", "-f", "/dev/null"]
    tty: true
    env_file: python.env
    stop_signal: SIGKILL
    network_mode: "none"

[Docker-compose] 基本

Composeの定義内でイメージが置かれるディレクトリとDockerfile名を指定すれば、docker-composeコマンドの発行時にDockerfileによるビルドも自動で実施する

$ tree
.
├── app
│   ├── Dockerfile
│   └── src
│   └── server.py
├── docker-compose.yml
└── web
├── Dockerfile
└── html
└── index.html

./web/Dockerfile

From nginx:1.17.5-alpine
COPY ./html/ /usr/share/nginx/html/
CMD["nginx", "-g", "daemon off;"]

./docker-compose.yml

version: '3.3'
services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    ports:
    - 8081:80
  web:
    build:
      context: ./web
      dockerfile: Dockerfile
    image: c5dev1_nginx
    container_name: c5dev1_nginx
    ports:
    - 8080:80

build: でビルドする
image: がイメージ名
サービス名とイメージのリソースを置くディレクトリ名を統一する方が良い

$ sudo docker-compose build

bindで動作検証して、OKだったら、ビルドする

version: '3.7'
services:
  web:
    build:
      context: ./web
      dockerfile: dockerfile
    depends_on:
      - app
    ports:
      - 8080:80
    environment:
      APP_SERVER: http://app:80
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    depends_on:
      - db
    environment:
      REDIS_HOST: db
      REDIS_PORT: 6379
      REDIS_DB: 0
  db:
    image: redis:5.0.6-alpine3.10
    volumes:
      - c5kvs_redis_volume:/data
volumes:
  c5kvs_redis_volume:
    driver: local

[Docker-compose] WordPressとMySQLを展開

docker-compose.local.yml

version: '3.3'
services:
  web:
    build:
      context: ./web
      dockerfile: Dockerfile
    ports:
    - 8080:80
    volumes:
    - ./web/html:/usr/share/nginx/html

/web/Dockerfile

From nginx:1.17.5-alpine
COPY ./html/ /usr/share/nginx/html/
CMD ["nginx", "-g", "daemon off;"]

/web/html/index.html

	<title>Document</title>
</head>
<body>
	<h1>hello</h1>
</body>

$ sudo docker-compose -f docker-compose.local.yml up -d –build

[Docker-compose] WordPressを起動する

docker-compose.yml

version: '3.3'
services:
  mysql:
    image: mysql:5.7.28
    restart: unless-stopped
    networks:
    - wp_net
    volumes:
    - mysql_volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wordpress 
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: password

  wordpress:
    image: wordpress:5.2.3-php7.3-apache
    restart: unless-stopped
    depends_on:
    - mysql
    networks:
    - wp_net
    ports:
    - 8080:80
    environment:
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: password

networks:
  wp_net:
    driver: bridge
volumes:
  mysql_volume:
    driver: local

うおおおおおおおおおお
これはやばい

[Docker-compose] 入門

docker-compose.ymlで作成する

version: '3.3'
services:
  nginx:
    image: nginx:1.17.6-alpine
    ports:
    - 8080:80
    environment:
      MYENV: "hello compose"

k8sもymlで作成する
docker-compose up -d の「-d」はバックグラウンド実行

$ sudo docker-compose up -d
$ sudo docker-compose ps
Name Command State Ports
——————————————————————————–
c5_nginx_1 nginx -g daemon off; Up 0.0.0.0:8080->80/tcp,:::8080->80/tcp
$ sudo docker-compose down

なるほどー 入門になってないな…

[Docker] コンテナ上のアプリを動かす

dockerの場合はdaemonで動かすのではなく、アプリを直接動かすのが基本
起動時のコマンドが全てのプロセスの原点となる
-> bashを抜けるとコンテナが停止する

$ sudo docker run -it –name centos centos:7.7.1908 bash

start.sh

#!bin/sh
handle() {
	echo 'handle sigterm/sigint'
	exit 0
}
trap handle TERM INT

nginx -g "daemon off;" &
wait

Dockerfile

From python:3.7.5-slim
RUN pip install flask=1.1.1
COPY ./server.py /server.py
ENV PORT 80
STOPSIGNAL SIGINT
CMD ["python", "-u", "/server.py"]

### supervisorで複数の子プロセス(アプリ本体)を管理

From centos:7.7.1908
RUN yum install -y epel-release \
	&& yum install -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
	&& yum -y install nginx openssh-server supervisor \
	&& rm -rf /var/cache/yum/* && yum clean all
RUN ssh-keygen -A
COPY supervisord.conf /etc/supervisord.conf
EXPOSE 22 80
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D
autostart=true
autorestart=true

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true

うーん、結構奥が深いな…