容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P(大写)
或 -p (小写)
参数来指定端口映射。启动容器的时候如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
Docker 的端口映射通过 -p
或 -P
参数实现,命令如下:
docker run --name tomcat1 -d tomcat
docker run --name tomcat2 -d -p 8888:8080 tomcat
如上,就把主机端口 8888 请求映射到 Docker 容器内部端口 8080 了。
-p
和 -P
区别为:
-P : 随机映射一个49000~49900的端口到内部容器开放的网络端口
-p : 可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器
执行完这两条命令后,通过 docker ps
查看:
通过 PORTS
可以看出,tomcat2
是做了端口映射的,tomcat1
是没进行映射过的。
分别通过浏览器访问:
http://*.*.*.*:8080/
// tomcat1默认端口;
http://*.*.*.*:8888/
// 做过端口映射的 Tomcat2,8888 会转发请求到 tomcat2 的 8080。
结果如下:
第一个请求是无法请求到的,原因开篇处说过了。
第二个请求是可以正常进行请求的,会由 tomcat2 容器进行处理
端口映射格式
#指定ip、指定主机port、指定容器port
#ip:hostport:containerport
docker run --name tomcat -d -p 127.0.0.1:8080:8080 tomcat
#指定映射使用一个特定地址,比如 localhost地址 127.0.0.1
#指定ip、未指定主机port、指定容器port
#ip::containerport
docker run --name tomcat -d -p 127.0.0.1::8080 tomcat
#绑定 localhost 的任意端口到容器的 8080 端口,本地主机会自动分配一个端口,还可以使用 udp 标记来指定 udp 端口
docker run --name tomcat -d -p 127.0.0.1:8080:8080/udp tomcat
#未指定ip port、指定主机port、指定容器port
#hostport:containerport
docker run --name tomcat -d -p 8080:8080 tomcat
#将本地的 8080 端口映射到容器的 8080 端口,默认会绑定本地所有接口上的所有地址
查看端口映射
可以通过如下命令查看容器映射了哪些端口及协议:
docker port container-id
示例:
[root@iZwz9inovbad1hkjy16akvZ tmp]#docker port 1596abf8d8a3
8080/tcp -> 0.0.0.0:8888
8080/tcp -> :::8888
[root@iZwz9inovbad1hkjy16akvZ tmp]#docker port 67751753d5da
如果返回空,则代表没进行端口映射。
小结
-
容器有自己的内部网络和 ip 地址,可以使用
docker inspect container-id
可以获取所有的变量 -
Docker 还可以有一个可变的网络配置
-
-p 标记可以多次使用来绑定多个端口 eg.
docker run --name tomcat -d -p 8080:8080 -p 3000:80 tomcat
查看容器
可通过如下命令,查看运行中的容器列表:
docker ps
-
CONTAINER ID
:启动时生成的容器 ID; -
IMAGE
:该容器使用的镜像; -
COMMAND
:容器启动时执行的命令; -
CREATED
:容器创建时间; -
STATUS
:当前容器状态; -
PORTS
:当前容器所使用的端口号; -
NAMES
:启动时给容器设置的名称。
另,docker ps -参数
含义:
-a
:查看所有容器,包括已停止运行的;
-q
:静默模式,只显示容器编号;
-l
:显示最近创建的容器;
-n 3
:显示最近创建的 num(此处为 3)个容器;
--no-trunc
:不截断输出,显示完整信息。
停止容器
通过以下命令来停止运行中的容器:
docker stop container-name/container-id
强制停止容器(类似强制关机):
docker kill container-name/container-id
启动容器
通过以下命令启动容器:
docker start container-name/container-id
docker run和docker start的区别:
1.docker run
docker run只有在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器的时候,只需要使用命令docker start就可以。
docker run相当于执行了两步操作:将镜像(Image)放到容器(Container)中,这一步过程叫做docker create,然后将容器启动,使之变成运行时容器(docker start)。
2.docker start
docker start的作用是:重新启动已经存在的容器。也就是说,如果使用这个命令,我们必须先要知道这个容器的ID、或者这个容器的名字,我们可以使用docker ps命令找到这个容器的信息。
重启容器
通过以下命令启动容器:
docker restart container-name/container-id
删除容器
删除单个容器:
docker rm container-id
删除多个容器:
docker rm container-id container-id
删除所有容器:
docker rm $(docker ps -a -q )
另,docker rm -参数
含义:
-f
:强制删除,如果在运行中,先停止,再删除
查看容器日志
查看当前容器日志,可通过如下命令:
docker logs container-id/container-name
另,docker logs -参数
含义:
-
-t
:加入时间戳; -
-f
:跟随最新的日志打印; -
-n
:显示最后多少条。
连接到正在运行容器
docker attach container-id
:连接到正在运行的容器;
要attach
上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen
命令的attach
类似)。
官方文档中说 attach
后可以通过 CTRL-C
来 detach
,但实际上经过我的测试,如果 container 当前在运行 bash
,CTRL-C
自然是当前行的输入,没有退出;如果 container 当前正在前台运行进程,如输出 nginx
的 access.log
日志,CTRL-C
不仅会导致退出容器,而且还 stop
了。
这不是我们想要的,detach
的意思按理应该是脱离容器终端,但容器依然运行。好在 attach
是可以带上 --sig-proxy=false
来确保 CTRL-D
或 CTRL-C
不会关闭容器。
docker attach --sig-proxy=false 7f237caad43b
在运行的容器中执行命令
运行中的容器其实是一个功能完备的简易版 Linux 操作系统,所以我们可以像常规系统一样进行登陆及退出操作。
命令为:
docker exec -it container-id/container-name bash
退出命令为:
exit
exec
和 attach
区别:
-
attach
:直接进入容器启动命令的终端,不会启动新的进程; -
exec
:在容器中打开新的终端,并且可以启动新的进程,可在宿主机中直接执行操作容器的命令,eg.docker exec -it 7f237caad43b ls /tmp
。
查看容器中正在运行进程
可用通过如下命令查看容器中正在运行进程:
docker top container-id/container-top
查看容器内部细节
可用通过如下命令查看容器内部细节,返回为 json:
docker inspect container-id
容器和宿主机互相拷贝文件
宿主机拷贝文件到容器:
docker cp 文件 container-id:目标文件/文件夹
将宿主机tmp文件夹下test.txt文件拷贝到容器7f237caad43b中tmp目录中
docker cp /tmp/test.
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
txt 7f237caad43b:/tmp
从容器拷贝文件到宿主机:
docker cp container-id:目标文件/文件夹 宿主机目标文件/文件夹
将容器7f237caad43b中tmp目录下yum.log拷贝到宿主机/tmp目录下
docker cp 7f237caad43b:/tmp/yum.log /tmp
更多操作命令
更多命令可以参考:https://docs.docker.com/engine/reference/commandline/docker/
以下是 Docker 的一些常用命令,通过 docker --help
就可以查看,只是将其翻译成中文而已:
| 命令 | 英文 | 中文 |
| :-- | :-- | :-- |
| attach | Attach to a running container | 当前 shell 下 attach 连接指定运行镜像 |
| build | Build an image from a Dockerfile | 通过 Dockerfile 定制镜像 |
| commit | Create a new image from a container changes | 提交当前容器为新的镜像 |
| cp | Copy files/folders from the containers filesystem to the host path | 从容器中拷贝指定文件或者目录到宿主机中 |
| create | Create a new container | 创建一个新的容器,同 run,但不启动容器 |
| diff | Inspect changes on a container’s filesystem | 查看 docker 容器变化 |
| events | Get real time events from the server | 从 docker 服务获取容器实时事件 |
| exec | Run a command in an existing container | 在已存在的容器上运行命令 |
| export | Stream the contents of a container as a tar archive | 导出容器的内容流作为一个 tar 归档文件[对应 import] |
| history | Show the history of an image | 展示一个镜像形成历史 |
| images | List images | 列出系统当前镜像 |
| import | Create a new filesystem image from the contents of a tarball | 从 tar 包中的内容创建一个新的文件系统映像[对应 export] |
| info | Display system-wide information | 显示系统相关信息 |
| inspect | Return low-level information on a container | 查看容器详细信息 |
| kill | Kill a running container | kill 指定 docker 容器 |
| load | Load an image from a tar archive | 从一个 tar 包中加载一个镜像[对应 save] |
| login | Register or Login to the docker registry server | 注册或者登陆一个 docker 源服务器 |
| logout | Log out from a Docker registry server | 从当前 Docker registry 退出 |
| logs | Fetch the logs of a container | 输出当前容器日志信息 |
| port | Lookup the public-facing port which is NAT-ed to PRIVATE_PORT | 查看映射端口对应的容器内部源端口 |