こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。
今回はDjangoのコンテナイメージを作成し、それをdocker上で稼働させます。また、そのイメージをHarborに併せてpushしていきたいと思います。そして次回以降、今回作成したDjangoコンテナイメージを使いkubernetes環境にpodとしてデプロイしていきたいと思います。
今回はその準備なので、殴り書き程度に抑えておきます。
構築イメージ
Harborに専用のProjectを用意
今回はins-envという名前のProjectを作成しました。ここにDjangoのコンテナイメージを格納していきたいと思います。
ベースとなるDjangoコンテナイメージを作成する
基本的には以前私が作成した以下をベースにします。
ベースとなるコンテナイメージは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
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のデフォルトの画面が出力されているので問題なさそうです。
これを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を使ってアクセスしていきたいと思います。