小知识点:Docker 安装、命令、Dockerfile ...

目录

  • 一、安装
  • 二、底层原理
  • 三、常用命令
  • 四、容器数据卷
  • 五、DockerFile
  • 六、Docker 网络
  • 七、SpringBoot Docker 打包镜像
  • 八、Docker Compose
  • 九、其他

一、安装

  • yum 包更新到最新
yum update
  • 安装需要的软件包,yum-util 提供 yum-config-manager 功能,另外两个是 device mapper 驱动依赖
yum install -y yum-utils device-manager-persistent-data lvm2
  • 设置 yum 源
yum-config-manager --add-repo https://dowload.docker.com/centos/docker-ce.repo
  • 安装 docker
yum install -y docker -ce
  • 查看 docker 版本
docker -v
  • 配置加速器
    • 进入阿里官网获取地址和命令
  • 启动
sudo service docker start

二、底层原理

  • Docker 是什么工作的
    • Client-Server 结构的系统,守护进程运行在主机上,通过 Socket 从客户端进行访问
  • Docker 为什么比 VM 快
    • Docker 比虚拟机有更少的抽象层
    • Docker 利用的是主机的内核,VM 需要 Guest OS
    • 所以说,新建容器 Docker 不需要像虚拟机一样加载一个操作系统,避免引导
    • 虚拟机是加载 Guest OS,分钟级别,Docker 是利用宿主机操作系统,秒级
  • Docker 镜像原理
    • UnionFS 联合文件系统是一种分层、轻量级并且高性能的文件系统,支持对文件系统对修改作为一次提交来一层层的叠加
    • 镜像可以通过分层来进行继承,基于基础镜像可以制作各种具体的应用镜像
  • 分层理解
    • 所有的 Docker 镜像起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上创建新的镜像层

三、常用命令

  • 帮助命令
    • docker version (版本信息)
    • docker info (更详细的系统信息,包括镜像和容器的数量)
    • docker 命令 --help (命令帮助)
  • 镜像命令
    • docker images (查看所有本地主机上的镜像)
    • docker search (搜索镜像)
    • docker pull (拉取镜像)
    • docker rmi (删除镜像)
  • 容器命令
    • docker run (启动镜像)
      • –name=“name” 容器名字
      • -d 后台方式运行
      • -it 使用交互方式运行
      • -p 指定容器端口 -p 主机端口:容器端口
      • -P 随机指定端口
    • docker ps (运行中的容器)
      • -a 列出当前正在运行的容器 + 历史运行过的容器
      • -n=? 最近运行过的容器
      • -q 只显示编号
    • docker rm (删除容器)
      • id 删除指定容器
      • -f $(docker ps -aq)删除所有容器
    • 容器管理
      • docker start id 启动容器
      • docker restart id 重启容器
      • docker stop id 停止容器
      • docker kill id 强制停止容器
      • exit 直接容器停止并退出
      • ctrl + P + Q 后台运行
  • 常用其他命令
    • docker logs -f -t --tail 容器 查看日志
    • docker top 容器 查看 docker 内部进程
    • docker inspect 容器 查看容器元数据
    • docker exec -it 容器 bash 后台方式进入容器,开启新的中断
    • docker attach 容器 进入正在运行的容器终端,不会启动新的进程
    • docker cp 容器 拷贝文件
      • docker cp 容器:/xxx/xx /xxx 反过来就是拷贝到容器
    • docker stats 查看容器运行情况
    • docker volume ls 查看数据卷情况

四、容器数据卷

  • 说明:将容器内的目录挂在到宿主机里面,实现容器持久化,容器间数据共享
  • 使用
    • 命令:docker run -it -v /xxx/xx:/home name /bin/bash 将 /xxx/xx 挂载到容器 /home 里面
      • docker inspect 查看信息
      • 修改是双向的
  • 实战 MySQL
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password --name mysql mysql:tag
  • 具名和匿名挂载
    • 匿名挂载
      • -v 容器内路径 (不指定容器外名,会自动挂载到本地)
    • 具名挂载
      • -v 卷名:容器内路径
    • 指定路径挂载
      • -v /宿主机地址::容器内地址
    • docker volume inspect name 获取具体卷具体信息
    • 拓展
      • -v 容器内路径:ro rw 改变读写权限
      • 数据卷容器:实现容器间数据同步 --volumes-from
        • 拷贝数据到主机里
        • 生命周期一直持续到没有容器使用为止

五、DockerFile

  • 说明
    • 通过脚本生成镜像
    • DockerFile:构建文件,定义了一切的步骤,源代码
    • DockerImages:通过 DockerFile 构建生成的镜像,最终发布和运行的产品,原来是 jar 和 war
  • 脚本
  # 创建一个 dockerfile 文件,名字可以随机
  # 文件中的内容 指令(答谢) 参数
  FROM centos
  # 匿名挂载,和外部有一个同步的目录
  VOLUME ["volume01", "volume02"]
  CMD echo "======end======"
  CMD /bin/bash
  • 执行脚本生成镜像
    • docker build -f dockerfile -t acware/centos .
  • 构建步骤
    • 编写 dockerfile 文件
    • docker build 构建成一个镜像
    • docker run 运行镜像
    • docker push 发布镜像(DockerHub、阿里云镜像仓库)
  • 构建过程
    • 每个保留关键字(指令)都是必须是大写字母
    • 执行从上到下顺序执行
    • # 标示注释
    • 每个指令都会创建提交一个新的镜像层,并提交
  • 指令
    • FROM 指定基础镜像,一切从这里开始构建
    • MAINTAINER 镜像是谁写的,姓名 + 邮箱
    • RUN 镜像构建的时候需要运行的命令
    • ADD 添加内容,例如 tomcat 压缩包
    • WORKDIR 镜像的工作目录
    • VOLUME 挂载的目录
    • EXPOSE 暴露端口
    • CMD 指令容器启动的时候运行的命令,只有最后一个会生效,可被替代
    • ENTRYPOINT 指定容器启动的时候要运行的命令,可以追加命令
    • ONBUILD 当构建一个被继承的 DockerFile 这个时候会运行 ONBUILD 指令,触发指令
    • COPY 类似 ADD,将我们文件拷贝到镜像中
    • ENV 构建的时候设置环境变量
  • 练习
# 编写文件
FROM centos:7
MAINTAINER acware<1982455737@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash
# build
# docker build -f DockerFile -t mycentos:0.1 .
  • CMD 和 ENTRYPOINT 区别
    • CMD 只有最后一个会生效,可被 -l 替代
    • ENTRYPOINT 可以在这个命令后面追加命令
  • 实战:Tomcat 镜像
# 准备 tomcat、jdk 压缩包
# 编写 Dockerfile
FROM centos
MAINTAINER acware<email>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u11-linux-x64.tat.gz /usr/local
ADD apache-tomcat-9.0.22.tar.gz /usr/local

RUN yum -y install vimp

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out 

# 构建
# docker build -t diytomcat .
# 运行
# docker run -d -p 9090:8080 --name name -v /tmp/xxx:/usr/local/apache-tomcat-9.0.22/webapps/test -v /tmp/xx:/usr/local/apache-tomcat-9.0.22/logs diytomcat
# 测试
# 发布
  • 发布镜像
    • https://hub.docker.com 注册账号
    • docker login -u username 然后输入 password
    • docker push name/diytomcat:1.0
    • 发布到阿里云上
      • 登陆阿里云
      • 找到容器镜像服务
      • 创建命名空间

六、Docker 网络

  • 理解 Docker0
    • 外部宿主可以 ping 通容器内部网络,在同一个子网内都能通信,容器间也可以
    • 每启动一个 docker 容器,docker 就会给容器分配一个 ip,只需要安装 docker 就会有一个网卡 docker0
    • 用的是桥接模式,使用的是 evth-pair 技术,就是一对的虚拟设备接口,都是成对出现的,一段连着协议,一段彼此相连
    • OpenStac、Docker 容器之间的连接,OVS 的连接,都是用 evth.pair 技术
    • Docker 中的网络接口都是虚拟的,虚拟的转发效率高
  • 通过名字访问服务
    • –link:在运行一个容器时指定一个容器进行 link,直接可以使用容器名进行 ping
      • 就是在 hosts 里面配置了映射
  • 自定义网络
    • 查看所有的 docker 网络:docker network ls
    • 网络模式
      • bridge:桥接模式
      • none:不配置
      • host:和宿主机共享网络
      • container:容器网络连通
    • 启动的时候可以加 --net bridge
    • 自定义
      • docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 net
      • 自定义网络不使用 --link 也可以使用容器名来 ping 通
      • 好处:不同集群使用不同网络
  • 网络连通
    • docker network connect net 容器
    • 连通之后就是将容器放入 net 网络内

七、SpringBoot Docker 打包镜像

  • 步骤
    • 编写 SpringBoot 项目
    • 打包应用
    • 编写 DockerFile
    • 构建镜像
    • 发布运行
  • 在 IDEA 里面可以下载 Docker 插件,DockerFIle 高亮
  • 编写 DockerFile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
  • 镜像发布
    • docker build -t acware:1.0 .
    • docker run -d -P --name acware-web acware:1.0

八、Docker Compose

  • 下载 compose
    • apt install docker-compose / yum -y install docker-compose
    • docker-compose --version
  • 编写 docker-compose yaml 文件
version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:
  • 开始部署
    • docker-compose up -d

九、其他

  • Docker 可视化工具
    • portainer:Docker 图形化界面管理工具,提供一个后台面板供我们操作
      • docker run -d -p 8080:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true name
  • Commit 镜像
    • docker commit 提交一个容器作为新的副本
    • docker commit -m “描述” -a=“作者” 容器 目标镜像名: [TAG]
      • docker commit -a=“xxx” -m=“xxx xx” id name:1.0

你可能感兴趣的:(小知识点,docker,容器)