服务器配置教案 Help

9-3 Docker2

=== 上一节安装了Docker,学习了基本命令pull拉取镜像、run运行hello-world容器,这节继续学习docker run运行容器命令相关的参数。

准备nginx镜像

  1. 安装docker和启动服务参考上一节。

  2. (跳过)在线拉取nginx镜像 docker pull nginx

  3. 从离线包加载镜像。老师分发离线镜像文件nginx.tar,宿主机复制,虚拟机粘贴。然后

    docker load -i /root/hello-world.tar
  4. (可选)确认镜像已导入

    docker image list
  5. 运行默认的不加参数的nginx容器

    docker run nginx
  6. 火狐浏览器访问127.0.0.1:80
    发现不能访问。因为容器内nginx运行在本地80端口,只能进入容器内,用命令行浏览器curl 127.0.0.1:80才能访问到。

端口映射

建立映射宿主机8080端口➡️容器80端口,这样在宿主机浏览器访问127.0.0.1:80时,会访问到容器中的80端口,从而访问到网页。
语法为docker run -p <宿主机端口>:<容器端口> <镜像名>

  1. 停止刚才运行的容器。 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)
  2. 运行容器,包含几个新参数。

    • --name: 注意两个-,容器名称默认会取随机英文单词,取一个更有意义的名字,后面一些命令就不用根据容器ID操作了。

    • -p: port端口映射,宿主机8080➡️虚拟机80。当然也可以80:80这里为了区分起成不一样的。

    • -d: 后台运行,不然这个监听程序会直接启动到当前终端影响输入其它命令。在开发调试参数阶段,不加-d更方便。

    docker run --name -p 8080:80 -d nginx
  3. 火狐浏览器测试访问

    9 3

(课外)Docker自带的桥接网卡:
Windows宿主机上有CentOS虚拟机,CentOS中的docker容器又是一个linux系统,已经发生了虚拟化嵌套。 Docker也包含桥接网卡、NAT网卡,会自动分配给容器桥接网卡,宿主机和docker容器都在同一网段内,访问宿主机ip即会访问至容器,接下来只要进行端口映射把容器中的服务暴露出来。

磁盘映射

想用Nginx反向代理自己开发的网站,但是镜像已经封装好,进入镜像修改是件麻烦的事,与虚拟机不同,Docker采用另一种思路来解决。
Nginx镜像已经封装好保持独立,开发好的网站在宿主机开发机上,那么只要建立目录映射开发机本地/root/myHtmlSite ➡️容器/usr/share/nginx/html/myHtmlSite ,主要场景为映射开发机代码到容器和映射容器日志到开发机器。

  1. 开发机上准备简易网页

    echo "<html>my site</html>" | tee index.html
  2. 修改简易网页的权限。
    因为nginx容器配置文件中的默认进程运行用户为nginx(为了安全因素的良好设计,但会对初学者造成麻烦),开发机创建的简易网页权限为root,造成浏览器测试时403错误。

    1. chown nginx:nginx index.html 2. (可选) chmod 755 index.html
  3. 运行容器

    • -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形如0301bd41955310922880d160c62bfe5688f9dc00fe8813652427c7074759c4fcdocker ps查看已启动的容器。

    9 3

其它常用命令

  1. 进入容器
    exec命令表示执行容器内命令,bash开启容器内的终端,-it把容器内的终端暴露给开发机。容器内exit推出。

    docker exec -it container-id bash

    docker attach container-id
  2. 查看容器控制台日志 docker logs -f

  3. 检查容器详细信息 inspect

  4. 提交镜像,略,先学git,大学期间不涉及。

  5. 建立私有仓库,略,大学期间不涉及。

课外

学会docker后,能一行命令搭建别人封装好的复杂应用,可以从网上找一些。

  • dos老游戏模拟器

  • NodeBB论坛 后续发展路径,有兴趣可以自学,Docker compose,Kubernate。

(个人笔记)从家到学校,虚拟机NAT模式下,连入学校网络但无上网权限,会导致虚拟机内的网络不正常,vmware切换网卡、虚拟机重启网卡、重启docker。

Last modified: 25 十一月 2024