一. Docker简介
Docker 是一个开源的应用容器引擎,诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
Docker 可以让开发者打包他们的应用,以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。Docker容器是完全使用沙箱机制,相互隔离,性能开销也极低。
从 17.03 版本之后,Docker分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)
Docker通俗的讲是服务器中高性能的虚拟机,可以将一台物理机虚拟N多台虚拟机的机器,互相之间隔离,互不影响。
网站Docker: Accelerated Container Application Development
1.1虚拟机网卡配置
1.2虚拟机和容器的区别
1.3Docker基本概念
宿主机:安装Docker守护进程的Linux服务器,称之为宿主机;
镜像(Image):Docker 镜像,就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像运行之后的实体,镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个镜像控制中心,用来保存镜像。
1.4虚拟化技术主要作用
-
软件跨环境迁移问题(代码的水土不服)
-
高性能的物理硬件产能过剩
二.Docker安装和启动
注意,一定安装在CentOS 7.x及以上版本,CentOS6.x的版本中有Bug!
- yum包更新到最新
sudo yum update
- 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 配置yum源的代理,类似于maven镜像仓库,加速下载软件。
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker
sudo yum install docker-ce
- 安装后查看docker版本,是否安装成功
docker -v 或者 docker info 查看Docker信息
2.2 Docker守护进程相关命令
启动docker:
systemctl start docker
停止docker:
systemctl stop docker
重启docker:
systemctl restart docker
查看docker状态:
systemctl status docker
开机启动:
systemctl enable docker
查看docker概要信息
docker info
出现这个错误说明不要复制代码了,手打一遍
docker info概要信息
2.3 镜像加速
- 编辑该文件(最好先进入docker目录再 vim daemon.json)
vim /etc/docker/daemon.json
- 配置daemon.jsom文件
{
"registry-mirrors": [
"https://docker.mirrors.sjtug.sjtu.edu.cn/",
"https://docker.m.daocloud.io/",
"https://noohub.ru/",
"https://huecker.io/",
"https://dockerhub.timeweb.cloud/",
"https://registry.cn-hangzhou.aliyuncs.com/",
"https://docker.agsv.top/",
"https://hub.iyuu.cn/]"
}
- 重新读取配置文件
sudo systemctl daemon-reload
- 重启docker
sudo systemctl restart docker
配置后docker info成功页面
失败页面
三、Docker中常用命令
3.1镜像相关命令
- 查看本地所有镜像
docker images
- 无法使用!
docker search 镜像名称
- 拉去镜像
docker pull 镜像名称
- 删除镜像
docker rmi 镜像ID
3.2 容器相关命令
- 查看正在运行的容器
docker ps
- 查看所有容器
docker ps –a
- 查看最后一次运行的容器
docker ps –l
- 查看停止的容器
docker ps -f status=exited
- 创建容器
docker run 参数 镜像名称:镜像标签 /bin/bash
- 参数详解
xxxxxxxxxx ## 命令参数详解
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端(如果只加it两个参数,创建后就会自动进去容器)。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
--name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到容器上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射进入容器之后,初始化执行的命令:/bin/bash;可写可不写
- 交互式容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
- 守护式容器
docker run -di --name=容器名称 镜像名称:标签 /bin/bash
- 登录容器
docker exec -it 容器名称 (或者容器ID) /bin/bash
注意:这里的登陆容器之后执行的脚本/bin/bash必须写
-
停止容器:
docker stop 容器名称(或者容器ID)
-
启动容器:
docker start 容器名称(或者容器ID)
- 查看容器IP地址
docker inspect 容器名称(容器ID)
- 删除容器
docker rm 容器名称(容器ID)
MYSQL部署
docker run -di --name=c_mysql -p 3306:3306 -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker exec –it c_mysql /bin/bash
tomcat部署
docker run -id --name=c_tomcat -p 8080:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:10
Redis部署
docker run -id --name=c_redis -p 6379:6379 redis:6.0
四、制作Docker镜像
1、容器保存为镜像
docker commit {正在运行容器名称} {镜像名称}:{镜像标签}
# 举例
docker commit c_tomcat c_tomcat_bak
2、镜像备份
docker save -o {镜像的备份文件} {镜像名称}
# 举例
docker save -o c_tomcat_bak.tar c_tomcat_bak
# -o :输出到的文件
3、镜像恢复与迁移
docker load -i {备份的镜像文件}
# 举例
docker load -i c_tomcat_bak.tar
# -i :指定导入的文件
4.3 Dockerfile简介
Dockerfile 是一个文本文件,包含了构建镜像文件的指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像;
-
对于开发人员:可以为开发团队提供一个完全一致的开发环境
-
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像,直接开始工作
-
对于运维人员:在部署时,可以实现应用的无缝移植
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN ["command" , "param1","param2"] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD ["command" , "param1","param2"] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME ["目录"] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
4.4 将springboot的可执行jar包制作为docker镜像
- 在IDEA中编辑Dockerfile文件
# 定义基础镜像
FROM openjdk:17
# 定义作者信息
MAINTAINER ss
# 添加jar包文件到镜像中
ADD springboot.jar app.jar
# 定义当前镜像启动容器时,执行命令
CMD java –jar app.jar
- 在宿主机中,构建镜像
docker build –f {dockerfile的文件路径} –t {镜像名称:版本} {构建文件所在路径}
# 举例
docker build -f Dockerfile -t myspringboot:1.0 ./
# -f:指定要使用的Dockerfile路径;
# -t:镜像的名字及标签,通常 name:tag 或者 name 格式,不设置为latest
# 一定不要忘记最后./ 构建文件所在路径
- 基于镜像,启动容器
docker run -di --name=myspringboot -p 9000:8080 myspringboot:1.0
注意: 一定不要忘记最后./ 构建文件所在路径