目录
概念
docker是容器虚拟化技术的一种, 对虚拟化容器进行了封装, 采用cs架构, 根据客户端命令操作docker实现对容器/镜像的维护
镜像
模板
容器
根据模板创建的一个具有基本linux环境的实例
仓库
docker hub, 镜像仓库, registry包含多个仓库
容器与虚拟机虚拟化区别
容器 | 虚拟机 |
---|---|
基于宿主机系统 | 虚拟化基于硬件 |
系统仅支持宿主机同内核系统 | 系统与宿主机无关 |
体积小 | 体积大 |
共用内核启动快 | 构建内核启动慢 |
环境搭建
以下操作需要全程联网
以centos7作为虚拟机系统
virtualbox
下载
https://www.vagrantup.com/downloads.html
vagrant
下载
https://www.virtualbox.org/wiki/Downloads
- 初始化centos7系统
- 启动系统
可以切换到root 用户, vagrant生成的root用户密码也是vagrant, 不然下面输的某些命令需要加sudo - 网络配置
vagrant初始化的系统不带有ip, 需要配置宿主系统与虚拟系统的端口映射, 需要将外部访问虚拟系统的请求由宿主机转发到 虚拟机的端口. 每个服务的端口都需要进行映射. 建议给虚拟机分配默认ip
命令终端输入 ipconfig, 查看虚拟机ip
然后去修改vagrant文件
C:\Users\你的用户名\Vagrantfile
此处的地址的网段与虚拟机ip相同, 末位任意
config.vm.network "private_network", ip: "192.168.56.10"
修改完后重启虚拟机,
vagrant reload
之后用宿主机和虚拟机互相ping一下确认网络
4. 确认安装gcc
yum -y install gcc
5. docker安装
确认操作系统版本, centos6/7安装稍有不同
docker官方文档
https://docs.docker.com/engine/install/centos/#uninstall-old-versions
这一步推荐使用阿里云镜像
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
docker安装完成后, 需要配置国内镜像站, 加快镜像拉取上传速度
直接复制以下命令在虚拟机中执行
docker操作
启动docker
sudo systemctl start docker
测试
sudo docker run hello-world
配置docker开机启动
sudo systemctl enable docker
常用命令
docker images
docker info
docker version
docker --help
镜像命令
命令 | 说明 |
---|---|
docker images | 镜像列表 |
docker search tomcat(镜像名称) | 根据名称从仓库中查询镜像 |
docker pull tomcat(镜像名称):3.2(标签版本) | 拉取镜像 |
docker rmi tomcat | 删除镜像 |
容器命令
命令 | 说明 |
---|---|
docker run -it --name adsfadsf(镜像id) | 根据镜像id新建并启动容器 |
-it | 以交互模式启动容器, 并启动一个伪终端 |
- -name | 为容器指定一个名称 |
docker ps -n 3 | 显示当前运行3个容器 |
-n 3 | 展示数量 |
exit | 关闭并退出当前容器 |
ctrl+p+q | 不关闭退出容器,容器仍在运行 |
docker stop id/name | 根据容器id或者名称停止容器 |
docker start id/name | 根据容器id或者名称启动容器 |
docker kill | 强制停止 |
docker rm id/name | 删除容器 |
docker run -d
守护进程方式后台启动容器, 与-it不同, 不会提供终端, 受docker机制影响因为容器没有事做, 会立即退出
docker logs -t -f --tail 3 id
根据id查看容器的运行日志,
-t 附带时间戳
-f 循环
–tail 从尾部
查看该容器的内部细节, 已json方式展示
docker -inspect id
直接进入容器, 不会启动新的进程
docker attach id
不进入容器, 将容器中执行的命令结果返回到宿主机终端
docker exec id 命令
docker cp id /容器路径 文件名 /宿主机路径
将容器中的文件拷贝到宿主机
开机时容器自动启动
docker update 容器名 --restart=always
镜像
虚拟机的镜像由unionFS联合文件系统构成, 分为bootsFS 与rootFS, bootsFS中包含kernel内核, 启动时将内核加载到rootFS中, rootFS为root根目录的文件结构
与虚拟机的镜像不同, docker镜像不包含内核, 仅有rootFS, 所以体积小
镜像中包含不同的镜像, 比如tomcat镜像基于jdk, jdk基于centos, centos基于kernel, 采用这种结构, 可以实现其他镜像共享相同镜像, 当拉取es时, 因为es同样基于jdk, 可以共用jdk镜像.
镜像命令
docker run -it -p 8888:8080 id
启动容器并配置端口映射, 容器相当于一个linux系统, 内部也有网络/端口, 通过宿主机访问容器中的服务时, 需要进行端口映射, 8888为宿主机端口, 8080为容器端口, 宿主机中访问8888时, 就会访问到容器中的tomcat服务
端口映射概念补充
例如现在有3个系统, 一个是笔记本上启动的, 一个是安装在virtualbox上的虚拟机centos7, 还有一个就是启动后的容器, 因为虚拟机已经配置了静态ip192.168.56.xx, 所以windows可以直接通过这个地址访问虚拟机上的服务, 但是容器没有配置静态ip, 需要通过端口映射, 才能访问到容器中运行的服务, 比如现在想通过window访问一个启动的tomcat, 根据这run命令, windows浏览器中通过192.168.56.xx:8888就可以访问到
docker commit -m="memo提交的描述信息" -a="(author作者)" 容器id 新镜像名 :[标签版本号]
已一个运行容器为模板, 创建一个镜像, 当然, 本地也会存在这个镜像
数据卷
作用:
- 将容器的数据进行持久化保存
- 容器与容器之间的数据同步
命令
docker run -it -v /宿主机绝对路径 : /容器内目录 镜像名
例docker run -it -v /host/temp : /container/temp mycentos
-v volume数据卷缩写
将主机中/host/temp目录与容器/container/temp目录中的内容同步, 包含执行前的内容, 如果没有该文件夹将创建
可通过docker inspect 查看valume对象中的内容
因为已经改变了容器的配置文件, 就算容器关闭退出, 下次重启后同步仍生效
这个命令是启动一个新的容器并追加数据卷
docker run -it -v /宿主机绝对路径 : /容器内目录:ro 镜像名
:ro 为仅赋予容器方数据卷readonly权限
对同一目录执行, 将会覆盖之前的数据卷的配置
数据卷的传递
docker run -it --name doc2 --volumes -from doc1 镜像名
启动doc2容器, 并与doc1容器建立数据卷关系
已经建立的数据卷关系, 及时有一个容器关闭删除, 其他配置了的数据卷的容器仍会保持数据卷关系
dockerfile
dockerfile是用来构建镜像的脚本, 通过docker的编译命令可以生成镜像文件, 类似java的class文件
查看docker hub中tomcat的dockerfile
https://github.com/docker-library/tomcat/blob/22269be2cf23e1f7b17331a90db4f4ed9c9d1f65/8.5/jdk8/openjdk/Dockerfile
创建dockerfile
vim Dockerfile
例使用该内容通过dockerfile配置数据卷
文件内容:
#volume test //
FROM centos //基于centos镜像
VOLUME["/dataVolumeContainer1","/dataVolumeContainer2"] //容器卷目 ,该无法固定宿主机路径,使用默认路径,同步容器间的数据卷
CMD echo "finished,success"
CMD /bin/bash
dockerfile有编写格式与解析要求
每条保留字指令需要大写, 最后一个单词是一个参数变量;
每执行一行命令, 都会创建一个新的镜像并基于上一个镜像进行提交;
保留字
ADD 添加一个文件并针对文件类型进行处理, url解压tar包
CMD 执行命令 , 仅处于末位的一个生效 可通过[“xxx”,“xxx”]执行多个命令
FROM 基于哪个镜像
MAINTAINER 作者和邮箱
RUN 执行其他命令 比如yum xxx
EXPOSE 开放端口
WORKDIR 容器启动后终端所在的目录
ENV environmentValue 环境变量 定义一个变量, 下文可以使用$进行引用
COPY 添加一个文件
ENTRYPOINT 执行命令, 不会像CMD一样仅最后一项生效
ONBUILD 类似回调函数, 构建镜像时触发父镜像的onbuild
VOLUME 数据卷
docker build -f /文件路径 -t 新镜像名
-f 应该是find的意思
-t 提供终端界面
docker history id 查看镜像的build历史记录
entrypoint 和cmd区别
容器启动时 在最后可以执行命令 touch 123.txt, 如果dockerfile文件中的命令是cmd执行的, 那么启动容器时, 将会自动执行 cmd touch 123.txt ,而且会覆盖之前的cmd命令, entrypoint就不会
常用软件启动命令
斜杠\ 是换行符 表示命令未完结 , 需要空格+换行符+回车,才能有效
mysql
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
redis
docker run -p 6379:6379 --name redis \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /data:/data \
-d redis redis-server /etc/redis/redis.conf
activeMQ
docker run -d --name activemq -p 61617:61616 -p 8162:8161 webcenter/activemq
开机自启动
docker update 容器名 --restart=always
已交互方式进入容器
docker exec -it activemq(容器名) /bin/bash
查看容器日志, 用来排障
docker logs 容器