Docker 容器

文章目录

  • 一、Docker 简介
    • 1.1、Docker诞生
    • 1.2、Docker相关解释
    • 1.3、Docker与传统虚拟化对比
    • 1.4、Docker的构成
    • 1.5、Docker历经过程
  • 二、Docker 容器安装
    • 2.1、Docker 容器的安装方式
      • 2.1.1 Script 安装
      • 2.1.2 YUM 安装
      • 2.1.3 RPM 包安装
    • 2.2、Docker 镜像加速配置
    • 2.3、Docker 化应用体验
  • 三、Docker 容器管理
    • 3.1、、Docker基础概念
    • 3.2、Docker基础命令
    • 3.3、单一容器管理命令
    • 3.4、Run常用的一些参数
    • 3.5、Docker-Compose 安装及用法
  • 四、Docker 镜像管理
    • 4.1、镜像的特性
    • 4.2、容器转换为镜像
    • 4.3、Dockerfile 语法
      • 4.3.1 实验(制作镜像)
    • 4.4 镜像的导出以及导入
  • 五、镜像仓库构建
    • 5.1、官方仓库构建
    • 5.2、Harbor 仓库构建
      • Harbor原理说明
      • 1、软件资源介绍
      • 2、 Harbor 的特性
      • 3、Harbor 认证过程
      • 4、Harbor 认证流程
  • 六、Docker中的网络
    • 1、Linux 内核中的 NameSpace
    • 2、Docker 网络通讯示意图
    • 3、Docker 中的防火墙规则
    • 4、Docker 网络的修改
      • 4.1 Docker 进程网络修改
      • 4.2 Docker 容器网络修改
    • 5、端口的暴露方式
    • 6、网络隔离
      • 6.1 基础命令说明
      • 6.2 使用网络名字空间进行隔离代码记录
      • 6.3 使容器配置上独立IP进行通讯
  • 七、数据存储
    • 1、数据卷特性
    • 2、数据卷的意义
    • 3、数据卷的类型
    • 4、容器中使用数据卷的方法
    • 5、存储驱动
  • 八、 资源限制
    • 1、内存资源限制
    • 2、内存限制设置方式
    • 3、参数示意图
    • 4、CPU 资源限制
    • 5、限制性实验
  • 九、补充(Append)

一、Docker 简介

1.1、Docker诞生

Docker 是 dotcloud 公司开源的一款产品dotcloud是2010年新成立的一家公司,主要基于 PAAS (PlatfromasaService) 平台为开发者提供服务。2013年10月 dotcloud 公司改名为 Docker 股份有
限公司

1.2、Docker相关解释

 LinuxContainer 是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源
 Docker 是 PAAS 提供商 dotCloud 开源的一个基于LXC的高级容器引擎,源代码托管在 Github 上,基于 go 语言并遵从 Apache2.0 协议开源
Docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在 OS 基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造

1.3、Docker与传统虚拟化对比

Docker 容器_第1张图片

Docker 容器_第2张图片

1.4、Docker的构成

 Docker 仓库:https://hub.docker.com
 Docker 自身组件

DockerClient:Docker 的客户端
DockerServer:Dockerdaemon 的主要组成部分,接受用户通过 DockerClient 发出的请求,
并按照相应的路由规则实现路由分发
Docker镜像:Docker镜像运行之后变成容器(dockerrun)

1.5、Docker历经过程

Docker 容器_第3张图片
Docker 容器_第4张图片
Docker 容器_第5张图片

Docker 容器_第6张图片

Docker 容器_第7张图片

二、Docker 容器安装

2.1、Docker 容器的安装方式

2.1.1 Script 安装

[root@docker ~]$ yumupdate
[root@docker ~]$ curl -sSL https://get.docker.com/ |sh
[root@docker ~]$ systemctl start docker && systemctl enable docker
[root@docker ~]$ docker run hello-world
………………
Hello from Docker!
This message shows that your installation appears to be working correctly.
………………

2.1.2 YUM 安装

[root@docker ~]$ yum update
[root@docker ~]$ systemctl start docker && systemctl enable docker
[root@docker ~]$ docker run hello-world
………………
Hello from Docker!
This message shows that your installation appears to be working correctly.
………………

2.1.3 RPM 包安装

(我使用的这个安装,下面的实验也使用这个)

win访问:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
#下载这两个 rmp 包
docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm

#上传至 Docker 服务器
[root@docker ~]$ mkdir docker
[root@docker ~]$ mv docker-* docker
[root@docker ~]$ cd docker/
[root@docker docker]$ yum -y install *.rpm
[root@docker docker]$ docker run hello-world
………………
Hello from Docker!
This message shows that your installation appears to be working correctly.
………………

2.2、Docker 镜像加速配置

[root@docker ~]$ cp /lib/systemd/system/docker.service /etc/systemd/system/ 
[root@docker ~]$ chmod 777 /etc/systemd/system/docker.service 
[root@docker ~]$ vim /etc/systemd/system/docker.service 
#在EexcStart…docker 后面添加仓库地址 --registry-……  
ExecStart=/usr/bin/dockerd --registry-mirror=https://kfp63jaj.mirror.aliyuncs.com
[root@docker ~]$ systemctl daemon-reload #重载管理脚本
[root@docker ~]$ systemctl restart docker.service #重启服务
[root@docker ~]$ ps -ef |grep docker #查看进程
root       6816      1  0 15:08 ?        00:00:00 /usr/bin/dockerd --registry-mirror=https://kfp63jaj.mirror.aliyuncs.com
#有这一行就代表已经加速成功了

阿里云Docker官网:https://dev.aliyun.com/search.html

2.3、Docker 化应用体验

环境分析

WordPress运行环境需要如下软件的支持:

  • PHP5.6或更新软件
  • MySQL5.6或更新版本
  • Apache和mod_rewrite模块

代码展现

[root@docker ~]$ docker pull wordpress
[root@docker ~]$ docker pull mariadb
[root@docker ~]$ docker images #查看安装的 镜像
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   13 days ago    13.3kB
wordpress     latest    a05fd91ad06a   2 months ago   550MB
mariadb       latest    3a348a04a815   3 months ago   407MB

[root@docker ~]$ docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb #运行
[root@docker ~]$ docker run --name MyWordPress --link db:mysql -p 80:80 -d wordpress #运行


网页访问IP安装 wordress

Docker 容器_第8张图片
Docker 容器_第9张图片
Docker 容器_第10张图片
Docker 容器_第11张图片

登录成功后访问IP地址 就能看到博客前台页面

三、Docker 容器管理

3.1、、Docker基础概念

Docker三个重要概念:仓库(Repository)、镜像(image)和容器(Container)
dockerrun–nameMyWordPress–linkdb:mysql-p8080:80-dwordpress
Docker指令的基本用法:

docker+命令关键字(COMMAND)+一系列的参数

3.2、Docker基础命令

docker	info			守护进程的系统资源设置
docker	search	Docker	仓库的查询
docker	pull	Docker	仓库的下载
docker	images 	Docker	镜像的查询
docker	rmi		Docker	镜像的删除
docker	ps				容器的查询
docker	run				容器的创建启动
docker	start/stop		容器启动停止

Docker指令除了单条使用外,还支持赋值、解析变量、嵌套使用

3.3、单一容器管理命令

每个容器被创建后,都会分配一个CONTAINERID作为容器的唯一标示,后续对容器的启动、停
止、修改、删除等所有操作,都是通过CONTAINERID来完成,偏向于数据库概念中的主键

docker	ps	--no-trunc				 查看
docker	stop/start	CONTAINERID		 停止
docker	start/stop	MywordPress		 通过容器别名启动/停止
docker	inspect		MywordPress		 查看容器所有基本信息
docker	logs		MywordPress		 查看容器日志
docker	stats		MywordPress		 查看容器所占用的系统资源
docker	exec	容器名	容器内执行的命令	容器执行命令
docker	exec	-it	容器名	/bin/bash 登入容器的bash

3.4、Run常用的一些参数

--restart=always		容器的自动启动
-h x.xx.xx				设置容器主机名
-dns xx.xx.xx.xx		设置容器使用的DNS服务器
--dns-searchDNS			搜索设置
--add-host hostname:IP	注入hostname<>IP解析
--rm					服务停止时自动删除

3.5、Docker-Compose 安装及用法

Docker-composeinstalll

官方提供的安装 速度较慢
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 


国内的安装方法速度快
curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose


赋予执行权想
chmod +x /usr/local/bin/docker-compose

查看版本号
docker-compose version
					`Docker-compose用法`
-f		指定使用的yaml文件位置			up -d	启动容器项目
ps		显示所有容器信息					pause	暂停容器
restart	重新启动容器						unpause	恢复暂停
logs	查看日志信息						rm		删除容器
stop	停止容器							start 启动容器
config -q	验证yaml配置文件是否正确

			演示代码记录
version:'2'

services:
	db:
	image:mysql:5.7
	restart:always
	environment:
			MYSQ_ROOT_PASSWORD:somewordpress
			MYSQL_DATABASE:wordpress
			MYSQL_USER:wordpress
			MYSQL_PASSWORD:wordpress


wordpress:
	depends_on:
		-db
		image:wordpress:latest
		restart:always
		ports:
			-"8000:80"
		environment:
				WORDPRESS_DB_HOST:db:3306
				WORDPRESS_DB_USER:wordpress
				WORDPRESS_DB_PASSWORD:wordpress

四、Docker 镜像管理

                            Docker 容器_第12张图片

4.1、镜像的特性

容器创建时需要指定镜像,每个镜像都由唯一的标示 ImageID,和容器的 Container ID 一样,默认 128 位,可以使用前 16 为缩略形式,也可以使用镜像名与版本号两部分组合唯一标示,如果省略版本号,默认使用最新版本标签 (latesr)

镜像的分层:Docker 的镜像通过联合文件系统 (unionfilesystem) 将各层文件系统叠加在一起

bootfs:用于系统引导的文件系统,包括 bootloader 和 kernel,容器启动完成后会被卸载以节省内存资源

roofs:位于 bootfs 之上,表现为 Docker 容器的跟文件系统

传统模式中,系统启动时,内核挂载 rootfs 时会首先将其挂载为“只读”模式,完整性自检完成后将其挂载为读写模式
Docker中,rootfs 由内核挂载为“只读”模式,而后通过 UFS 技术挂载一个“可写”层

4.2、容器转换为镜像

docker commit CID xx.xx.xx

4.3、Dockerfile 语法

Dockfile 是一种被 Docker 程序解释的脚本,Dockerfile 由一条一条的指令组成,每条指令对应 Linux 下面的一条命令。Docker 程序将这些 Dockerfile 指令翻译真正的 Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于 Makefile。Docker 程序将读取 Dockerfile,根据指令生成定制的 image

docker build -t wangyang/jdk-tomcat . #转换命令

Dockerfile语法

Dockerfile语法
1、FROM(指定基础image):
构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。
FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库
example:
	FROM centos:7.2
	FROM centos

2、MAINTAINER(用来指定镜像创建者信息):
构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行dockerinspect
命令时,输出中有相应的字段记录该信息。
example:
	MAINTAINER wangyang "[email protected]"

3、RUN(安装软件用):
构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了Centos,那么软件管理
部分只能使用Centos的包管理命令
example:
	RUN cd /tmp && curl -L
'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar-xz
RUN ["/bin/bash","-c","echohello"]

4、CMD(设置container启动时执行的操作):
设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。
该指令只能在文件中存在一次,如果有多个,则只执行最后一条
example:
	CMD echo “Hello,World!”

5、ENTRYPOINT(设置container启动时执行的操作):
设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。
example:
	ENTRYPOINTls-l
#该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。当独自使用时,  \
#如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相 \ 
#覆盖只有最后一个CMD或者ENTRYPOINT有效
	#CMD指令将不会被执行,只有ENTRYPOINT指令被执行
	CMD echo “Hello,World!”
	ENTRYPOINT ls -l
#另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整 \
#的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令, 		\	
#而不能指定参数
	FROM ubuntu
	CMD ["-l"]
	ENTRYPOINT ["/usr/bin/ls"]

6、USER(设置container容器的用户):
设置指令,设置启动容器的用户,默认是root用户
	example:
		USER daemon	= ENTRYPOINT ["memcached","-u","daemon"]

7、EXPOSE(指定容器需要映射到宿主机器的端口):设置指令,该指令会将容器中的端口映射成宿
主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP
地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射
的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端
口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要
确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时
候,可以配套的多次使用-p选项。
	example:
		映射一个端口
		EXPOSE 22
		相应的运行容器使用的命令
		docker run -p port1 image
	
		映射多个端口
		EXPOSE port1 port2 port3
		相应的运行容器使用的命令
		docker run -p port1-p port2 -p port3 image
		还可以指定需要映射到宿主机器上的某个端口号
		docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image

8、ENV(用于设置环境变量):构建指令,在image中设置一个环境变量
	example:
	设置了后,后续的RUN命令都可以使用,container启动后,可以通过dockerinspect查看这个环
境变量,也可以通过在dockerrun--envkey=value时设置或修改环境变量。假如你安装了JAVA程序,
需要设置JAVA_HOME,那么可以在Dockerfile中这样写:

	ENV JAVA_HOME /path/to/java/dirent

9、ADD(从src复制文件到container的dest路径)
	example:
		ADD <src><dest>
		<src>是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
		<dest>是container中的绝对路径

10、COPY(从src复制文件到container的dest路径)
	example:
		COPY<src><dest>

11、VOLUME(指定挂载点):
设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共
享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,
所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令
	examp:
		FROM base
		VOLUME ["/tmp/data"]

12、WORKDIR(切换目录):设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效
	example:
		WORKDIR /p1 WORKDIR p2 RUN vim a.txt

13、ONBUILD(在子镜像中执行):ONBUILD指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
	example:
		ONBUILD ADD . /app/src
		ONBUILD RUN /usr/local/bin/python-build --dir /app/src

4.3.1 实验(制作镜像)

Docker 的安装启动上面已经有了,这里直接进行镜像制作

MAINTAINER [email protected]

ADD ./apache-tomcat-7.0.42.tar.gz /root
ADD ./jdk-7u25-linux-x64.tar.gz /root

ENV JAVA_HOME /root/jdk1.7.0_25
ENV PATH $JAVE_HOME/bin:$PATH

EXPOSE 8080

ENTRYPOINT /root/apache-tomcat-7.0.42/bin/startup.sh && tailf /root/apache-tomcat-7.0.42/logs/catalina.out
[root@docker ~]$ mkdir tomcat
[root@docker ~]$ cd !$
上传软件包
[root@docker tomcat]$ docker build -t tomcat:v1.0 . #制作镜像,镜像名称为 tomcat 标签为 v1.0
[root@docker tomcat]$ docker images #查看镜像
REPOSITORY   TAG    IMAGE ID       CREATED     	   SIZE
tomcat      v1.0    2284842ecb5d   4 minutes ago   642 MB
[root@docker tomcat]$ docker run --name tomcat -p 80:8080 -d tomcat:v1.0  #运行镜像
[root@docker tomcat]$ docker ps -a #查看运行的镜像
CONTAINER ID     IMAGE             COMMAND                  CREATED           STATUS            PORTS                          NAMES
5cf00924bfe8     tomcat:v1.0       "/bin/sh -c '/root..."   2 minutes ago     Up 2 minutes      22/tcp, 0.0.0.0:80->8080/tcp   tomcat

[root@docter tomcat]$ docker ps -a --no-trunc #查看运行的详细信息

浏览器访问 10.1.1.11 即可看到运行的 tomcat 网页

4.4 镜像的导出以及导入

导出:docker save -o xx.xx.xx xx.xx.xx.tar
[root@docker tomcat]$ docker save -o tomcat.tar tomcat
[root@docker tomcat]$ scp tomcat.tar [email protected]:/root

导入:docker load -i xx.xx.xx.tar
[root@centos ~]$ docker load -i tomcat.tar
[root@centos ~]$ docker run --name tomcat -p 80:8080 -d tomcat:v1.0 #运行镜像
[root@centos ~]$ docker ps -a #查看容器运行状态

浏览器访问10.1.1.12测试

五、镜像仓库构建

5.1、官方仓库构建

`docker 服务器操作`
[root@docker ~]$ docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always registry
[root@docker ~]$ vim /etc/docker/daemon.json
#添加内容
{
    "insecure-registries": ["10.1.1.11:5000"]
}
[root@docker ~]$ systemctl restart docker
[root@docker ~]$ docker images
REPOSITORY   TAG        IMAGE ID        CREATED       SIZE
tomcat       v1.0       2284842ecb5d    2 hours ago   642 MB


[root@docker ~]$ docker tag tomcat:v1.0 10.1.1.11:5000/tomcat:v1.0 #更改镜像名
#镜像名上传规范:仓库地址/认证过的username/imagename:tag
#将 tomcat 更改为可上传的镜像名,没有官方仓库的认证用户,所以这里没有写
[root@docker ~]$ docker images
REPOSITORY               TAG       IMAGE ID         CREATED           SIZE
10.1.1.11:5000/tomcat    v1.0      2284842ecb5d     2 hours ago       642 MB
tomcat                   v1.0      2284842ecb5d     2 hours ago       642 MB
[root@docker ~]$ docker push 10.1.1.11:5000/tomcat:v1.0 # 上传镜像
[root@docker ~]$ curl -XGET http://10.1.1.11:5000/v2/_catalog #查看已有的镜像


`docker 客户端操作 `
[root@client ~]$ vim /etc/docker/daemon.json
#添加内容
#作用的让客户端信任这个地址以及端口、这样客户端才能下载我们上传镜像,因为官方的端口是 443,我们用的是 5000 ,
{
    "insecure-registries": ["10.1.1.11:5000"]
}
[root@client ~]$ systemctl restart docker 
[root@client ~]$ curl -XGET http://10.1.1.11:5000/v2/_catalog #查看已有的镜像
[root@client ~]$ docker pull 10.1.1.11:5000/tomcat:v1.0 #下载镜像
查看并运行镜像
[root@centos2 ~]# docker images 
REPOSITORY              TAG =     IMAGE ID         CREATED           SIZE
10.1.1.11:5000/tomcat   v1.0      2284842ecb5d     26 hours ago      642 MB
[root@centos2 ~]# docker run --name tomcat -p 80:8080 -d 10.1.1.11:5000/tomcat:v1.0
浏览器访问 docker 客户端的IP 测试

5.2、Harbor 仓库构建

`服务器构建`
[root@docker ~]$  python #查看 python 版本为 2.7 或更高版本
Python 2.7.5 (default, Oct 30 2018, 23:45:53) 
………………
>>> exit ()
[root@docker ~]$ docker version #查看 docker 引擎版本应为 1.10 或更高版本
Server Version: 17.03.0-ce
[root@docker ~]$ docker-compose --version #查看 docker-compose 版本为 1.6.0 或更高版本
docker-compose version 1.27.4, build 40524192

[root@docker ~]$ openssl genrsa -des3 -out server.key 2048 #创建加密私钥
Enter pass phrase for server.key: #设置密钥密码:docker
Verifying - Enter pass phrase for server.key: #确认密码:docker
[root@docker ~]$  openssl req -new -key server.key -out server.csr #创建证书请求
Enter pass phrase for server.key: #输入之前设置的密钥密码: docker
………………
Country Name (2 letter code) [XX]:CN #国家
State or Province Name (full name) []:BJ #省名
Locality Name (eg, city) [Default City]:BJ #城市
Organization Name (eg, company) [Default Company Ltd]:docker #组织(公司)
Organizational Unit Name (eg, section) []:docker #单位
Common Name (eg, your name or your server's hostname) []:hub.docker.com #域名
Email Address []:[email protected]   #邮箱

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: #不用改密码   直接回车
An optional company name []: #不用改名字 直接回车
[root@docker ~]$ cp server.key server.key.org #备份
[root@docker ~]$ openssl rsa -in server.key.org -out server.key 
#退密码 因为容器启动后 nginx 启动调用证书文件需要输入密钥密码,从而会导致启动失败,所以需要取消密钥密码
Enter pass phrase for server.key.org: #输入密钥密码 :docker
writing RSA key
[root@docker ~]$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt #创建证书
[root@docker ~]$ mkdir -p /data/cert #创建证书存放目录
[root@docker ~]$ mv server.* /data/cert #移动所有的证书文件

上传软件包
[root@docker ~]$ tar -zxvf harbor-offline-installer-v1.2.0.tgz 
[root@docker ~]$ mv harbor /usr/local
[root@docker ~]$ cd /usr/local/harbor/
[root@dcoker harbor]$ vim harbor.cfg 

hostname = hub.docker.com   #目标主机名或完全限定域名,与创建密钥时的域名一致即可 p5 
ui_url_protocol = https   #docker 官方的默认协议,与他保持一致 p9
db_password = root123   # mysql数据库root用户的密码,在生产环境下使用之前修改 p12
max_job_workers = 3   # job服务的最大工作人数 p15
customize_crt = on   #如果值为on,则 prepare 脚本将为注册表的令牌创建新的根证书和私钥 p21
ssl_cert = /data/cert/server.crt   #证书位置 p24
ssl_cert_key = /data/cert/server.key   #私钥位置 p25
harbor_admin_password = Harbor12345   #门户网站 admin 的密码 p59

[root@docker harbor]$ ./install.sh #运行脚本进行安装
 

修改 windows 的 hosts 文件
10.1.1.11 hub.docker.com#这是我们自己起的域名,没有 DNS ,所以需要添加解析
IP 域名
访问 域名或 IP 进入 harbor 门户网站,默认账户密码为 admin/Harbor12345

[root@docker ~]$ vim /etc/docker/daemon.json 
#因为我们的密钥私有的,没有官方授权,所以要做下认证
{
    "insecure-registries": ["hub.docker.com"] 
}
[root@docker ~]$ vim /etc/hosts
10.1.1.11 hub.docker.com #这是我们自己起的域名,没有 DNS ,所以需要添加解析
[root@docker ~]$ systemctl restart docker.service 
[root@docker ~]$ docker ps -a #查看服务器harbor有没有全部启动
[root@docker ~]$ docker start  harbor-jobservice  #没启动的手动启动 示例
[root@docker ~]$ docker images
REPOSITORY   TAG      IMAGE ID         CREATED          SIZE
tomcat       v1.0     2284842ecb5d    23 hours ago      642MB
[root@docker ~]$ docker tag tomcat:v1.0 hub.docker.com/library/tomcat:v1.0
#镜像名改成可推送的 格式: harbor域名/项目名称/镜像名称/标签
[root@docker ~]$  docker login hub.docker.com 
#登录后才可推送镜像,如果后面不加域名,默认登录是 docker 官方
Username: admin
Password: #Harbor12345
Login Succeeded
[root@docker ~]$ docker push hub.docker.com/library/tomcat:v1.0 #推送

已经可以看到镜像推送上去了

Docker 容器_第13张图片

`客户端下载镜像`
[root@client ~]$ vim /etc/docker/daemon.json 
#因为我们的密钥私有的,没有官方授权,所以要做下认证
{
    "insecure-registries": ["hub.docker.com"] 
}
[root@client ~]$ vim /etc/hosts
10.1.1.11 hub.docker.com #这是我们自己起的域名,没有 DNS ,所以需要添加解析
[root@client ~]$ systemctl restart docker
[root@client ~]$ docker pull hub.docker.com/library/tomcat:v1.0
#如果 library 项目不是公开的还需要登录对应的用户(docker login hub.docker.com)才可下载
[root@client ~]$ docker images
REPOSITORY                      TAG      IMAGE ID        CREATED        SIZE
hub.docker.com/library/tomcat   v1.0     2284842ecb5d    2 days ago     642 MB
[root@client ~]$ docker run --name tomcat -p 80:8080 -d 2284842ecb5d

访问clinetIP地址测试

Harbor原理说明

1、软件资源介绍

  Harbor是VMware公司开源的企业级DockerRegistry 项目,项目地址为 https://gitub.com/vmware/harbor 其目标是帮助用户迅速搭建一个企业级的 Deckerregistry 服务。它以 Docker 公司开源的 registry 为基础,提供了管理UI,基于角色的访问控制 (Role Based Access Control),AD/LDAP 集成、以及审计日志(Auditogging)等企业用户需求的功能,同时还原生支持中文。Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 来对它进行部。用于部署Harbor的Docker Compose 模板位于 /Deployer/docker-compose.yml, 由5个容器组成,这几个容器通过 Docker link 的形式连接在一起,在容器之闻通过容器名字互相访问。对终端用户而言,只需要暴露 proxy(即Nginx) 的服务端口

  • Proxy:有 Nginx 服务器构成的反向代理。
  • Registry:由 Docker 官方的开源 registry镜像构成的容器实例。
  • UI: 即架构中的 core service, 构成此容器的代码是 Harbor 项目的主体。
  • MySQL:有官方MySQL 镜像构成的数据库容器
  • Log: 运行着 rsyslogd 的容器,通过 log-driver 的形式收集其他容器的日志。

2、 Harbor 的特性

a、基于角色控制:用户和仓库都是基于项目进行组织的,而用户基于项目可以拥有不同的权限

b、基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制

c、支持LDAP: Harbor的用户授权可以使用已经存在LDAP用户

d、镜像删除 & 垃表回收: imege可以被删除并且回收 image 占用的空间,绝大部分的用户操作API,方便用户对系统进行扩展

e、用户Ul: 用户可以轻松的浏览、搜索镜像仓库以及对项目进行管理

f 、轻松的部署功能: Harbor提供了 online、fline安装, 除此之外还提供了 virtualappliance 安装

g、Harbor 和 docker registry 关系: Harbor实质 上是对 docker registry 做了封装,扩展了自己的业务模块
Docker 容器_第14张图片

3、Harbor 认证过程

a、dockerdaemon 从 dockerregistry 拉取镜像。

b、如果 dockerregistry 需要进行授权时,registry 将 会返回 401 Unauthorized 响应,同时在响应中包含了 docker client 成如何进行认证的信息。

C、dockerclient 根据 registry 返回的信息,向 auth server 发送请求获取认证 token。

d、auth server 则根据自己的业务实现去验证提交的用户信息是否存符合业务要求。

e、用户数据仓库返回用户的相关信息。

f、auth serer 将会根据查询的用户信息,生成 token 令牌,以及当前用户所具有的相关权限信息。上述就是完整的授权过程.当用户完成上述过程以后便可以执行相关的 pull/pusb 操作。认证信息会每次都带在请求头中

Docker 容器_第15张图片

4、Harbor 认证流程

a、首先,请求被代理容器监听拦藏,并跳转到指定的认证服务器。

b.如果认证服务器配置了权限认证,则会返回 401,通知 dockerclient 在特定的请求中需要带上一个合法的token。而认证的逻辑地址则指向架构图中的 core services。

c、 当 docker client 接受到错误 code。 client就会发送认证请求(带有用户名和密码)到 core services 进行 basic auth 认证。

d、当C的请求发送给 Ngnix 以后,Ngnix 会根据配置的认证地址将带有用户名和密码的请求发送到 core serivces。

e、core serivces 获取用户名和密码以后对用户信息进行认证 (自己的数据库或者介入LDAP都可以)。成功以后,返回认证成功的信息

Docker 容器_第16张图片

六、Docker中的网络

1、Linux 内核中的 NameSpace

uamespace 系统调用参数 隔离内容 内核版本
UTS CLONE_NEWUTS 主机名和域名. 2.6.19
IPC CLONE_NEWIPC 信号量、消息队列和共享内存 2.6.19
PID CLONE_NEWPID 进程编号 2.6.24
NetWork CLONE_NEWNET 网络设备、网络栈、端口等 2.6.29
Mount CLONE_NEWNS 挂载点(文件系统) 2.4.19
User CLONE_NEWUSER 用户和用户组 3.8

2、Docker 网络通讯示意图

Docker 容器_第17张图片

3、Docker 中的防火墙规则

容器访问外部网络

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE

外部网络访问容器

docker run -d -p 80:80 apache
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A DOCKER !-i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

4、Docker 网络的修改

4.1 Docker 进程网络修改

 -b, --bridge=" " 指定Docker使用的网桥设备,默认情况下Docker会自动创建和使用 docker0 网桥设备,通过此参数可以使用已经存在的设备
 --bip 指定 Docker0 的IP和掩码,使用标准的 CIDR 形式,如 10.10.10.10/24
 --dns 配置容器的 DNS,在启动 Docker 进程是添加,所有容器全部生效

4.2 Docker 容器网络修改

–dns 用于指定启动的容器的 DNS
–net 用于指定容器的网络通讯方式,有以下四个值

  • bridge:Docker 默认方式,网桥模式
  • none:容器没有网络栈
  • container:使用其它容器的网络栈,Docker 容器会加入其它容器的 networknamespace
  • host:表示容器使用 Host 的网络,没有自己独立的网络栈。容器可以完全访问 Host 的网络,不安全

5、端口的暴露方式



-p/P选项的使用格式

-p :将制定的容器端口映射至主机所有地址的一个动态端口
-p ::映射至指定的主机端口
-p :::映射至指定的主机的IP的动态端口
-p :::映射至指定的主机IP的主机端口
-P(大):暴露所需要的所有端口

  • docker port ContainerName 可以查看容器当前的映射关系

6、网络隔离

6.1 基础命令说明

docker network ls #查看当前可用的网络类型
docker network create -d 类型 网络空间名称 #创建

类型分为:

  • overlay network
  • bridge network

6.2 使用网络名字空间进行隔离代码记录

docker network create -d bridge --subnet "172.22.0.0/16" --gateway "172.22.0.1" test1
docker network create -d bridge --subnet "172.22.0.0/16" --gateway "172.22.0.1" test2
docker run --name tomcat1 --network=test1 -d tomcat:v1.0
docker run --name tomcat2 --network=test2 -d tomcat:v1.0

6.3 使容器配置上独立IP进行通讯


A、配置真实网桥

[root@docker ~]# cd /etc/sysconfig/network-scripts/
[root@docker network-scripts]# cp -a ifcfg-ens33 ifcfg-br0
[root@docker network-scripts]# vim ifcfg-ens33
#删除 IP ,配置成如下
TYPE=Ethernet
DEVICE=ens33
BOOTPROTO=static
ONBOOT=yes
BRIDGE=br0
[root@docker network-scripts]# vim ifcfg-br0 
#改成这样
TYPE=Bridge
DEVICE=br0
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.1.1.11
NETMASK=255.255.255.0
GATEWAY=10.1.1.1
DNS=8.8.8.8
[root@docker network-scripts]# systemctl restart network
[root@docker network-scripts]# ifconfig
#ens33 已经没有地址了,而 br0 已经配置上 IP 了
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.1.1.11  netmask 255.255.255.0  broadcast 10.1.1.255
[root@docker ~]# yum -y install git #安装 git 命令用于克隆 pipework
[root@docker ~]# git clone https://github.com/jpetazzo/pipework #克隆 pipework
[root@docker ~]# cp -a pipework/pipework /usr/local/bin/ #移动到命令目录下
[root@docker ~]# chmod a+x /usr/local/bin/pipework #赋予执行权限
[root@docker ~]# docker run --name tomcat --net=none -d tomcat:v1.0 
[root@docker ~]# pipework br0 tomcat 10.1.1.20/24 
#给名称为 tomcat 的镜像设置 IP 地址,此命令并不是永久生效,需要加载到开机脚本里
#浏览器访问 10.1.1.20:8080 


七、数据存储

1、数据卷特性

Docker 镜像由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层

如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,次即“写时复制”机制

Docker 容器_第18张图片

2、数据卷的意义

Volume 可以在运行容器时即完成创建与绑定操作。当然,前提需要拥有对应的申明

Volume 的初衷就是数据持久化

Docker 容器_第19张图片

3、数据卷的类型

Bindmountvolume

Docker-managedvolume

Docker 容器_第20张图片

4、容器中使用数据卷的方法

Docker-managed Volume(自管理卷)

`1. 容器中自带的挂载卷`
[root@docker ~]# docker pull wordpress
[root@docker ~]# docker run --name wd -d wordpress
[root@docker ~]# docker inspect wd #查看名称为 wd 容器
"Source": "/var/lib/docker/volumes/f3604caf884d9b6bc4483152ba93d97cdafb7b6f0432b03bf2b59b92f084540b/_data",
#这是在宿主机中的目录
"Volumes": {
                "/var/www/html": {}
#这是容器中的数据卷(目录) #这两个目录是共享的,容器删除后,宿主机的数据卷并不会删除(可以创建测试)。

`2. 默认不带挂载的容器`
[root@docker ~]# docker pull centos:6.8
[root@docker ~]# vim Dockerfile
FROM centos:6.8 #指定基础镜像
RUN touch /tmp/1.txt #创建文件
RUN mkdir /data #创建目录
CMD tail -f /tmp/1.txt #在前台查看1.txt,因为镜像需要有个前台命令才可以启动
[root@docker ~]# docker build -t test:v1.0 . #制作镜像
[root@docker ~]# docker run --name test -d test:v1.0
[root@docker ~]# docker inspect test
"Mounts": [],
 "Volumes": null,
#自己做的镜像并没有随即创建出数据卷,需要在 Dockerfile 中写入自定义的容器挂载卷

`3. 自定义的容器挂载卷`
[root@docker ~]# vim Dockerfile
#添加 VOLUME /data
FROM centos:6.8 #指定基础镜像
RUN touch /tmp/1.txt #创建文件
RUN mkdir /data #创建目录
VOLUME /data
CMD tail -f /tmp/1.txt #在前台查看1.txt,因为镜像需要有个前台命令才可以启动
[root@docker ~]# docker build -t test:v2.0 . #制作镜像
[root@docker ~]# docker run --name test2 -d test:v2.0 
[root@docker ~]# docker inspect test2
 "Source": "/var/lib/docker/volumes/070e7fdf91f99d532672d4994a9f582e0600fe7d6e64c7650db56ad024e58c07/_data",
  "Volumes": {
                "/data": {}
#这里已经有我们自定义的挂在卷了
[root@docker ~]# docker rm -f -v test2 #强制删除运行的容器与数据卷
docker rm -f -v $( docker ps -a -q ) #强制删除所有运行的容器与数据卷
# rm 代表删除,-f 代表强制,-v 代表(volume)数据卷,ps 代表查看,-a 代表所有,-q 代表只看容器ID

Bind-mount Volume(绑定卷)

格式 :

  • docker tun --name 名称 -v 宿主机数据卷:容器数据卷 -d 镜像名+标签(镜像ID)

示例:

  • docker run --name test -v /data:/data -d test:v2.0
    #指定宿主机的/ data 绑定容器的 /data 卷,-d 是放在后台运行

如有镜像有自管理卷,我们有指定了这个镜像的绑定卷,那么我们指定的会大与自管理

小实验借助宿主机让两个容器共享数据卷

[root@docker ~]# docker run --name test1 -v /data:/data -d test:v1.0 
[root@docker ~]# docker run --name test2 -v /data:/data -d test:v1.0 

Docker 容器_第21张图片

不借助宿主机让两个容器共享数据卷(镜像需要有自管理卷)
Union Volume

[root@docker ~]# docker rm -f $( docker ps -a -q )
[root@docker ~]# docker run --name wd1 -d wordpress
[root@docker ~]# docker run --name wd2 --volumes-from wd1 -d wordpress

Docker 容器_第22张图片

5、存储驱动

Docker 存储驱动 (storagedriver) 是 Docker 的核心组件,它是 Docker 实现分成镜像的基础

  • devicemapper(DM):性能和稳定性存在问题,不推荐生产环境使用
  • btrfs:社区实现了 btrfsdriver,稳定性和性能存在问题
  • overlayfs:内核 3.18overlayfs 进入主线,性能和稳定性优异,第一选择

Dockeroverlayfsdriver
Docker 容器_第23张图片

mount -t overlay overlay -olowerdir=./low,upperdir=./upper,workdir=./work./merged

修改为 overlayfs 存储驱动

echo "overlay" > /etc/modules-load.d/overlay.conf
cat /proc/modules | grep overlay
reboot
vim /etc/systemd/system/docker.service
	--storage-driver=overlay \


八、 资源限制

1、内存资源限制

相关说明

  • CGroup是ControlGroups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组
    (processgroups)所使用的物力资源(如cpumemoryi/o等等)的机制。2007年进入Linux2.6.24
    内核,CGroups不是全新创造的,它将进程管理从cpuset中剥离出来,作者是Google的PaulMenage
  • 默认情况下,如果不对容器做任何限制,容器能够占用当前系统能给容器提供的所有资源
  • Docker限制可以从Memory、CPU、BlockI/O三个方面
  • OOME:OutOfMemoryException
    • 一旦发生OOME,任何进程都有可能被杀死,包括dockerdaemon在内
    • 为此,Docker调整了dockerdaemon的OOM优先级,以免被内核关闭

重点提示

  • 为应用做内存压力测试,理解正常业务需求下使用的内存情况,然后才能进入生产环境使用
  • 一定要限制容器的内存使用上限
  • 尽量保证主机的资源充足,一旦通过监控发现资源不足,就进行扩容或者对容器进行迁移
  • 如果可以(内存资源充足的情况),尽量不要使用swap,swap的使用会导致内存计算复杂,对调度器非常不友好

2、内存限制设置方式

在docker启动参数中,和内存限制有关的包括(参数的值一般是内存大小,也就是一个正数,后面
跟着内存单位b、k、m、g,分别对应bytes、KB、MB、和GB):

  • -m --memory:容器能使用的最大内存大小,最小值为 4m
  • –memory-swap:容器能够使用的swap大小
  • –memory-swappiness:默认情况下,主机可以把容器使用的匿名页(anonymouspage)swap 出来,你可以设置一个 0-100 之间的值,代表允许swap出来的比例
  • –memory-reservation:设置一个内存使用的 softlimit,设置值小于–m设置
  • –kernel-memory:容器能够使用的 kernelmemory 大小,最小值为4m。
  • –oom-kill-disable:是否运行 OOM 的时候杀死容器。只有设置了 -m,才可以把这个选项设置为 false,否则容器会耗尽主机内存,而且导致主机应用被杀死

3、参数示意图

Docker 容器_第24张图片

4、CPU 资源限制

相关说明
Docker提供的CPU资源限制选项可以在多核系统上限制容器能利用哪些vCPU。而对容器最多能使用的CPU时间有两种限制方式:

  • 一是有多个CPU密集型的容器竞争CPU时,设置各个容器能使用的CPU时间相对比例
  • 二是以绝对的方式设置容器在每个调度周期内最多能使用的CPU时间

CPU限制方式
–cpuset-cpus=" " 允许使用的CPU集,值可以为0-3,0,1
-c,–cpu-shares=0 CPU共享权值(相对权重),默认值1024
–cpuset-mems=" " 允许在上执行的内存节点(MEMs)
–cpu-period=0 即可设置调度周期,CFS周期的有效范围是1ms1s,对应的–cpu-period的数值范围是10001000000
–cpu-quota=0 设置在每个周期内容器能使用的CPU时间,容器的CPU配额必须不小于
1ms,即–cpu-quota的值必须>=1000,单位微秒
–cpus 能够限制容器可以使用的主机CPU个数,并且还可以指定如1.5之类的小数

Example

docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04 /bin/bash
docker run -it --cpu-period=10000 --cpu-quota=20000 ubuntu:16.04 /bin/bash

5、限制性实验

#你必须有这么多 cpu 或内存才能让容器使用,并不能超过宿主机所有的内存与 cpu
>docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2
#限制 stress 容器最多使用 256 MB 内存, -vm 2-—使用两个线程来跑这个容器 
>docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8
#限制 stress 容器最多使用 2 个 cpu ,使用 8 个线程来跑
>docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8
#让容器使用第一个 cpu 且只是用一个 cpu ,用 8 个线程跑

九、补充(Append)

1、配置 Docker 远程访问

修改 /etc/docker/daemon.json 文件
	"hosts":["tcp://0.0.0.0:2375","unix://var/run/docker.sock"]
example:
	docker -H Ip:Port Command

2、容器标准化结构

OpenContainerInitiative

由Linux基金会主导于2015年6月创立
旨在围绕容器格式和运行时定制一个开放的工业化标准

Containstwospecifications

theRuntimeSpecification(runtime-spec)
theImageSpecification(runtime-spec)

RUNC?
是对于OCI标准的一个参考实现,是一个可以用于创建和运行容器的CLI(command-line
interface)工具。runC 直接与容器所依赖的 cgroup/linuxkernel 等进行交互,负责为容器配置 cgroup/namespace 等启动容器所需的环境,创建启动容器的相关进程。

为了兼容 OCI 标准,Docker也做了架构调整。将容器运行时相关的程序从 Dockerdaemon 剥离出来,形成了 Containerd。Containerd 向 Docker 提供运行容器的 API,二者通过grpc进行交互。 Containerd 最后会通过 Runc 来实际运行容器

Docker 容器_第25张图片

3、常见命令关联图
Docker 容器_第26张图片

你可能感兴趣的:(linux,docker,容器,linux,服务器)