docker 你可以理解为非常轻量化而且功能更强大的 virtualbox,虚拟机固然能将一台电脑虚拟为多台,而且也可以实现目录绑定,ip绑定功能,但是端口映射我似乎并没有见到过,相比之下 virtualbox 属于虚拟硬件,你甚至可以在其上安装任意系统,比如 Linux 上运行virtualbox,virtualbox里运行个windows也是可以的。而docker却没这么重,docker你可以理解为是应用程序容器,一个应用一个docker是OK的,而且也是我推荐的做法。
下面,我们进入主题,从docker 安装开始到拉取以及运行镜像到保存docker实例为镜像或者创建自己的镜像,中间穿插docker开机自启等知识。
docker 的安装
docker 的安装非常简单,我使用 Manjaro Linux 所以非常方便,对于使用ubuntu 以及其他系统的用户,可以参考:install docker ce 另外,可以考虑使用 中科大镜像 加速安装以及docker 镜像的拉取。
docker 国内镜像,加速docker 镜像拉取
可以参考 中科大Docker Hub 使用帮助 ,具体是: sudo vim /etc/docker/daemon.json
然后输入:
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"] }
接着:sudo systemctl restart docker
即可。如果感觉不快,还可以使用 http://f1361db2.m.daocloud.io 将 https://docker.mirrors.ustc.edu.cn/ 改为 http://f1361db2.m.daocloud.io 即可。
非 root 运行docker
docker默认是以root身份运行,不加sudo 是无法运行的,这在服务器上是好的,但是普通pc上则有点问题,可通过如下方式解决:
sudo groupadd docker sudo gpasswd -a ${USER} docker
然后重启下电脑即可
docker 搜索镜像
docker search nginx
这里nginx可以换作 mariadb、tomcat等。
docker 拉取镜像并运行
docker run --name nginx -p 80:80 -p 443:443 -v /var/log/nginx:/var/log/nginx -v /etc/letsencrypt:/etc/letsencrypt -itd nginx
这条命令将创建一个名为 nginx 的容器,且本机的443端口和80端口均映射到这个docker的443和80,本机的/etc/letsencrypt和/var/log/nginx/目录也映射到该容器里对应的目录上,-p 和 -v 分别指端口映射和目录映射,且后面的第一个参数是指本机,第二个是指容器,比如 -p 5001:3000是指将本机的5001端口映射到容器的3000端口上,之后在本机执行 curl http://localhost:5001 与在容器里执行 curl http://localhost:3000 没有区别,值得注意的是,你如果在应用程序里没有指定监听的主机,那么可能会有问题,一般应用需要监听在 0.0.0.0 上面,而非默认,否则本机映射的端口无法访问docker容器里面的应用哦。
停止、删除docker 容器与镜像
停止刚刚创建的nginx容器,可以docker stop nginx,删除可以docker rm nginx 你需要先停止再删除。查看已有的容器可以通过 docker ps -a ,或者 docker ps 前者包含没有运行的,后者仅列出运行中的。查看已有镜像可以通过 docker images,删除可以通过 docker rmi nginx,删除容器是 docker rm 而删除镜像是docker rmi,让我们先删除这个nginx容器,然后继续下面的操作。
docker 开机启动服务
docker容器与Linux本身相比是有明显不同的,docker容器命令执行结束就会退出,上面的例子里使用了nginx镜像自己的启动命令,你也可以通过传入自定义的命令来完成类似的目的,比如:
docker run --name nginx -p 80:80 -p 443:443 -v /var/log/nginx:/var/log/nginx -v /etc/letsencrypt:/etc/letsencrypt -itd nginx sh /usr/local/bin/start.sh
这条命令与前面的相比,多了 sh /usr/local/bin/start.sh 你执行完毕,然后执行 docker ps 会发现 nginx没有运行,只有nginx,如果你输入 docker ps -a 会发现 nginx 已经退出了,我们接下来查看这个容器的日志。
查看 docker 容器的运行日志
通过 docker logs -f nginx 我们看到了这样的输出:sh: 0: Can't open /usr/local/bin/start.sh
这里,-f 是指follow的意思,和tail 类似会监听日志并输出,没有-f类似于cat,有了-f类似于tail,那我们创建个 start.sh 并复制到 nginx 容器里面去。
docker 文件复制
先 vim start.sh 然后输入 /bin/bash 然后保存并执行chmod a+x ./start.sh 接着复制
docker cp start.sh nginx:/usr/local/bin/
文件复制和正常的cp 类似,仅仅是前面多了一个docker,而如果要用到docker容器里的文件,你需要指明docker容器名,这和 scp 类似哈,很好理解。
然后,我们执行 docker start nginx,执行完毕再执行 docker ps 会发现nginx 这个容器运行了,现在我们进入这个容器玩玩。
docker 进入容器,docker执行容器命令
进入容器,一般指进入容器的shell,可通过 docker exec -it nginx /bin/bash 进入,有的容器可能没有bash只有sh,那么将/bin/bash 换作/bin/sh 即可。之后,你输入的命令就是在docker 容器里执行了。
由于篇幅所限,我们在下篇继续探讨docker 的使用攻略。详情请查看 docker 进阶实战