docker简介:
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 一个完整的Docker有以下几个部分组成: Docker Client 客户端 |
Docker功能特性
隔离环境(系统,网络,文件系统)与应用:1.通过cgroup(隔离和跟踪资源的使用)& namespace(组与组之间隔离)来实现轻量级的进程隔离 解决依赖与版本问题1.传统模式下,多个不同环境或版本的项目需要部署在不同机器上,部署与后期维护管理复杂繁琐。 易于分发,开箱即用1.镜像可以通过导入,导出,上传到镜像仓库等多种方式进行分发 节点与容器快速扩容1.容器扩容简单方便 镜像制作简单便捷,管理方便1.镜像的灵魂Dockerfile |
Docker的应用场景:
|
Docker 的优点:
1、快速,一致地交付您的应用程序2、响应式部署和扩展3、在同一硬件上运行更多工作负载 |
Docker 架构:
Docker 包括三个基本概念:
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。四大核心管理:1.network 网络 2.container 容器 3.image 镜像 4.data volumes 卷 docker的网络模式:1.bridge :默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中 2.host:容器不会获得一个独立的network namespace,而是与宿主机共用一个 3.none :获取独立的network namespace,但不为容器进行任何网络配置 4.container:与指定的容器使用同一个network namespace,网卡配置也都是相同的 5.自定义:自定义网桥,默认与bridge网络一样 |
docker安装:
卸载旧版本:sudo yum remove docker \ 安装所需的软件包:sudo yum install -y yum-utils \ 设置稳定的仓库:sudo yum-config-manager \ 安装最新版本的 Docker: 添加国内镜像源:echo -e "{\n\t\"registry-mirrors\":[ \"https://registry.docker-cn.com\" ]\n}" > /etc/docker/daemon.json |
镜像的使用:
查看docker信息 | docker info |
登录到docker hup | docker login |
查看登录信息 | cat /root/.docker/config.josn |
搜索镜像 | docker search 镜像名称 |
下载镜像 | docker pull 镜像名称 |
查看下载的镜像 | docker images |
为镜像打标签 | docker tag 镜像名称 镜像名称:v1 |
上传镜像 | docker push 镜像名称:v1 |
导出镜像到文件 | docker save -o /root/nginx nginx |
docker save linuxfan/centos:v1 -o centos.tar | |
导入镜像 | cat centos.tar |docker import - myctos:v1 |
docker load </root/nginx | |
删除镜像 | docker rmi myctos:v1 |
#查看镜像详细信息 | docker inspect 容器id |
查看容器命令:
查看容器端口映射及协议 | docker port |
查看当前系统docker运行情况 | docker info |
查看docker状态 | docker top |
查看docker进程 | docker ps -a |
列出所有的容器 ID | docker ps -aq |
停止所有的容器 | docker stop $(docker ps -aq) |
删除所有的容器 | docker rm $(docker ps -aq) |
删除所有的镜像 | docker rmi $(docker images -q) |
复制文件 | docker cp mycontainer:/opt/file.txt /opt/local/ |
docker cp /opt/local/file.txt mycontainer:/opt/ |
容器的使用:
创建容器 | docker create [选项] 镜像 运行的程序 | -i #让容器的输入保持打开 |
-t #为docker分配一个伪终端 | ||
启动容器 | docker start 容器的id或者名称 | |
创建并启动容器 | docker run [-itd] 容器的名称 运行的程序 -c "命令" | |
容器的终止 | docker stop 容器的id或者名称 | |
exit 或 ctrl + d //退出并停止容器 | ||
先按ctrl + p 再按 ctrl + q //退出伪终端,容器后台运行 | ||
容器的删除 | docker rm [-f] 容器的id或名称 | |
容器的进入 | docker exec -it 容器的id或者名称 /bin/bash | |
docker attach 容器的id或名称 | ||
容器的导出和导入 | docker export 容器的id或名称 >/root/centos.con | |
cat /root/centos.con |docker import - centos7.5:v1 | ||
将容器导出为文件 | docker export uuid -o centos_httpd.tar | |
将容器保存至镜像 | docker commit 容器的id或名称 haha/centos:v1(自定义) | |
映射容器端口 | docker run -p 端口:端口 -it 服务名称 /bin/bash | |
向容器进程发布命令 | docker exec 容器id 命令 | |
容器文件的复制 | docker cp 容器id:/tmp/文件名称 ./ | |
docker cp 文件名称 容器id:目录 | ||
强制停止运行容器 | docker kill 容器id | |
暂停与恢复容器进程 | docker pause 容器id | |
docker unpause 容器id | ||
进入容器中的mysql创建库 | docker exec 卷名 sh -c ‘exec MySQL -uroot -p“$MYSQL_ROOT_PASSWORD”-e "create database wp"’ | |
运行docker中的命令 | docker run docker.io/centos /bin/echo "welcome to the Docler World" | |
创建一个自定义网络 | docker network create name | |
安装bridge | yum -y install bridge-utils | |
brctl show //查看网桥状态 | ||
docker network ls // 查看网络类型 | ||
docker inspect 容器名称 |grep -A 15 “Networks” //查看容器的网络信息 |
docker卷容器:
volumes | docker volume create nginx-v1 |
docker run -dit --name=nginx-test --mount src=nginx-v1,dst=/usr/share/nginx/html nginx | |
bind mounts: | docker run -dit --name nginx-test4 -p 90:80 --mount type=bind,src=/var/lib/docker/volumes/nginx-v2/_data,dst=/usr/share/nginx/html nginx |
tmpfs | 挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统 |
dockerfile常用指令:
FROM | 构建的新镜像是基于哪个镜像。例如:FROM centos:v1 | |
MAINTAINER | 镜像维护者姓名或邮箱地址。例如:MAINTAINER name | |
RUN | 构建镜像时运行的Shell命令 | shell 格式: RUN <命令行命令> # <命令行命令> 等同于,在终端操作的 shell 命令。 |
exec 格式: RUN ["可执行文件", "参数1", "参数2"] # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline |
||
CMD | 运行容器时执行的Shell命令 | 格式: CMD <shell 命令> CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数 注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。 |
ENTRYPOINT |
运行容器时执行的Shell命令(不能被运行时传递的参数覆盖) | 格式: ENTRYPOINT ["<executeable>","<param1>","<param2>",...] 优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。 注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。 |
COPY | 拷贝文件或目录到镜像(不能自动解压缩) | 格式: COPY [--chown=<user>:<group>] <源路径1>... <目标路径> COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"] |
ADD | 拷贝文件或目录到镜像(可以自动解压缩或者下载)如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html或者:ADD html.tar.gz /var/www/html ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径> ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。 |
|
ENV | 设置容器内环境变量 | 格式: ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... |
ARG | 在构建镜像时指定一些参数 | 格式: ARG <参数名>[=<默认值>] |
EXPOSE | 声明容器运行的服务端口 | 格式: EXPOSE <端口1> [<端口2>...] |
VOLUME | 指定容器挂载点到宿主机自动生成的目录或其他容器 | 格式: VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径> 在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点 |
USER |
用于指定执行后续命令的用户和用户组(用户和用户组必须提前已经存在) | 格式: USER <用户名>[:<用户组>] |
WORKDIR |
指定工作目录(必须是提前创建好的) |
格式: WORKDIR <工作目录路径> |
HEALTHCHECK |
用于指定某个程序或者指令来监控 docker 容器服务的运行状态 | 格式: HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令 HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令 HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。 |
ONBUILD |
用于延迟构建命令的执行 | 格式: ONBUILD <其它指令> |
Compose 简介:
Compose 是用于定义和运行多容器 Docker 应用程序的工具 Compose 使用的三个步骤:
|
Compose 安装:
|
Compose 命令:
|
yml 配置文件:
# yaml 配置 web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。 redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。 |
yml 配置指令参考:
version 指定本 yml 依从的 compose 哪个版本制定的build 指定为构建镜像上下文路径 例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像: 或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
cap_add,cap_drop添加或删除容器拥有的宿主机的内核功能。 cgroup_parent为容器指定父 cgroup 组,意味着将继承该组的资源限制。 command覆盖容器启动的默认命令。 container_name指定自定义容器名称,而不是生成的默认名称。 depends_on设置依赖关系。
注意:web 服务不会等待 redis db 完全启动 之后才启动。 deploy指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。 可以选参数: endpoint_mode:访问集群服务的方式。 labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。 mode:指定服务提供的模式。
replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。 resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。 restart_policy:配置如何在退出容器时重新启动容器。
rollback_config:配置在更新失败的情况下应如何回滚服务。
update_config:配置应如何更新服务,对于配置滚动更新很有用。
注:仅支持 V3.4 及更高版本。 devices指定设备映射列表。 dns自定义 DNS 服务器,可以是单个值或列表的多个值。 dns_search自定义 DNS 搜索域。可以是单个值或列表。 entrypoint覆盖容器默认的 entrypoint。 也可以是以下格式: env_file从文件添加环境变量。可以是单个值或列表的多个值。 也可以是列表格式: environment添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。 expose暴露端口,但不映射到宿主机,只被连接的服务访问。 仅可以指定内部端口为参数: extra_hosts添加主机名映射。类似 docker client --add-host。 以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系: healthcheck用于检测 docker 服务是否健康运行。 image指定容器运行的镜像。以下格式都可以: logging服务的日志记录配置。 driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项 仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。 当达到文件限制上限,会自动删除旧得文件。 syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。 network_mode设置网络模式。 networks 配置容器连接的网络,引用顶级 networks 下的条目 。 aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。 restart
注:swarm 集群模式,请改用 restart_policy。 secrets存储敏感数据,例如密码: security_opt修改容器默认的 schema 标签。 stop_grace_period指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。 默认的等待时间是 10 秒。 stop_signal设置停止容器的替代信号。默认情况下使用 SIGTERM 。 以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。 sysctls设置容器中的内核参数,可以使用数组或字典格式。 tmpfs在容器内安装一个临时文件系统。可以是单个值或列表的多个值。 ulimits覆盖容器默认的 ulimit。 volumes将主机的数据卷或着文件挂载到容器里。 |