Docker
Docker
Docker基本命令
安装
apt-get update
apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
apt-get remove docker docker-engine docker.io containerd runc # 先卸载
apt-get install docker-ce docker-ce-cli containerd.io
# 或
apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
启动
docker run hello-world
查看镜像
docker images
/var/lib/docker # docker默认资源路径
docker inspect 镜像id # docker查看镜像内容
docker进入容器
docker exec -it 容器id # 打开一个新bash
docker attach 容器id # 进入正在执行命令的容器
docker cp 容器id:容器内路径 当前路径
删除容器
docker rm -f $(docker -ps -aq) # 删除所有容器
docker rmi -f $(docker images -aq) # 删除所有镜像
容器数据卷
具象映射
匿名映射
xx映射
-v
DockerFile
DockerFIle:构建文件,定义了步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终要发布和运行的产品
DockerFile命令
FROM # 基础镜像,一切从这里开始构建 (基础镜像 scratch)
MAINTAINER # 作者信息
RUN # 镜像构建时,需要运行的命令
ADD
WORKDIR # 镜像的工作目录
VOLUME # 设置挂载的位置
EXPOSE # 暴露端口
RUN
CMD # 指定容器启动时,要运行的指令,只有最后一个会生效,可以被replace
ENTRYPOINT # 可以追加命令的cmd
ONBUILD # 当build一个被继承的DockerFile时会运行此指令,触发指令
COPY # 类似ADD,将文件copy镜像中(不会自动解压)
ENV # 构建的时候,设置环境变量
构建一个DockerFile
(dockerfie类似于makefile,通过dockerfile来构建docker,不同的是,dockerfile的每行指令单独形成一层)
# 1、编写DockerFile文件
FROM centos
MAINTAINER wandugu<wandugu@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN apt-get install vim
RUN apt-get install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "====end===="
CMD /bin/bash
# 2、通过DockerFile build 成镜像
docker build -f dockerfilename -t mycentos:0.1 .
docker history 镜像id # 查看构件过程
Tomcat镜像
-
准备镜像文件 tomcat压缩包、jdk压缩包
-
编写DockerFile文件,官方命名
Dockerfile
,如果是这个名字,就不用-f再指定文件名了 -
build
-
发布(百度web.xml)
发布镜像
1、发布到docker hub
# docker login --help
docker login -u wandugu
docker push wandugu/image_name:ver
# docker tag image_id tag_name:tag_ver
2、发布到阿里云
Docker网络
Docker0
测试
ip addr # 扩展知识
lo: 本机回环地址
eth0: 阿里云内网地址
docker0: docker0地址
三个网络(linux+2个容器)
# docker 如何处理容器内网络访问
docker run -d -P --name tomcat_name tomcat
# 查看容器内部网络地址 ip addr, 容器启动时,会得到一个eth0@ifxxx 的ip地址,docker分配的
docker exec -it tomcat_name ip addr
# linux 可以 ping 通 docker 容器内部
原理
我们每启动一个容器,docker就会给容器分配一个ip,只要安装了docker,就会生成一个网卡docker0
# 桥接模式: 使用的是 veth-pair 技术
# veth-pair: 就是一堆虚拟设备接口, 一端连着协议,一端彼此相连
# veth-pair 可以充当一个桥梁,连接各种虚拟网络设备
# OpenStack、OVS 的连接,都是使用 veth-pair 技术
容器和容器之间是可以互相通信的
docker0就像一个路由,不同的地址通过其互相通信
–link
docker exec -it tomcat02 ping tomcat01
# ping 不通
docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping tomcat02
# 可以 ping 通
docker exec -it tomcat02 ping tomcat03
# 反向 ping 不通
–link 其实是在 hosts 配置中增加了一个 tomcat02 的映射
docker0:不支持容器名访问
自定义网络
docker network rm 容器id # 移除网络
docker network ls # 查看所有网络
网络模式
bridge: 桥接(docker默认)
none: 不配置网络
host: 和宿主机共享网络
container: 容器内网络连通(用得少)
# 直接启动命令 --net bridge, 这个就是docker0
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0 特点: 默认,域名不能访问, --link可以打通连接
# 自定义一个网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# --driver brideg 连接方式
# --subnet 192.168.0.0/16 子网
# --gateway 192.168.0.1 网关
运行自己创建的网络
docker run -d -P --name tomcat-net-01 mynet comcat
docker run -d -P --name tomcat-net-02 mynet comcat
# 直接可以 ping 通
好处
redis - 不用的集群使用不同的网络,保证集群是安全和健康的
mysql -
网络连通
# 不能直接把两个不用网段的网络连起来(那样就成了一个网段)
# 用一个网段的容器去直接连另一个网段
docker network connect mynet tomcal01
# 连通就是将 tomcat01 放到了 mynet 的配置文件里
部署redis集群
# redis里面只有sh,没有bash
SpringBoot微服务打包Docker镜像
- 构建springboot项目
- 打包应用
- 编写dockerfile
- 构建
- 发布运行