目录

 

Docker基础与实战

第1 章Docker概述

1.1Docker是什么

1.2Docker设计目标

1.3Docker基本组成

1.4容器vs 虚拟机

1.5Docker应用场景

第2 章Linux安装Docker

2.1Docker版本

2.2支持平台

2.3CentOS7.x安装Docker

第3 章镜像管理

3.1镜像基础

3.1.1镜像是什么?

3.1.2镜像从哪里来?

3.2镜像与容器联系

3.3管理镜像常用命令

第4 章容器管理

4.1创建容器常用选项

4.2容器资源限制

4.3管理容器常用命令

第5 章管理应用程序数据

5.1将数据从宿主机挂载到容器中的三种方式

5.2Volume

5.3Bind Mounts

5.4小结

5.4.1Volume特点:

5.4.2Bind Mounts特点:

第6 章容器网络

6.1网络模式

6.2容器网络访问原理

第7 章Dockerfile 

7.1Dockerfile格式

7.2Dockerfile指令

7.3Build镜像

7.4构建Nginx,PHP,Tomcat基础镜像

7.5快速搭建LNMP网站平台

第8 章镜像仓库

8.1私有镜像仓库

8.1.1搭建私有镜像仓库

8.1.2私有镜像仓库管理

8.2Docker Hub公共镜像仓库使用

8.3企业级镜像仓库Harbor

8.3.1Harbor概述

8.3.2Harbor部署

8.3.3基本使用

第9 章图形页面管理

第10 章构建容器监控系统


Docker基础与实战

第1 章Docker概述

1.1Docker是什么

  • 使用最广泛的开源容器引擎
  • 一种操作系统级的虚拟化技术
  • 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)
  • 一个简单的应用程序打包工具

1.2Docker设计目标

  • 提供简单的应用程序打包工具
  • 开发人员和运维人员职责逻辑分离
  • 多环境保持一致性

1.3Docker基本组成

  • Docker Client:客户端
  • Docker Daemon:守护进程
  • Docker Images:镜像
  • Docker Container:容器
  • Docker Registry:镜像仓库
 Docker基本组成

1.4容器vs 虚拟机

容器VS虚拟机
 ContainerVM
启动速度秒级分钟级
运行性能接近原生5%左右损失
磁盘占用MBGB
数量成百上千一般几十台
隔离性进程级别系统级(更彻底)
操作系统只支持Linux几乎所有
封装程度只打包项目代码和依赖关系,共享宿主机内核完整的操作系统

1.5Docker应用场景

  • 应用程序打包和发布
  • 应用程序隔离
  • 持续集成
  • 部署微服务
  • 快速搭建测试环境
  • 提供PaaS产品(平台即服务)

第2 章Linux安装Docker

2.1Docker版本

  • 社区版(Community Edition,CE)
  • 企业版(Enterprise Edition,EE)

2.2支持平台

  • Linux(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu)

  • Mac

  • Windows

2.3CentOS7.x安装Docker

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。

#安装前的一些操作
#查看centos版本
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
#查看内核
[root@localhost ~]# uname -r
3.10.0-327.el7.x86_64
#关闭防火墙
[root@localhost ~]# systemctl stop firewalld
You have new mail in /var/spool/mail/root
#禁止开机启动
[root@localhost ~]# systemctl disable firewalld
#关闭selinux(SELINUX=disabled)
[root@localhost ~]# vi /etc/selinux/config 
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
# 安装依赖包
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
# 安装Docker CE
yum install -y docker-ce
# 启动Docker服务并设置开机启动
systemctl start docker
systemctl enable docker

有的网络访问不了docker服务器,下载不成功,可以选择阿里的源http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo,或者选择离线安装,具体可参考我的另外一篇docker离线安装博客

具体的安装过程可以参考官方文档:https://docs.docker.com

Docker存储库安装方式
Docker源安装方式

 

二进制包安装方式
 二进制包安装方式

第3 章镜像管理

3.1镜像基础

3.1.1镜像是什么?

•一个分层存储的文件
•一个软件的环境
•一个镜像可以创建N个容器
•一种标准化的交付
•一个不包含Linux内核而又精简的Linux操作系统
镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/\<storage-driver\>中。

3.1.2镜像从哪里来?

Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
地址:https://hub.docker.com/explore
配置镜像加速器:https://www.daocloud.io/mirror

#自动配置国内镜像库
[root@localhost ~]#curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
[root@localhost ~]#cat /etc/docker/daemon.json
{
"registry-mirrors": [ "http://f1361db2.m.daocloud.io"]
}


3.2镜像与容器联系

如图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率。若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像。

镜像与容器的联系
镜像与容器的联系


3.3管理镜像常用命令

镜像常用命令
指令描述
ls列出镜像
build构建镜像来自Dockerfile
history查看镜像历史
inspect显示一个或多个镜像详细信息
pull从镜像仓库拉取镜像
push推送一个镜像到镜像仓库
rm移除一个或多个镜像
prune移除未使用的镜像。没有被标记或被任何容器引用的。
tag创建一个引用源镜像标记目标镜像
export导出容器文件系统到tar归档文件
import导入文件系统tar归档文件创建镜像
save保存一个或多个镜像到一个tar归档文件
load加载镜像来自tar归档或标准输入

第4 章容器管理

4.1创建容器常用选项

容器常用选项
选项描述
-i, –interactive交互式
-t, –tty分配一个伪终端
-d, –detach运行容器到后台
-e, –env设置环境变量
-p, –publish list发布容器端口到主机
-P, –publish-all发布容器所有EXPOSE的端口到宿主机随机端口
–name string指定容器名称
-h, –hostname设置容器主机名
–ip string指定容器IP,只能用于自定义网络
–network连接容器到一个网络
–mount mount将文件系统附加到容器
-v, –volume list绑定挂载一个卷
–restart string容器退出时重启策略,默认no,可选值:[always|on-failure]

4.2容器资源限制

容器资源限制
选项描述
-m,–memory容器可以使用的最大内存量
–memory-swap允许交换到磁盘的内存量
–memory-swappiness=<0-100>容器使用SWAP分区交换的百分比(0-100,默认为-1)
–oom-kill-disable禁用OOM Killer
–cpus可以使用的CPU数量
–cpuset-cpus限制容器使用特定的CPU核心,如(0-3, 0,1)
–cpu-sharesCPU共享(相对权重)

 

示例:
内存限额:

允许容器最多使用500M内存和100M的Swap,并禁用OOM Killer:

[root@localhost ~]#docker run -d --name nginx03 --memory="500m" --memory-swap=“600m" --oom-kill-disable nginx

CPU限额:
允许容器最多使用一个半的CPU: 

[root@localhost ~]#docker run -d --name nginx04 --cpus="1.5" nginx

允许容器最多使用50%的CPU:

[root@localhost ~]#docker run -d --name nginx05 --cpus=".5" nginx

4.3管理容器常用命令

容器管理常用指令
选项描述
ls列出容器
inspect查看一个或多个容器详细信息
commit创建一个新镜像来自一个容器
cp拷贝文件/文件夹到一个容器
logs获取一个容器日志
port列出或指定容器端口映射
top显示一个容器运行的进程
stats显示容器资源使用统计
stop/start停止/启动一个或多个容器
rm删除一个或多个容器

 

第5 章管理应用程序数据

5.1将数据从宿主机挂载到容器中的三种方式

Docker提供三种方式将数据从宿主机挂载到容器中:
•volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
•bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
•tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。

挂载的三种方式
标题


5.2Volume

管理卷:
 

# 创建nginx-vol数据卷
# docker volume create nginx-vol
# 查看现有数据卷
# docker volume ls
# 查看nginx-vol数据卷的详细信息
# docker volume inspect nginx-vol


用卷创建一个容器:
 

# mount挂载数据卷的一种方式,src指定源(数据卷),dst指定目标(容器中的目录),持久化到数据卷中
# docker run -d --name=nginx-test -p 88:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
# 早期使用-v挂载数据卷,使用-v或者--mount都可以
# docker run -d --name=nginx-test -p 88:80 -v nginx-vol:/usr/share/nginx/html nginx


清理:
 

# docker stop nginx-test
# docker rm nginx-test
# docker volume rm nginx-vol

注意:
1.如果没有指定卷,自动创建。
2.建议使用--mount,更通用。

更多volume知识请查看:https://docs.docker.com/engine/admin/volumes/volumes/#start-a-container-with-a-volume

5.3Bind Mounts

用卷创建一个容器:

# type指定bind,默认为volume,src为宿主机上任意位置的文件或者目录
# 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

注意:
1.如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
2.如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。

更多Bind Mounts知识请查看:https://docs.docker.com/engine/admin/volumes/bind-mounts/#start-a-container-with-a-bind-mount

5.4小结

5.4.1Volume特点:

•多个运行容器之间共享数据。
•当容器停止或被移除时,该卷依然存在。
•多个容器可以同时挂载相同的卷。
•当明确删除卷时,卷才会被删除。
•将容器的数据存储在远程主机或其他存储上
•将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

5.4.2Bind Mounts特点:

•从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
•在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。
•当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时

第6 章容器网络

6.1网络模式

•bridge

–net=bridge默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
•host

–net=host容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。
•none

–net=none获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。
•container

–net=container:Name/ID与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
•自定义网络与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。

6.2容器网络访问原理

 veth:虚拟设备,成对出现(宿主机+容器),容器通信的关键

 

 

第7 章Dockerfile 

7.1Dockerfile格式

FROM centos:latest
MAINTAINER cgh
RUN yum install gcc -y
COPY run.sh /usr/bin
EXPOSE 80
CMD [“run.sh”]


7.2Dockerfile指令

Dockerfile指令
指令描述
FROM构建新镜像是基于哪个镜像
MAINTAINER镜像维护者姓名或邮箱地址
RUN构建镜像时运行的Shell命令
COPY拷贝文件或目录到镜像中
ENV设置环境变量
USER为RUN、CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE声明容器运行的服务端口
HEALTHCHECK容器中服务健康检查
WORKDIR为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
ENTRYPOINT运行容器时执行,如果有多个ENTRYPOINT指令,最后一个生效
CMD运行容器时执行,如果有多个CMD指令,最后一个生效

7.3Build镜像

Usage: docker build [OPTIONS] PATH | URL | -[flags]Options:
-t, --tag list # 镜像名称
-f, --file string # 指定Dockerfile文件位置

# docker build .
# docker build -t shykes/myapp .
# docker build -t shykes/myapp -f /path/Dockerfile /path
# docker build -t shykes/myapp http://www.example.com/Dockerfile


7.4构建Nginx,PHP,Tomcat基础镜像

•构建Nginx基础镜像

构建步骤:

  1. yum或者源码编译安装(生产环境一般采用源码编译安装:1.configure检查当前环境是否满足编译源码环境;2.make编译;3:make install安装到系统中) RUN;
  2. 启用哪些模块 RUN;
  3. nginx初始化 RUN;
  4. 启动 CMD ENTRIPOINT.

•构建PHP基础镜像
•构建Tomcat基础镜像

7.5快速搭建LNMP网站平台

搭建LNMP网站平台
搭建LNMP网站平台

搭建过程如下:

 1、自定义网络

docker network create lnmp


2、创建Mysql容器

docker run -d \
--name lnmp_mysql \
--net lnmp \
--mount src=mysql-vol,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf8


3、创建PHP容器

docker run -d --name lnmp_php --net lnmp --mount src=wwwroot,dst=/wwwroot php:v1


4、创建Nginx容器

docker run -d --name lnmp_nginx --net lnmp -p 88:80 \
--mount type=bind,src=$(pwd)/nginx.conf,dst=/usr/local/nginx/conf/nginx.conf --mount src=wwwroot,dst=/wwwroot nginx:v1


5、以wordpress博客为例

https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz

第8 章镜像仓库

8.1私有镜像仓库

8.1.1搭建私有镜像仓库

DockerHub作为Docker默认官方公共镜像;如果想自己搭建私有镜像仓库,官方也提供registry镜像,使得搭建私有仓库非常简单。
1.下载registry镜像并启动

# docker pull registry
# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry


2.测试,查看镜像仓库中所有镜像

# curl http://192.168.0.212:5000/v2/_catalog
{"repositories":[]}


8.1.2私有镜像仓库管理

1、配置私有仓库可信任

# vi /etc/docker/daemon.json
{"insecure-registries":["192.168.0.212:5000"]}
# systemctl restart docker

2、打标签

# docker tag centos:6 192.168.0.212:5000/centos:6

3、上传

# docker push 192.168.0.212:5000/centos:6

4、下载

# docker pull 192.168.0.212:5000/centos:6

5、列出镜像标签

# curl http://192.168.0.212:5000/v2/centos/tags/list

8.2Docker Hub公共镜像仓库使用

1、注册账号
地址:https://hub.docker.com
2、登录Docker Hub

# docker login
或
# docker login --username=cgh --password=123456

3、镜像打标签

# docker tag wordpress:v1 cgh/wordpress:v1

4、上传

# docker push cgh/wordpress:v1
#搜索测试:
# docker search cgh

5、下载

# docker pull cgh/wordpress:v1

8.3企业级镜像仓库Harbor

8.3.1Harbor概述

Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制,AD/LDAP集成以及审计日志等,足以满足基本企业需求。
官方地址:https://vmware.github.io/harbor/cn/

Habor组件及功能
组件功能
harbor-adminserver配置管理中心
harbor-dbMysql数据库
harbor-jobservice负责镜像复制
harbor-log记录操作日志
harbor-uiWeb管理页面和API
nginx前端代理,负责前端页面和镜像上传/下载转发
redis会话
registry镜像存储

8.3.2Harbor部署

Harbor安装有3种方式:
•在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小
离线安装:安装包包含部署的相关镜像,因此安装包比较大

1.下载habor

下载地址:https://github.com/goharbor/harbor/releases

2.下载habor需要的依赖--docker compose

下载安装地址:https://docs.docker.com/compose/

下载指令:

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

添加执行权限:

sudo chmod +x /usr/local/bin/docker-compose

3.habor安装

# tar zxvf harbor-offline-installer-v1.5.1.tgz
# cd harbor
# vi harbor.cfg
hostname = 10.206.240.188
ui_url_protocol = http
harbor_admin_password = 123456
# ./prepare
# ./install.sh

8.3.3基本使用

1、配置http镜像仓库可信任

# vi /etc/docker/daemon.json
{"insecure-registries":["reg.ctnrs.com"]}
# systemctl restart docker

2、打标签

# docker tag centos:6 reg.ctnrs.com/library/centos:6

3、上传

# docker push reg.ctnrs.com/library/centos:6

4、下载

# docker pull reg.ctnrs.com/library/centos:6

第9 章图形页面管理

Portainer是一个开源、轻量级Docker管理用户界面,基于Docker API,可管理Docker主机或Swarm集群,支持最新版Docker和Swarm模式。

1、创建卷
# docker volume create portainer_data
2、创建Portainer容器
 

# docker run -d \
-p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer

第10 章构建容器监控系统

cAdvisor+InfluxDB+Grafana

cAdvisor:容器资源收集系统,可以收集容器所有资源的利用率,有内置图形化界面;

InfluxDB:时序的数据库管理系统,主要存储cAdvisor(只收集展示不存储的系统)收集的数据

Grafana:纯html+js写的一个前端的页面,这个页面主要作为一个仪表盘去用,可以自定义很多的图表(趋势图、饼图...

Influxdb:

docker run -d \
--name influxdb \
--net monitor \
-p 8083:8083 \
-p 8086:8086 \
tutum/influxdb

cAdvisor:

docker run -d \
--name=cadvisor \
--net monitor \
-p 8081:8080 \
--mount type=bind,src=/,dst=/rootfs,ro \
--mount type=bind,src=/var/run,dst=/var/run \
--mount type=bind,src=/sys,dst=/sys,ro \
--mount type=bind,src=/var/lib/docker/,dst=/var/lib/docker,ro \
google/cadvisor \
-storage_driver=influxdb \
-storage_driver_db=cadvisor \
-storage_driver_host=influxdb:8086

Grafana:

docker run -d \
--name grafana \
--net monitor \
-p 3000:3000 \
grafana/grafana

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐