[docker] 场景记录 基础语法

基础信息,Docker 2019-02-22

近期使用docker来部署自己的开源微服务项目,包括一系列的镜像制作,容器运行,docker-compose 服务组制作,以及服务编排,顺便来记录下 docker的使用吧,方便以后查阅,不用在baidu到处searh了,^-^

docker Dockerfile 语法

from

  • base image镜像,简而言之就是最基础的依赖,可以是ubuntu 或者发布的一些image镜像,或者本地的环境
  • from php7.1 | from ubuntu等等,如果本地没有则会去hub.docker 拉取

label

  • 定义作者信息
  • LABEL maintaner="xiaodo xiaodo_liu@163.com"之类的

WORKDIR

  • 设定当前目录,设定当前容器运行时所在的路径,linxu 如:cd /website/micro-service-im,然后再执行其他操作
  • WORKDIR /website/micro-service-im 如果不适用这种方式的话也可以使用 RUN cd /website/micro-service-im

ADD

  • 将本地文件添加到镜像里,例如,将本地的project项目添加到镜像image中的ubutnu系统中
  • ADD . /website/micro-service-im

COPY 与 ADD的 区别

  • copy 只支持当前主机上的自由复制或加入到容器镜像中|add 多一个可以通过 url远程读取文件复制
  • ADD 默认拷贝文件会进行解压缩|COPY不支持
  • COPY . /website/micro-service-im 用法基本和add一致

RUN

顾名思义就是执行运行系统命令,在构建镜像的时候运行系统命令,一般在搭建环境时执行命令
  • RUN pip install flask redis等等 执行shell命令

CMD && ENTRYPOINT (区别和用法)

  • 1.两者都是在容器运行时会执行的命令
  • 2.需要注意定义多个CMD命令 只有最后一个会运行
  • 3.CMD 可以为 ENTYPOINT 提供参数|CMD 的参数会被docker run 运行指定的参数替代 而ENTRYPOINT则不会
  • CMD ["php","/website/micro-service-im/gateway-api/bin/swoft","ws:start"],
  • ENTRYPOINT ["php","/website/micro-service-im/gateway-api/bin/swoft","ws:start"],

分享一个简单的Dockerfile

FROM python:2.7
LABEL maintaner="xiaodo xiao_do@163.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]


docker 命令

build 构建镜像

  • docker build -t lxido/hello-world . -t 后更image镜像名,也就是发布的dockerhub的项目名,最后的参数是指定dockerfile 配置文件的目录

run 运行镜像容器

  • docker run (-it 调试|-d 守护) lxido/hello-world --name docker-helloworld 运行镜像,镜像不存在则去hub.docker 上拉取

push 发布镜像到 docker.hub

  • docker push lxido/hello-world

commit 更新镜像

  • docker commit containerid -m '' 将更新后的容器重复发布成镜像

端口映射

  • docker run -p 本地端口:容器端口 lxido/hello-world

清理容器 需要提前stop正在运行的容器

  • docker rm $(docker ps -aq)

容器调试

  • docker exec -it containerid /bin/bash就可以进入容器中

docker 持久化

docker容器比较是虚拟的层系统,如果不将运行时产生的数据持久化到本地,那么一旦容器exit退出将会无法恢复数据
docker 有两种持久化数据方法:映射|挂载

映射

  • docker run -d -v mysql1:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
  • -v 本地名:容器里的绝对路径
  • 这样就可以将容器里的数据映射到宿主机的本地文件中 实际保存路径可以 docker volum ls查看

挂载

  • docker run -d -v /var/lib/mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
  • -v 本地绝对路径:容器里的绝对路径
  • 其实就是-v 后的本地参数改成绝对路径就可以一对一映射了,本地和容器实时同步了

本文由 小东@xiaodo 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。