构建
# 最后的 . 表示当前路径,是上下文目录,构建时会将路径下所有文件发给Docker引擎供 COPY ADD 等命令调用 # 如果配置文件名不为 Dockerfile,可用 -f 指定文件名 sudo docker build -t 新镜像名 . 5.4 Dockerfile常用关键字FROM:基于哪个基础镜像
MAINTAINER:镜像维护者的姓名和邮箱地址
WORKDIR:指定运行目录,为后续的 RUN、CMD、COPY、ADD 等命令配置工作目录,默认 /
COPY:将宿主机的文件拷贝到镜像中去(原文件必须在build命令最后指定的路径内)
ADD:和COPY一样,并且还可以解压缩,或者从url拷贝文件到镜像中
RUN:构建镜像时运行的shell命令,由于DockerFile每条指令都会堆叠一层镜像,所以最好使用 \ 换行和 && 连接命令来减少体积
EXPOSE:指定镜像暴露出来的端口
CMD:容器运行时默认执行的shell命令(多个CMD只有最后一个生效)
VOLUME:声明容器内多个路径为匿名卷,run容器时若没有指定宿主机目录与其关联,则自动在宿主机创建目录与其关联,目的是防止容器运行时产生太多数据,如 log
ENV:指定环境变量
USER:使用哪个用户启动,默认root
ENTRYPOINT:和CMD一样,但是可以追加(必须使用exec格式:ENTRYPOINT [./entrypoint.sh,参数1,参数2……])
LABEL:标签
ONBUILD:当构建一个父镜像时,父镜像被子镜像继承时,ONBUILD被触发
6. 服务编排(Docker Compose)微服务架构系统中一般包含多个微服务,每个微服务一般会部署多个实例,如果手动管理工作量就会很大:
要构建或拉取镜像
要创建多个容器
要管理这些容器
服务编排就是按照一定的规则批量管理容器的方法。Docker Compose 是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整生命周期,使用步骤:
利用 DockerFile 定义运行环境镜像
使用 docker-compose 配置文件定义组成应用的各服务
运行 docker-compose up 启动应用
6.1 安装 sudo apt install docker-compose 6.2 编排一个 Nginx+Flask 项目创建工作目录
mkdir project cd project # 创建nginx个人配置目录,一会儿做映射 mkdir -p nginx/conf.d编写docker-compose配置文件
version: '3' services: # 定义一个容器 nginx1: # 可以自定义容器名 container_name: main_nginx image: nginx ports: - "80:80" # 链接到另一个容器后便可以直接访问 links: - flask1 # 这里简单起见对默认配置不做修改,仅挂载自定义配置 volumes: - ./nginx/conf.d:/etc/nginx/conf.d flask1: container_name: main_flask # 可以基于一份Dockerfile制作镜像并创建容器,如果同时指定image会以它命名镜像 # 这里假设已经在当前目录下写好了flask镜像的Dockerfile build: context: . dockerfile: ./Dockerfile image: img_flask # 暴露端口,并没有与宿主机做映射,只允许被链接容器访问 expose: - "8000" # 如果容器内没有前台常驻进程,构建完后会立即退出,加上tty参数分配一个伪终端 # tty: true编写Nginx程序配置 ./nginx/conf.d/flask1.conf
server { listen 80; # 监听80端口来自外部的请求 server_name _; # 如果映射了域名,可以代替_ # 为HTTP规则 / 设置转发 location / { proxy_pass :8000; # 转发到本地端口 } }启动
# 如果配置文件名不为 docker-compose.yml,可用 -f 指定文件名 # 后台启动 -d sudo docker-compose up查看所有容器状态
sudo docker-compose ps停止容器
# 可通过 sudo docker-compose start 再次启动 sudo docker-compose stop # 删除所有停止状态的容器 sudo docker-compose rm # 停止并删除容器,网络 # --rmi all/local (删除compose文件中定义的所有镜像)/(删除镜像名为空的镜像) # -v 删除已经在compose文件中定义的和匿名的挂载在容器上的数据卷 sudo docker-compose down