一、安装
- 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 run (启动镜像)
- 常用其他命令
- 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 查看信息
- 修改是双向的
- 命令:docker run -it -v /xxx/xx:/home name /bin/bash 将 /xxx/xx 挂载到容器 /home 里面
- 实战 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 里面配置了映射
- –link:在运行一个容器时指定一个容器进行 link,直接可以使用容器名进行 ping
- 自定义网络
- 查看所有的 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
- portainer:Docker 图形化界面管理工具,提供一个后台面板供我们操作
- Commit 镜像
- docker commit 提交一个容器作为新的副本
- docker commit -m “描述” -a=“作者” 容器 目标镜像名: [TAG]
- docker commit -a=“xxx” -m=“xxx xx” id name:1.0