Docker相关知识

date
Nov 14, 2019
slug
docker-about
status
Published
tags
开发测试
summary
一种虚拟化方案 操作系统级别的虚拟化 只能运行相同或相似内核的操作系统 依赖于Linux内核特性
type
Post
 

容器

一种虚拟化方案 操作系统级别的虚拟化 只能运行相同或相似内核的操作系统 依赖于Linux内核特性

Docker基本组成

notion image

Docker Image 镜像

容器的基石,一个层叠的文件系统

Docker Container容器

通过镜像启动,就会产生一个可写层,这个可写层就是容器产生的内容。而另外下面的几个文件系统就是之前镜像提供的东西,这两样东西相结合就形成了容器。容器还有一个重要的内容就是写时复制(copy on write)
notion image
notion image

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维护的版本较新,^_^
notion image
notion image
开启守护进程
 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"
notion image
此时我们输入
docker logs 容器ID
会显示容器内的标准输出
notion image
一般的话我们在运行一个交互式的bash的时候
 docker run -i  -t ubuntu /bin/bash
用的是 ctrl+Pctrl+Q键去退出这样就会在后台一直运行
要想回去怎么办?运用附加命令
 docker attach 容器ID或者名字
notion image
我们还可以直接用-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类似,但是可以追加。
 
 
 

© 4me 2021 - 2024