定义和用处
- 定义
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。
- 用处
- 隔离性
- 轻便,便于维护管理
- 弹性,同时起用多个
- 可复用镜像
概念
-
镜像
**Docker 把应用程序及其依赖,打包在 image 文件里面。**只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。
-
镜像仓库
存储镜像的仓库,类似于Maven仓库。可在本地服务器部署镜像仓库,也可使用阿里云或官方仓库。
-
容器
**image 文件生成的容器实例,本身也是一个文件,称为容器文件。**关闭容器并不会删除容器文件,只是容器停止运行而已。
-
Dockerfile
Dockerfile是一个文本文件,里面编写多条命令,这些命令描述了一个镜像构建的细节。Docker 根据 该文件生成二进制的 image 文件。
安装和配置
-
centos7安装
yum install -y docker
-
配置镜像仓库
打开 /etc/docker/daemon.json,插入以下数据
{ "registry-mirrors": ["你的镜像地址(https://c6n8vys4.mirror.aliyuncs.com)"] }
使用命令
-
拉取镜像
docker pull redis:3.0
-
查询镜像
docker search redis
-
上传镜像
docker push redis:3.0
-
删除镜像
docker rmi redis:3.0
-
制作springboot jar镜像
-
编写Dockerfile文件(参看Dockerfile 指令详解)
FROM jdk:alpine-jdk8 VOLUME /tmp ADD app.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
-
maven 打springboot的jar
-
将Dockerfile文件和jar放在linux同一目录,执行以下命令(其中-d代表名字 . 代表当前目录)
docker build -d myApp:1.0 .
-
-
创建并启用容器(其中-d代表后台运行,–name postgres96代表容器名字,-p 5433:5432代表宿主机端口为5433,容器内端口为5432,–network testnet代表使用桥连接中testnet的网络,–network-alias postgres96代表在testnet网络中的别名为postgres96,同样在该网络中的容器,可通过域名为postgres96来访问该容器)
docker run -d --name postgres96 -p 5433:5432 --network testnet --network-alias postgres96 postgres:9.6.11
-
启用容器
docker start postgres96
-
停止容器
docker stop postgres96
-
删除容器
docker rm postgres96
-
创建网络(参看Docker容器互访三种方式)
docker network create testnet
-
springboot 的日志挂载数据卷
- 日志配置文件中目录为 /logs/app
- docker 启动镜像时加上 -v /usr/local/app/logs:/logs/app
docker run -d -v /usr/local/logs/app:/logs/app --name myApp -p 8081:8080 --network testnet myApp:1.0
-
进入容器
docker exec -it redis /bin/bash
网络模式
Docker网络模式 | 配置 | 说明 |
---|---|---|
host模式 | –net=host | 容器和宿主机共享Network namespace。 |
container模式 | –net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
none模式 | –net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 |
bridge模式 | –net=bridge | (默认为该模式),容器互访可使用同一网桥或创建连接 |
DockerFile
- 指令
- From:指定一个基准镜像,后续的指令运行于此基准镜像所提供的运行环境,必选
- FROM image:version
- MAINTAINER:作者信息,已废弃,使用LABEL替换,可选
- MAINTAINER “auther info”
- LABEL:键值的元数据
- LABEL :
- COPY:用于将宿主机工作目录复制到目标镜像的系统文件中
- COPY …
- COPY ["",…""]
- ADD:类似于COPY,此外还能将URI文件下载并保存,此外本地的tar文件也会自动展开
- WORKDIR:指定工作目录
- WORKDIR
- VOLUME:创建一个挂载点目录,会自动指定宿主机挂载目录
- VOLUME
- EXPOSE:用于为容器打开指定要监听的端口以实现与外部通信
- EXPOSE
- ENV:用于为镜像定义所需的环境变量,并可被Dockerfile中位于其他的命令(如ENV、ADD、COPY等)所调用
- 调用格式为 v a r i a b l e n a m e 或 variable_name或 variablename或{variable_name}
- EVN = …
- 也可通过 run 或 build 命令加 -e 方式输入参数
- RUN:docker build 运行的命令,如压缩包的解压,但基于基础镜像的命令,会逐一运行,以下第一种使用shell启动,第二种不会,可以加入"/bin/bash"
- RUN
- RUN ["", “”, “”]
- CMD:docker run 运行的命令,存在多个CMD时,只运行最后一个,以下第一种使用shell启动,启动后,进程不为1,docker无法停止,但默认会转为第二种,加"/bin/bash",第二种ID为1,可以加入"/bin/bash",以便能执行sh的命令,但会变成shell子进程,可以使用exec方式,第三种为ENTRYPOINT指令提供默认参数
- CMD
- CMD ["", “”, “”]
- CMD ["", “”]
- ENTRYPOINT:类似于CMD,指定默认运行程序,与CMD不同的是ENTRYPOINT启动的命令,不会被docker run 后续的命令覆盖,除非使用–entrypoint,此外CMD中的数据会作为ENTRYPOINT的参数使用
- ENTRYPOINT
- ENTRYPOINT ["", “”, “”]
- USER:执行命令时指定的用户,但该用户需要在linux中存在
- USER |
- HEALTHCHECK:检查主进程工作状态健康与否,且可以加入起始时间等待或间隔尝试等参数
- SHELL:运行程序默认的程序
- STOPSIGNAL:发送docker停止的信号
- ARG:只在build使用,且通过 --build-arg =
- ONBUILD:在Dockerfile中定义一个触发器,其他的镜像调用本镜像时其他镜像会执行
- From:指定一个基准镜像,后续的指令运行于此基准镜像所提供的运行环境,必选