一、docker是什么
ocker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
可以看成是更精简更轻量化的虚拟机。可以解决环境难配的问题,环境冲突等。
二、docker架构
ocker主要有以下几部分组成:
- Docker Client 客户端
- Docker daemon 守护进程
- Docker Image 镜像
- Docker Container 容器
- Docker Registry 仓库
客户端和守护进程:
Docker是C/S(客户端client-服务器server)架构模式。
docker通过客户端连接守护进程,通过命令向守护进程发出请求,守护进程通过一系列的操作返回结果。
docker客户端可以连接本地或者远程的守护进程。
docker客户端和服务器通过socket或RESTful API进行通信。
Docker是一个C/S架构,在docker中,守护进程就是服务端,docker客户端向守护进程发送请求,可以是本地的也可以是远程的来访问.
我们通过客户端写命令,客户端将命令发送给守护进程,守护进程再将命令执行的结果返回给客户端.这就使我们能通过命令查看执行结果.
镜像、容器、仓库
镜像是容器的模板,容器是镜像的实例,仓库是保存镜像的地方
若想使用docker运行比如说tomcat开发web程序。首先从docker hub或者阿里的仓库拉取tomcat的镜像到本地,然后通过这个镜像创建一个容器,使用容器就能运行tomcat了。
镜像和容器的关系像类和实例的关系。
三、使用
安装教程网上有,安装完了,记得设置阿里云的加速器,把用户加入docker的group里就不用每次输入sudo了。
1、常用命令(待某日总结)
容器和主机之间数据拷贝
docker cp [OPTIONS] 主机文件路径 container_id:容器目录 # 主机文件拷贝到容器
docker cp [OPTIONS] container_id:容器文件路径 主机目录 # 容器文件拷贝到主机
2、docker命令
启动docker systemctl start docker
守护进程重启 sudo systemctl daemon-reload
重启docker服务 systemctl restart docker
重启docker服务 sudo service docker restart
关闭docker service docker stop
关闭docker systemctl stop docker
帮助 docker --help
docker run --help
查询版本 docker --version
查看docker信息 docker info
3、镜像命令
搜索镜像:
docker search name
docker search --filter=stars=3 name
搜索star数大于3的name镜像
拉取镜像:
docker pull name[:tag]
列出本地镜像列表
docker images
docker images -a
包括中间层
docker images -q
列出镜像id,与-a连用
删除镜像
docker rmi iname
删除某个镜像
docker rmi -f iname
强制删除
docker rmi -f $(docker images -qa)
删除所有镜像
更新镜像
docker commit -m="描述信息" -a="作者名字" containerid imagename[:tag]
以自己修改过的容器为基础创建一个新的镜像。
docker commit -m="add something" -a="xxyy" 9b9729bc4b6f xxyy/ubuntu:6.29
不加tag默认就是latest
从dockerfile
创建镜像
docker build
4、容器命令
运行容器
docker run
--name 为容器指定名称
-i 交互模式
-t 为容器分配一个伪输入终端
-d 后台运行容器并返回容器id(即启动守护式容器)
-P 随机端口映射
-p 指定端口映射,格式如下4种
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort(常用)
containerPort
-v 容器容器卷 ## Bind mount a volume
容器与主机数据的共享
--link建立容器之间的连接
--privileged
-it
,--name
交互式模式
docker run -it --name firstubuntu ubuntu
以交互式模式运行容器,并指定名称。默认使用shell是bin/bash
,相当于:docker run -it --name xx ubuntu /bin/bash
-d
守护式容器,后台模式
docker run -d ubuntu
启动守护式容器(没有交互式的终端),也就是后台模式。
docker容器后台运行,必须要有一个前台进程,不然就会退出,上面的命令输入后,容器开启,因为没有前台进程,所以立刻就关闭了。所以需要将运行的程序以前台进程的方式运行。如下:
docker run -d ubuntu ls
docker run -d ubuntu /bin/sh -c "while true;do echo hello;sleep 2;done"
此时容器仍以后台模式启动,但没有交互式界面,容器一直在后台不断执行打印命令。此时容器在后台干了什么可以使用容器日志命令查看。
docker run -d --name=server centos6.8-mysql /usr/bin/mysql_safe -d
这时候我们这个容器的名称为server,同时激活了数据库mysql的后台线程,让它不断的跑,这时候我们的容器也不会被关闭。不指定名称,会给随机的名称
docker run -d --name=server centos6.8-mysql /usr/bin/mysql_safe -d
这时候我们这个容器的名称为server,同时激活了数据库mysql的后台线程,让它不断的跑,这时候我们的容器也不会被关闭。不指定名称,会给随机的名称
-p
-P
端口映射
在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因为没有端口。
docker run -it -p 8888:8080 tomcat
运行tomcat,指定端口为8888,此时打开浏览器输入localhost:8888
即可进入tomcat。此时docker ps会显示端口为0.0.0.0:8888->8080/tcp
,表示宿主机的8888端口映射到了tomcat的8080端口
docker run -it -P tomcat
运行tomcat,随机端口。tomcat的默认端口是8080(默认端口是作者设置的)
docker run -d -p 6666:8080 tomcat
-v
数据容器卷
docker run -it -v 宿主机绝对路径目录:容器内目录 imagename
docker run -it -v /home/xianyi/work/caffe/project1:/project1 caffe
连接宿主机的目录和虚拟机的目录
docker run -it -v /home/xianyi/work/caffe/project1:/project1:ro caffe
只读:是虚拟机只读,不能改,而宿主机是可以修改的。
查询容器
docker ps
默认列出running容器 list running containers
docker ps -a
所有容器 list all containers
docker ps -l
列出最近创建的容器 Show the latest created container (includes all states)
docker ps -q
只列出id
docker ps -n 5
列出最近5个容器
docker ps 界面,依次是
容器id 容器所属镜像 容器启动执行命令 创建时间 状态 端口 名称
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2818b36f0e4d ubuntu "/bin/bash" 19 minutes ago Up 4 seconds(up表示正在启动,4s了) thirsty_wing
退出容器
在容器的交互式界面退出有2种:
1. 停止并退出:在容器交互式的伪终端输入exit
。
2. 不停止退出:ctrl+P+Q
。此时只是暂时离开容器回到宿主机。
进入正在运行的容器并以命令行交互
docker exec
和docker attach
docker attach container
进入正在运行的容器并以命令行交互。
docker exec -it container /bin/bash
-t
表示伪终端命令,-i
表示标准输入,不加这个没法输入,功能同上。
但docker exec
比docker attach
更强大。
docker exec -t container ls -l /tmp
进入容器,执行ls -l /tmp
命令,退出并返回结果到宿主机。
二者的差异是attach
直接进入容器启动命令的终端,不会启动新的进程
exec
是在容器中打开新的终端,并且可以启动新的进程。
启动容器
docker start containers
启动停止的容器
docker start -i containers
以交互式模式启动停止的容器
docker restart container
重启容器:重启,关闭再开启
停止容器
docker stop container
停止正在运行的容器
docker kill container
强制停止运行的容器
删除容器
docker rm containers
删除已停止的容器
docker rm -f containers
强制删除容器
docker rm -f $(docker ps -qa)
删除所有容器
docker ps -qa | xargs docker rm
同上
查看容器日志
docker logs -f -t --tail 3 container
打印日志,带时间戳,跟随最新的3条日志。
-t
加入时间戳,-f
跟随最新的日志打印,--tail
显示最后多少条
查看容器内的进程
top
linux下查看进程
docker top container
查看容器内的进程
查看容器内部细节
dcoker inspect container
从容器拷贝数据到主机上
容器内的数据随着容器的删除就消失了,所以数据需要保存到主机