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 镜像
Odoo Image: Odoo 在 Docker 上有一个官方镜像(Odoo Image),以便在 docker 虚拟环境中安装 Odoo。
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难度也要大得多.
参考
How to Install Odoo 13 Using Docker
Odoo docker image build tutorial