试验环境 centos7
Docker 概述
Docker 是一个开源框架应用容器,让开发者可以打包他们的应用以及依赖包到一个可以移植的容器中,然后分布到任务流行的Linux 机器上,也可以实现虚拟化,容器时完全使用沙盒机制,互相之前不会有任何接口, 几乎没有星型开销,可以很容易地在机器上和数据中心进行运行,最重要的是,他们不依赖于任何语言,框架保证系统
Docker 是dotCoud 公司开源的一个基于LXC 的高级容器引擎源代码托管在Github 上,基于go语言尊姓从apache2.0 协议开源
Android linux JVM java程序 app
linux -》 docker 服务做成系统直接可以运行起来
windows docker 服务做成镜像可以直接运行起来
扩展LXC linux Container 的简写,是一种内核虚拟化技术,可以提供轻量级的徐吉华,以便隔离进程和资源,
8.1.1 docker 容器技术和虚拟机对比
相同点:docker 容器技术和虚拟机技术,都是虚拟化技术
docker 相对于VM虚拟机,少了虚拟机操作系统这一层,所以docker 效率比虚拟机高
在docker 上启动一个实例1-2 秒,
工作流程,在服务器A运行docker Engine 服务,在docker Engine 上启动很多容器container 从外网Docker Hub 上把image 操作系统镜像下载来,放到container 容器运行,这样一个容器的实例就运行起来了
最后通过Docker client 对docker 容器虚拟化平台进行控制
Image和Container 的关系,image 可以理解为系统镜像,Container 是image 在运行时的一个状态
Docker 核心技术
1 Namespace - 实现Container 的进程,网络,消息,文件系统和主机名的隔离
2 Cgroup - 实现对资源的配额和度量
8.2 部署docker 容器虚拟化平台
1 ) 实战1 ,部署docker 容器虚拟化平台
把docke-rpm .tar.gz 上传到linux系统上,
[root@xuegod6 ~]# tar -xf docker-rpm.tar.gz
[root@xuegod6 ~]# cd docker-rpm/
[root@xuegod6 docker-rpm]# ;s
-bash: 未预期的符号 `;' 附近有语法错误
[root@xuegod6 docker-rpm]# ls
container-selinux-2.21-2.gitba103ac.el7.noarch.rpm oci-register-machine-0-3.11.1.gitdd0daef.el7.x86_64.rpm
container-storage-setup-0.6.0-1.gite67c964.el7.noarch.rpm oci-systemd-hook-0.1.12-1.git1e84754.el7.x86_64.rpm
docker-1.12.6-55.gitc4618fb.el7.centos.x86_64.rpm oci-umount-1.12.6-55.gitc4618fb.el7.centos.x86_64.rpm
docker-client-1.12.6-55.gitc4618fb.el7.centos.x86_64.rpm repodata
docker-common-1.12.6-55.gitc4618fb.el7.centos.x86_64.rpm skopeo-containers-0.1.23-1.git1bbd87f.el7.x86_64.rpm
2 )创建自己的repo 源
[root@xuegod6 docker-rpm]# rm -rf repodata/
[root@xuegod6 docker-rpm]# createrepo ./
3 ) [root@xuegod6 docker-rpm]# vim /etc/yum.repos.d/docker-rpm.repo
[docker-rpm]
name=docker-rpm
baseurl=file:///root/docker-rpm
enable=1
gpgcheck=0
~
4 )一走yum 源
[root@xuegod6 docker-rpm]# cd /etc/yum.repos.d/
[root@xuegod6 yum.repos.d]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo docker-rpm.repo
[root@xuegod6 yum.repos.d]# mv CentOS-* /opt/
5 )安装docker 方法2 使用centos系统自带的源码安装,比较慢
[root@xuegod6 yum.repos.d]# yum -y install docker
开始启动 [root@xuegod6 yum.repos.d]# systemctl start docker && systemctl enable docker
查看version 版本
[root@xuegod6 yum.repos.d]# docker -version
flag provided but not defined: -version
See '/usr/bin/docker-current --help'.
[root@xuegod6 yum.repos.d]# docker version
Client:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-55.gitc4618fb.el7.centos.x86_64
Go version: go1.8.3
Git commit: c4618fb/1.12.6
Built: Thu Sep 21 22:33:52 2017
OS/Arch: linux/amd64
Server:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-55.gitc4618fb.el7.centos.x86_64
Go version: go1.8.3
Git commit: c4618fb/1.12.6
Built: Thu Sep 21 22:33:52 2017
OS/Arch: linux/amd64
也可以这样查看
[root@xuegod6 yum.repos.d]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
二 下载docker镜像
1 ) 查看docker searce centos
[root@xuegod6 yum.repos.d]# docker search centos
方法1,从公网dockerhub 拉去下载 image pull 拉
docker pull docker.io/centos 复制上面第一行
方法2 把之前下载好的image 镜像导入 image
把centos-latest-docker -iamge.tar 镜像上传到linux
查看镜像列表
[root@xuegod6 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 470671670cac 4 months ago 237.1 MB
[root@xuegod6 ~]#
三 docker平台的使用
开始运行docker
docker.io/centos latest 470671670cac 4 months ago 237.1 MB
[root@xuegod6 ~]# docker run -it docker.io/centos:latest /bin/bash
[root@e24065a502c6 /]#
-i: 以交互模式进行容器,通常与-t 同时使用
-t 为容器重新分配一个为终端输入,通常与-i 同时使用
2 )已经能独立运行了
[root@e24065a502c6 /]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
exit 退出去
例2 在container 中启动一个长久运行的进程,不断向stain 输出hello world ,模拟一个后台运行的服务
docker 常用参数
-d 后台运行容器,并返回容器ID
-c 后面跟待完成的命令
docker run -d docker.io/centos:latest /bin/bash -c "while true;do echo hello world;sleep 1;done"
sadkfsdklfsadfsdfsakjldfasdfsds
容器的ID 号
从容器中读取日志
语法: docker logs 容器实例Name /ID
docker logs adjkssaldfsld 只哎哟ID 是唯一就可以
[root@xuegod6 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@xuegod6 ~]# cat /proc/sys/net/ipv4/ip_forward
1
也可以使用
[root@xuegod6 ~]# vim /etc/sysctl.conf
插入以下内容
net.ipv4.ip_forward = 1
[root@xuegod6 ~]# sysctl -p
net.ipv4.ip_forward = 1
查看所有的进程ID
[root@xuegod6 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e24065a502c6 docker.io/centos:latest
docker logs e24065a502c6 能查出所有刚才 docker里面的命令
例3
杀死一个容器:比如:杀死一个正在后台运行的容器
查看要杀死的容器的ID
docker kill d031ed2c6a ID 号
例4 启动,停止,重启container 容器实例
[root@xuegod6 ~]# docker run -d docker.io/centos:latest /bin/bash -c "while true;do echo hello world;sleep 1;done"
f030193723cd760415fd5969bd8de35d4493f11b3aae27033591d2bd65a34221
[root@xuegod6 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@xuegod6 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f030193723cd docker.io/centos:latest "/bin/bash -c 'while " About a minute ago Up About a minute prickly_shannon
[root@xuegod6 ~]# docker stop|start|restart f03019372 停止 重启 开始
删除镜像
docker rm -f ID号
8.4 docker 镜像制作方法
Docker Image 的制作两种方法
方法1: docker commit 保存 container 的当前状态到Image后,然后生成对应的image
方法2: docker build 使用Dockerfile 文件自动化制作,image
创建一个安装好的apache 工具
[root@xuegod6 ~]# docker run -it docker.io/centos /bin/bash
[root@ffd64485cc9b /]# yum install httpd -y
根据容器当前状态做一个image 镜像 创建一个 安装了一个apache 工具的centos镜像
语法 docker commit <container的ID> 或者<image_name>
[root@xuegod6 ~]# docker commit ffd64485cc9b docker.io/centos:latest
sha256:bb36ea5da00c9d66d674460da38c264178fd10f2efcc3b14575e10283e6ed627
[root@xuegod6 ~]# docker images 就会覆盖之前的
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest bb36ea5da00c 13 seconds ago 279.4 MB
docker.io/centos <none> 470671670cac 4 months ago
[root@xuegod6 ~]# docker commit ffd64485cc9b docker.io/centos:httpd
sha256:22685138d3850ab6d2fe7d2d57617c520af1e68118131707cafa26583b17a4e2
[root@xuegod6 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos httpd 22685138d385 2 seconds ago 279.4 MB
docker.io/centos latest bb36ea5da00c About a minute ago 279.4 MB
docker.io/centos <none> 470671670cac 4 months ago
使用镜像创建的docker.io/centos:apache 镜像,生成一台容器实例
镜像,生成一台容器
docker run -it docker.io/centos :apache /bin/bash
[root@c33af26e3cde /]# rpm -qa httpd 查看,已经安装好的apache 命令
httpd-2.4.37-16.module_el8.1.0+256+ae790463.x86_64
说明基于安装apache 的docker安装成功
方法二, 创建一个基于centos的httpd web 服务器镜像
1 创建工作目录
[root@xuegod6 ~]# mkdir /docker-build
[root@xuegod6 ~]# cd /docker-build/
[root@xuegod6 docker-build]# touch Dockerfile
注 make自动化编译需要Makefile 文件,自动化创建docker镜像时,需要Dockerfile
2 编辑Dockerfile
[root@xuegod6 docker-build]# vim Dockerfile
插入以下内容
FROM docker.io/centos:latest 基于哪个镜像
MAINTAINER <root@xuegod6> 镜像的作者
RUN yum -y install httpd 安装软件
ADD start.sh /usr/local/bin/start.sh
ADD index.html /var/www/html/index.html
[root@xuegod6 docker-build]# echo "/usr/sbin/httpd -DFOREGROUND" > start.sh
~
3 )chmod a+x start.sh
[root@xuegod6 docker-build]# echo "docker image build test" > index.html
[root@xuegod6 docker-build]# ls
Dockerfile index.html start.sh
4 ) 使用build 来创建新的image
语法 :docker build -t 父 镜像名 镜像的tag Dockerfile 文件所在的路径
-t : 表示tage 镜像名
[root@xuegod6 docker-build]# docker build -t docker.io/centos:httpd ./
注:
注:docker 镜像=应用/程序+库
方法1:Save Image To TarBall
方法2: Push Iamge To Docker Hub
方法1:Save Image To TarBall
保存 Image 到tar 包
语法: docker save -o 导出的镜像名.tar 本地镜像名:镜像标签
[root@xuegod6 ~]# docker save -o centos-httpd-docker-image.tar docker.io/centos:httpd
方法3 使用阿里云的私有仓库发布,等下结说完私有仓库以后,
8.5 Container 容器端口映射
[root@xuegod6 ~]# docker run -d -p 80:80 docker.io/centos:httpd /bin/bash -c /usr/local/bin/start.sh
def5d5dccc529c5b1e84ca4bd3d855604bfce9e8c799db367e1efa13e46d1459
-p 前面是物理机的端口 后面是容器的端口
[root@xuegod6 ~]# netstat -antup | grep 80
tcp 0 0 192.168.43.99:22 192.168.43.80:3632
使用浏览器查看80 端口 把容器中的80端口映射到物理机上的80 端口
现在docker 实例运行的网络模式就像VMware 的nat 模式,后期会讲给docker 配置静态IP
实战6 : 访问正在运行的container 容器实例
语法 docker exec -it <container ID | name > /bin/bash
[root@xuegod6 ~]# docker exec -it def5d5dccc52 /bin/bash
[root@def5d5dccc52 /]#
[root@def5d5dccc52 /]# cd /var/www/html/
[root@def5d5dccc52 html]# ls
index.html
[root@def5d5dccc52 html]# echo xuegod >/var/www/html/test.html
测试一下