Odoo Docker安装&部署

Docker是什么?

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

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

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

  • DockerClient客户端

  • Docker Daemon守护进程

  • Docker Image镜像

  • DockerContainer容器

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

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

Docker Hub

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

常用命令

1. 安装docker

		​curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2.列出本机镜像

​docker images
3.下载docker image镜像

​docker pull odoo:14.0
4.查找镜像
​docker search
5.删除镜像
​docker rmi odoo:14.0

6. 创建镜像

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

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

7. 启动容器(交互式):  

​docker run [-i]  [-t] # docker run -it ubuntu /bin/bash

8. 启动容器(后台模式):

​docker run -d # docker run -itd --name ubuntu-test ubuntu /bin/bash

9. 启动一个已停止的容器:

​docker start b750bbbcfd88

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

  • docker attach 1e560fca3906

  • docker exec -it 243c32535da7 /bin/bash

11. 退出容器:

​exit / CTRL+D

12. 停止容器

​docker stop Container-ID

13. 删除容器

​docker rm -f Container-ID

14. 查看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 构建自定义镜像


技术
VirtualEnv应用
通过VirtualEnv配置Odoo