Dockerを使用してローカルでのコンテナ作成からGCEへのデプロイまでの手順

このチュートリアルでは、Dockerコンテナ(pannakoota/telegram_bot)を作成して、GCP Compute EngineのContainer-Optimized OSで実行する方法を説明します。

## 前提条件
- 開発環境(Mac)にDockerがインストールされていること
- Google Cloud Platformアカウントがあり、Compute Engineが利用可能であること
- Docker Hubアカウントがあること

## 手順
#### Dockerfileの作成
Dockerfileを用意して下記の環境をコンテナ化
※下記は例になります。
```
cat > Dockerfile <<EOF
FROM rockylinux:8.5

RUN yum update -y 
RUN yum install -y \
 epel-release \
 git \
 jq \
 langpacks-ja \
 cronie \
 python3

RUN pip3 install google-api-python-client google-auth gspread oauth2client

RUN dnf -y install langpacks-ja \
 && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ENV LANG="ja_JP.UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8"

RUN git clone https://github.com/kawamurashingo/telegram_bot
RUN chmod 775 /telegram_bot/telegram.sh
RUN /usr/bin/crontab /telegram_bot/crontab.txt

RUN git clone https://github.com/kawamurashingo/telegram_bot_next
RUN chmod 775 /telegram_bot_next/telegram.sh
RUN /usr/bin/crontab /telegram_bot_next/crontab.txt

RUN ln -sf /proc/1/fd/1 /var/log/cron.log

CMD crond && tail -f /dev/null
EOF
```
#### Dockerfileからコンテナを作成
```
docker login
docker search rockylinux
docker pull rockylinux:8.5
docker build --no-cache -t pannakoota/telegram_bot .
```
#### Docker Hubにコンテナをプッシュ
```
docker push pannakoota/telegram_bot
```
#### GCPでContainer-Optimized OSインスタンスを起動し、pannakoota/telegram_botイメージを選択
![スクリーンショット 2023-05-06 9.37.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307994/66607642-7ccb-3a47-9470-36351e174973.png)
![スクリーンショット 2023-05-06 9.37.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307994/eda049b3-c6b3-d3ab-934d-1436de04851d.png)
![スクリーンショット 2023-05-06 9.38.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307994/4af82416-47d8-0c3e-2e03-67bcc470c010.png)

#### Compute Engineで無事デプロイされていることの確認
```
docker ps
docker exec -it <コンテナID> /bin/bash
```
#### Docker内で設定を行う（任意）
```
ps -ef | grep cron
crontab -l
cd telegram_bot
vi credentials.json
vi get_events.py
vi telegram.sh
cd ../telegram_bot_next
vi credentials.json
vi get_events.py
vi telegram.sh
crontab -e
```
#### Dockerコンテナの保存とカスタムコンテナの作成（任意）
```
docker ps
docker commit <コンテナID> telegram_custom
docker image ls
```
#### オリジナルコンテナを停止し、カスタムコンテナを起動（任意）
```
docker kill <コンテナID>
docker run --name telegram_custom -d telegram_custom
docker exec -it telegram_custom /bin/bash
exit
```
#### 自動起動設定の更新（任意）
```
docker update --restart=always telegram_custom
docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(docker ps -aq) | grep always
```
#### 再起動テスト（任意）
```
sudo reboot
```

## 備考
#### GitHub
https://github.com/kawamurashingo/telegram_bot

#### DockerHub
https://hub.docker.com/repository/docker/pannakoota/telegram_bot/general

#### Dockerhubに登録
https://qiita.com/ksugawara61/items/e98edc767c79fd2856e1

#### 実行中のDockerコンテナを停止および削除
```
docker ps
docker kill <コンテナID>
または
docker stop <コンテナID>
docker container rm telegram_bot
```
#### Dockerコンテナのリビルド
```
docker build --no-cache -t pannakoota/telegram_bot .
```
#### Dockerコンテナの実行
```
docker run -it --name telegram -d pannakoota/telegram_bot
```
#### Dockerコンテナに接続
```
docker exec -it telegram /bin/bash
exit
```