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 之后的参数也会追加在后面执行。可以参考这篇文章。

下面来看张图片(注:图片取自这篇博客)

docker 容器共享内存 docker共享主机网络_docker 容器共享内存


示例一:基于 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)容器可以设置白名单