iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
0
DevOps

Cloud Native 開發維運一條龍系列 第 8

Day 8. 容器化的 API Gateway 開發與部署 - 以 Flask 為例

  • 分享至 

  • xImage
  •  

今天來用 Flask 寫一個 API Gateway 的 service,這個微服務的架構長這樣

.
├── conf
│   └─── config.ini
├── data
├── Dockerfile
├── requirements.txt
├── run.sh
├── src
│   └─── api.py
└── wsgi.py

可以看出這是一個典型的 flask project 架構,主要有 conf/ 與 src/ 及其他必要的檔案。
另一個值得關注的議題是,我們希望在開發與部署時,執行的環境盡量一樣。我們可以透過 soft link 的方式,將 host VM 上的 python 與 docker 內要掛起的 python 作 alias ,這樣在包 docker 的時候就可以不必 rename。

詳細的 python 怎麼寫,我們就不在這裡示範了,我們看 Dockerfile 及 ansible 的 Yaml 即可。

$ cat flask.mytodos/Dockerfile 
FROM centos:7.5.1804
MAINTAINER yi_de_wu@trendmicro.com

RUN useradd -ms /bin/bash centos && \
    passwd -d centos && \
    gpasswd -a centos wheel

WORKDIR /opt/aisoc/aisoc-flask
COPY . .
RUN chown centos:centos /opt/mytodos -R && \
    yum install -y epel-release gcc sudo curl net-tools telnet vim which wget && \
    yum install -y python36 python36-devel python36-setuptools postgresql10-devel openssl-devel && \
    easy_install-3.6 pip && \
    pip install --no-cache-dir -r requirements.txt && \
    ln -s /usr/bin/python3.6 /usr/local/bin/python3-mytodos

USER centos

CMD ["/bin/sh", "run.sh"]
$ cat ansible/roles/tasks/run_flask.yaml
- name: Copy File | Copy Conf to Remote
  vars:
    hostname: "{{ ansible_facts['hostname'] }}"
  template:
    src: "{{ dev_dir }}/ansible/files/conf.d/flask.ini.j2"
    dest: "{{ prd_dir }}/mytodos-flask/conf/config.ini"
- name: Docker | Start flask.mytodos
  docker_container:
    name: flask.mytodos
    state: started
    domainname: flask.mytodos
    image: "path.to.your.docker.registry/team-name/mytodos-flask:{{ img_ver }}"
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
      - /usr/share/zoneinfo/UTC:/etc/localtime:ro
      - "{{ prd_dir }}/mytodos-flask/conf:{{ prd_dir }}/mytodos-flask/conf:ro"
      - "{{ prd_dir }}/mytodos-flask/log:{{ prd_dir }}/mytodos-flask/log"
    networks:
      - name: mynet
        aliases: flask.mytodos
        ipv4_address: 172.20.0.4
        links:
          - postgresql.mytodos
    ports:
      - '9000:9000'
    recreate: true

上一篇
Day 7. 容器化的 Database 部署與管理 - 以 PostgreSQL 為例
下一篇
Day 9. 容器化的 Frontend Interface 開發與部署 - 以 React 為例
系列文
Cloud Native 開發維運一條龍18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言