一、Docker概述
1. 简介
基于Go语言实现的云开源项目。理念:Build,Ship and Run Any App Anywhere ,缩小版的Linux系统。
2. 为什么使用Docker
解决了运行环境和配置问题的软件容器,方便做持续的集成并有助于整体发布的容器虚拟化技术。
- Docker用来解决开发和运维之间配置环境、运行环境、操作系统、运行依赖包等不同导致的项目部署后无法运行的问题,因此将工程与工程运行所需的配置等一起打包成一个镜像。
- 解决集群项目中,如果同一个项目需要再多台机器上部署时需要反复配置的问题。
- 一次构建,处处运行。(类似于Java虚拟机的概念)
2. 与虚拟机对比
- 虚拟机:虚拟出一套硬件以后,在其上运行一套完整的操作系统(在宿主机OS上运行虚拟机OS),在该系统上运行所需的应用进程。(资源占用多,启动慢,冗余步骤多)
- Docker:容器内的应用使用的是宿主机的内核,没有硬件虚拟,容器之间相互隔离,每个容器有自己的文件系统,容器间不会相互影响。
3. Docker的三大特征(重要)
- 镜像:
- 容器:
- 仓库: 提交Docker镜像的仓库。https://hub.docker.com
4. 理解Docker
- 蓝色的海:宿主机系统
- 鲸鱼:Docker
- 集装箱:容器实例 (实例来自于镜像)
二、Ubuntu安装Docker
- 安装必要的系统工具
1 | sudo apt install apt-transport-https ca-certificates curl software-properties-common |
- 将Docker存储库添加到APT源:
①. 官方的源
1 | sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" |
②. 阿里的源
1 | sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" |
- 将官方Docker存储库的GPG密钥添加到系统:
①. 官方的GPG证书
1 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
②. 阿里的GPG证书
1 | curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - |
- 确保从Docker repo 安装docker
1 | apt-cache policy docker-ce |
- 安装Docker(社区版)
1 | sudo apt-get install -y docker-ce |
- 查看docker版本
1 | docker -v |
- 启动Docker
1 | sudo systemctl status docker |
- 由于从国外的网站拉镜像比较慢,因此国内如阿里云提供了容器镜像服务(如果不使用国内的镜像服务也没关系)。注册阿里云账号后,一般进入控制台/产品与服务/容器镜像服务/镜像加速器(第一次进入会让你设置一个Rigistry密码)。然后就可以看到你的专属加速器地址和配置使用方法(根据系统按照操作文档中的命令运行即可)。
- 查看Docker所使用的源##
1 | docker info|grep Mirrors -A 1 |
三、Docker常用命令
docker [OPTION] COMMAND
帮助命令
- docker version 查看docker版本
- docker info docker的详细信息
- docker —help 查看Docker的帮助信息
镜像命令
- docker images 列出本地所有的镜像
- -a 列出本地所有的镜像,(含中间层)
- -q 只显示镜像的ID
- -qa 所有镜像的ID
- —digests 列出所有镜像,带有镜像的摘要信息
- —no-trunc 没有截取显示所有信息(如查看完整ID)
- docker search 镜像名字(是从docker hub上查询的)
- -s 查询出点赞数超过50的镜像(docker search -s 50 tomcat)
- —no-trunc 没有截取显示所有信息(可以看到完整的Description)
- docker pull 镜像名字 (下载镜像,默认最新版本 :latest )
- :5.6 拉取相应版本的镜像(docker pull :5.6)
- docker rmi 镜像名(删除镜像remove images)
- -f 强制删除镜像
- 镜像名 镜像名 删除多个镜像(docker rmi hello-word tomcat)
- $(docker images -qa) 删除所有镜像 docker rmi -f $(docker images -qa)
容器命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG…] 启动容器
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用(-it)
—name=”容器新名字”: 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-P: 随机端口映射;
-p: 指定端口映射
例如:docker run -it -p 8090:8080 tomcat Docker运行tomcat tomcat的8080端口映射到8090,实际向外暴露的8090端口。
docker ps 正在运行的容器
- -l 上一个运行的容器
- -a 运行过的所有容器
- -n n是一个数字,列出最近运行出的n个容器
- -q 只显示容器的编号(ID)用于批量删除容器
exit 退出容器(容器停止运行)
Ctrl + P +Q 退出容器,容器仍在运行
docker start 容器ID 启动已经停止了的容器
docker restart 容器ID 重启某个容器
docker stop 容器ID 停止容器运行
docekr kill 容器ID 强制停止容器(马上停止)
docker rm 容器ID 删除某个容器(已经停止了的)
- -f 强制删除
docker ps -d 容器ID 运行容器,运行后就停止了(Docker机制:Docker 后台运行,必须有一个前台进程)
docker attach 容器ID 进入正在运行的容器
docker exec -it 容器ID /bin/bash 进入到容器中打开终端
或者直接运行bash: docker exec -it 容器ID bash
或者使用容器的名字来替换容器ID
docker logs 容器ID
- -t 加入时间戳
- -f 跟随最新日志打印
- —tail 数字 显示最后多少条
docker top 容器ID 查看容器中运行的进程
docker inspect 容器ID 查看容器的内部细节
docker cp 容器ID:/tmp/test.txt /root 将容器中的文件拷贝到宿主机(命令在宿主机中执行,冒号前后没有空格)
提交命令
- docker commit 提交容器副本使之成为新的镜像
- docker commit -m=”提交信息” -a=”作者” 容器ID 要创建的镜像名:版本号
- eg:docker commit -m=”tomcat of me” -a=”xuwei” fq48903bfd beyonderwei/mytomcat:1.2
四、镜像(UnionFS)
概念
镜像: 轻量级的可执行的独立软件包,用来打包运行环境和基于运行环境开发的软件。
- UnionFS:联合文件系统,是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层叠加。
- bootFS:包含bootloader 和 kernel ,bootloader 用来引导和加载kernel,Docker镜像的最底层也是bootFS。
- rootFS:在bootFS之上,包含的是典型的Linux系统中的/dev /bin等目录文件,root就是各种不同linux系统的发行版如:Ubuntu,CentOS等。Docker的镜像共用了内核,只是rootFS不同,因此很小。
- 分层结构:为了共享资源,多个镜像用到相同的base镜像时,宿主机只需要保存一份base镜像。
五、容器数据卷
简介: Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来的话,当我们删除容器后,数据就消失了,而容器数据卷实现了数据的持久化。
用途
容器与主机之间的数据共享。
特点:
- 数据卷可以在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新当中
- 数据卷的生命周期一直持续到没有容器使用它为止
命令
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 运行镜像的过程中添加数据卷
eg:docker run -it -v /dataVolume:/dataVolumeContainer 镜像名
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 添加权限(容器内只读read only)
注:
- 容器停止以后,主机修改数据,当再次启动容器时,数据会同步。
可通过 docker inspect 容器ID 来查看容器数据卷与宿主机之间的绑定关系
生命周期
注:容器之间的配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
- docker run -it —name doc2 —volumes-from 已有容器ID beyonderwei/ubuntu 运行容器beyonderwei/ubuntu 名为doc2 继承自 已有容器ID,这样就有父容器的所有数据卷
六、DockerFile添加容器卷
简介:
DockerFile 是镜像模板的描述文件,用来构建Docker镜像的构建文件,由一系列命令和参数构成的脚本。(有自己的一套语法规则)。
DockerFile形式添加数据卷
可在Docker中使用VOLUME指令来给镜像添加一个或者多个数据卷
宿主机根目录下新建mydocker文件夹并进入
File构建(脚本文件)
vim DockerFile 并输入以下内容
1 | volume test |
- docker build -f /mydocker/DockerFile -t beyonderwei/ubuntu . 构建一个新的镜像文件(命令最后有一个点,表示执行所有指令)
- docker images 查看自己刚构建好的镜像
- 运行自己构建的容器,这样就会自动构建容器数据卷
七、DockerFile
构建docker镜像的步骤
编写Dockerfile文件
docker build Dockerfile文件
命令:
docker build -f dockerfile文件 -t 镜像名:版本号 .
命令最后的点表示输出镜像到当前路径
docker run 运行镜像文件
注:每条指令都会创建一个镜像层,并对镜像进行提交。
在我们得到镜像以后,就可以定制自己的镜像,然后完善自己的工具库。
Docker 执行DockerFile的大致流程
- Docker 从基础镜像运行一个容器
- 执行一条指令,并对容器做出修改
- 执行类似 docker commit的操作提交一个新的镜像
- Dcoker再基于刚提交的镜像运行一个新的容器
- 执行DockerFile的下一条指令直到所有的指令都执行完成。
- 最终形成一个我们自定义的镜像。
最终目的:服务器只需要安装Docker镜像后,直接运行我们自己弄好的镜像就完成部署。
Docker 关键字
FROM:基础镜像,当前镜像是基于哪个镜像的
MAINTAINER:镜像维护者的姓名和邮箱
RUN:构建时需要运行的额外的命令
EXPOSE:当前容器对外暴露的端口(这也就解释了为什么Docker内的Redis只能用6379端口的原因)
WORKDIR:指在创建容器后,终端默认登录进来的工作目录。
ENV:用来在构建镜像的过程中设置环境变量,键值对,其他内容可引用
ADD:将宿主机目录下的文件拷贝进镜像,ADD命令会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝问价和目录到镜像中,
将从构建上下文目录中<源路径>的文件 / 目录复制到新的一层的镜像内的<目标路径>位置
语法: COPY src dest 或 COPY [“src”,”dest”]
VOLUME:容器的数据卷,用来数据保存和持久化工作
CMD:指定一个容器启动时要运行的命令
注:Dockerfile中可以有多个CMD指令,但是只有最后一个会生效,CMD会被Docker run之后的参数替换,即会被在终端执行的命令所覆盖。
ENTRYPOINT:指定一个容器启动时要运行的命令
注:和CMD一样,都是指定容器启动程序及参数,但不会被我们在终端执行的命令带的参数所覆盖,而是将终端的命令加到 ENTRYPOINT 中。
ONBUILD:当构建一个被集成的Dockerfile时运行的命令,父镜像在被子镜像继承后,父镜像的onbuild会被触发。
八、Docker安装mysql
直接执行下面命令的话,没有相关的配置文件,按照配置文件启动还没有测试。
- 原配置文件位置(8.0.12版本):进入容器后,/etc/mysql/ 下my.cnf
docker search mysql
docker pull mysql
docker run -p 3306:3306 —name 容器名
-v /xuwei/mysql/conf:/etc/mysql/conf.d 配置文件数据卷
-v /xuwei/mysql/logs:/logs 日志数据卷
-v /xuwei/mysql/data:/var/lib/mysql 数据的数据卷
-e MYSQL_ROOT_PASSWORD=123456 数据库密码
-d mysql 后台运行mysql,默认latest版本
1
docker run -p 3307:3306 --name learnmysql -v /xuwei/mysql/conf:/etc/mysql/conf.d -v /xuwei/mysql/logs:/logs -v /xuwei/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker exec -it 容器ID /bin/bash 进入到容器中打开mysql终端
mysql -V 查看MySQL版本
mysql -uroot -p 登录mysql
mysql> show variables like ‘character%’; 查看数据库的字符设置
exit 退出mysql
exit 退出容器
九、Docker安装Redis
docker search redis
docker pull redis
vim /xuwei/myredis/conf/redis.conf 配置redis,通过数据卷实现在本机操作配置
配置文件地址:redis.conf
docker run -p 6379:6379
—name myredis 容器名字
-v /xuwei/myredis/data:/data redis数据与本地绑定
-v /xuwei/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf 通过数据卷映射配置文件到宿主机,默认:Docker中的redis无配置文件
-d redis redis-server /usr/local/etc/redis/redis.conf 后台启动,按照配置文件启动
—appendonly yes 开启AOF持久化
1
docker run -p 6380:6379 --name myredis01 -v /xuwei/myredis/data:/data -v /xuwei/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf --port 6380 --appendonly yes
docker exec -it redis容器ID redis-cli 开启一个redis客户端,连接redis
docker exec -it redis容器ID bash 进入到redis容器
- redis-server —version 查看redis版本
exit 退出redis容器
shutdown 退出redis 并停止
注意: docker 启动redis,redis只能以6379启动,但是可以通过docker 映射到主机的其他端口。
十、本地镜像push到阿里云
运行镜像得到一个容器实例(进行定制化修改)
提交(commit):提交容器,得到新的定制化的镜像(可以提交已有的镜像素材)
docker commit -a beyonderwei -m “my test ubuntu image” 容器ID 新的镜像名:镜像版本
去阿里云创建镜像仓库
- 命名空间:即beyonderwei/myubuntu 中的beyonderwei
- 选择本地仓库
创建好后点击管理,可以看到操作指南。
- 登录时使用的密码就是最开始注册容器服务时输入的那个密码
1
2
3
4
5
6登录到Registry
sudo docker login --username=tb896628372 registry.cn-shanghai.aliyuncs.com
给镜像打版本(tag)
sudo docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/beyonderwei/myubuntu:[镜像版本号]
推送到Registry 要求版本号与上一步的相同
sudo docker push registry.cn-shanghai.aliyuncs.com/beyonderwei/myubuntu:[镜像版本号]
...
...
本文为作者原创文章,未经作者允许不得转载。