docker的简单理解及操作

可以理解docker为一个简单的虚拟机

把一个应用程序在在独立的环境中运行

简单举一个例子 通过docker中的ubentu环境输出一个hello docker

docker run ubuntu echo hello docker

如果报错Unable to find image 'ubuntu:latest' locally说明本地没有ubuntu 

在科学上网下 docker会自动下载镜像库中存在的内容 注意打字内容正确否则下载不到内容

我们可以先查看本地都有什么images 命令如下

docker images

使用如下命令通过-p将docker中的80端口映射到本机的8080端口 -d允许程序直接返回到命令行

docker run -p 8080:80 -d daocloud.io/nginx

返回值为nginx的ID值

并且可以通过浏览器查看8080端口

显示当前运行程序

docker ps

显示程序运行历史

docker ps -a

 通过

docker rm ID ID

可以删除指定程序启动记录

可以通过下方拷贝命令 将docker中的index.html替换 路径是docker默认路径 id为指定程序id

docker cp index.html ID://usr/share/nginx/html

通过stop停止程序运行 

docker stop ID

docker中的替换都是暂时的 当程序停止后再进行启动 之前的操作无效

不过可以通过

docker commit -m 'fun' ID name

将当前修改的内容进行保存 注意保存后是重新开启了一个程序 此时两个程序并存

将无用的程序删掉

docker rmi ID
docker pull       //获取image
docker build      //创建image
docker images     //列出image
docker run        //运行容器
docker ps         //列出容器
docker rm         //删除容器
docker rmi        //删除image
docker cp         //在host和容器直接复制文件
docker commit     //保存改动为新的image

docker还可以编写简单的文件自创docker镜像

touch Dockerfile//Dockerfile为约定成俗的名字 可以为其他名字但不建议
vim Dockerfile//编写Dockerfile
FROM alpine:latest //alpine为docker特有的linux环境 占用空间极小 latest为TAG名
MAINTAINER xbf     //作者
CMD echo "Hello Docker!"
docker build -t hello_docker .    
//-t是给images一个标签 hello_docker是标签名 .代表当前目录下所有内容
docker images //查看是否生成images
docker run hello_docker//运行images

成功打印内容

复杂一点的dockerdocker镜像

FROM ubuntu
MAINTAINER xbf //作者
RUN sed -i 's/archive.ubuntu.com/mirros.ustc.edu.cn/g' /etc/apt/sources.list
//加速下载 指定站点下载到指定路径
RUN apt-get update //更新ubuntu的库
RUN apt-get install -y nginx //安装nginx的命令 -y不需要提示我
COPY index.html /var/www/html    //拷贝一个自己准备的html文件到容器指定路径ps:不同版本的ubentu路径不同
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"] 
//定义容器入点 []内是三个字符串组成的数组 最后会被展开 用空格隔开 让他用命令行来执行 作用是让它作为前台来执行而不是守护进程执行
EXPOSE 80 //暴露端口 普通的监听端口

由于上方容器会调用一个我们自己设置的html文件 所有我们做一个简单的html文件

touch index.html //里面内容随便输入个 docker学习中

接下来构建即可

docker build -t xbf/hello-nginx .

随后运行

docker run -d -p 80:80 xbf/hello-nginx //映射80端口

通过命令行打印端口内容

curl http://localhost //缺省是80端口
FROM     //指定基础项目 从哪里开始
RUN      //会在容器内执行命令
ADD      //添加文件 可以将远程的文件添加到容器
COPY     //拷贝文件 复制文件到容器
CMD      //执行命令
EXPOSE   //暴露端口
WORKDIR  //指定路径
MAINTAINER   //维护者
ENV      //设定环境变量
ENTRYPOINT   //容器入口
USER     //指定用户
VOLUME   mount point

docker中的镜像是分层的 每一行一层 在成为容器之前只是可读的(RO)成为容器后会可写可读(RW)

这样做的母的是当有两个文件具有相同行数的行数时可以使用共同一行 减少存储空间

Volume提供独立于容器之外的持久化存储

docker run -d --name nginx -v /usr/share/nginx/html nginx //让nginx访问容器内指定路径内容
docker inspect nginx //将容器的所有信息打印出

通过Mounts下方可以看的主机路径Source挂载到了容器内部Destination路径

我们可以通过ls 查看主机路径内容 不过mac系统还有一层虚拟层

mac系统需要先进入到docker虚拟层

直接启动docker的命令行cd到路径

进入到路径后可以看的nginx容器的两个缺省文件.html

当我们修改html文件后 容器调用的内容也是改变的

docker exec -it nginx /bin/bash //进入到容器内部
cd /usr/share/nginx/html/     //进入到容器内部的路径
cat index.html    //内容就是主机上修改的内容  已从主机映射到容器

将主机文件挂载到容器

docker run -p 80:80 -d -v $PWD/html:/usr/share/nginx/html nginx //:之前是代表当前目录下的html :之后代表的是容器路径目录

程序已经在容器内容运行

通过

docker curl http://localhost 

可以看的容器内部输出的内容就是主机的内容

由此可以想到 当需要频繁修改并且永久保存的内容可以在主机上保存 之后挂载到容器中

创建一个专门用来挂载的仅有容器

docker create -v $PWD/data:/var/mydata --name data_container ubuntu //ubuntu为基础环境

之后创建一个新的容器 将专门用来挂载数据的容器加载到新的容器

docker run -it --volume-from data_container ubuntu /bin/bash  //将data_container挂载到/bin/bash下

通过观察可以看到data_container被挂载到/bin/bash

通过仅有容器可以让多个容器共享一个仅有容器

常见docker术语

host           //宿主机
image          //镜像
container      //容器
registry       //仓库
daemon         //守护进程
client         //客户端

关于镜像仓库

docker search whalesay    //查找镜像
docker pull whalesay      //下载镜像
docker push myname/whales //上传镜像到仓库
//上传镜像时需要先登录到dockerhub
docker login //登录

docker官方仓库是dockerhub dockerhub是国外的服务器 国内你懂得

国内也有一些仓库

daocloud

时速云

aliyun

docker tag docker/whalesay xbf/whalesay //拷贝一个新的容器 双方tag相同

多容器app

docker-compose

mac/Windows 自带compose

linux需要自行安装

当配置完多层架构文件docker-compose.yml

运行多层架构

docker-compose up -d //运行当前目录下的yml
docker-compose stop //停止运行的程序
docker-compose rm //删掉没有用的容器

docker-compose.yml 命令集

build        //本地创建镜像
command      //覆盖缺省命令
depends_on   //连接容器
ports        //暴露端口
volumes      //卷
image        //pull镜像
up           //启动服务
stop         //停止服务
rm           //删除服务中的各个容器
logs         //观察各个容器的日志
ps           //列出服务相关的容器
down         //删除之前网络!!!

有时候做练习的时候会生成大量的容器,一个一个停用然后删除实在太没有效率了。 
1、停用全部运行中的容器:

docker stop $(docker ps -q)
1
2、删除全部容器:

docker rm $(docker ps -aq)
1
3、一条命令实现停用并删除容器:

docker stop $(docker ps -q) & docker rm $(docker ps -aq)

猜你喜欢

转载自blog.csdn.net/weixin_42654444/article/details/83050576