一. 什么是docker
在了解docker之前,我们必须先清楚docker和虚拟机的不同
- 虚拟机
我们用的传统虚拟机如 VMware ,VisualBox 之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用
每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统 - 容器
容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。
容器包含应用和其所有的依赖包,但是与其他容器共享内核。
容器在宿主机操作系统中,以进程的方式运行。 - docker
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。
总体来说, Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
二.Docker包含的三个基本概念
-
Image(镜像)
镜像(Image)就是一堆只读层(read-only layer)的统一视角 -
Container(容器)
容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。 -
Repository(仓库)
Docker 仓库是集中存放镜像文件的场所。
仓库又可以分为两种形式:
public(公有仓库)
private(私有仓库)
三.docker的常用命令
命令 | 作用 | 补充 |
---|---|---|
docker load -i ubuntu.tar | 导入镜像 | |
docker create | 为指定的镜像(image)添加了一个可读写层,构成了一个新的容器 | 这个容器并没有运行 |
docker start vm1 | 启动容器 | 创建了一个进程隔离空间 |
docker run | 启动并运行容器 | docker create和docker start两个命令的组合 |
docker ps | 查看容器状态,当前活跃的 | |
docker ps -a | 查看所有的容器状态 | |
docker attach vm1 | 连接容器 | |
docker inspect vm1 | 查看容器详情 | |
docker stats vm1 | 查看容器资源使用率 | |
docker diff vm1 | 查看容器修改 | |
docker stop vm1 | 停止容器 | |
docker start vm1 | 启动容器 | |
docker rm vm1 | 删除容器 | 只能对非运行态容器执行 |
docker rm -f vm1 | 强制删除容器 | |
docker rmi ubantu | 删除镜像 | |
docker images | 列出镜像 | |
docker images –a | 命令列出了所有的镜像 | 也可以说是列出了所有的可读层 |
docker history | 查看某一个image-id下的所有层 | |
docker kill vm1 | 强制干掉容器 | |
docker restart vm1 | 重启容器 |
四.安装docker
搭建环境:
物理机:172.25.3.250
docker环境机:172.25.3.100
-
第一步:将docker的安装包和docker所需要的一些依赖性放在同一个文件夹中并将其发布在http的默认发布页面中。
-
第二步:在需要安装docker的主机中配置相关路径的yum源
-
第三步:直接使用yum 安装docker
yum install docker-ce -y
-
第四步:查看docker的运行
[root@docker ~]# systemctl start docker
[root@docker ~]# docker version
执行后Runtimes: runc这个必须为runc
runC是一个遵循OCI标准的用来运行容器的命令行工具(CLI Tool),它也是一个Runtime的实现。尽管你可能对这个概念很陌生,但实际上,你的电脑上的docker底层可能正在使用它。
[root@docker ~]# docker info
五.利用docker部署game2048,nginx服务并创建一个交互式容器
(1)部署game2048
-
第一步:获取game2048的镜像
-
第二步:导入2048镜像
-
第三步:查看镜像信息
-
第四步:创建容器game1,并运行
-d 打入后台 ;-p 端口映射;- -name 指定容器的名字
[root@docker mnt]# docker run -d -p 80:80 --name game1 game2048
当使用-P(大写P)标记时,Docker会随机映射一个端口到内部容器开放的网络端口(端口范围在Linux系统使用的端口之外,一般都过万)
当使用-p(小写p)可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。 -
第五步:查看容器信息
##列出镜像
[root@docker mnt]# docker images
##查看容器状态
[root@docker mnt]# docker ps
##查看容器状态
[root@docker mnt]# docker ps -a
##查看端口
[root@docker mnt]# netstat -antlupe
##查看容器信息
[root@docker mnt]# docker inspect game1
- 第五步:验证
(2)利用docker搭建一个nginx服务
第一步:导入nginx镜像,并查看镜像
[root@docker mnt]# docker load -i nginx.tar
[root@docker mnt]# docker images
第二步:给nginx镜像重新贴一个标签
[root@docker mnt]# docker history e548f1a579cf
[root@docker mnt]# docker tag nginx:latest nginx:1.13.9
[root@docker mnt]# docker images
第三步:运行nginx镜像
[root@docker mnt]# docker run -d --name v1 -p 8080:80 nginx
第四步:测试
第五步:挂载本机目录到容器里
[root@docker ~]# docker stop vm1
[root@docker ~]# docker rm vm1
[root@docker ~]# docker ps -a
[root@docker ~]# docker run -d -p 8080:80 --name vm2 -v /tmp/docker/:/usr/share/nginx/html/:ro nginx
通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径;也可以指定挂载目录的权限
docker run -d -p 8080:80 --name vm2 -v /tmp/docker/:/usr/share/nginx/html/ nginx
docker run -d -p 8080:80 --name vm2 -v /tmp/docker/:/usr/share/nginx/html/:ro nginx
第六步:测试
(3)利用docker搭建一个交互式容器
第一步:导入镜像并查看镜像
[root@docker mnt]# docker load -i ubuntu.tar
第二步:运行容器,创建一个交互式的容器镜像
[root@docker mnt]# docker run -it --name vm3 ubuntu
-it表示打开交互式docker界面(ubuntu自带,rhel镜像需要在后面再加bash)
第三步:在容器中查看内核版本
root@ea18269d2300:/# uname -r
第四步:在物理机中查看内核版本
[kiosk@foundation3 ~]$ uname -r
由此可以证明,容器是和物理机共用一个内核。
补充:docker交互式界面时
ctrl + pq ##退出容器但不关闭容器
[root@server3 ~]# docker attach vm3 ##可以直接进入容器
ctrl + D ##退出并关闭容器,下次登陆时需要开启
[root@server3 ~]# docker start vm3 ##打开关闭的容器
[root@server3 ~]# docker attach vm3 ##再进入容器
docker rm vm3 删除容器
docker rm -f vm2 强制删除容器
docker rmi ubuntu:vm3 删除镜像