Docker
- Docker
- nginxイメージを使用して公開する
- タイムゾーン設定
- コンテナ内に一般ユーザを作成する
- nginxイメージを使用してhttpsとして公開する
- Markdownファイルをブラウザから参照できるようにする
- docker login
- コンテナ内からホスト側のサービスを呼ぶ
- shを実行する
- docker-composeコマンドに渡した引数をコンテナ内のshファイルに渡す
- docker-compose使用時にENTRYPOINTに引数を渡す
- 複数のdocker-compose.ymlファイルを使用する
- イメージのビルド
- イメージのpush
- イメージの保存/読み込み
- build結果をtarに出力する/使用する
- docker-compose 起動オプション
- docker-compose.yml ファイルで使用可能な値
- コンテナ内でホストと同じユーザになる
- ホストとコンテナで同じユーザを使用する(やってることは上と同じ)
- ログ出力
- docker psのオプション
- fs.file-max
- Dockerfile内で使用できるコマンド
- ホストからコンテナの環境変数を設定する
- WSL2で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
参照方法
- cloud9
- Preview
- 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
参考
- 【その壱】Apache/PandocでMarkdownをHTMLで配信するDockerコンテナの作成:Qiita
- docker-pandoc:kobucom:Github
- pandoc:kobucom:Docker-Hub
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 起動オプション
- up
- 個々のコンテナの出力をまとめる。
- 開始 or 再起動
- -d
- バックグラウンドで動く
- –build
- 開始時にビルドする
- run
- ワンオフ起動
- start
- 再起動
docker-compose.yml ファイルで使用可能な値
何もしないコンテナでも上がり続ける
tty: true
読み取り専用(ReadOnly)としてバインドする
volumes:
- <ホスト側パス>:<コンテナ側パス>:ro
コンテナ内でホストと同じユーザになる
注意点
- ホスト側とユーザ側の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の指定は不要。コロンだけ書いて実行すると、ユーザのプライマリグループに変更される。
実際にやってみた
- (https://github.com/SampleUser0001/Create_files_in_Docker_Container)[Create_files_in_Docker_Container]
ホストとコンテナで同じユーザを使用する(やってることは上と同じ)
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
参考
- Docker コンテナ内で Docker ホストと同じユーザを使う:CUBE SUGAR CONTAINER
- SameUser_onDocker:SampleUser0001:Github
- 実際にやってみた。
ログ出力
下記ファイルに出力される。
/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が配置されているパス}
参考
例
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