Odoo Docker安装&部署

                                                                   Docker是什么?

                                                                  首先它是一个开源的应用容器引擎,可以连同执行环境和应用一起打包成一个镜像,方便移植。

                                                                  然后它实现了轻量级的隔离机制, 可以快速重建和销毁, 占用资源少。用docker在开发者的单机环境下模拟分布式软件部署和调试,可谓又快又好。

                                                                  一个完整的Docker有以下几个部分组成:

                                                                  • DockerClient客户端

                                                                  • Docker Daemon守护进程

                                                                  • Docker Image镜像

                                                                  • DockerContainer容器

                                                                  容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app), 更重要的是容器性能开销极低。

                                                                  Docker 是一种应用级部署工具,可帮助开发人员和用户使用容器来创建、部署、运行和维护他们的应用程序。此外,这些容器帮助开发人员将其软件开发包/工具/环境/库等的各个部分集成到单个实例中。通过这样做,开发人员可以在任何其他环境中运行他们的应用程序,而不必担心它们的依赖性变化。Docker 实际上就像一个虚拟机。

                                                                  Docker Hub:

                                                                  DockerHub是一个由Docker官方管理的基于云的存储库,它是一个在线docker image存储库。
                                                                  在国内Docker公司选择阿里云平台作为其DockerHub在中国运营的基础服务,所以如果希望镜像拉取加速,可以配置阿里云的镜像库地址。

                                                                  常用命令

                                                                  安装docker:  curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

                                                                  列出本机镜像: docker images

                                                                  下载docker image镜像: docker pull odoo:14.0

                                                                  查找镜像:docker search

                                                                  删除镜像:docker rmi odoo:14.0

                                                                  创建镜像:

                                                                  • 更新镜像,一般是通过docker run ... /bin/bash的命令方式先进入一个对应的容器,做必要操作后,通过docker commit来提交更新。

                                                                  • 构建新的镜像,通过docker file的方式,编辑指令告诉docker你希望在这个镜像中需要包含哪些内容,最后通过docker build命令完成创建image。

                                                                  启动容器(交互式):  docker run [-i]  [-t] # docker run -it ubuntu /bin/bash

                                                                  启动容器(后台模式): docker run -d # docker run -itd --name ubuntu-test ubuntu /bin/bash

                                                                  启动一个已停止的容器: docker start b750bbbcfd88

                                                                  进入一个后台运行的容器(attach 或者 exec):

                                                                  • docker attach 1e560fca3906

                                                                  • docker exec -it 243c32535da7 /bin/bash

                                                                  退出容器: exit / CTRL+D

                                                                  停止容器:docker stop Container-ID

                                                                  删除容器:docker rm -f Container-ID

                                                                  查看log:   docker logs -f odoo


                                                                  如何通过Docker来部署Odoo

                                                                  通过在 Odoo 中使用Docker功能,用户无需担心依赖项和包,因此您只需要考虑 Odoo 的各个方面,其中包含所有必需的包和库。因此,Docker 使开发人员和最终用户的工作变得容易。

                                                                  要在 docker 上运行 Odoo,我们必须设置两个 docker 容器。为此,我们可以使用 docker 镜像

                                                                  1. Odoo Image:  Odoo 在 Docker 上有一个官方镜像(Odoo Image),以便在 docker 虚拟环境中安装 Odoo。

                                                                  2. Postgress Image:  Odoo 使用 Postgres SQL 来存储和操作它的数据。所以在配置 Odoo 镜像之前,我们必须确保 Postgres 镜像在我们的 docker 环境中正确运行。

                                                                  官方镜像地址:

                                                                  • Odoo - https://hub.docker.com/_/odoo/

                                                                  • PostgresSQL - https://hub.docker.com/_/postgres/

                                                                  创建数据库容器

                                                                  • docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:10

                                                                  创建odoo容器

                                                                  • docker run -p 8069:8069 --name odoo --link db:db -t odoo #Odoo尝试查找Postgres容器“db”。所以为了连接Odoo和PostgreSQL,Postgres容器的别名应该是'db'

                                                                  在Odoo容器中使用自定义conf文件

                                                                  • docker run -v /custom/conf/path:/etc/odoo -p 8069:8069 --name odoo --link db:db -t odoo

                                                                  在Odoo容器中使用自定义插件

                                                                  • docker run -v /path/to/addons:/mnt/extra-addons -p 8069:8069 --name odoo --link db:db -t odoo

                                                                  部署多个Odoo实例
                                                                      docker run -p 8070:8069 --name odoo1 --link db:db -t odoo
                                                                      docker run -p 8071:8069 --name odoo2 --link db:db -t odoo


                                                                  通过Docker部署Odoo还有另外一种方式 ,就是通过Docker Compose。 这种方式需要先编写docker compose文件,格式与内容可以参照下面:
                                                                  version: '2'
                                                                  services:
                                                                    web:
                                                                      image: odoo:12.0
                                                                      depends_on:
                                                                        - db
                                                                      ports:
                                                                        - "8070:8069"
                                                                    db:
                                                                      image: postgres:10
                                                                      ports:
                                                                        - "9091:5432"
                                                                      environment:
                                                                        - POSTGRES_DB=postgres
                                                                        - POSTGRES_PASSWORD=odoo
                                                                        - POSTGRES_USER=odoo
                                                                        - PGDATA=/var/lib/postgresql_docker/data/pgdata
                                                                      volumes:
                                                                        - ./odoo-db-data:/var/lib/postgresql_docker/data/pgdata
                                                                  volumes:
                                                                      odoo-db-data:
                                                                  然后通过docker-compose up命令执行该文件来创建相应的容器。

                                                                  通过docker-compose更新odoo模块:
                                                                     
                                                                  command: -u module_name -d db_name
                                                                  需要确保使用docker-compose update而不是docker-compose up命令。

                                                                  制作自己的Odoo镜像

                                                                  docker制作镜像的2种方式

                                                                  • Docker Commit

                                                                  • dockerfile   主流方式

                                                                  Docker Commit方式制作镜像

                                                                  修改好容器之后:

                                                                  docker commit  -a "chy  xxxxxxx@qq.com"  -m  "做了哪些修改"  id|name  imageName:version

                                                                  -a指定作者信息,-m指定镜像信息,一般是说明做了哪些修改、这个镜像的功能用途。如果值是不带空格的字符串,可以不引,带了空格就要引起来。

                                                                  -a、-m均可选,如果配置了,使用docker inspect id|name 查看该镜像创建的容器的信息时会看到这2个参数的值

                                                                  id|name指定要使用哪个容器制作镜像

                                                                  imageName:version指定镜像的名称、版本号,版本号任意,可以是test、v1这种字符串,也可以是1、1.1这种数字


                                                                  Dockerfile方式制作镜像

                                                                  (1)vim dockerfile   #文件名必须是dockerfile

                                                                   

                                                                  (2)在里面写指令:

                                                                  FROM imageName:version
                                                                  MAINTAINER chy xxxxxxx@qq.com
                                                                  RUN each "image is building..."

                                                                   

                                                                  (3)docker build -t Odoo_Pos:v1 .     #构建镜像,Odoo_Pos:v1是自定义的镜像名称、版本号,后面是dockerfile文件所在目录,.表示当前目录

                                                                   

                                                                  dockerfile常用指令

                                                                  FROM imageName:version    #基于哪个镜像构建

                                                                  MAINTAINER  chy  xxxxx@qq.com    #作者信息

                                                                   

                                                                  COPY  1.txt   /usr/local/    #将文件从宿主机复制到镜像,宿主机的路径写相对路径,镜像的路径写绝对路径

                                                                  ADD 1.txt   /usr/local/    #和COPY相似,不同点:如果是.tar.gz文件,ADD复制之后会自动解压

                                                                   

                                                                  WORKDIR /usr/local/tomcat  指定应用的工作目录,如果此目录不存在,会自动创建

                                                                   

                                                                  ENV JAVA_HOME=/usr/local/jdk   #设置环境变量

                                                                  EXPOSE   8080  #开放防火墙端口

                                                                  RUN echo "image is building..."  #作用于镜像层面,在构建镜像时执行;如果有多条RUN命令,都会执行

                                                                  ENTRYPOINT yum install xxx  -y #作用于容器层,在容器启动的时候执行;如果有多条ENTRYPOINT命令,只执行最后一条ENTRYPOINT命令

                                                                  CMD yum install xxx  -y  #作用于容器层,在容器启动的时候执行;如果有多条CMD命令,只执行最后一条CMD命令。

                                                                   

                                                                  ENTRYPOINT、CMD的区别:

                                                                  CMD可以在容器启动时传递参数,参数是默认参数,可以被覆盖,ENTRYPOINT不可以传参数。

                                                                  如果要用CMD传参数,需要搭配ENTRYPOINT使用,示例:

                                                                  CMD ["-ef"]

                                                                  ENTRYPOINT ["ps"]

                                                                  docker run或docker start 启动容器时,可以向ps命令传递参数,eg.  docker start id|name -ef

                                                                  比如传递-ef,比如传递-aux,传递的参数会覆盖默认的-ef,如果不向ps命令传递参数,使用默认的-ef

                                                                   

                                                                  命令格式

                                                                  RUN、ENTRYPOINT、CMD运行的命令可以是下面的2种格式

                                                                  • shell命令格式     RUN echo "....",RUN yum install xxx  -y
                                                                  • exec命令格式     RUN  [ "yum","install" ,"xxx" ,"-y"]   命令写成字符串数组

                                                                  Docker Commit方式要启动镜像的一个容器,对容器进行修改,打包为镜像,再停止、删除这个容器,颇为麻烦;

                                                                  dockerfile是在宿主机上新建文件dockerfile,在dockerfile文件中写指令,不需要操作容器,更简便,用得也更多;但dockerfile难度也要大得多.



                                                                  参考:

                                                                  制作一个自己的odoo镜像

                                                                  Dockerized Odoo Development

                                                                  通过Docker实现odoo快速迁移

                                                                  How to Install Odoo 13 Using Docker

                                                                  Docker教程

                                                                  Odoo docker image build tutorial

                                                                  Docker 构建自定义镜像