docker是什么?

dockerdajianxuniji_dockerdajianxuniji

docker是一个能帮助广大程(dan)序(shen)猿(gou)脱离“各种配置环境”苦海的工具。

同时能最大化利用服务器(电脑)的资源,性能比虚拟机好很多很多。

一个实际开发场景:

项目中需要使用两种数据库redis与mongo,我们可使用docker来加快开发进度,一条命令就能搭建好redis、mongo服务器。

从此再也不再需要像以前那样先在服务器上安装各种依赖,美滋滋。

dockerdajianxuniji_qt使用mysql_02

本文主要讲解docker实际应用场景、相关命令、以及排查问题的思路,并未涵盖docker的方方面面。望不吝赐教。

正文

docker run --name xx-nginx -itd --restart always -p 9000:80 -v /root/test/qt-nginx/dist:/usr/share/nginx/html nginx




该命令的功能是启动一个nginx服务器。我们来把命令拆解一下。

docker run:顾名思义,启动一个docker容器。不要纠结容器是什么,它就是一段有着一定计算机资源的程序而已,不高级。

--name:为这个容器取一个名字,起到标识作用,也方便我们查找。

-p:端口映射,连接服务器的9000端口与容器的80端口,这样就能够通过网络直接访问容器了。

--restart always:这个配置选项能够在容器在意外崩溃后再次启动起来,用来防止周末被老板叫回去加班,建议加上。

-v:路径挂载。将容器外部的路径与容器内部的路径给“连接”在一起。

从此这两个被绑定在一起的路径就是亲兄弟了,一起吃肉,一起喝酒,所有文件都共享。

若原路径不存在则会被docker自动创建。

这个功能极大的方便的服务器与docker容器之间的文件传输。

开发人员直接将文件甩到nginx路径下,在容器中的html路径下就也能访问到这些文件了。实际效果如下:



dockerdajianxuniji_docker使用_03


服务器上的文件

dockerdajianxuniji_docker使用_04

docker容器内的文件

可以看见,路径下的文件是一样的。这样当容器内的文件需要更新时就不在需要很麻烦的操作了。

例如前端代码更新后直接把文件放到dist路径下就可以直接更新页面了。

dockerdajianxuniji_docker使用_05

nginx:这是需要使用的镜像名字,根据需要更改成对应的镜像名。

当我们需要搭建tomcat服务器时就把nginx改成tomcat即可。

若本地没有所需要的镜像,docker 会帮助我们自动拉取最新版镜像,嘿嘿。

常用docker命令

查看所有正在运行的docker容器

docker ps


通过该命令我们能够查看到各个容器的ID、名字、端口映射等信息。

dockerdajianxuniji_dockerdajianxuniji_06

如果需要查看所有容器,不管是否正在运行,则加上-a即可:

docker ps -a


dockerdajianxuniji_dockerdajianxuniji_07

可以看到,即使是已经退出的容器该命令也将其相关信息展示了出来。

该命令可以用于在服务不可用(比如访问网站却发现是404)时排查问题。

首先第一步排查是不是容器崩溃的原因。如果是的话先把容器重启再去查找具体的问题,保证服务能及时重新上线。

重启容器

给可爱的容器再一次活着的机会,感受世间的温暖,嘿嘿。

docker restart 容器ID(或者容器名字)


查看容器配置信息

该命令能够很详细的展示容器的配置信息,与grep搭配可以很方便的查看对应信息。

docker inspect 容器ID(或者容器名字)


当我们忘了一个容器的挂载路径时,可以使用如下命令查看:

docker inspect container_id | grep Mounts -A 20


dockerdajianxuniji_dockerdajianxuniji_08

进入容器

在执行这条命令后,我们就相当于连接到了容器内部,可以输入我们希望在容器内执行的命令,直接操纵容器。

docker exec -it ID(Name)/bin/bash


当我们希望直接在redis服务器上查看有哪些键时,则可以使用该命令:

dockerdajianxuniji_docker使用_09

另一个使用场景是直接进入tomcat容器内查看后端运行日志。

dockerdajianxuniji_docker增加端口映射_10

若需要使用vim打开日志文件,则需要先安装vim,安装过程会非常缓慢,耐心等待下。

apt-get update //更新源apt-get install vim


拷贝文件

容器与服务器之间的文件拷贝

#docker cp ~/test/spring-test.war c0587e081ebf:/usr/local/tomcat/webapps docker cp 源路径下的文件 容器ID:目标路径


当我们忘了路径挂载时就可以直接使用这条命令来拷贝文件到容器内,或者从容器内拷贝到服务器上。

常用镜像

这部分是我日常项目中的经验总结,各位可以参考一下,这样就不用再去百度啦。

1.nginx:主要是路径挂载与端口映射,nginx监听的是80端口。

docker run --name xx-nginx -itd -p  xxxx:80 --restart always -v /root/test/xx-nginx/dist:/usr/share/nginx/html nginx


nginx需要修改代理配置文件,该文件的路径为:etc/nginx/conf.d/default.conf。增加如下配置,复制粘贴时注意一下缩进:

location /api {         #proxy_pass  http://121.40.111.111:28089/bigdata;        proxy_pass  http://IP地址:端口号/后端war名; }


dockerdajianxuniji_dockerdajianxuniji_11

然后wq保存退出。不放心的话重启一下nginx容器即可。

2.tomcat:主要也是路径挂载,监听的端口是8080。xx-tomcat可以根据项目需要替换成对应的名字,如:web-tomcat。

docker run --name xx-tomcat --restart always -p xxxx:8080 -v /root/test/xx-tomcat:/usr/local/tomcat/webapps tomcat


tomcat不需要其他配置,使用IDEA打包好war包,然后将这个war放到xx-tomcat路径下即可。

tomcat容器会自动发现文件更新并解压运行的。

3.mysql:监听端口为3306,-e 用来设置mysql root用户的账号。

docker run --name xx-mysql --restart always -e MYSQL_ROOT_PASSWORD=123456 -p xx:3306 mysql

4.redis:监听端口为6379

docker run --name xx-redis --restart always -p xx:6379 redis

5.mongodb:监听端口为27017

docker run --name xx-mongo --restart always -p xx:27017 mongo

到目前为止,web应用开发的各个组件基本够用了。