1.Docker 网络模式
虚拟机两种联网方式
- 桥接:主机 IP --> (网桥) ==> 同级 IP 【同级网关,可以外访】
- NAT:主机 IP --> (交换机) ==> 下级 IP 【主机网关,只能内访】
- bridge(默认):NAT 模式,容器是子网;主机隔离,容器互通
- 主机访问容器:容器 IP。比如部署应用后,通过 172.17.0.3 访问 redis
- 容器访问主机:外网 ip:port。比如 docker 的 nginx 代理主机 8080 端口,就要写 43.107.136.120:8080
- host:主机容器共网,同一 IP;安全性低
- container:使用其他容器的网路,共享IP和PORT等网络资源
- none:网络关闭
2.Docker 常用命令
- docker search ~:搜索镜像
- docker pull ~:拉取镜像
- docker images:查看已有镜像
- docker rmi ~:删除已有镜像
- docker run ~:启动容器
-
-d
--detach=false 指定容器运行于前台还是后台,默认为false -
--name=""
指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字 -
-p 主机port:容器port
--publish=[] 指定容器暴露的端口 -
-v 主机目录:容器目录
--volume=[] 给容器挂载存储卷,挂载到容器的某个目录 -
-e
--env=[] 指定环境变量,容器中可以使用该环境变量 -
--net="bridge"
容器网络设置 -
--privileged=false
指定容器是否为特权容器,特权容器拥有所有的capabilities
- docker ps -a:查看所有容器
- docker exec -it ~ bash:进入容器
- docker start()/restart()/stop() ~:容器启动/重启/停止
- docker logs -f ~:查看镜像日志
- docker rm ~:删除容器
- docker inspect ~ | grep IPAddress:查看镜像 IP
- docker build -t ~ .:构建镜像(.当前路径)
3.构建 Dockerfile
所有镜像其实都是 Dockerfile,只不过像 mysql、redis 这些人家是已经写好并发布到 DockerHub 了而已。
- FROM:基础镜像,当前新镜像是基于哪个镜像的,若在本地不存在,则会到 DockerHub 上下载
- MAINTAINER:镜像维护者的姓名和邮箱地址
- EXPOSE:当前容器对外暴露的端口
- RUN:容器构建时需要运行的命令
- ADD:将宿主机目录下的文件拷贝进镜像并且 ADD 命令会自动处理 URL 和解压 tar 包
- WORKDIR:指定在创建容器后,终端默认登陆进来的工作目录,以及之后的 CMD 命令都是基于这个目录的
- ENV:用来在构建镜像过程中设置环境变量
- VOLUME:容器数据卷,用于数据保存和持久化工作
- CMD:指定一个容器启动时要运行的命令格式
- shell(常规shell命名): CMD (命令)
- exec(执行脚本):CMD [‘可执行文件’,“参数1”,“参数2”,…]
- DockerFile中可以有多个CMD指令,但只有最后一个生效,可以被docker run之后的参数替换
- ENTEYPOINT 指定一个容器启动时要运行的命令
注:ENTRYPOINT的目地和CMD一样,都是在指定容器启动程序及参数,区别是 ENTRYPOINT 通过把所有的命令追加在一起执行,docker run 之后的参数也会追加在后面执行。可以参考这篇文章。
下面来看张图片(注:图片取自这篇博客)
示例一:基于 CentOS 构建一个带有 Vim 的 CentOS
# 设置 继承容器
FROM centos
# 设置 作者 邮箱
MAINTAINER wcong<1848293548@qq.com>
# 定义变量MYPATH
ENV MYPATH "/usr/local"
# 设置进入容器的初识工作目录
WORKDIR $MYPATH
# 安装 vim
RUN yum install -y vim
# 暴露端口 提示作用
EXPOSE 80
# 打印 测试
CMD echo $MYPATH
CMD echo "this is test ------- success"
CMD /bin/bash
示例二:对 SpringBoot 程序构建一个应用镜像
# 基础环境
FROM openjdk:8-jdk-alpine
# 添加文件
ADD forum-1.0-SNAPSHOT.jar /usr/local/java/forum/app.jar
# 挂载数据目录
VOLUME ["/var/xusm"]
# 暴露
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java","-jar","/usr/local/java/forum/app.jar"]
docker build -t ~ .:构建镜像(.当前路径)
4.Docker 安全
1)连接时直接使用容器 IP、端口,关闭服务器响应端口。比如应用部署后,连接 mysql
jdbc:mysql://172.17.0.2/forum?useUnicode=true&characterEncoding=utf8
这样,我们就可以关闭服务器 3306 端口,redis 同理
2)容器可以设置白名单