安装在CentOS 7.6 64bit 。系统内核要求在3.10以上。
容器是独立运行的一个或一组应用,及他们的运行环境。
1.查看系统内核
uname -r
2.安装命令
yum -y install docker-io
3.启动命令
service docker start
4.查看版本
docker version
5.查看所有容器
docker ps -a
docker ps 查看运行容器
6.启动容器
docker start [name]
7.停止容器
docker stop [name]
8.删除容器
docker rm [name]
docker rm -f 强制删
9.进入容器
docker exec -it [name] /bin/bash
10.创建镜像
①docker commit -m '例如git注释' -a 'author' 镜像id 镜像命名
docker commit -m 'create image' -a 'Nan' 7b789b19757d my/image:v1
②Dockerfile
使用Dockerfile来创建镜像,使用docker commit 虽然很容易拓展镜像,但不便于团队分享,我们可以使用docker build来创建一个新的镜像,为此首先要创建一个Dockerfile文件,这个文件中包含如何创建镜像的指令。
a.首先新建一个目录和Dockerfile
b.Dockerfile中输入指令,每条指令都创建镜像的一层。层数有限制,不能超过127,否则会报错。
cd docker
mkdir centos
cd centos
touch Dockerfile
vim Dcokerfile
# 注解
FROM centos //FROM 以哪个镜像为基础
MAINTAINER NAN xxxx //维护者信息
RUN yum -qqy install python //RUN 开头的指令会在创建中运行,例如yum安装python。yum需要指定参数,不加-qqy可能会报错
docker build -t='my/centos_with_python:v1.0.1' .
这个.很重要,意味着从当前路径去找Dockerfile文件读取文件,构建镜像
※在build进程在执行操作。它要做的第一件事情就是上传这个Dockerfile内容,因为所有的操作都要依据Dockerfile来进行。然后,Dockerfile中的指令被一条一条的执行。每一步都创建一个新的容器,在容器中执行指令并提交修改(就跟docker commit 一样)。当所有指令完成,返回最终的镜像id。所有中间步骤所产生的容器都被删除和清理。
不能超过127层。
Dockerfile中还可以输入其他的命令,例如可以使用ADD命令复制本地文件到镜像中;用expose命令对外开放端口;用CMD命令描述容器启动后运行的程序。
11.运行镜像
docker run -t -i my/image:v1
参数-t让Docker分配一个伪终端并绑定在容器的标准输入上,-i让容器的标准输入保持打开。-d在后台以守护态运行(daemen)。
使用docker run 命令来启动容器,docker在后台运行的标准操作包括
a.检查本地是否存在指定的镜像,不存在则从公有仓库下载
b.使用镜像创建并启动容器
c.分配一个文件系统,并在只读的镜像层外面挂在一层可读可写层。
d.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
e.从地址池分配一个ip地址给容器
f.执行用户指定的应用程序
g.执行完毕之后容器被终止
后台运行的容器我们怎么进入:
①docker attach 是docker自带的命令。
docker attach 容器名
该命令有时候并不方便,因为它是同步的,如有多个用户attach到一个容器,一个窗口命令阻塞,其他窗口都无法执行。
②nsenter命令:在util-linux包2.23版本后都有包含。nsenter可以访问另一个进程的进程空间。
安装:
wget ...util-linux...
tar 解压
cd
./configure 配置
cp nsenter /user/local/bin
为了连接到容器,需要知道容器的PID,可以使用nsenter获取,如下:
PID=$(docker-pid 容器id)
docker-pid需要自己安装,否则找不到命令
配好之后,获取到PID后,
nsenter --target 3291 --mount --uts --ipc --new --pid进入容器
12.修改镜像标签
docker tag 镜像ID 修改后标签名
13.导入镜像
必须是.tar.gz或tart 文件
cat ubuntu_elm.tar | docker import -my/ubuntu_elm:v1.1.0
14.上传镜像
用户可以通过docker push命令,把自己创建的镜像上传到仓库中共享。
docker push 镜像名
15.保存镜像到本地
docker save -o 保存的镜像的名字 docker中镜像的名字
16.将本地保存的镜像导入到docker
①docker load --input 镜像名
②docker load < 镜像名
17.删除镜像
docker rmi image_id
docker rmi -f image_id 强制删除
18.打印容器日志
docker logs 容器id
19.导出容器
docker export 容器id > 容器名
20.导入容器
cat centos.tar | docker import - my/centos:v1
还可以通过指定一个URL或者目录来导入。
docker import http://..... 镜像名
docker中可以使用docker load来导入镜像,也可以使用docker import 来导入一个容器快照到docker镜像。两者的区别是容器快照将丢失所有的历史记录和元数据信息。而镜像保存完整的记录,因此也更大一些。
Docker公有仓库 Docker Hub
仓库是集中存放镜像的地方。容易混淆的是注册服务器,它是管理仓库的服务器,每个服务器上可以有多个仓库,每个仓库下可以有多个镜像。因此仓库可以被认为是一个具体的目录。
例如,dl.dockerpool.com/centos来说,dl.dockerpool.com是注册服务器地址,centos是一个仓库名字。
Docker官方目前维护着一个公共仓库,我们要是用这个仓库,需要登录https://hub.docker.com网站,注册一个账号
在命令行中输入docker login输入用户名密码完成登录。
成功后,本地用户目录的.docker目录中将保留用户的认证信息。
要推送镜像到Docker Hub,需要先登录账号,然后使用docker push 镜像名 推送镜像
Docker 私有仓库
有时候,在公司内部为了提高分享的速度,需要在公司内部搭建一个本地仓库,供个人使用。
docker官方提供了一个工具docker-registry,我们可以借助这个工具构建私有镜像仓库
a.首先,使用docker search命令查找registry
b.docker pull registry
c.运行registry : docker run -d -p 5000:5000 -v /root/docker/registry:/tmp/registry registry
默认情况下,仓库会创建在容器中的/tmp/registry目录下,通过-v指定将镜像文件存放在本地的目录中。
d.搭建好了私有仓库后,就可以上传、下载、搜索镜像了。
e.查看本机ip地址:ifconfig 。将镜像名字的前缀改成本机ip加端口 192.168.0.150:5000
f.docker push 192.168.0.150:5000/centos将镜像推送到私有仓库。
g.局域网内其他机器可以使用docker pull 镜像名拉取镜像。
# docker创建六个redis节点
docker create --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6379
docker create --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6380
docker create --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6381
docker create --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6382
docker create --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6383
docker create --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6384