最近项目中应用到了Docker这项技术,在此记录一下。
Docker能做什么?
有了需求才会驱动我们去学习一门新的技术,那么Docekr能做什么呢?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
这里与虚拟机技术做一个比较:
- 传统虚拟机,虚拟出一整个硬件,一个虚拟机运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机中,这里需要注意容器没有自己的内核,也没有虚拟硬件,因此轻便许多!
- 每个容器间相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。这里让我感觉这地方的概念跟Anaconda中的虚拟环境挺像
基本概念
镜像(image)
镜像可以理解为一个模板,我们可以通过这个模板来创建容器服务,通过一个镜像可以创建多个容器(镜像类似一个类,而容器可以看作是这个镜像创建出来的实例对象)
容器(container)
Docker利用容器就可以独立运行一个或者一组应用。
仓库(repository)
仓库就是存放镜像的地方,这里例举几个:
Docker Hub:https://hub.docker.com/
阿里云:https://cr.console.aliyun.com
中科大:https://github.com/ustclug/mirrorrequest
常用命令
详细命令可以去查官方文档:https://docs.docker.com/reference/
这里只列举部分常用的
镜像命令
docker images 查看所有本地主机上的镜像
用法:docker images [OPTIONS] [REPOSITORY[:TAG]]
docker search 搜索镜像
用法:docker search [OPTIONS] TERM
docker pull 下载镜像
用法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker rmi 删除镜像
用法:docker rmi [OPTIONS] IMAGE [IMAGE…]
容器命令
注意:有了镜像才可以创建容器,这里我们下载一个centos镜像来测试学习。
docker pull centos
新建容器并启动
用法:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
# 参数说明
--name="Name" 容器名字
-d 后台方式运行
-it 交互式运行
-p 指定容器端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
容器端口
-P 随机指定端口
注意:这里有一个常见的坑。在后台启动容器时,如果没有一个前台进程,docker就会自动停止
退出容器
exit # 停止并退出
ctrl+p+q #退出但不停止
列出所有运行的容器
用法:docker ps [OPTIONS]
删除容器
用法:docker rm [OPTIONS] CONTAINER [CONTAINER…]
启动和停止容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
commit镜像
这里如果你学习过git的话就很容易理解了,这条命令可以将修改过的现有容器变为一个新的镜像来使用。
实战测试
# 启动一个官方的tomcat
# 发现官方的tomcat中没有webapps应用
# 手动拷贝需要的基本文件后commit,以后就可以使用这个修改过的镜像
容器数据卷
什么是容器数据卷?
首先这里有个需求,就是如果容器删除,容器中的数据就会随之丢失。我们希望数据可以持久化存储在本地!
我们可以运用卷技术,将容器内的目录挂载到本地。
总结起来就是容器的持久化和同步操作,且不同的容器之间也可以进行数据共享!
使用数据卷
方式一
docker run -it -v 主机目录:容器内目录
值得注意的是数据的挂载是双向的,也就是说不管你是在主机中对数据作出修改或是在容器中对数据作出修改,都会立马映射到另一端,也即两端自动同步。
DockerFile
除了上述方式进行挂载外,我们还可以利用DockerFile进行挂载。Dockerfile就是用来构建docker镜像的文件,实质就是一段脚本!
方式二
在编写Dockerfile时将挂载数据卷的操作直接写进去,这里有详细的Dockerfile编写格式,本文这里就不再赘述了。
Dockerfile编写参考资料