9-3 Docker2
=== 上一节安装了Docker,学习了基本命令pull拉取镜像、run运行hello-world容器,这节继续学习docker run运行容器命令相关的参数。
准备nginx镜像
安装docker和启动服务参考上一节。
(跳过)在线拉取nginx镜像
docker pull nginx
从离线包加载镜像。老师分发离线镜像文件nginx.tar,宿主机复制,虚拟机粘贴。然后
docker load -i /root/hello-world.tar(可选)确认镜像已导入
docker image list运行默认的不加参数的nginx容器
docker run nginx火狐浏览器访问127.0.0.1:80。
发现不能访问。因为容器内nginx运行在本地80端口,只能进入容器内,用命令行浏览器curl 127.0.0.1:80才能访问到。
端口映射
建立映射宿主机8080端口➡️容器80端口,这样在宿主机浏览器访问127.0.0.1:80时,会访问到容器中的80端口,从而访问到网页。
语法为docker run -p <宿主机端口>:<容器端口> <镜像名>。
停止刚才运行的容器。 nginx容器会持续监听,因此容器运行后一直存在,为了避免端口冲突和容器名冲突,需要手动停止,以免端口占用影响后续实验。
查看docker容器进程ps(process)docker ps返回信息包含容器ID container-id
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3095d4dc6f7a nginx "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp reverent_chaplygin然后根据container-id终止容器,id很长只写前几位就行,-f参数表示不需要先停止容器而可以直接删除。
docker rm -f 3095如果你不确定上面两行命令是否成功,执行下面命令关闭所有容器。
docker stop $(docker ps -q)运行容器,包含几个新参数。
--name: 注意两个-,容器名称默认会取随机英文单词,取一个更有意义的名字,后面一些命令就不用根据容器ID操作了。
-p: port端口映射,宿主机8080➡️虚拟机80。当然也可以80:80这里为了区分起成不一样的。
-d: 后台运行,不然这个监听程序会直接启动到当前终端影响输入其它命令。在开发调试参数阶段,不加-d更方便。
docker run --name -p 8080:80 -d nginx火狐浏览器测试访问
(课外)Docker自带的桥接网卡:
Windows宿主机上有CentOS虚拟机,CentOS中的docker容器又是一个linux系统,已经发生了虚拟化嵌套。 Docker也包含桥接网卡、NAT网卡,会自动分配给容器桥接网卡,宿主机和docker容器都在同一网段内,访问宿主机ip即会访问至容器,接下来只要进行端口映射把容器中的服务暴露出来。
磁盘映射
想用Nginx反向代理自己开发的网站,但是镜像已经封装好,进入镜像修改是件麻烦的事,与虚拟机不同,Docker采用另一种思路来解决。
Nginx镜像已经封装好保持独立,开发好的网站在宿主机开发机上,那么只要建立目录映射开发机本地/root/myHtmlSite ➡️容器/usr/share/nginx/html/myHtmlSite ,主要场景为映射开发机代码到容器和映射容器日志到开发机器。
开发机上准备简易网页
echo "<html>my site</html>" | tee index.html修改简易网页的权限。
因为nginx容器配置文件中的默认进程运行用户为nginx(为了安全因素的良好设计,但会对初学者造成麻烦),开发机创建的简易网页权限为root,造成浏览器测试时403错误。1. chown nginx:nginx index.html 2. (可选) chmod 755 index.html运行容器
-v volume磁盘卷映射,开发机目录:容器目录。
--name,为容器起一个名字。这样子后面重启、删除容器时不需要先ps命令查看又长又难记的id。
-d,后台运行。因为nginx是一个监听程序,将会占据终端前台导致无法继续其它命令操作只能新打开终端窗口,在调试阶段可以不加此参数。
--rm remove,如果同名容器已存在,先删除掉之前的。
(下面两种写法任选其一)
单行命令docker run --rm --name=nginx -p 8080:80 -v /root/index.html:/usr/share/nginx/html/index.html -d nginx单行分割成多行的写法,'\'表示一行命令未结束,当命令特别长时这样写会更清晰。
docker run \ --rm \ --name=nginx \ -p 8080:80 \ -v /root/index.html:/usr/share/nginx/html/index.html \ -d \ nginx成功后返回容器id形如0301bd41955310922880d160c62bfe5688f9dc00fe8813652427c7074759c4fc,
docker ps
查看已启动的容器。
其它常用命令
进入容器
exec命令表示执行容器内命令,bash开启容器内的终端,-it把容器内的终端暴露给开发机。容器内exit推出。docker exec -it container-id bash或
docker attach container-id查看容器控制台日志 docker logs -f
检查容器详细信息 inspect
提交镜像,略,先学git,大学期间不涉及。
建立私有仓库,略,大学期间不涉及。
课外
学会docker后,能一行命令搭建别人封装好的复杂应用,可以从网上找一些。
NodeBB论坛 后续发展路径,有兴趣可以自学,Docker compose,Kubernate。
(个人笔记)从家到学校,虚拟机NAT模式下,连入学校网络但无上网权限,会导致虚拟机内的网络不正常,vmware切换网卡、虚拟机重启网卡、重启docker。