Docker
1. Docker的安装(centos 7)
-
查看系统版本:cat /etc/redhat-release
-
yum安装gcc相关:
- yum -y install gcc
- yum -y install gcc-c++
-
卸载旧版本:yum -y remove docker docker-common docker-selinux docker-engine
-
安装需要的软件包:yum install -y yum-utils device-mapper-persistent-data lvm2
-
设置stable镜像仓库:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum包索引: yum makecache fast
-
安装docker ce:yum -y install docker-ce
-
启动docker: systemctl start docker
-
查看docker版本: systemctl start docker
-
配置镜像加速:
- mkdir -p /etc/docker
- vim /etc/docker/daemon.json
-
1 2 3
{ "registry-mirrors": ["https://h0yx4rna.mirror.aliyuncs.com"] }
-
font color=’red’>systemctl daemon-reload</font>
- systemctl restart docker
快速安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker软件包源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce
$ systemctl enable docker && systemctl start docker
$ docker --version
# cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://h0yx4rna.mirror.aliyuncs.com"]
}
EOF
卸载
1
2
3
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
2.Docker常用命令
==帮助命令==
1
2
3
查看版本:docker version
查看详细信息: docker info
帮助命令:docker help
==管理镜像常用命令==
1
2
3
4
5
6
列出镜像:dokcer images -[OPTIONS]
OPTIONS说明
-a 列出本地所有的镜像(含中间映像层)
-q :只显示镜像ID。
--digests :显示镜像的摘要信息
--no-trunc :显示完整的镜像信息
1
2
3
4
5
查找镜像:docker search [OPTIONS] 镜像名字
OPTIONS说明
--no-trunc : 显示完整的镜像描述
-s : 列出收藏数不小于指定值的镜像
--automated : 只列出 automated build类型的镜像
1
2
3
4
5
6
7
提交镜像:docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
拉取镜像:docker pull 镜像名字[:TAG] (不指定tag时默认为lastest)
推送镜像:docker push 镜像名字[:TAG]
删除镜像
删除单个:docker rmi -f 镜像ID
删除多个:docker rmi -f 镜像名1:TAG 镜像名2:TAG
全部删除:docker rmi -f $(docker images -qa)
1
2
3
构建镜像来自DokcerFile: docker build DockerFile
查看镜像历史:docekr history 镜像ID
显示一个或多个镜像详细信息: docker inspect 镜像名1:TAG 镜像名2:TAG
1
2
3
4
导出容器文件系统到tar归档文件: docker export
导入容器文件系统tar归档文件创建镜像:docer import
保存一个或多个镜像到一个tar归档文件: docekr save
加载镜像来自tar归档或标准输入: docker load
==创建容器常用命令==(省略docker命令)
示例: 内存限额: 允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer: docker run -d –name nginx03 –memory=”500m” –memory-swap=“600m” –oom-kill-disable nginx CPU限额: 允许容器最多使用一个半的CPU: docker run -d –name nginx04 –cpus=”1.5” nginx 允许容器最多使用50%的CPU: docker run -d –name nginx05 –cpus=”.5” nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
创建并启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字": 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
-h: 设置容器主机名
-e: 设置环境变量
–network: 连接容器到一个网络
-mount: 将文件系统附加到容器
-v:绑定挂载一个卷
--restart:容器退出时重启策略,默认no,可选值:[always|on-failure]
-m,–memory:容器可以使用的最大内存量
–memory-swap:允许交换到磁盘的内存量
–memory-swappiness=<0-100>:容器使用SWAP分区交换的百分比(0-100,默认为-1)
--cpus:可以使用的CPU数量
–cpuset-cpus:限制容器使用特定的CPU核心,如(0-3, 0,1)
–cpu-shares:CPU共享(相对权重)
1
2
3
4
5
6
7
8
9
10
从容器内拷贝文件到主机上: docker cp 容器ID:容器内路径 目的主机路径
查看容器内运行的进程: docker top 容器ID
启动容器: docker start 容器ID或者容器名
重启容器: docker restart 容器ID或者容器名
停止容器: docker stop 容器ID或者容器名
强制停止容器: docker kill 容器ID或者容器名
删除已停止的容器:docker rm 容器ID docker rm -f $(docker ps -a -q) docker ps -a -q | xargs docker rm
列出或指定容器端口映射:docker port 容器ID或者容器名
显示容器资源使用统计: docker stats 容器ID或者容器名
获取容器日志: docker logs 容器ID或者容器名
3.管理应用程序数据
3.1 Volumes
管理卷:
- docker volume create nginx-vol
- docker volume ls
- docker volume inspect nginx-vol
用卷创建一个容器:
- docker run -d –name=nginx-test –mount src=nginx-vol,dst=/usr/share/nginx/html nginx
- docker run -d –name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
清理:
- docker stop nginx-test
- docker rm nginx-test
- docker volume rm nginx-vol
==特点==
- 多个运行容器之间共享数据,多个容器可以同时挂载相同的卷。
- 当容器停止或被移除时,该卷依然存在。
- 当明确删除卷时,卷才会被删除。
- 将容器的数据存储在远程主机或其他存储上(间接)
- 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
3.2 BindMount
用卷创建一个容器:
- docker run -d -it –name=nginx-test –mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
- docker run -d -it –name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
验证绑定:
- docker inspect nginx-test
清理:
- docker stop nginx-test
- docker rm nginx-test
==特点:==
- 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
- 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。
- 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时
4.Doker 网络
-
bridge
-net=bridge
默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
-
host
-net=host
容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。
-
none
-net=none
获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。
-
container
-net=container:Name/ID
与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
-
自定义网络
与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名容器之间网络通信。
5. DockFile
5.1 DockerFile格式
FROM:基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:容器构建时需要运行的命令
EXPOSE:当前容器对外暴露出的端口
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
ENV:用来在构建镜像过程中设置环境变量
ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置目标路径>源路径>
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定一个容器启动时要运行的命令,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT :指定一个容器启动时要运行的命令,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
示例nginx docker file:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM centos:7
MAINTAINER www.ctnrs.com
RUN yum install -y gcc gcc-c++ make \
openssl-devel pcre-devel gd-devel \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/*
RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz && \
tar zxf nginx-1.15.5.tar.gz && \
cd nginx-1.15.5 \
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module && \
make -j 4 && make install && \
rm -rf /usr/local/nginx/html/* && \
echo "ok" >> /usr/local/nginx/html/status.html && \
cd / && rm -rf nginx-1.12.2* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
6.Habor
Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等,足以满足基本企业需求
github地址:https://github.com/goharbor/harbor
6.1 安装方式
• 在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小 • 离线安装:安装包包含部署的相关镜像,因此安装包比较大 • OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动Harbor
安装docker compose
1
2
3
4
5
6
7
8
curl -L "https://github.com/docker/compose/releases/download/1.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Harbor部署
1
2
3
4
5
6
# tar zxvf harbor-offline-installer-v1.6.1.tgz
# cd harbor
# docker image load -i harbor.v2.0.0.tar.gz
# vi harbor.yml
# ./prepare
# ./install.sh
基本使用
-
配置http镜像仓库可信任
1 2 3 4
# vi /etc/docker/daemon.json {"insecure-registries":["reg.huangpuguang.com"]} # systemctl restart docker # docker-compose up -d
-
打标签
1
# docker tag 2e25d8496557 xxxxx.com/abc-dev/arc:1334
docker tag 2e25d8496557 xxxxx.com/abc-dev/arc:1334
2e25d8496557:IMAGE ID,可以用docker images 查看
xxxxx.com:私有hub域名
abc-dev:项目名称
arc:镜像名称
1334:镜像版本号
-
上传
1
# docker push xxxxx.com/abc-dev/arc:1334
-
下载
1
# docker pull xxxxx.com/abc-dev/arc:1334
7.Prometheus+Grafana监控Docker
Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目,拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016年加入云原生云计算基金会(CNCF),成为继Kubernetes之后的第二个托管项目。
Prometheus 特点:
• 多维数据模型:由度量名称和键值对标识的时间序列数据 • PromQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询 • 不依赖分布式存储,单个服务器节点可直接工作 • 基于HTTP的pull方式采集时间序列数据 • 推送时间序列数据通过PushGateway组件支持 • 通过服务发现或静态配置发现目标 • 多种图形模式及仪表盘支持(grafana)
架构图:
• Prometheus Server:收集指标和存储时间序列数据,并提供查询接口 • ClientLibrary:客户端库 • Push Gateway:短期存储指标数据。主要用于临时性的任务 • Exporters:采集已有的第三方服务监控指标并暴露metrics • Alertmanager:告警 • Web UI:简单的Web控制台
实例:可以抓取的目标称为实例(Instances)作业:具有相同目标的实例集合称为作业(Job)
作业:具有相同目标的实例集合称为作业(Job)
1
2
3
4
5
6
7
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['192.168.1.10:9090']
Docker部署
https://prometheus.io/docs/prometheus/latest/installation/
1
2
3
4
5
docker run -d \
--name=prometheus \
-p 9090:9090 \
-v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
prometheus.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
- job_name: "Linux"
static_configs:
- targets: ['192.168.31.62:9100']
Docker部署Grafa
1
2
3
4
docker run -d \
--name=grafana \
-p 3000:3000 \
grafana/grafana
Docker部署cAdvisor:
1
2
3
4
5
6
7
8
9
10
docker run -d \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
Docker主机监控模板:193 Linux主机监控模板:9276
8. 推送镜像到阿里云
1. 登录阿里云Docker Registry
1
$ sudo docker login --username=hazer@foxmail.com registry.cn-shenzhen.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
1
$ sudo docker pull registry.cn-shenzhen.aliyuncs.com/hazer/docker:[镜像版本号]
3. 将镜像推送到Registry
1
2
3
$sudo docker login --username=hazer@foxmail.com registry.cn-shenzhen.aliyuncs.com
$sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/hazer/docker:[镜像版本号]
$sudo docker push registry.cn-shenzhen.aliyuncs.com/hazer/docker:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-shenzhen.aliyuncs.com 作为Registry的域名登录。
5. 示例
使用”docker tag”命令重命名镜像,并将它通过专有网络地址推送至Registry。
1
2
3
4
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-shenzhen.aliyuncs.com/acs/agent:0.7-dfb6816
使用 “docker push” 命令将该镜像推送至远程。
1
$ sudo docker push registry-vpc.cn-shenzhen.aliyuncs.com/acs/agent:0.7-dfb6816