docker是什么?
docker目前最为火热的一种虚拟技术。和传统的虚拟技术有所不同,docker存在一个容器和镜像的概念。镜像类似于images,可以用来启动容器,容器里面可以做我们想做的操作。而容器也可以保存为新的镜像。容器之间独立运作且docker不必为每个虚拟机单独安装依赖,docker和宿主机端口映射用的是itables的方法。
docker的特点
- 自下而上,基础设施(pc),操作系统,docker守护进程,依赖和应用
- 不依赖于从操作系统,撇去了臃肿的从操作系统,他的启动可以说是毫秒级的
- 多用于单例任务,如前后端分离,数据库独立,启三个docker程序来协同工作
安装
先看看nameserver有没有8.8.8.8 若没有需添加
1 | vim /etc/resolv.conf 添加 nameserver 8.8.8.8 |
更新组件
1 | yum update |
添加docker下载源
1 | sudo tee /etc/yum.repos.d/docker.repo <<-'EOF' |
使用yum安装docker
1 | yum install docker-engine |
若下载较慢,可以尝试163的镜像源
1 | cd /etc/yum.repos.d |
下载镜像,启动容器
启动docker
1 | service docker start |
下载第一个镜像
1 | docker pull hello-world |
下载完成后查看本地镜像
1 | docker images |
建立私有库
准备工作
server端,用作仓库所在地址。地址:192.168.10.1
client端,用作docker客户端。地址:192.168.10.2
开始操作
1.在两台机器分别安装好docker并启动
按照上述操作。
2.在server端拉取仓库镜像
1 | docker pull registry:2 |
3.在client配置到server的hosts,稍后会用到
1 | vim /etc/hosts |
4.两台服务器都同步下时间,防止ssl证书过期
1 | ntpdate cn.pool.ntp.org |
5.证书制作
1 | mkdir -p ~/certs |
在server端生成证书
拷贝一份crt到client端
1 | scp ~/certs/myregistry.com.crt root@myregistry.com:/etc/docker/certs.d/myregistry.com/ |
如果没有scp命令的话执行: yum install openssh-clients -y 来安装,两台服务器都安装
启动仓库镜像
在server端执行启动命令
1 | docker run -d -p 443:5000 --name myregistry --restart=always |
解释下
- -v ,挂载命令,-v 基本格式 宿主机路径:docker容器内部路径,这里挂了两个,一个是存放镜像,一个是访问ssl证书(certs)
- -e 额外的指令
- -d 表示守护模式,不在显示器打印日志
- -p 映射端口,基本格式 宿主机ip:容器ip
- –name 给容器起的别名
- –restart=always 表示挂掉总是自动重启容器
- 命令最后的registry:2表示以哪个镜像来启动容器,对应docker images中的REPOSITORY字段的值
上传镜像到私有库
在client给之前pull的hello-world打一个tag标记下,用于上传
1 | docker tag myregistry.com/hello-world hello-world |
查看下本地镜像,看看有没有标记上
1 | docker images|grep myregistry.com/hello-world |
push到私有registry
1 | docker push myregistry.com/hello-world |
成功push会得到下面一段话
1 | The push refers to a repository [myregistry.com/hello-world] |
删除client上的myregistry.com/hello-world,然后从私有registry上pull
1 | docker rmi xxx # xxx为myregistry.com/hello-world的imageid |
查看myregistry.com/hello-world是否从镜像里删除
1 | docker images |
从私有myregistry拉取
1 | docker pull myregistry.com/hello-world |
再次查看镜像里myregistry.com/hello-world是否pull了下来
1 | docker images |
加上login操作
上述操作直接进行,未加认证,可以加上用户名密码认证。
在server端进行如下操作:
1 | mkdir -p ~/auth |
启动参数加上四行:
1 | -v ~/auth:/auth |
client在进行push操作的时候需要login
1 | docker login myregistry.com |
docker常用命令简析
docker images
查看正在运行的容器 - -a 表示所有容器 - -l 最近一次启动的container - -q 最近一次运行的container ID1
2
3
4
5
6
7
8
查看镜像
- -a所有包含历史
- --tree显示镜像的所有层(layer)
- ```
docker psdocker pull centos:lastest
- -i 以“交互模式”运行容器 -d 表示守护模式,信息不输出到桌面 - -t 表示启动后进入其命令行 - -v 表示挂载本地目录到容器知道位置 -v localpath:containerpath - -p 18080:8080 表示宿主机与容器的映射端口,容器的内部的8080映射到宿主机的18080,宿主机的18080端口向外界暴露 - /xxx/xxx.sh 写在最后表示容器启动后执行的指令 - --name containedname 给启动的容器命名1
2
3
4
5
- 格式 containername:版本号, 不加版本号直接写containername则默认是最新版本(lastest)
- ```
docker run imagename:versiondocker push containername
上传镜像docker search centos
仓库里搜索带centos名字的公共镜像docker rm containerid
- --since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志 - -f : 查看实时日志 - -t : 查看日志产生的日期 - -tail=10 : 查看最后的10条日志。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
删除容器(如果已启动需先stop)
- docker rm `docker ps -a -q` 删除所有的container
- docker ps -a -q | xargs docker rm 删除所有的container
- `docker rmi imageid` 删除镜像
- `docker start/restart/stop container` 开启/停止/重启container
- `docker exec -it 进入容器
- `docker attach containerid/containername` 进入正在运行的容器
- ```
docker logs -f -t --since="2017-05-31" --tail=10 containeriddocker commit containerid(容器名也行) node:node1(为新的镜像名)