cloud9_note

cloud9に限らないメモ

View on GitHub

Docker

nginxイメージを使用して公開する

docker-compose.yml

version: '3'
services:
  nginx:
    image: nginx
    container_name: <任意のコンテナ名>
    ports: 
      - "80:80"
    volumes:
      - ./<任意のパス>:/usr/share/nginx/html/

起動コマンド

docker-compose up

タイムゾーン設定

FROM ubuntu:latest

# Shift timezone to Asia/Tokyo.
RUN apt-get update && apt-get install -y tzdata && apt-get clean && rm -rf /var/lib/apt/lists/*
ENV TZ Asia/Tokyo

# Set local to jp.
RUN apt-get update && apt-get install -y language-pack-ja && \
    update-locale LANG=ja_JP.UTF-8 && rm -rf /var/lib/apt/lists/*
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

参考

コンテナ内に一般ユーザを作成する

FROM ubuntu:latest

RUN apt update && apt -y upgrade && apt -y install sudo

# ユーザーを作成
ARG DOCKER_UID=1001
ARG DOCKER_USER=user
ARG DOCKER_PASSWORD=pass

RUN useradd -m --uid ${DOCKER_UID} --groups sudo ${DOCKER_USER} \
  && echo ${DOCKER_USER}:${DOCKER_PASSWORD} | chpasswd

# 作成したユーザーに切り替える
USER ${DOCKER_USER}
WORKDIR /home/${DOCKER_USER}

参考

nginxイメージを使用してhttpsとして公開する

当然オレオレ証明書。

version: '3'
services:
  nginx:
    image: nginx
    container_name: <任意のコンテナ名>
    ports: 
      - "8080:80"
    volumes:
      - ./<任意のパス>:/usr/share/nginx/html/
  https-portal:
    image: steveltn/https-portal:1.15.0
    ports:
      - '80:80'
      - '443:443'
    links:
      - nginx
    restart: always
    environment:
      DOMAINS: 'localhost => http://nginx:3000'
      STAGE: local

起動コマンド

docker-compose up

参照方法

  1. cloud9
  2. Preview
  3. Preview Running Application

※外部から参照する場合も同じURL。

Markdownファイルをブラウザから参照できるようにする

version: '3'
services:
  pandoc:
    image: kobucom/pandoc:local1
    container_name: pandoc
    ports: 
      - "8080:80"
    volumes:
      - ./markdown:/usr/local/apache2/htdocs
      - ./logs:/usr/local/apache2/logs

参考

docker login

# username=
# password=
# server=https://hub.docker.com/

# serverは省略可能。省略した場合はhttps://hub.docker.com/にログイン。
docker login -u ${username} -p ${password} ${server}

コンテナ内からホスト側のサービスを呼ぶ

localhostは使えない。ホスト側のIPを指定する。(プライベートIPでOK。)

# 実行例
sftp -i ./.ssh/id_rsa -P2222 foo@192.168.1.16

shを実行する

ディレクトリ構造

.
├── Dockerfile
├── app
│   └── app.js
├── docker-compose.yml
└── start.sh

Dockerfile

# 任意のイメージを取得
FROM node

WORKDIR /app

COPY app /app
COPY start.sh /start.sh

RUN chmod 755 /start.sh

CMD [ "/start.sh" ]

docker-compose.yml

サービス名、コンテナ名は任意。
ポートは外からアクセスするために必要なポートを開ける。

version: '3'
services:
  node:
    build: .
    container_name: node
    ports:
      - "3000:3000"
    volumes:
      - ./start.sh:/start.sh
      - ./app:/app

start.sh

#!/bin/bash

exec node app.js

Dockerコマンド

chmod 755 start.sh
docker-compose build
docker-compose up -d

docker-composeコマンドに渡した引数をコンテナ内のshファイルに渡す

docker-compose.yml

version: '3'
services:
  shell: # ここの値を使う
    build: .
    container_name: container_shell
    volumes:
      - ./start.sh:/start.sh

sh

#!/bin/bash

echo 'Hello' $1 '!!'

コマンド

docker-compose run shell ${引数に渡したい値}

実行結果

Creating docker_args_shell_run ... done
Hello hoge !!

docker-compose使用時にENTRYPOINTに引数を渡す

docker-compose_args:SampleUser0001:Github

複数のdocker-compose.ymlファイルを使用する

上書きできる。

docker-compose -f ${ベースになるファイル.yml} -f ${上書きする内容.yml} ${docker-composeコマンド}

実行例

イメージのビルド

docker build -t {ユーザ名}/{イメージ名}:{タグ名} {Dockerfileがあるディレクトリ}

イメージのpush

docker push {ユーザ名}/{イメージ名}:{タグ名}

イメージの保存/読み込み

保存

docker save <イメージ名> > <イメージ名>.tar

読み込み

docker load < <イメージ名>.tar

build結果をtarに出力する/使用する

tarに出力

docker buildx build \
  -t my-image:tarred \
  --output type=tar,dest=./my-image.tar \

tarをimageに展開

docker load -i my-image.tar

docker-compose 起動オプション

docker-compose.yml ファイルで使用可能な値

何もしないコンテナでも上がり続ける

tty: true

読み取り専用(ReadOnly)としてバインドする

volumes:
  - <ホスト側パス>:<コンテナ側パス>:ro

コンテナ内でホストと同じユーザになる

注意点

  1. ホスト側とユーザ側のOS(権限管理)が一致している必要がある。
    • ディストリビューションが違う場合も注意が必要なはずだが、未確認。

ホスト側

export USERID=$(id -u)
export GROUPID=$(id -g)
export HOSTUSER=`whoami`
docker-compose up

docker-compose.yml

version: '3'
services:
  hoge:
    # userでコンテナ内で実行するユーザを変更できるが、
    # 実行する内容によってはrootが必要なので、rootのまま実行したほうが無難。
    # user: "${USERID}:${GROUPID}"
    volumes:
      - /etc/passwd:/etc/passwd:ro
      - /etc/group:/etc/group:ro
    environment:
      - USERID=${USERID}
      - GROUPID=${GROUPID}
      - HOSTUSER=${HOSTUSER}

コンテナ内

chown -R ${HOSTUSER}: ${所有者を変更するディレクトリ}

groupidの指定は不要。コロンだけ書いて実行すると、ユーザのプライマリグループに変更される。

実際にやってみた

ホストとコンテナで同じユーザを使用する(やってることは上と同じ)

docker-compose.yml

/etc/passwd/etc/group をバインドする。

version: '3'
services:
  sh:
    build: .
    container_name: hogehoge
    volumes:
      - ./work:/tmp/work
      - /etc/passwd:/etc/passwd:ro
      - /etc/group:/etc/group:ro
    command: sh /tmp/work/create_directory.sh

実行

-u オプションでコンテナ内で実行するユーザを指定する。

docker-compose run  -u "$(id -u $USER):$(id -g $USER)"  --rm sh 

参考

ログ出力

下記ファイルに出力される。

/var/lib/docker/containers/${コンテナID}/${コンテナID}-json.log

ログローテ

    logging:
      driver: "json-file" # defaults if not specified
      options:
        max-size: "10m"
        max-file: "3"

参考

docker psのオプション

Nameで検索

コンテナ名は部分一致検索。

docker ps --filter="name=${コンテナ名}"

参考

fs.file-max

sudo sysctl -w fs.file-max=524288

Dockerfile内で使用できるコマンド

ARG

docker build時に引数で受けた値を環境変数として設定できる。

コマンド

docker build --build-arg ${ARGで宣言した環境変数}=${渡したい値} ${Dockerfileが配置されているパス}

参考

Dockerfile リファレンス

FROM ubuntu:latest

ARG HOGE

RUN echo $HOGE

$ docker build --build-arg HOGE=hogehoge .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu:latest
 ---> 1318b700e415
Step 2/3 : ARG HOGE
 ---> Running in f8e120639f74
Removing intermediate container f8e120639f74
 ---> 53121a4f0530
Step 3/3 : RUN echo $HOGE
 ---> Running in d04a646dc28d
hogehoge
Removing intermediate container d04a646dc28d
 ---> 55a01aafb8e9
Successfully built 55a01aafb8e9

備考

大文字/小文字の判定がある。

ホストからコンテナの環境変数を設定する

少し試してみた。

WSL2でDockerサービスを起動する

sudo service docker start