Docker相关知识
date
Nov 14, 2019
slug
docker-about
status
Published
tags
开发测试
summary
一种虚拟化方案 操作系统级别的虚拟化 只能运行相同或相似内核的操作系统 依赖于Linux内核特性
type
Post
容器Docker基本组成Docker Image 镜像Docker Container容器Docker Registry 仓库Docker运用Linux的内核特性Ubantu中安装DockerWindows下的安装Docker使用运行交互式的容器停止容器重新启动停止的容器启动容器(后台模式/守护式容器)查看容器内的进程在容器内执行新的进程停止守护式容器的方法Docker中部署静态网页设置容器的端口映射Nginx部署流程docker save 与 loadDockerfile解析
容器
一种虚拟化方案
操作系统级别的虚拟化
只能运行相同或相似内核的操作系统
依赖于Linux内核特性
Docker基本组成
Docker Image 镜像
容器的基石,一个层叠的文件系统
Docker Container容器
通过镜像启动,就会产生一个可写层,这个可写层就是容器产生的内容。而另外下面的几个文件系统就是之前镜像提供的东西,这两样东西相结合就形成了容器。容器还有一个重要的内容就是写时复制(copy on write)
Docker Registry 仓库
公有 私有 Docker Hub
Docker运用Linux的内核特性
Namespace 命名空间
Control groups(cgroups)控制组 --->用来分配资源
Namespace
对于编程而言,是一种封装=代码的隔离,对于操作系统而言是一种系统资源(进程,网络,文件系统)的隔离
Ubantu中安装Docker
首先还是得检查
1.内核版本
uname -a
2.检查Device Mapper
ls -l /sys/class/misc/device-mapper
下面就是安装了
1.Ubuntu维护的版本
sudo apt-get update
sudo apt-get install docker.io
注意这里是
docker.io
2.Docker维护的版本,推荐安装Docker维护的版本,因为它的版本较新,以前那一种利用脚本安装的好像出了点问题 这部分有点烦人,按照官方文档去实现下载不太行,总是报错,最后就参考了一波下面这个网址的安装方法,终于装好,mmp,这里我用的是Ubuntu16.04 64位版本
http://www.runoob.com/docker/ubuntu-docker-install.html
sudo docker run hello-world
检测一下是否安装好,安装好就会出现一定的回显如果不想一直都要输入sudo,也就是当要以非root用户可以直接运行docker时,需要执行
sudo usermod -aG docker
你的用户名 命令,然后重新登陆,记得要注销
,不然还是会报错对比一下版本确实docker维护的版本较新,^_^
开启守护进程
sudo service docker start
对于Docker服务其他的相关命令
sudo service docker stop
sudo service docker restart
运行第一个容器命令
sudo docker run ubuntu echo 'hello'
如果想要其他版本的Linux的话把中间的Ubuntu改为centos即可,还可以改版本,例如
sudo docker run ubuntu:15.10 echo "Hello world"
Windows下的安装
这是要下载专门的Docker for Windows这个东西上面的网址也有提及到,win10就专门利用的这个东西,但win7 还有 win8 的就用的是docker toolbox,Windows安装很容易出毛病,最典型的是如果你Win10上有虚拟机,开了Docker两者就会不兼容,因为Docker得开启win10自带的Hyper-V虚拟化,跟虚拟机会产生冲突,后续每次启动关闭都得重启,别问我为什么知道。。因为我都试过了。。-_-||
下面的过程我就默认直接是非root用户使用docker了
Docker使用
docker run ubuntu echo 'hello'
在输出hello world之后镜像也就关闭了,无法交互
如果想要交互界面的话,看下面
运行交互式的容器
docker的两个参数
-i -t
,让docker运行的容器实现bash交互
• -t:在新容器内指定一个伪终端或终端。
• -i:允许你对容器内的标准输入 (STDIN) 进行交互
docker run -i -t ubuntu /bin/bash
命令
exit
就可以退出交互式界面了,并且是直接
把容器退出的确认容器是否在运行,可以通过
docker ps [-a] [-l]
查看,没有参数默认查看运行容器的进程-a: all 可查看运行过的容器
-l: latest
停止容器
我们使用
docker stop
命令来停止容器: docker stop 容器ID号
停止之后记得
docker ps
一波查看是否真正关闭自定义容器名字
docker run --name 自定义名 -i -t IMAGE /bin/bash
删除停止的命令
docker rm 容器名
重新启动停止的容器
docker start -i 容器名或ID
-i 参数指的是是否要交互界面
查看某个容器更加详细的信息
docker inspect 容器唯一ID或名字
启动容器(后台模式/守护式容器)
一般用于开启服务,没有会话,长期运行
怎么理解这个东西,看下面
尝试下面的命令,然后docker ps发现该容器仍在后台执行
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
此时我们输入
docker logs 容器ID
会显示容器内的标准输出
一般的话我们在运行一个交互式的bash的时候
docker run -i -t ubuntu /bin/bash
用的是
ctrl+P
和 ctrl+Q
键去退出这样就会在后台一直运行要想回去怎么办?运用附加命令
docker attach 容器ID或者名字
我们还可以直接用-d参数启动docker容器
docker run -d ubuntu [COMMAND][ARG…] 也就是这部分一开头的例子
这里再来详细讲下
docker logs
命令 docker logs [-f][-t][--tail] 容器ID/名字
-f可以理解为是动态追踪
-t是显示时间 还有其他参数可查看官方文档
一般我都是不带参数的。。。
查看容器内的进程
docker top 容器ID/名字
在容器内执行新的进程
docker exec [-d] [-i] [-t] 容器名 [command]
停止守护式容器的方法
1 docker stop 容器ID/名字
2 docker kill 容器ID/名字
区别在于第一种是等待容器内进程结束再关闭,另外一种是直接结束容器
想了解更多使用docker帮助文档
man命令
如
man docker-run
man docker-top
...
Docker中部署静态网页
设置容器的端口映射
docker run [-P][-p]
-P: 对容器所有的端口进行映射
-p: 指定映射哪些容器的端口
下面是几个例子
containerPort 只指定容器的端口,宿主机的端口随机映射
docker run -p 80 -i -t /bin/bash
hostPort:ContainerPort 同时制定宿主机端口以及容器端口
docker run -p 8080:80 -i -t /bin/bash
ip:containerPort 指定ip和容器的端口
docker run -p 0.0.0.0:80 -i -t /bin/bash
ip:hostPort:ContainerPort 同时制定ip以及宿主机端口以及容器端口
docker run -p 0.0.0.0:8080:80 -i -t /bin/bash
Nginx部署流程
先运行一个带端口映射的容器并命名为web
docker run -p 80 --name web -i -t ubuntu /bin/bash
然后安装Nginx
apt-get install -y nginx
安装Vim编辑器 ,主要是为了方便修改东西
apt-get install -y vim
新建一个工作目录
mkdir -p /var/www/html
切换到工作目录下,编辑一个静态页面
cd /var/www/html
vim index.html
自己喜欢写点啥就写啥吧
查找一下Nginx文件的位置
whereis nginx
查看etc下面的Nginx
ls /etc/nginx
进去里面的sites-enabled目录里面,发现一个default文件打开编辑
ls /etc/nginx/sites-enabled
vim default
改变root的值为你的网页目录
root: /var/www/html
开始运行nginx
nginx
ps -ef
查看相关进程是否启动让它继续后台运行
可以用下面几个命令查看端口号
docker ps
docker port 容器ID/名字
docker top 容器ID/名字
然后再curl一波就知道,是否安装成功
curl 127.0.0.1:32770
也可以本机的浏览器里面打开。。
还可以用容器的ip地址去实现在本机浏览器的浏览
docker inspect 容器ID/名字
可以看到容器ip地址和映射端口
“IPAddress”: “172.17.0.2”
“HostPort”: “32768”
访问
curl <http://172.17.0.2>
这就不需要指定端口号了,用默认的80端口就可以访问
停止该容器,然后再次启动
我们需要注意一旦我们关闭并且重新启动的话,docker分配的映射ip以及端口地址都会改变,需要重新查看
镜像标签
TAG
ubuntu:latest
ubuntu:14.04
啥都不写默认
latest
标签删除镜像
docker rmi 镜像名:标签/ID
搜索镜像
docker search
拉取镜像
docker pull 你搜到的镜像名
docker push命令可以将某一个镜像发布到官方网站。
利用DockerFile构建镜像 ,这个东西有时候还是很好用的
docker build -t='自定义名字' DockerFile
docker save 与 load
docker save
用来将一个或多个image打包保存。如:将本地镜像库中的image1和image2打包到images.tar中
docker save -o images.tar image1:v1 image2:v1
docker save
也可以打包container,保存的是容器背后的image.docker load
用于将打包的tar中包含的镜像load到本地镜像库,但不能重命名其中的镜像名。docker load -i images.tar
docker export
打包container文件系统docker export -o thecontainer.tar container_name
使用 docker import 载入,可以为新镜像指定name和tag
docker import thecontainer.tar newimagename:tag
总结一下
docker save
保存的是镜像(image),docker export保存的是容器(container);docker load
用来载入镜像包,必须是一个分层文件系统,必须是是save的包;docker import
用来载入容器包,但两者都会恢复为镜像;docker load
不能对载入的镜像重命名,而docker import
可以为镜像指定新名称。docker export的包会比save的包要小,原因是save的是一个分层的文件系统,export导出的只是一个linux系统的文件目录
Dockerfile解析
每条保留字指令并且后面至少一个参数,而且是从上往下顺序执行,#表示注释
每条指令都会创建新的镜像层,并对镜像进行提交
保留字指令
FROM
基础镜像MAINTAINER
镜像维护者的姓名和邮箱RUN
容器构建时需要运行的命令EXPOSE
当前容器对外暴露的端口号WORKDIR
指定创建容器后,终端默认登录进来的工作目录,一个落脚点ENV
用来在构建镜像过程中设置环境变量ADD
将宿主机目录下的文件拷贝进京向且ADD命令会自动处理URL和解压tar包COPY
类似ADD拷贝文件和目录到镜像中1.COPY src dest 2.COPY ["src","dest"]VOLUME
容器数据卷,用于保存数据CMD
可以有多个命令,但会被docker run之后替换最后一个命令,而且不能追加某个命令的选项ENTRYPOINT
跟CMD类似,但是可以追加。