Docker进阶
Docker相关网站:
https://hub.docker.com 官方镜像网站
https://download.docker.com/linux/centos/ docker-yum源
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/ 清华大学开源镜像站
- Dokcer简介
docker容器发行版本:
Moby: 继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品
docker-ce: docker公司维护的开源项目,是一个基于moby项目的免费的容器产品
docker-ee: docker公司维护的闭源产品,是docker公司的商业产品
- 功能目录章节
docker简介(一)
功能目录章节(二)
docker-ce版本安装方法(三)
Docker操作命令(四)
docker容器命令格式说明
docker容器命令选项参数说明
docker容器常用子命令使用方法
1. 将docker容器制作成一个新镜像 (命令docker commit)
2. 修改docker容器镜像名称或标签信息(命令docker tag)
3. 删除docker镜像(命令docker rmi)
4. 查看docker本地镜像(命令docker images)
5. 搜索docker hub公共镜像资源(命令docker search)
6. 从docker hub公网下载docker容器镜像(命令docker pull)
7. 查看docker镜像内容参数信息(命令docker inspect)
8. 登录docker hub(命令docker login)
9. 上传自制docker镜像到docker hub网上(命令docker push)
10. 退出docker hub登录(命令docker logout)
11. 打包本地docker镜像导出成文件(命令docker save)
12. 将打包的docker镜像文件导入到本地镜像仓库(命令docker load)
Docker 容器相关命令使用
1. 调用docker镜像运行docker容器(命令docker run)
2. 进入到已运行docker容器交互命令行页面(命令docker exec)
Docker操作命令(五)
关于docker容器的四种网络模式说明
查看docker容器默认的网络模式(命令 docker network ls)
1. Docker容器使用host模式方法
2. Docker容器使用none模式方法
3. Docker容器使用默认bridge网络模式方法
. 使用bridge模式发布docker容器端口到公网访问
. 使用bridge网络模式但是修改bridge网络模式默认IP网段
. 为docker容器自建新的bridge网桥划分自定义网络用于容器网络
. 新建docker容器网桥
4. Docker容器使用container网络模式方法
. 创建docker容器时,主动配置ip地址,不选择自动分配
5. docker程序远程管理其他物理主机docker程序
6. 设置docker容器默认启动时候支持外网tcp远程以及本地使用
Docker容器存储篇(六)
应用场景说明
实现同一台物理主机上两台web docker容器共享同一份代码文件
多个磁盘目录需要挂载到docker容器系统
指定跟从指定的机器挂载相同
查看docker容器镜像详细信息格式
搭建docker私有仓库(七)
方式一搭建服务器本地私有仓库(无web管理页面)
客户端往私有docker本地仓库中上传或下载方法
方式二使用docker容器搭建私有仓库(web页面管理后台)
Docker系统资源限制(八)
查看docker容器性能资源消耗
查看docker容器中的运行程序
容器资源限制参数
限制docker容器的使用内存最大值
限制docker容器的可使用CPU核心数
明确指定docker容器只运行使用本地物理主机的第几核CPU
按照权重进行CPU资源分配
DockerFile制作容器镜像文件参数详解(九)
Dockerfile的基本结构
Dockerfile文件常用指令说明
Dockerfile文件常用指令语法详解
制作容器镜像
Docker排错篇(十)
docker容器开机启动项无法开机启动时
Docker-CE的安装方法(三)
首先条件:docker-CE版本只能在CentOS7以上版本安装
cd /etc/yum.repos.d
wget https://download.docker.com/linux/centos/docker-ce.repo
yum install -y epel-release
-----------------------------------------------------------------
由于docker hub官方镜像站点在国外,国内访问速度较低,所以yum源调用国外docker hub会相对速度较低时,可以考虑更换国内其他docker hub的站点,如清华大学
vim /etc/yum.repos.d/docker-ce.repo
:%s#download.docker.com#mirror.tuna.tsinghua.edu.cn/docker-ce#g
https://mirror.tuna.tsinghua.edu.cn/docker-ce/ //清华大学
ln -sv /data_disk/vdb1/docker_run /var/lib/docker
千万不要把docker_run 或 /var/lib/docker目录权限改动,容器会出现各种故障
可以将docker程序的运行目录存放到挂载磁盘中
yum -y install docker-ce
- Docker操作命令:
格式: docker [选项] 命令
[选项] Options: 如下:
--config 路径: 指定客户端配置文件的配置字符串位置(默认 /root/.docker )
-D --debug: 调试启用调试模式,输出debug信息
-H --host list: 主机列表要连接的守护进程套接字
-l --log-level string: 设置日志级别(debug,info,warn,error,fatal”)(默认为“info”)
-V --version:打印版本信息并退出
--tlscacert string :由该CA签名的信任证书(默认值为“/root/.docker/ca.pem”)
--tlscert string : TLS证书文件的路径(默认为“/root/.docker/cert.pem”
--tlskey string : TLS密钥文件的路径(默认为“/root/.docker/key.pem”)
[管理命令] Management Commands:
Builder 管理构建
Config 管理Docker配置
Container 管理容器
Engine 管理Docker引擎
Image 管理镜像
Network 管理网络
Node 管理群集节点
Plugin 管理插件
Secret 管理docker密码
Service 管理服务
Stack 管理Docker堆栈
Swarm 管理群集
System 管理Docker系统
Trust 管理对Docker映像的信任
Volume 管理卷
[命令] Commands 如下:
Attach 将本地标准输入、输出和错误流附加到正在运行的容器
Build 从Dockerfile构建图像
Commit 将容器做成一个新镜像
Cp 在容器和本地文件系统之间复制文件/文件夹
Create 创建新容器
Diff 检查对容器文件系统上文件或目录的更改
Events 从服务器获取实时事件
Exec 在正在运行的容器中运行命令
Export 将容器的文件系统导出为tar存档
History 显示镜像的历史记录
Images 列表出镜像
Import 从tarball(源码包)导入内容以创建文件系统映像
Info 显示系统范围的信息
Inspect 返回Docker对象的低级信息
Kill 杀死一个或多个正在运行的容器
Load 将其他docker服务器save打爆的docker镜像文件加载到当前服务器
Login 登录Docker Hub
Logout 注册登录
Logs 获取容器的日志
Pause 暂停一个或多个容器中的所有进程
Port 列出容器的端口映射或特定映射
Ps 列表容器
Pull 从docker hub处中提取镜像或存储库
Push 将镜像或存储库推送到docker hub
Rename 重命名容器
Restart 重新启动一个或多个容器
rm 删除一个或多个容器
rmi 删除一个或多个镜像
run 在新容器中运行命令
save 将一个或多个镜像使用tar打包存档成文件拷贝到其他服务器上使用 load解压
search 在Docker Hub中搜索镜像
start 启动一个或多个停止的容器
stop 停止一个或多个正在运行的容器
stats 显示容器资源使用统计信息的实时流
tag 创建引用源镜像的修改目标镜像标签内容
top 显示容器的运行进程
unpause 取消暂停一个或多个容器中的所有进程
update 更新一个或多个容器的配置
version 显示Docker版本信息
wait 阻止,直到一个或多个容器停止,然后输出其退出代码
docker 容器常用子命令使用方法:
1. 将docker容器做一个新的镜像 docker commit (自制docker镜像 docker commit)
命令格式:
Docker commit --help //可以查看docker commit子命令的使用参数
-a 名称 : 设置镜像作者名称
-c list : 设置镜像运行的容器默认执行命令 -c [“/bin/httpd”,”-f”,”-h” /data/html]
-m 文字: 提交时的说明文字
-p : 在commit时,将容器暂停,防止在做镜像时容器程序有新数据产生
命令使用格式:
Docker commit [选项] 做成镜像的容器名 [仓库库:标签名]
docker commit -p -a "space.wu" nginx1-test1 nginx:1.14
将正在运行的容器nginx1-test1 制作成镜像,存放在仓库名为nginx,标签1.14
2. 修改docker容器镜像名称或标签信息
命令格式:
Docker tag 源镜像名[:标签] 目标镜像[:标签]
Docker tag 源镜像名[:标签] 仓库名/新镜名[:标签]
docker tag nginx:1.14 space.wu/nginx:1.14.2
Docker tag 源镜像id 仓库名/新镜名[:标签]
docker tag 2c80c730f6d7 space/nginx:1.14.2
3. 删除docker镜像
命令格式: (docker rm 是删除容器 docker rmi 删除镜像)
Docker rmi [选项] 镜像id或 [仓库名/镜像名:标签]
[选项:]
-f : 强制删除图像
--no-prune 不删除未标记的父级
4. 查看docker本地镜像
命令格式:
Docker images [选项] //指定查看全部镜像
Docker images [选项] [仓库名/镜像名:标签] //查看指定的镜像
[选项]:
-a --all : 显示所有图像(默认隐藏中间图像)
--digests : 查看摘要信息
5. 搜索docker hub公共镜像资源
命令格式:
Docker search [选项] 镜像名称信息
--no-trunc 不截断输出(输出镜像描述的详细信息)
--limit 数量 设置最大搜索数量(默认最多25条)
默认docker search 搜索内容会显示25条,使用 –limit 5 让其只线上5条
在镜像描述信息中,一般无法完全线上,使用 --no-trunc 线上显示详细信息
6. 从docker hub公网下载docker容器镜像
命令格式:
Docker pull 镜像名称[:tag标签]
[选项:]
-a 下载存储库中的所有标记图像
使用 docker search 命令在docker hub上搜索需要下载的容器镜像
然后使用 docker pull 容器镜像 从docker hub上下载需要的镜像
7. 查看docker镜像内容参数信息
命令格式
Docker inspect [选项] 镜像名:标签 或 镜像id
8. 登录docker hub
命令格式
Docker login [选项] [docker hub Server服务器]
[选项]
-u 帐号 : 使用-u 参数,输入帐号
-p 密码 : 使用-p参数,输入密码 (默认不推荐使用,这样会暴露密码)
Server : 如果是自建或者其他第三方docker hub服务器时使用
9. 上传自制docker镜像到docker hub网上
命令格式:
Docker push [选项] 镜像名[:标签]
[选项]:
--disable-content-trust : 跳过镜像签名(默认为真)
在cloud.docker.com docker hub网站注册一个帐号,默认仓库名等于帐号名称无法修改
,然后输入space.wu 镜像名称 第三列为标签信息
上市与私人的区别在于,如果是私人则需要个人登录帐号才能下载,公共则对所有人开放
镜像仓库建立好以后,需要上传的镜像信息必须与仓库信息对应,如镜像为
969226301/space.wu nginx:1.14.2 这可以成功
使用push上传一个与969226301/space.wu nginx:1.14.2仓库格式不一致的镜像失败
使用docker tag命令修改需要上传docker hub镜像信息,使其信息与docker hub仓库信息一致,然后使用docker push成功完成上传;
10. 退出docker hub登录
命令格式:
Docker logout [docker hub Server服务器]
11. 打包本地docker镜像存储为文件格式用于迁移到其他docker主机进行部署
命令格式:
Docker save -o 打包的文件.gz 镜像名1 [镜像2]
[选项]
-o --output 文件路径 : 指定打包过后的docker镜像文件存放路径
docker save -o /root/docker.gz space.wu/nginx:1.14.2 mysql:5.6
将docker 镜像 space.wu/nginx:1.14.2 和 mysql:5.6 两个镜像一起打包存到一个docker.gz的文件存储到/root目录下
12. 将其他docker应用服务器的镜像打包文件附加到新的docker应用服务器
命令格式:
Docker load -i 导入的镜像打包文件.gz
[选项]
-i --input 文件路径 : 指定导入docker镜像的包文件
-q --quiet : 安静模式导入,不输出导入信息
docker load -i /root/docker.gz
在一台新的服务器,使用docker load 命令解压并且导入其他docker的镜像文件
Docker 容器相关命令使用:
1. 调用docker镜像运行docker容器
命令格式:
Docker run [选项] 使的镜像 [执行命令]
[选项]
--privileged=true : 使用该参数,container内的root拥有真正的root权限
-t --tty : 运行docker容器时,分配一个tty进程,用于用户登录交互
-i --interactive : 即使容器并未连接,也保持stdin(标准输入打开)
--name 容器名 : 为运行的容器设置一个名称
-d : 运行docker容器时,docker容器不占用前端交互窗口后台运行
--rm : 临时运行docker容器时使用该参数,当docker容器stop关闭后,会自动删除docker容器
-v : 将本地磁盘目录挂载到容器中 -v 本地磁盘路径:对应容器目录
-u : 指定容器中使用已存在的用户身份
-P(大写P) : 自动发布容器对外公开的所有端口到随机端口
-p(小写p): [物理主机ip:]端口:[容器ip:]端口 指定映射本地端口映射到容器主机
默认ip可以不填写,直接写映射的端口即可
-h : 设置新建的docker容器系统主机名称,非容器名
--network 网桥名 : 指定建立的docker容器连接的网桥,不指定为默认docker0网桥
--ip ip地址: 明确手动指定docker容器ip,ip必须与docker所处网络模式网段一致,
并且保证该ip与同网段容器中未被使用的ip,(该参数必须在自建的docker
网桥上使用,默认docker0网桥无法使用自定义ip)
-m 限制内存 : 限制容器最大使用内存量,单位分别为m为兆 g为千兆
--cpus 核心数 : 限制容器最大可使用CPU核心数,如本地物理主机为4核8G,服务器
CPU性能消耗则可以达到百分之400,1核表示100%;
2. 进入到已运行docker容器交互命令行页面
方法一: docker exec : 在正在运行的容器中运行命
docker exec [选项] 运行命令
[选项]
-t --tty : 运行docker容器时,分配一个tty进程,用于用户登录交互
-i --interactive : 即使容器并未连接,也保持stdin(标准输入打开)
-u : 指定容器中使用已存在的用户身份
-w : 指定进入容器命令行交互界面的当前所在目录
docker exec -it web_server /bin/sh
关键字 容器名 需要在容器中运行的命令
利用docker exec功能,在容器中新增一个tty和连接,并且启动一个sh命令行交互
方法二: 进入一个自带bash环境的容器内部命令行交互页面
命令格式:
docker inspect --format "{{.State.Pid}}" sql_server
docker inspect 命令可用于查看容器详细信息
--format "{{.State.Pid}}" 通过给定的模板格式化输出容器State.pid
sql_server 容器名称
nsenter --target 26750 --mount --uts --ipc --net --pid
nsenter 使用其他进程的命名空间运行程序(命令工具)
--target 指定获取命名空间的目标进程
-m --mount 输入装载命名空间
-u --uts 输入uts名称空间(主机名等)
-i --ipc 输入System v IPC命名空间
-n --net 输入网络命名空间
-p --pid 输入PID命名空间
-w --wd 设置工作目录
使用nsenter工具,指定sql_server容器的id进入容器的命令行交互式操作页面
每次输入命令比较麻烦,可通过脚本完成:
vim /bin/indocker.sh
#!/bin/bash
CNAME=$1
CPID=`docker inspect --format "{{.State.Pid}}" $CNAME`
nsenter --target $CPID --mount --uts --ipc --net --pid
Docker容器网络篇(五):
关于docker容器的四种网络模式说明:(除host模式外,其他3中为docker容器默认网络)
host模式:
相当于Vmware中的桥接模式,与宿主机在同一个网络中, 但没有独立IP地址,相当于与物理主机共用网卡;
none模式:
该模式关闭了容器的网络功能,一般用于跑批量处理任务时;
container模式:
此模式与host网络模式类似,host网络模式是网物理主机与docker容器主机共享使用同一个ip,而container模式则是让两个或者多个docker容器共享使用同一个网卡和ip;
bridge模式:(docker容器默认模式)
系统在安装并且运行的docker容器以后,默认在物理服务器运行ifconfig命令查看本地网卡信息时,会出现一个额外新增的docker0网桥,该网桥类似于一个网络交换机,所有新建的docker容器在为明确使用—network设置网络模式时,默认都是直接接入该网络,然后默认分配的ip为docker0网卡的ip段;172.17.0.1/16
查看docker容器默认的网络模式:
docker network ls
- Docker容器使用host模式方法:
查看当前云主机服务器公网上网ip地址作为外网物理主机时使用,然后使用ifconfig命令查看当前物理主机本地ip地址;
查看物理主机本地网络状态,然后使用docker命令运行docker容器
命令格式:
运行docke 容器关键字 --name docker容器名 -it --network=设置为host网络模式 映射本地80端口到容器
docker run --name nginx_host_mode -it --network=host -p 80:80 space.wu/nginx:1.14.2
运行完成容器后,在外网访问云服务器公网ip 80端口后成功打开docker容器内部网站
并且docker容器也输出了访问日志;
由于docker容器运行后是交互式页面,使用ctrl + c 退出后,容器自动关闭了,导致再次访问云主机外网ip 80流量无法转发到docker容器,网站无法打开;
使用docker start 命令运行创建的host网络模式的docker虚拟机,然后查看端口映射关系发现,访问物理主机外网80端口的已经成功接收;
使用docker exec -it 容器名 /bin/sh 运行容器的一个sh环境,然后进入到容器内部,使用ifconfig命令查看容器ip信息与物理主机一致;
- Docker容器使用none模式方法:
docker run --name nginx_none_mode -it --network=none space.wu/nginx:1.14.2
--network=none 模式定义nginx_none_mode模式为无网络模式;
3.Docker容器使用默认bridge网络模式方法:
Docker run -it --name nginx_bridge_mode space.wu/nginx:1.14.2
运行一台虚拟机,默认如果不使用—network 参数设置的容器,默认都是使用的bridge网络模式;
使用:docker exec -it nginx_bridge_mode /bin/sh 命令进入容器
ifconfig 查看容器ip地址,与物理主机docker0 IP在一个网段
在bridge模式的docker容器中尝试使用ping命令ping外网,发现无法访问外网
通过访问自己的docker容器ip和访问物理主机docker0网卡ip也能够正常访问
Docker容器:nginx_bridge_mode nginx程序;
wget -O - -q url 使用wget访问网页,并且直接输出网页内容
在docker物理主机服务器尝试访问docker容器ip以及docker0网卡ip,能够正常访问nginx 80端口,但是公网访问80端口由于没有做pat流量转发,bridge模式主机无法被公网访问;
. 使用bridge模式发布docker容器端口到公网访问:
关闭docker物理主机firewalld防火墙 以及 selinux防火墙
编辑 /etc/sysctl.conf文件 将net.ipv4.ip_forward =0修改为1 开启转发功能
使用sysctl -p 命令生效修改的linux转发功能生效;
docker run -it -d --name nginx_bridge_mode_wan8080_to_lan80 -p 8080:80 space.wu/nginx:1.14.2
-d 参数 用于设置容器运行起来后,后台运行不暂用前端窗口,省去ctrl +c
Docker start 命令过程,直接运行起容器不暂用命令窗口;
-p 参数 [物理主机ip:]端口:[容器ip:]端口 指定映射本地端口映射到容器主机
默认ip可以不填写,直接写映射的端口即可
iptables -t nat -vnL 查看防火墙nat转发映射表
使用bridge网络模式但是修改bridge网络模式默认IP网段:
自定义docker0网卡网络属性信息: (推荐不使用容易造成docker程序无法启动)
vim /etc/docker/daemon.json
{
"bip": "192.168.1.1/24", //网桥ip
"mtu": 1500,
"default-gateway": "192.168.1.1",
"dns": ["10.20.1.2","10.20.1.3"]
}
为docker容器自建新的bridge网桥划分其他自定义网络用于容器网络:
docker network [功能参数]
[功能参数:]
create 新建一个docker容器网桥
rm 名称 删除一个已创建的docker容器网桥
ls 查看现有的docker容器网桥
prune 删除所有未使用的网桥
connect 将容器连接到指定的网桥
disconnect 端口容器与网桥的连接
新建docker容器网桥
格式:docker network create [选项] 网桥
[create选项:]
-d 指定新建的网桥属于docker容器网络类型中的其中一种,默认bridge
--subnet 指定新建的docker容器网桥网段
--gatway 指定新建的网桥网段内的默认网关ip,一般指定为网桥ip
--internal 限制对网络的外部访问
--ip-range 设置该网桥自动分配的IP地址范围
使用docker network create 命令新建一个名为docker_lan_net的bridge网络模式的网桥
ip地址段为192.168.100.0/24 网桥ip为192.168.100.1 作为分配到该网桥容器的网关ip
docker run -it --name docker_lan_web1 --network docker_lan_net -p 80:80 space.wu/nginx:1.14.2
新建一个docker_lan_web1的容器,--network指定网桥连接docker_lan_net 然后发布80端口,然后启动容器,然后使用exec进入到容器,查看容器ip已经nginx运行程序,然后在外部访问测试;
4.Docker容器使用container网络模式方法:
先建立一台正常模式下发布80端口的docker容器主机
再建立另外一台nginx 容器与nginx-web1共用一个网卡IP时,提示由于80端口已经被占用,所以无法运行;
再次下载另外一个开机运行默认不占用80端口的docker镜像,然后设置容器名称为
docker-container --network 指定为container模式与nginx-web1共享网卡ip
.创建docker容器时,主动配置ip地址,不选择自动分配;
--ip ip地址 使用--ip选项可在自建的网桥上创建docker容器时,手动指定固定的ip地址,该ip地址必须与网桥在一个网段,并且该网段内的其他docker容器未使用;
docker network create -d bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 dcoker_lan_net
创建一个命名为 dcoker_lan_net的网桥,网段为192.168.100.0/24段
运行一个名为test_web1的容器,--network 指定连接的网桥是自建的dcoker_lan_net网桥,并且指定自定义的固定ip地址为192.168.100.188
5. docker程序远程管理其他物理主机docker程序
在需要被远程docker管理的主机上,使用systemctl stop docker
然后使用手动命令行启动docker
dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
查看需要被远程管理的docker物理主机,发现2375端口已经被监听
在另外一台主机使用dcoker -H命令远程查看docker容器信息
docker start启动失败出现此类错误,提升使用docker status docker.service时,大多都是
/etc/docker/daemon.json文件中内容与 /lib/systemd/system/docker.service 中启动加载内容重合 如下:
6. 设置docker容器默认启动时候支持外网tcp远程以及本地使用
vim /lib/systemd/system/docker.service
注释默认docker.service 启动参数,然后手动将docker启动参数加入
然后启动docker服务时
提升需要daemon-reload,根据提示执行完成后,本地docker服务正常运行;
外网访问也正常;
Docker容器存储卷篇(六):
利用Docker容器建立存储挂载点,解决docker容器停止或被删除后数据丢失风险;
实现多台容器共同使用同一份公共资源数据,如多台web docker共享网站代码;
利用Hadoop nfs mfs samba等网络文件系统,实现多台不同的docker物理服务器上运行相同业务类型的docker容器数据资源共享;
应用场景如下:
前端负载均衡器 + 物理服务器 A 与 物理服务器B + 磁盘存储服务器
A 与 B 服务器各自都运行3台web容器,作为负载均衡器后端web站点
为保证 A + B两台物理主机下的6台Web Docker容器代码文件一致性,可以采用
利用linux存储目录挂载模式,将磁盘存储目录统一都挂载在两台物理主机的/data-disk目录下,实现两台docker物理服务器数据存储目录 /data-disk目录数据共享;
配置实例:(先实现同一台物理主机上两台web docker容器共享同一份代码文件)
首先在本地物理主机 新建一个docker容器网站代码存储目录 /data-disk/docker
运行两台docker容器
docker run -it --name share_web1 -d -p 8081:80 -v /data-disk/docker:/docker_webdata space.wu/nginx:1.14.2
docker run -it --name share_web2 -d -p 8082:80 -v /data-disk/docker:/docker_webdata space.wu/nginx:1.14.2
选项:
-v 物理本地磁盘路径:挂载到容器中的磁盘目录
-d 运行完容器后不进入容器页面占用前端窗口
在物理主机的容器挂载目录下创建index.html文件,然后分别进入两台容器进行查看
在物理主机使用iptables -t nat -vnL 查看dnat端口转发情况;
.多个磁盘目录需要挂载到docker容器系统
需求说明:
需要将两个或两个以上的目录挂载到docker容器主机中指定目录下对应
docker run -it -d --name "disk_web3" -p 8083:80 -v /data-disk/disk_web3/diska:/dataa -v /data-disk/disk_web3/diskb:/datab space.wu/nginx:1.14.2
如果需要两个或者多个挂载目录,每次的对应挂载目录都使用一次-v 参数进行指定即可;
.如果同一台物理主机中,多台容器挂载目录都一致,并且挂载目录量较大时,可使用
--volumes-from 参数进行指定跟从指定的机器挂载相同选项;
docker run -it -d --name "from_web4" -p 8084:80 -v /data-disk/disk_web4/diska:/dataa -v /data-disk/disk_web4/diskb:/datab space.wu/nginx:1.14.2
正常创建一台为from_web4的docker容器,然后为其挂载两个目录;
然后建立第二台to_web4的docker容器,让其赋值from_web4容器的挂载参数;
. 查看docker 容器信息相关信息格式:
查看docker容器相关详细信息格式:
docker inspect [选项] 容器名
查看docker容器镜像详细信息格式:
docker image inspect [选项] 镜像名称
搭建docker私有仓库(七)
方式一: 在本地搭建一个docker本地私有仓库(无web管理页面);
方式二: 使用docker容器搭建私有仓库,从docker hub下载支持web页面管理后台;
. 方式一搭建服务器本地私有仓库(无web管理页面)
yum -y install docker-registry
安装docker-registry仓库程序包
使用rpm -ql 命令查看docker私有仓库程序包安装后文件路径,其中config.yml为docker私有仓库本地配置文件,/var/lib/registry目录则为仓库存储目录
建立docker本地仓库镜像存储目录,然后挂载一个大磁盘作为大量docker镜像文件存储,然后编辑并设置docker本地仓库配置文件;
修改配置文件中的镜像存储目录以及docker本地仓库程序服务监听端口;
启动docker本地仓库服务程序 systemctl start docker-registry
查看程序监听端口,已经docker本地仓库服务器IP地址;
客户端往私有docker本地仓库中上传或下载docker镜像需要如下操作:
做一个DNS域名解析到docker本地服务器;
"insecure-registries": ["dockerio.spacewu.com:8080"]
编辑docker容器配置文件,使用insecure-registries 参数,设置docker容器本地程序连接本地docker私有仓库时,不使用https协议;
docker tag space.wu/nginx:1.14.2 dockerio.spacewu.com:8080/space.wu/nginx:1.14.2
如果需要将本地docker镜像文件上传到私有docker仓库服务器,在使用push时,需要通过docker镜像名称相关信息,让docker程序判断文件是提交到dockerhub还是第三方docker仓库,故镜像名称格式为:
dockerio.spacewu.com:8080/space.wu/nginx:1.14.2
docker本地服务器域名:程序监听端口号/镜像名称/程序版本号
使用tag 文件修改需要上传到本地私有仓库的镜像名称标签
docker push dockerio.spacewu.com:8080/space.wu/nginx:1.14.2
然后docker push 完成nginx.1.14.2镜像提交到私有仓库;
在docker私有仓库服务器查镜像存储目录;
在其他docker物理主机中远程连接docker私有部署的镜像仓库(请确保iptables和firewall防火墙端口运行docker私有仓库程序端口开放)
yum -y install iptables-service
iptable -F
iptables -A INPUT -p tcp --dport 8080 -s 0.0.0.0/0 -j ACCEPT
systemctl stop firewalld.service
systemctl disable firewalld.service
在其他docker物理主机的hosts中写入docker私有仓库域名解析
编辑daemon.json文件,设置docker连接私有仓库时允许使用http协议
使用docker pull下载私有仓库的docker镜像
查看私有仓库下的镜像方法如下
在另外一台docker物理主机再次提交一个新版本的docker容器到本地仓库。
.方式二: 使用docker容器搭建私有仓库,从docker hub下载支持web页面管理后台
官方安装说明文档,以保存中文版pdf存储
https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md
程序包安装文件下载路径
https://github.com/goharbor/harbor/releases
yum install -y epel-release
wget https://download.docker.com/linux/centos/docker-ce.repo
:%s#download.docker.com#mirror.tuna.tsinghua.edu.cn/docker-ce#g
yum -y install docker-ce docker-compose
修改hosts解析;
systemctl start docker.service
wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.4.tgz
tar -xf harbor-offline-installer-v1.7.4.tgz
cd harbor
进入到harbor的解压目录,在docker-compose.yml文件中,定义了所有docker容器的配置信息,作为私有镜像仓库的容器存储目录默认磁盘不足,可以新增挂载盘到容器默认挂载点目录下;
编辑harbor.cfg文件,用于定制私有仓库的相关页面以及帐号密码信息,详情可查阅官网另存的pdf文件:
hostname = docker.spacewu.com //设置docker仓库访问域名(其他服务器需要解析)
---------------------------------------------推荐相关帐号密码不需要修改------------------------------------
ui_url_protocol = http //设置访问协议类型
db_password = space2018 //postgreSQL数据库密码 推荐不修改以防内部调用出错
redis_password = space2018 //redis服务器密码 推荐不修改以防内部调用出错
clair_db_password = space2018 //此处密码必须与postgreSQL设置参数一致
max_job_workers = 10 //服务器最大复制工作数
customize_crt = off //关闭证书验证
ssl_cert = /data/cert/server.crt //如果站点支持https证书存放目录
ssl_cert_key = /data/cert/server.key //如果站点支持https证书密钥存放目录
harbor_admin_password = Abcd1234 //管理员初始密码(可以先不设置后去修改)
sh -x install.sh > install.log
使用install.sh 文件运行安装
systemctl stop firewalld.service // 关闭系统防火墙
systemctl disable firewalld.service // 关闭系统防火墙开机启动关闭
setenforce 0 // 关闭系统防火墙
yum -y install iptables-service
iptables -F 如果iptables导致无法访问,可以尝试情况防火墙(推荐不操作)
使用设置的harbor_admin_password 帐号密码登录 默认admin/Harbor12345
使用管理员登录至私有仓库管理后台,创建私有仓库镜像上传下载相关帐号
创建一个帐号为spacewu的用户
用户创建完成
使用创建的用户登录docker私有仓库管理后台
选择创建docker镜像管理的项目仓库,点击新增;
为仓库名称命名为nginx-web,可选择设置公开或者不公开;
在一台docker容器的物理主机上设置域名解析,以及编辑/etc/docker/daemon.json文件,使用insecure-参数设置docker.spacewu.com域名不需要使用https协议
使用docker login命令登录docker.spacewu.com私有仓库
使用docker tag标签命令修改需要上传到私有仓库的容器标签名称,格式如下:
docker.spacewu.com/nginx-web/nginx/1.14.2
私有仓库服务器/项目仓库名/镜像名称:[版本信息]
使用docker push命令提交镜像文件到私有仓库,如果此处docker为登录认证docker私有仓库,则会报错,提交docker镜像时候版本标签可选择省略
上传完成后,可通过docker私有仓库管理后天,查看项目下的镜像;
在其他docker容器物理主机中下载docker本地私有仓库下的镜像文件,解决容器服务器解析问题,在/etc/docker/daemon.json文件中设置私有仓库无需https协议,然后如果不登录进行身份认证,pull或者push都会失败。
停止docker私有仓库服务命令: docker-compose pause
运行私有仓库服务器命令 docker-compose unpause
如果docker私有仓库无法私有,需要确认运行的所有docker私有仓库相关容器属于运行状态,可通过docker start docker stop命令进行启动和停止
Docker系统资源限制(八)
. 查看docker容器性能资源消耗:
docker stats [容器名]
docker stats 命令可以查看当前物理主机下,所有docker容器的性能资源
. 查看docker容器中的运行程序
docker top 容器名
使用docker top命令指定查看一台容器的内部运行的程序;
容器资源限制参数:
格式: docker run [选项]
[ 选项:]
-m 限制内存 : 限制容器最大使用内存量,单位分别为m为兆 g为千兆
--cpus 核心数 : 限制容器最大可使用CPU核心数,如本地物理主机为4核8G,服务器
CPU性能消耗则可以达到百分之400,1核表示100%;
--cpuset-cpus 值,值 : 明确指定容器只允许使用物理服务器中第几颗CPU,
如当物理主机为4核8G配置时,--cpuset-cpus 0,3则表示该容器值 运行使用两个CPU,分别是0第一颗,3第四颗,意味着容器最大 CPU只有2颗,内存消耗在200%左右,0-2 这表示 012三颗;
--cpu-shares 权重值 按照权重比例切分物理主机CPU资源,如物理主机4核8G配置
3台容器 web1比例1024 web2比例512 web3比例2048,则表示 将物理主机CPU分为7份web3可以使用物理主机4核CPU的
7/4CPU资源,然后如果新增其他主机分配权重值,则继续按照此 比例分配。
限制docker容器的使用内存最大值,防止docker容器将物理主机服务器性能资源耗尽
docker run -d --name test_memory -it -m 512m space.wu/nginx:1.14.2
运行一台docker容器,-d后台运行不占用交互界面,命名为test_memory -m 512m设置该容器最大可使用内存为512m
使用docker top 容器名,查看容器内部运行进程信息
使用docker stats [容器名] 查看容器性能消耗信息,其中MEM USAGE为目前容器使用内存,LIMIT为容器最大可使用内存,MEM% 为服务器已使用内存占可使用内存百分比;
限制docker容器的可使用CPU核心数,防止docker容器将物理主机服务器性能资源耗尽
docker run -d -it --name test_cpu --cpus 2 space.wu/nginx:1.14.2
运行一个容器,然后使用--cpus 2设置该容器最大只允许使用2核CPU,如果在满负载情况下CPU负载只能达到百分之200;
为演示当容器CPU性能消耗大于容器限制性能的实际效果,现通过stree容器进行压测模拟
下载镜像 lorel/docker-stress-ng:latest压测镜像
docker run -it --name test_cpu1 --rm -d --cpus 2 lorel/docker-stress-ng:latest stress --cpu 4
运行一个命名为test_cpu1的容器,--rm 容器使用完成后删除
--cpus 2分配容器最大只允许使用两核CPU,使用lorel/docker-stress-ng:latest镜像运行容器
stress --cpu 4 使用stress镜像中的stress压测程序,--cpu 4是程序消耗4核CPU压力进行运行 ,最后结果,发现服务器最大使用到198%接近2核CPU后无法上涨;
明确指定docker容器只运行使用本地物理主机的第几核CPU
运行容器test-cpu --cpuset 0,1 指将物理主机的0和1的两核CPU 给予容器使用,一般不使用做法。
. 按照权重进行CPU资源分配:
分别建立两台主机share_cpu1 和share_cpu2 share_cpu1的CPU权重占比为512 share_cpu2 占比1024 docker将本地物理主机CPU资源分为3份,然后比重占比进行分配;
最后CPU分配结果,share_cpu2分配的比重比share_cpu1多一倍,此服务器为2核CPU
docker本地物理主机CPU百分之100负荷中;
如果毕竟重要的docker容器,为防止docker物理主机资源耗尽后导致重要docker容器程序被杀死,则可以使用以下参数进行设置
--oom-kill-disable 禁用OOM杀死容器程序
--oom-score-adj 值 该值范围-1000 到1000 值越小,当系统资源不足时,优先杀死进程 被排名越靠后;
该实则以为着nginx_web容器就算使用内存超过限制的512m也不会被杀死。
DockerFile制作容器镜像文件参数详解(九)
. Dockerfile的基本结构
一般分为四部分:
1. 基础镜像信息
2. 维护者信息
3. 镜像操作指令和容器启动时执行指令
4. ’#’ 为 Dockerfile 中的注释
所有围绕着Dockerfile相关的文件以及程序,都必须要存放在dockerfile同级目录下
Dockerfile文件常用指令功能说明:
序号 | 文件指令 | 功能说明 |
1 | FROM | 指定基础镜像,必须为第一个命令 |
2 | MAINTAINER | 指定作者 |
3 | LABEL | 为镜像指定元数据,功能是为镜像指定标签 |
4 | ENV | 设置容器环境变量 |
5 | ADD | 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),但会wget自动下载 |
6 | COPY | 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源 |
7 | WORKDIR | 工作目录,类似于cd命令 |
8 | USER | 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户,当服务不需要管理员权限时,可以通过该命令指定运行用户。 |
9 | ONBUILD | 当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发 |
10 | EXPOSE | 指定于外界交互的端口,运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口 |
11 | VOLUME | 用于挂载docker本地物理主机的目录挂载到容器中,作为持久化存储防止容器删除后数据丢失 |
12 | ARG | 用于指定传递给构建运行时的变量 |
13 | RUN | 构建镜像时执行的命令 (RUN是构件容器时就运行的命令以及提交运行结果) |
14 | CMD | 构建容器后调用,也就是在容器启动时才进行调用 (CMD是容器构建成功以后,启动容器时执行的命令,在构件时并不运行) |
Dockerfile文件常用指令语法详解
From 指定基础镜像,必须为第一个命令
语法一: FROM 镜像全名:[标签]
语法二: FROM 镜像全名@[镜像哈希码] //防止冒名顶替的假镜像
说明: 自定义作一个镜像时,必须有一个基础原有可使用的镜像,然后在此镜像中新增和部署自己所需环境,语法一和二后面的值都是可选项,如果不使用这两个值时,会使用latest最新版本的基础镜像。
MAINTAINER 指定作者,镜像创建者维护者信息
语法格式: MAINTAINER 用户名
MAINTAINER 用户邮箱等
说明: 用于提供说明镜像的创建者信息,多个使用可以提供不同信息内容描述;
LABEL 为镜像指定元数据,设置镜像标签
语法格式: LABEL 关键字="值" 关键字2="值"
实例: version="1.10" maintainer="abc@163.com"
说明: 用于显示镜像相关标签信息,针对标签进行相关参数说明;
ENV 设置容器环境变量
语法格式: ENV PATH="/usr/local/httpd/bin:PATH"
实例: ENV webhome="/data/www"
说明: 设置的变量值会传递到容器内部被调用,或者DockerFile文件其他指令调用, 如后续指令中使用ADD COPY其他指令时,可以调用该变量的值;
ADD 将本地文件添加到容器中(指定的目录时,默认只拷贝目录下所有)
语法格式: ADD 本地文件 存放到容器中的目录
实例: ADD ./httpd-2.4.tar.gz /tmp/httpd/ 默认会被解压
ADD http://a.b.com/httpd-2.4.tar.gz /tmp/httpd/
说明: 使用add文件可以将服务器本地的文件拷贝到容器的指定目录中,并且如果
是压缩文件会被默认解压释放到指定的目录,而公网的软件,则会下载后存放
到指定目录。
COPY 将本地文件添加到容器中(指定的目录时,默认只拷贝目录下所有)
语法格式: COPY 本地文件 存放到容器中的目录
实例: COPY /data/www /data/www/
等于 COPY /data/www/* /data/www/
说明: 使用copy指令可以将本地文件拷贝到容器目录中
WORKDIR 工作目录,类似于cd命令
语法格式: WORKDIR /data/www
说明: 使用WORKDIR指令可以定义制作容器时,命令进入到哪个目录下进行下一步操作
USER 指定运行容器时的用户名或 UID
语法格式: USER 用户名
说明:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户,当服务不需
要管理员权限时,可以通过该命令指定运行用户,通过docker run运行容器时,
可以通过-u参数来覆盖所指定的用户
ONBUILD 用于设置镜像触发器
语法格式: ONBUILD RUN yum -y install lrzsz
实例: ONBUILD RUN wget http://a.b.com/abc.tar.gz
说明: 在ONBUILD指令后的命令在打包做镜像或者做成的镜像运行容器时都不会被
执行,但是当此镜像被其他制作镜像FROM参数调用时,则会执行ONBUOLD
指令后的命令;
EXPOSE 指定于外界交互的端口
语法格式: EXPOSE 端口号[/协议]
实例: EXPOSE 80
EXPOSE 80 443
EXPOST 10500/tcp 10010/udp
说明: 在部署的环境的容器中,需要开放程序端口对外时候,使用EXPOSE指令进行发布
VOLUME 挂载本地目录到容器
语法格式: VOLUME /data
实例; VOLUME /data/www
说明:当使用这个参数制作的容器,在被运行时候,会自动在物理机本地将一个目录挂载到dokcer容器中的/data/www目录下,如果在docker容器中/data/www目录下原先已经存在站点文件,则会将这些文件复制存放到容器挂载的目录使用,当容器删除后,该目录的东西由于在本地物理主机有对应挂载点,数据将得到保存;
ARG 为镜像build时设置默认值
语法格式: ARG webpath=/data/www
说明:当使用ARG定义的参数默认值,在进行build镜像时没有指定参数的新值,则默认使用ARG定义的值为默认参数;
RUN 构建镜像时执行的命令
语法格式: RUN 系统执行命令 && 系统执行命令2 && \ 换行然后命令3
实例:RUN mkdir -p /data/www/html && cp /root/html/a.html /data/www/html
说明:(RUN是构件容器时就运行的命令以及提交运行结果) 一般用于在容器制作前 部署环境使用,不建议写多个run运行多条命令;
CMD 为构建的容器设置容器启动时运行的程序
语法格式: CMD 容器启动后执行命令 参数1 参数2
实例: /bin/httpd -f -h /data/www/html
说明:CDM类似于centos6.X版本的rc.local文件,设置容器系统启动后默认执行程序
. 制作容器镜像
制作容器命令格式:
docker build [选项] 自定义容器名 容器执行相关文件目录
选项:
-m 限制内存 : 限制容器最大使用内存量,单位分别为m为兆 g为千兆
--cpus 核心数 : 限制容器最大可使用CPU核心数,如本地物理主机为4核8G, 耗则可以达到百分之400,1核表示100%;
-t 名称 : 自定义新建的容器镜像名称信息
准备一个基础容器镜像文件
创建一个用于建立新镜像的容器目录,然后在目录下创建一个Dockerfile文件
根据Dockerfile文件指令,对新容器镜像需求进行环境部署
使用docker build 命令镜像容器镜像制作 -t 自定义容器名称 指定Dockerfile镜像信息配置文件目录在当前目录下
镜像开始制作中,依次显示Dockerfile文件中指令
镜像制作根据dockerfile文件中指令对新镜像进行环境不是,部署完成后的镜像大小明显大于之前的基础镜像;
使用新制作的镜像运行docker容器,然后发现在制作docker镜像时,已使用的service httpd start运行httpd ,但镜像运行容器时,httpd服务依旧为被运行,手动运行httpd服务,查看到物理主机的镜像端口映射为32777:80
检查httpd开机启动状态和iftop工具是否已经在镜像制作时完成安装;
分别在docker物理主机和其他pc访问docker容器中的httpd服务。
docker排错篇(十):
1. docker容器开机启动项无法开机启动时
当使用docker start 容器名 无法启动容器时,一般是因为容器自启动项出了问题导致,可手动进行修改一个能够启动的,如图查看容器docker-censh-spider2容器默认开机运行的command命令是什么,然后通过docker inspect 容器名查看容器对应系统文件挂载目录;
通过查看容器详细信息可以找到容器运行系统文件存放位置
通过 --format "{{.GraphDriver.Data.UpperDir }}" 定位查找准确信息
然后在容器系统文件目录下找到该容器开机默认运行的程序,进行查看,然后修改为一个可以开机自动运行的项目即可,如 /bin/sh
docker容器启动没有反应查看日志方法:
docker logs 容器名称
使用docker容器搭建网站需要注意的三件事:
1. vim /etc/idmapd.conf
设置挂载用户为apache,否则会造成session等目录无法读写
2. /var/lib/docker 目录权限千万不能乱动
3. docker容器下,必须使用ln -sv 将网站根目录对应上/data-disk/www
容器使用systemctl命令提示此错误时:
Failed to get D-Bus connection: Operation not permitted;
原因:
运行docker容器时需要使用此参数:
--privileged=true 授权容器启动后,使用最高root权限
/usr/sbin/init 在启动容器命令最后添加该命令,类似于容器启动项设置为启动init
命令:
docker run -it -d --privileged=true ...*** 镜像名 /usr/sbin/init
docker下linux系统不支持中文处理方法:
yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
export LC_ALL=zh_CN.utf8
rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
vim /etc/profile
export LANG="c.UTF-8"
source /etc/profile