Djangoコンテナを作成し、デフォルトのWebサイトにアクセスする

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はDjangoのコンテナイメージを作成し、それをdocker上で稼働させます。また、そのイメージをHarborに併せてpushしていきたいと思います。そして次回以降、今回作成したDjangoコンテナイメージを使いkubernetes環境にpodとしてデプロイしていきたいと思います。
今回はその準備なので、殴り書き程度に抑えておきます。

# 構築イメージ

![k8s_3-ページ14.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/daeea2f1-9dfa-14de-e228-a120d164cf9f.png)


# Harborに専用のProjectを用意

今回はins-envという名前のProjectを作成しました。ここにDjangoのコンテナイメージを格納していきたいと思います。
![2023071201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/20111ada-67ef-9974-2133-b925e0a11d05.png)

# ベースとなるDjangoコンテナイメージを作成する

基本的には以前私が作成した以下をベースにします。

https://qiita.com/ohtsuka-shota/items/319e7893c34250030ad0

ベースとなるコンテナイメージはubuntu 22.04としました。
```
root@k8s-master:~/yaml/ins-env# docker images
REPOSITORY                             TAG       IMAGE ID       CREATED       SIZE
ubuntu                                 latest    5a81c4b8502e   10 days ago   77.8MB

root@k8s-master:~/yaml/ins-env# docker run -itd --name django ubuntu:latest
2df08d54e76e569363db2374d83bf079ba6d1f264a9cbc6aa0c4bd8670c3fb4f
root@k8s-master:~/yaml/ins-env# docker ps
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS         PORTS     NAMES
2df08d54e76e   ubuntu:latest   "/bin/bash"   3 seconds ago   Up 2 seconds             django
root@k8s-master:~/yaml/ins-env# docker exec -it django /bin/bash
root@2df08d54e76e:/# uname -a
Linux 2df08d54e76e 5.15.0-76-generic #83-Ubuntu SMP Thu Jun 15 19:16:32 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
root@2df08d54e76e:/# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

コンテナ内で以下のコマンドを実施
```
apt update
apt upgrade
apt install -y python3-pip vim 
pip --version
apt install -y software-properties-common
add-apt-repository ppa:deadsnakes/ppa
apt update
apt list python3.*
apt install -y python3.12 python3.12-venv
pip install django
```

コンテナからログアウトして、コンテナからイメージを作成します。
```
root@k8s-master:~/yaml/ins-env# docker commit django django-image
sha256:bc37f587743f23a4e350879c4a2cca5631f97b4ee8d6859e9178e4a1e59b3e07
root@k8s-master:~/yaml/ins-env# docker images
REPOSITORY                             TAG       IMAGE ID       CREATED         SIZE
django-image                           latest    bc37f587743f   6 seconds ago   639MB
ubuntu                                 latest    5a81c4b8502e   10 days ago     77.8MB
```

tag付けをします。
```
root@k8s-master:~/yaml/ins-env# docker tag django-image 192.168.2.37:30003/ins-env/django:1.0
root@k8s-master:~/yaml/ins-env# docker images
REPOSITORY                             TAG       IMAGE ID       CREATED         SIZE
192.168.2.37:30003/ins-env/django      1.0       bc37f587743f   4 minutes ago   639MB
django-image                           latest    bc37f587743f   4 minutes ago   639MB
192.168.2.37:30003/k8s-images/ubuntu   1.0       5a81c4b8502e   10 days ago     77.8MB
ubuntu                                 latest    5a81c4b8502e   10 days ago     77.8MB
```

Harborにログインしてpushします。
```
root@k8s-master:~/yaml/ins-env# docker login 192.168.2.37:30003
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
root@k8s-master:~/yaml/ins-env# docker push 192.168.2.37:30003/ins-env/django:1.0
The push refers to repository [192.168.2.37:30003/ins-env/django]
8a75255d3619: Pushed
59c56aee1fb4: Pushed
1.0: digest: sha256:44c98246ef58d3c14ef807d379774c976ea52bddce4e721bbb6bda6fad038e80 size: 742
```
アップロードできていますね。
![2023071202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3707e52c-08dc-2004-2075-6e34ac1fe9e1.png)

# Djangoコンテナ上でProjectを作成し、稼働させる

先程作成したDjangoイメージ:1.0をベースに再度Djangoコンテナをデプロイします。Django稼働時に8000ポートを開放してアクセスするようにするため、コンテナ稼働時に叩くコマンドに少し注意です。

```
root@k8s-master:~/yaml/ins-env# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@k8s-master:~/yaml/ins-env# docker images
REPOSITORY                             TAG       IMAGE ID       CREATED          SIZE
192.168.2.37:30003/ins-env/django      1.0       bc37f587743f   30 minutes ago   639MB
django-image                           latest    bc37f587743f   30 minutes ago   639MB
ubuntu                                 latest    5a81c4b8502e   10 days ago      77.8MB
192.168.2.37:30003/k8s-images/ubuntu   1.0       5a81c4b8502e   10 days ago      77.8MB
root@k8s-master:~/yaml/ins-env# docker run -itd --name django -p 8000:8000 192.168.2.37:30003/ins-env/django:1.0
5db09c0dd3d967758acb11991752413a0c27465c0ef1476a8045d272418f90ad
root@k8s-master:~/yaml/ins-env# docker ps
CONTAINER ID   IMAGE                                   COMMAND       CREATED         STATUS         PORTS                                       NAMES
5db09c0dd3d9   192.168.2.37:30003/ins-env/django:1.0   "/bin/bash"   5 seconds ago   Up 4 seconds   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   django
```

とりあえず適当にProjectを走らせます。
全IPアドレスからのアクセスを許可する為、settings.pyもいじります。
```
root@k8s-master:~/yaml/ins-env# docker exec -it django /bin/bash
root@5db09c0dd3d9:/# cd /home
root@5db09c0dd3d9:/home# django-admin startproject testProject
root@5db09c0dd3d9:/home# cd testProject/
root@5db09c0dd3d9:/home/testProject# python3 manage.py startapp testApplication
root@5db09c0dd3d9:/home/testProject# ls
manage.py  testApplication  testProject
root@5db09c0dd3d9:/home/testProject# cd testProject
root@5db09c0dd3d9:/home/testProject/testProject# ls -ltr
total 20
-rw-r--r-- 1 root root  399 Jul  9 16:18 wsgi.py
-rw-r--r-- 1 root root  767 Jul  9 16:18 urls.py
-rw-r--r-- 1 root root 3236 Jul  9 16:18 settings.py
-rw-r--r-- 1 root root  399 Jul  9 16:18 asgi.py
-rw-r--r-- 1 root root    0 Jul  9 16:18 __init__.py
drwxr-xr-x 2 root root 4096 Jul  9 16:20 __pycache__
root@5db09c0dd3d9:/home/testProject/testProject# vi settings.py
root@5db09c0dd3d9:/home/testProject/testProject# cp -p settings.py settings.py.org
root@5db09c0dd3d9:/home/testProject/testProject# vi settings.py
root@5db09c0dd3d9:/home/testProject/testProject# diff settings.py settings.py.org
28c28
< ALLOWED_HOSTS = ["*"]
---
> ALLOWED_HOSTS = []
root@5db09c0dd3d9:/home/testProject/testProject# cd ..
root@5db09c0dd3d9:/home/testProject# python3 manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 09, 2023 - 07:22:01
Django version 4.2.3, using settings 'testProject.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
```

dockerを走らせているサーバのIPアドレス:8000に対してWebブラウザでアクセスします。
Djangoのデフォルトの画面が出力されているので問題なさそうです。

![2023071203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f3fe8144-73a6-336e-5fcd-926d28179197.png)

これをDjangoイメージ:1.1としてHarborにアップロードします。
```
root@k8s-master:~/yaml/ins-env# docker commit django django
sha256:af76143a23d157a2b8601cc58f238a475118251bb2b5f219a01207447e235b2d
root@k8s-master:~/yaml/ins-env# docker images
REPOSITORY                             TAG       IMAGE ID       CREATED          SIZE
django                                 latest    af76143a23d1   8 seconds ago    678MB
192.168.2.37:30003/ins-env/django      1.0       bc37f587743f   48 minutes ago   639MB
django-image                           latest    bc37f587743f   48 minutes ago   639MB
ubuntu                                 latest    5a81c4b8502e   10 days ago      77.8MB
root@k8s-master:~/yaml/ins-env# docker tag django 192.168.2.37:30003/ins-env/django:1.1
root@k8s-master:~/yaml/ins-env# docker images
REPOSITORY                             TAG       IMAGE ID       CREATED              SIZE
192.168.2.37:30003/ins-env/django      1.1       af76143a23d1   About a minute ago   678MB
django                                 latest    af76143a23d1   About a minute ago   678MB
192.168.2.37:30003/ins-env/django      1.0       bc37f587743f   49 minutes ago       639MB
django-image                           latest    bc37f587743f   49 minutes ago       639MB
ubuntu                                 latest    5a81c4b8502e   10 days ago          77.8MB
192.168.2.37:30003/k8s-images/ubuntu   1.0       5a81c4b8502e   10 days ago          77.8MB
root@k8s-master:~/yaml/ins-env# docker push 192.168.2.37:30003/ins-env/django:1.1
The push refers to repository [192.168.2.37:30003/ins-env/django]
f036152a0332: Pushed
8a75255d3619: Layer already exists
59c56aee1fb4: Layer already exists
1.1: digest: sha256:3aa7bc46c2c77e97d803f0a90060c73ffaed6ef04b602665bc40288e1135ca79 size: 954
```

アップロードしました。
次はこのDjangoイメージ:1.1を使ってKubernetesにpodとしてデプロイ。NodePortを使ってアクセスしていきたいと思います。
![2023071204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/cb748c80-79e0-7445-22b5-e128d8bfab62.png)