容器
容器原理简介
Linux内核技术支持
- Cgroups(Control Groups) 资源管理
- SELinux 安全
- NameSpace 命名空间
- Linux的NameSpace有
- UTS
- NETWORK
- MOUNT
- USER
- PID
- IPC
- Linux的NameSpace有
容器的优缺点
- 优点
- 相比于传统的虚拟化技术,容器更加简洁高效
- 传统虚拟机需要给每个VM安装操作系统
- 容器使用的共享公共库和程序
- 缺点
- 容器的隔离性没有虚拟化强
- 共用Linux内核,安全性有先天缺陷
docker简介
- docker是完整的一套容器管理系统
- docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术
- 安装条件
- 需要64位操作系统
- 至少RHEL6.5以上的版本(内核2.6.32-431以上 CentOS7需要内核3.1)
- uname -r 查看内核版本 cat /etc/redhat-release 查看系统版本
- 关闭防火墙
- 安装条件
docker安装
- 系统软件,位于CentOS7-1804源中
- 扩展依赖包,位于extras源中
- docker软件,自己下
docker镜像管理命令
镜像管理命令 | 说明 |
---|---|
docker images | 查看本机镜像 |
docker search 镜像名称 | 从官方仓库查找镜像 |
docker pull 镜像名称:标签 | 下载镜像 |
docker push 镜像名称:标签 | 上传镜像 |
docker save 镜像名称:标签 -o 备份镜像名称.tar | 备份镜像为tar包 |
docker load -i 备份镜像名称 | 导入备份的镜像文件 |
docker rmi 镜像名称:标签 | 删除镜像(必须先删除该镜像启动的所有容器) |
docker histroy 镜像名称:标签 | 查看镜像的制作历史 |
docker inspect 镜像名称:标签 | 查看镜像的详细信息 |
docker tag 镜像名称:标签 新的镜像名称:新的标签 | 创建新的镜像名称和标签 |
docker容器管理命令
容器管理命令 | 说明 |
---|---|
docker run -it(d) 镜像名称:标签 启动命令 | 创建启动并进入一个容器,后台容器使用参数d |
docker ps | 查看容器 -a 所有容器 包含未启动的 -q 只显示ID |
docker rm 容器ID | -f 强制删除, 支持命令重入 |
docker start | stop | restart 容器ID | 启动、停止、重启容器 |
docker cp 本机文件路径 容器ID:容器内路径 | 把本机文件拷贝到容器内(上传) |
docker cp 容器ID:容器内路径 本机文件路径 | 把容器内文件拷贝到本机(下载) |
docker inspect 容器ID | 查看容器的详细信息 |
docker attach 容器ID | 进入容器的默认进程,退出后容器会关闭 |
docker attach 容器ID [ctrl+p, ctrl+q] | 进入容器以后,退出容器而不关闭容器的方法 |
docker exec -it 容器ID 启动命令 | 进入容器新的进程,退出后容器不会关闭 |
管理镜像使用 名称:标签
管理容器使用 容器ID (–name 指定容器名字后可以使用容器名字)
云服务器使用容器
-
机子情况
主机名 IP地址 说明 proxy 192.168.1.252 云服务器跳板机 node-0001 192.168.1.31 2CPU,2G内存 node-0002 192.168.1.32 2CPU,2G内存 -
跳板机添加docker软件
cp -a docker /var/ftp/localrepo #将docker rpm软件包复制到ftp目录下
cd /var/ftp/localrepo #进入目录
createrepo --update . #更新当前目录的自制yum源
- 节点服务器安装docker软件
#node-0001 和 node-0002
uname -r #确认当前云主机的内核版本
3.10.0-1160.6.1.el7.x86_64
cat /etc/redhat-release #查看当前云主机的系统版本
CentOS Linux release 7.5.1804 (Core)
yum makecache #缓存
vim /etc/sysctl.conf
=========================
net.ipv4.ip_forward=1 #开启节点服务器的路由转发功能
==========================
sysctl -p
yum install -y docker-ce
systemctl enable --now docker #启动docker服务并且开机自启
ifconfig #查看是否有docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:0f:54:6f:9a txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker version #查看docker 版本信息
Client:
Version: 18.06.3-ce
API version: 1.38
Go version: go1.10.3
Git commit: d7080c1
Built: Wed Feb 20 02:26:51 2019
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.06.3-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.3
Git commit: d7080c1
Built: Wed Feb 20 02:28:17 2019
OS/Arch: linux/amd64
Experimental: false
- 开发FORWARD默认规则(docker1.12版本以上会设置FORWARD的默认规则为DROP)
vim /lib/systemd/system/docker.service
============================================
#ExecStart 下面添加
ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
================================================
systemctl daemon-reload #刷新服务
systemctl restart docker #重启服务
iptables -nL FORWARD #查看 ACCEPT即可
- docker镜像命令使用
#node-0001或node-0002 整点镜像到当前目录下
ls
nginx.tar.gz redis.tar.gz ubuntu.tar.gz
docker load -i nginx.tar.gz #导入tar包镜像
docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 82629e941a38 2 years ago 95MB
nginx latest 42b4762643dc 2 years ago 109MB
ubuntu latest 20bb25d32758 2 years ago 87.5MB
centos latest 76d6bc25b8a5 2 years ago 200MB
docker search busybox #查找公用镜像 记得给查找的云主机配个公网IP
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
busybox Busybox base image. 2110 [OK]
docker pull busybox #下载镜像
docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 491198851f0c 9 hours ago 1.23MB
redis latest 82629e941a38 2 years ago 95MB
nginx latest 42b4762643dc 2 years ago 109MB
ubuntu latest 20bb25d32758 2 years ago 87.5MB
centos latest 76d6bc25b8a5 2 years ago 200MB
docker save busybox:latest -o busybox.tar #备份busybox成tar包
docker tag ubuntu:latest newubuntu:newtag #给镜像添加新的名词和标签
docker images #查看
REPOSITORY TAG IMAGE ID CREATED SIZE
newubuntu newtag 20bb25d32758 2 years ago 87.5MB
ubuntu latest 20bb25d32758 2 years ago 87.5MB
#ID是一样的
docker rmi ubuntu:latest #删除镜像
Untagged: ubuntu:latest #删除了
docker inspect centos:latest #查看镜像详细信息
...........
"Env": [ #镜像环境
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [ #镜像默认启动 docker run -it centos:latest 不加启动项时默认使用
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
...........
docker history nginx:latest #查看镜像的历史信息
- docker容器管理命令
docker run -itd nginx:latest #后台启动容器
5101e4fa279ce6817251eca11167bc6872b8ee553259f9a8b7d31407c16d5a7b
pgrep nginx #查看进程
4859
4891
#有了
docker ps #查看启动的容器 -a 显示所有容器 包括为启动的 -q 只显示容器ID
#容器ID 镜像 命令 创建时间 状态 端口 名字
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5101e4fa279c nginx:latest "nginx..." 3 minutes ago Up 3 minutes 80/tcp keen_jang
docker stop 5101e4fa279c #关闭容器
5101e4fa279c #关闭了
docker run -it --name myos centos:latest /bin/bash #前台创建启动进入centos:latest镜像 指定名字为myos
[ctrl+p, ctrl+q] #组合键 退出容器但是不关闭容器
docker ps #查看下
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ecd81bc15735 centos:latest "/bin/bash" 22 seconds ago Up 21 seconds myos
docker attach ecd81bc15735 #进入容器 容器需要启动的 且必须是交互式的容器(前台)
exit #推出并且关闭容器
docker ps -aq #查看所有容器ID
ecd81bc15735
5101e4fa279c
fe4dcdc4fea1 #有三个容器关闭着
docker start 容器ID
docker stop 容器ID
docker restart 容器ID
docker start ecd841bc15735 #启动
docker inspect ecd841bc15735 | grep IPAddress #查看容器信息过滤下
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2", #有IP地址
"IPAddress": "172.17.0.2",
#docker0的地址为172.17.0.1 网关 每启动一个容器 每个容器的IP都是172.17.0.x 逐渐加1
#因为是nginx容器服务 所以可以访问测试下
curl http://172.17.0.2 #访问 容器80端口
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#成功收到nginx的欢迎页面
#删除所有容器
docker rm -f $(docker ps -aq)
ecd81bc15735
5101e4fa279c
fe4dcdc4fea1
- 修改nginx容器内容
#启动nginx容器
docker run --name nginx -itd nginx:latest
3c97df1b59e1
#curl 172.17.0.2能够收到欢迎界面 现在修改网页内容
docker exec -it 3c97df1b59e1 /bin/bash #exec进入容器退出不关闭容器 但是需要添加启动命令
cat /etc/nginx/conf.d/default.conf #查看网页文件位置
echo "hello docker_nginx!" > /usr/share/nginx/html/index.html #直接修改
exit #退出容器
curl http://172.17.0.2 #访问修改的内容
hello docker_nginx! #成功访问到了内容
#因为容器内没有编辑器命令 所以复杂的修改需要将容器里面的文件拷贝出来修改在拷贝回去
#将容器内的网页文件拷贝出来
docker cp 3c97df1b59e1:/usr/share/nginx/html/index.html ./index.html
vim ./index.html
========================
hello docker cp nginx! #修改
=============================
#再传回去
docker cp ./index.html 3c97df1b59e1:/usr/share/nginx/html/index.html
#再次访问看看
curl http://172.17.0.2
hello docker cp nginx! #成功了
- 容器内服务安装
docker rm -f $(docker ps -aq) #清下环境
docker run -it --name myphp centos:latest
796adf954110
#在容器内
rm -f /etc/yum.repos.d/*.repo
[ctrl+p, ctrl+q] # 不关闭容器退出
docker cp /etc/yum.repos.d/CentOS-Base.repo 796adf:/etc/yum.repos.d/ #复制repo进去
docker exec -it 796ad /bin/bash #进入容器
yum install -y net-tools httpd #安装 因为可以和真机同样使用云yum源
echo hello world! > /var/www/html/index.html #写入
#因为容器没有systemd上帝进程 所以没法systemctl 启动服务 只能手动了
#查看/usr/lib/systemd/system/httpd.service
#EnvironmentFile=/etc/sysconfig/httpd #配置文件
#配置文件里面就是LANG=C
#ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND 启动命令
#手动启动服务
export LANG=C #设置为环境变量 编码环境 测试不写好像当前环境没影响
/usr/sbin/httpd -DFOREGROUND
[ctrl+p, ctrl+q] #不关闭退出
curl http://172.17.0.2/
hello world!