docker常用命令

Docker学习链接

1.常用命令

image
image

1. docker build

举例

docker build -t hmall .

  • docker build: 这部分指定了您要构建 Docker 镜像的命令。
  • -t hmall: 这部分使用 -t 选项为构建的镜像分配一个标签(tag)。在这里,hmall 是镜像的名称,您可以自行命名。标签通常用来标识镜像的版本或用途。
  • .:这部分表示构建的上下文路径,也就是 Docker 上下文。Docker 构建上下文是一个包含 Dockerfile 和构建过程中需要的文件的目录。. 表示当前目录,通常您会将 Dockerfile 放在此目录中。
  • 总结:执行这个命令将在当前目录中查找名为 Dockerfile 的文件,并根据其中的指令来构建 Docker 镜像。构建完成后,该镜像将被标记为 hmall(您可以自行更改标签名称),并可以使用该标签来运行容器或推送到 Docker 镜像仓库。

2. docker run -... <镜像名>

2.1 docker run -it <image> bash(伙同 docker exec -it mysql bash)

这个命令将以交互模式 (-it) 运行一个基于 <image> 镜像的容器,并在容器内部启动一个交互式的 Bash 终端。不同于docker exec -it mysql bash的是先创建容器再启动终端,而前者只启动终端。

2.2 docker run --name <container_name> <image>

这个命令将以 container_name 作为容器的名称运行一个基于 image 镜像的容器。

2.3 docker run -p <host_port>:<container_port> <image>

这个命令将运行一个基于 image 镜像的容器,并将容器的端口 container_port 映射到主机的端口 host_port。

2.4 docker run -d <image>

这个命令将以守护进程模式(后台运行)运行一个基于 image 镜像的容器。

2.5 docker run -v <host_path>:<container_path> <image>

这个命令将运行一个基于 image 镜像的容器,并将主机上的 host_path 目录挂载到容器内的 container_path 目录。

2.6 docker run --network <network_name> <image>

这个命令将运行一个基于 image 镜像的容器,并指定容器连接到的 Docker 网络为network_name。

实例

对于Nginx容器的创建

docker run -d \
  --name nginx \
  -p 18080:18080 \
  -p 18081:18081 \
  -v /home/docker/nginx/html:/usr/share/nginx/html \
  -v /home/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network hmall \
  nginx

2.网络相关命令

Docker容器运行的时候有 host 、 bridge 、 none 三种网络可供配置。默认是 bridge ,即桥接网络,以桥接模式连接到宿主机; host 是宿主网络,即与宿主机共用网络; none 则表示无网络,容器将无法联网。
image

2.1 查看指定网络的具体信息

docker network inspect hmall(可改为特定网络名称)
image

2.2 查看目前所建立的所有网络

docker network ls
image

3.数据卷相关命令

例子

以Nginx为例,我们知道Nginx中有两个关键的目录:

  • html:放置一些静态资源
  • conf:放置配置文件

如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:
image

数据卷具体原理

image
在上图中:

  • 我们创建了两个数据卷:conf、html
  • Nginx容器内部的conf目录和html目录分别与两个数据卷关联。
  • 而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录

这样以来,容器内的conf和html目录就 与宿主机的conf和html目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。

问题

为什么不让容器目录直接指向宿主机目录呢?

  • 因为直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。
  • 但是容器指向数据卷,一个逻辑名称,而数据卷再指向宿主机目录,就不存在强耦合。如果宿主机目录发生改变,只要改变数据卷与宿主机目录之间的映射关系即可。

后续部署java项目时,Nginx中html和conf挂载情况

然后创建nginx容器并完成两个挂载:

  • 把.../nginx/nginx.conf挂载到/etc/nginx/nginx.conf
  • 把.../nginx/html挂载到/usr/share/nginx/html

由于需要让nginx同时代理hmall-portal和hmall-admin两套前端资源,因此我们需要暴露两个端口:

  • 18080:对应hmall-portal
  • 18081:对应hmall-admin
    命令如下:
docker run -d \
  --name nginx \
  -p 18080:18080 \
  -p 18081:18081 \
  -v /home/docker/nginx/html:/usr/share/nginx/html \
  -v /home/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network hmall \
  nginx
posted @ 2023-11-03 17:48  DawnTraveler  阅读(8)  评论(0编辑  收藏  举报