docker常用命令
Docker学习链接
1.常用命令
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 则表示无网络,容器将无法联网。
2.1 查看指定网络的具体信息
docker network inspect hmall(可改为特定网络名称)
2.2 查看目前所建立的所有网络
docker network ls
3.数据卷相关命令
例子
以Nginx为例,我们知道Nginx中有两个关键的目录:
- html:放置一些静态资源
- conf:放置配置文件
如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。
但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:
数据卷具体原理
在上图中:
- 我们创建了两个数据卷: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