2021SC@SDUSC
目录
一.引言
SDU信息门户使用了docker,源码中也有相关的yaml文件,docker就是在Docker 中将应用程序与该程序的依赖,打包在一个文件里面,该文件包括了所有打包得应用程序的所有依赖,像数据库等;直接运行改文件,就可以让程序跑起来,从而不用再去考虑环境问题。
Docker 是属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
二.docker安装及yaml文件分析
1.安装
更新 apt 包索引
$ sudo apt-get update
安装 apt 依赖包,用于通过HTTPS来获取仓库
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
添加 Docker 的官方 GPG 密钥
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
使用以下指令设置稳定版仓库
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
安装 Docker Engine-Community
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
终端输入docker命令启动。
sudo service docker start
停止docker
sudo service docker stop
docker其他命令
查看docker信息:docker info
docker命令帮助:docker run --help
复制文件到容器:docker cp custom.conf Nginx:/etc/nginx/conf.d/
更新容器启动项:docker container update --restart=always nginx
查看docker日志:tail -f /var/log/messages
2.yaml文件分析
SDU信息门户在Docker Compose构建镜像文件时,用到了yml格式的文件。现在我们来学习一下。YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"。YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲。YAML 的配置文件后缀为 .yml,如:runoob.yml 。
基本语法:大小写敏感,使用缩进表示层级关系,缩进不允许使用tab,只允许空格,缩进的空格数不重要,只要相同层级的元素左对齐即可,'#'表示注释。
数据类型
YAML 支持以下几种数据类型:对象:键值对的集合;数组:一组按次序排列的值;纯量:单个的、不可再分的值YAML 对象,对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。
key:
child-key: value
child-key2: value2
较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value。
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。Compose 使用的三个步骤:使用 Dockerfile 定义应用程序的环境;使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行;最后,执行 docker-compose up 命令来启动并运行整个应用程序。
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
version
指定本 yml 依从的 compose 哪个版本制定的。
build
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3.7"
services:
webapp:
build: ./dir
作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:context:上下文路径;dockerfile:指定构建镜像的 Dockerfile 文件;args:添加构建参数,这是只能在构建过程中访问的环境变量;labels:设置构建镜像的标签;target:多层构建,可以指定构建哪一层。
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod
cap_add,cap_drop
添加或删除容器拥有的宿主机的内核功能。
cap_add:
- ALL # 开启全部权限
cap_drop:
- SYS_PTRACE # 关闭 ptrace权限
cgroup_parent
为容器指定父 cgroup 组,意味着将继承该组的资源限制。
cgroup_parent: m-executor-abcd
depends_on
docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
deploy:
指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。 可选参数:endpoint_mode:访问集群服务的方式。endpoint_mode: vip 。Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。endpoint_mode: dnsrr。DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。mode:指定服务提供的模式。replicated:复制服务,复制指定服务到集群的机器上。global:全局服务,服务将部署至集群的每个节点。parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。delay:每个容器组回滚之间等待的时间(默认为0s)。failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
mode:replicated
replicas: 6
endpoint_mode: dnsrr
labels:
description: "This redis service label"
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
restart
no:是默认的重启策略,在任何情况下都不会重启容器。
always:容器总是重新启动。
on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
secrets
存储敏感数据,例如密码:
version: "3.1"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
stop_signal
设置停止容器的替代信号。默认情况下使用 SIGTERM 。
以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。
stop_signal: SIGUSR1
tmpfs
在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
tmpfs: /run
tmpfs:
- /run
- /tmp
ulimits
覆盖容器默认的 ulimit。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes
将主机的数据卷或着文件挂载到容器里。
version: "3.7"
services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
dns
和 --dns 参数一样用途,格式如下:dns: 8.8.8.8;也可以是一个列表:dns:- 8.8.8. - 9.9.9.此外 dns_search 的配置也类似:dns_search: example.com。dns_search: - dc1.example.com - dc2.example.com
export-import与save-load的区别
导出后再导入(export-import)的镜像会丢失所有的历史,而保存后再加载(save-load)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚。(可以执行docker tag 来回滚之前的层)。
三.docker主要命令
docker run -i -t sauloal/ubuntu14.04
docker run -i -t sauloal/ubuntu14.04 /bin/bash # 创建一个容器,让其中运行 bash 应用,退出后容器关闭
docker run -itd --name centos_aways --restart=always centos #创建一个名称centos_aways的容器,自动重启。
查看容器:
docker ps :列出当前所有正在运行的container
docker ps -l :列出最近一次启动的container
docker ps -a :列出所有的container(包含历史,即运行过的container)
docker ps -q :列出最近一次运行的container ID
再次启动容器:
docker start/stop/restart <container> #:开启/停止/重启container
docker start [container_id] #:再次运行某个container (包括历史container)
进入正在运行的docker容器:
docker exec -it [container_id] /bin/bash
docker run -i -t -p <host_port:contain_port> #:映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口。
删除容器:
docker rm <container...> #:删除一个或多个container
docker rm `docker ps -a -q` #:删除所有的container
docker ps -a -q | xargs docker rm #:同上, 删除所有的containe
四.学习总结
docker是真的方便,整个SDU信息门户系统我只需要运行源代码中的compose.yaml文件,就可以自动安装配置系统需要的环境,使用docker可以让我从此告别繁琐的环境配置问题。Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,VM启动一般是分钟级,docker容器启动是秒级;方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合;节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;方便持续集成,通过与代码进行关联使持续集成非常方便;但要想知道具体的环境,还需要读懂yaml文件,这篇博客我主要介绍了我学习的yaml文件里面的参数知识,通过这次学习,我知道怎么看懂yaml文件,也知道怎么写yaml文件。