docker入门

Posted by Procon on July 8, 2022

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发现,可以通过容器名容器之间网络通信。

image-20200909153809028

image-20200909154406771

5. DockFile

5.1 DockerFile格式

image-20200909155102901

FROM:基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER:镜像维护者的姓名和邮箱地址

RUN:容器构建时需要运行的命令

EXPOSE:当前容器对外暴露出的端口

WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

ENV:用来在构建镜像过程中设置环境变量

ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

VOLUME:容器数据卷,用于数据保存和持久化工作

CMD:指定一个容器启动时要运行的命令,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

image-20200909162523135

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)

架构图:

image-20200909183030249

• 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