1 端口号的暴露问题、
参考 https://www.runoob.com/docker/docker-container-connection.html
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P
(大写) 或 -p
(小写) 参数来指定端口映射。
(1)当使用 -P 标记时,Docker 会随机映射一个 49000~49900
的端口到内部容器开放的网络端口。
使用 docker ps
可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。
同样的,可以通过 docker logs
命令来查看应用的信息。
(2)-p(小写)则可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。支持的格式有 hostPort:containerPort
、ip:hostPort:containerPort
、 ip::containerPort
。
-
hostPort:containerPort
(映射所有接口地址)
将本地的 5000 端口映射到容器的 5000 端口,可以执行如下命令:$ sudo docker run -d -p 5000:5000 training/webapp python app.py
此时默认会绑定本地所有接口上的所有地址。 -
ip:hostPort:containerPort
(映射指定地址的指定端口)
指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
-
ip::containerPort
(映射指定地址的任意端口)
绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
还可以使用 udp 标记来指定 udp 端口$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口配置
使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址
注意:
- 容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)
- -p 标记可以多次使用来绑定多个端口
例如
$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
2 自己包导入不了的问题
如在自己(pycharm)的环境中,因为已经确定了根目录环境 import mymodel 中不存在问题,但在docker 中或者命令行中可能就会存在
执行提示ModuleNotFoundError: No module named 'XXX' 问题
大家可以参考
https://www.cnblogs.com/dreamyu/p/7889959.html
ps:注意的是sys.path.append(rootPath)要放在import XXX 之前
3 Docker 删除 none 镜像 命令
自己在docker build 没有成功的时候一定要把失败的镜像删除
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi
ps: 删除的时候步骤是先停止容器 再删除容器 最后可以删除镜像
4 docekr环境中中文编码的问题
https://www.cnblogs.com/z-belief/p/6148463.html
ENV LANG C.UTF-8
在 10.8.80.239服务器上尝试过ENV LANG zh_CN.UTF-8 每次代码会自动乱码,慎用
5 docker exec 的使用-it操作
https://blog.csdn.net/qq_40081976/article/details/84590119
6 docker镜像导出,tar镜像包可以拷贝到其他机器docker环境中加载
docker save SDK_validation-o SDK_validation.tar
docker镜像加载
docker load -i SDK_validation.tar
7 Docker run 命令
Docker run 命令 | 菜鸟教程 (runoob.com)
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-
-d: 后台运行容器,并返回容器ID;
-
-i: 以交互模式运行容器,通常与 -t 同时使用;
-
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-
--name="nginx-lb": 为容器指定一个名称;
-
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
-
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-
-h "mars": 指定容器的hostname;
-
-e username="ritchie": 设置环境变量;
-
--env-file=[]: 从指定文件读入环境变量;
-
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-
-m :设置容器使用内存最大值;
-
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型;</name|id>
-
--link=[]: 添加链接到另一个容器;
-
--expose=[]: 开放一个端口或一组端口;
-
--volume , -v: 绑定一个卷
8 docker 镜像的构建
Docker Dockerfile | 菜鸟教程 (runoob.com)
docker build -t semantic_similarity:v1.0 .
ps:最后的 . 代表本次执行的上下文路径
FROM:定制的镜像都是基于 FROM 的镜像
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:
RUN <命令行命令> # <命令行命令> 等同于,在终端操作的 shell 命令。
exec 格式:
RUN ["可执行文件", "参数1", "参数2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
- ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
- ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。