前言
这一章开始,我们就开始记录Docker了,它也是开发中很实用的一项技术,希望通过学习能够有一个初步的了解和掌握,在后续的工作中,可以快速上手,熟练运用,熟能生巧。
一、简介
1、是什么
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
1.1 与传统虚拟机技术对比
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
Docker容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
2、能干嘛
更快速的应用交付和部署更便捷的升级和扩缩容传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
更简单的系统运维随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
更高效的计算资源利用应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
3、去哪下
官网:
Docker Hub官网: /
这里有两个地址,第一个官网是Docker的官方网站。第二个则是我们镜像仓库的地址。就如同maven仓库,因为其是外国网站,因此访问比较的慢,我们一般都是使用国内的仓库,如阿里云、网易云等。
二、安装
1、卸载与安装
因为部分朋友可能下载安装过docker,一般咱们先卸载干净,再来安装。
官网是有步骤的,可以根据官网的来:/engine/install/centos/。
不过有个大坑,需要注意,后续内容会有说明。
查看Linux版本是否是CentOS7及以上版本,通过cat /etc/redhat-release
查看。
删除旧版本
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
yum安装gcc相关
需要gcc的环境,这个很多小伙伴都有,就可以跳过。
yum -y install gccyum -y install gcc-c++
安装需要的软件包
yum -y install yum-utils
设置stable镜像仓库(坑!!!)
这么设置镜像仓库的地址是不对的,他是从官网下载,我们在国内很可能是下不下来的。容易出现Error 12和Error 14的错误。
我们需要配置自己的地址,比如设置阿里云仓库。如下。
yum-config-manager --add-repo /docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
安装DOCKER CE
yum -y install docker-ce docker-ce-cli containerd.io
启动docker
这一步没有报错就对咯,也可以查看一下进程看看。
systemctl start docker
测试docker是否成功安装
# 查看docker版本docker version# 运行hello-worlddocker run hello-world
出现如下信息就表明安装成功了。
我们也可以通过运行hello world来查看。如果机器上没有hello-world的镜像,就会去仓库里拉取,此时的仓库就是我们配置的阿里云仓库。当现实Hello from Docker就表明安装成功了。
卸载 Docker
# 关闭dockersystemctl stop docker# 删除docker相关的组件yum remove docker-ce docker-ce-cli containerd.io# 删除docker的容器和镜像(这些上面的步骤无法删除,需要手动删除)rm -rf /var/lib/dockerrm -rf /var/lib/containerd
2、阿里云镜像加速
1)首先登录阿里云:/ntms/act/kubernetes.html
2)点击控制台 - 选择容器镜像服务 - 获取加速器地址
3)使用下方的操作文档,按步骤执行即可。
至此,docker就正式安装完成啦。解下来就是常用命令的说明。
三、常用命令
常用命令我们从三方面记录,分别是帮助启动类命令、镜像命令、容器命令。
1、帮助类命令
# 启动dockersystemctl start docker# 停止dockersystemctl stop docker# 重启dockersystem restart docker# 查看docker状态systemctl status docker# 开机启动systemctl enable docker# 查看docker概要信息docker info# 查看docker总体帮助文档docker --help# 查看docker命令帮助文档,比如docker run --helpdocker 命令 --help
注意:
执行
systemctl stop docker
会出现“Warning: Stopping docker.service, but it can still be activated by: docker.socket”问题,它表示docker关闭了,但是docker.socket仍然存在,此时一旦执行docker相关命令。比如docker ps
,docker 又重启了,可通过systemctl status docker
查看此时docker状态为active (running),如果不需要这种机制,在执行systemctl stop docker
后再执行systemctl stop docker.socket
即可。
2、镜像命令
# 列出本地的镜像# -a :列出本地所有的镜像(含历史映像层)# -q :只显示镜像ID。 docker images [OPTIONS]# 查询镜像 如docker search redis# --limit num num为限制数,如5、10、20...docker search [OPTIONS] 镜像名# 下载镜像# 可以指定tag、如果不指定则下载latest,即最新版本docker pull 镜像名[:TAG]# 删除镜像# -f 强制删除docker rmi [OPTIONS] 镜像ID/镜像仓库/镜像仓库:Tag# 查看镜像/容器/数据卷所占的空间docker system df
3、容器命令
# 新建 + 启动容器# OPTIONS说明(常用):有些是一个减号,有些是两个减号# --name="容器新名字" 为容器指定一个名称;如果不写系统则随机一个名字# -d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);# -i:以交互模式运行容器,通常与 -t 同时使用;# -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互);# -P: 随机端口映射,大写P# -P: 指定端口映射,小写Pdocker run [OPTIONS] IMAGE [COMMAND] [ARG...]# 列出当前所有正在运行的容器# -a :列出当前所有正在运行的容器+历史上运行过的# -l :显示最近创建的容器。# -n:显示最近n个创建的容器。# -q :静默模式,只显示容器编号。docker ps [OPTIONS]# 退出容器# run进去容器,exit退出,容器停止exit# run进去容器,ctrl+p+q退出,容器不停止ctrl+p+q# 启动已停止运行的容器docker start 容器ID/容器名# 停止运行的容器docker stop 容器ID/容器名# 重启容器docker restart 容器ID/容器名# 强制停止容器docker kill 容器ID/容器名# 删除已经停止的容器# 无法删除未停止的容器,可以先停止再删除或者强制删除docker rm 容器ID/容器名# 一次删除多个容器# -f 强制删除# -a -q 可以合并写 -aqdocker rm [OPTIONS] $(docker ps -a -q)docker ps -a -q | xargs docker rm# 查看容器日志docker logs 容器ID/容器名# 查看容器内运行的进程docker top 容器ID/容器名# 查看容器内部细节docker inspect 容器ID/容器名# 进入正在运行的容器并以命令行交互# bashShell 可为/bin/bashdocker exec -it 容器ID/容器名 bashShell# 重新进入,不推荐使用docker attach 容器ID/容器名# 从容器内拷贝文件到主机上# 例:docker cp 3ba05078c5d5:/home/a.txt /homedocker cp 容器ID:容器内路径 目的主机路径# export 导出容器的内容留作为一个tar归档文件[对应import命令]# 例:docker export 3ba05078c5d5 > /home/aaa.tardocker export 容器ID > 文件名.tar# import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]# 例:cat aaa.tar | docker import - b-images:1.1.1# 例:cat aaa.tar | docker import - myfiles/a-images:1.1.0cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。
exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。
推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。
一般用-d后台启动的程序,再用exec进入对应容器实例
四、本地镜像发布
0、commit
将容器生成镜像发布到本地。
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
1、发布到阿里云
访问阿里云开发者平台/ntms/act/kubernetes.html,并登录。选择控制台,进入容器镜像服务选择个人实例,按要求填写内容,代码源时选择本地仓库进入管理界面获得脚本脚本页面有登录、拉取、推送等脚本,复制粘贴即可。
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。注意:连同[]一起替换!!!
2、发布到私有库
Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
Docker Registry是官方提供的工具,可以用于构建私有镜像仓库
1)下载并运行镜像Docker Registry
docker run -d -p 5000:5000 -v /zdl/myregistry/:/tmp/registry --privileged=true registry
运行一个带有容器卷存储功能的容器实例,rw为读写都行,ro为read only,不写默认rw
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
查看是否挂载成功
docker inspect 容器ID
数据卷:卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File
System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
卷的继承docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用
--privileged=true
命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限
2) 查看本地库现有镜像
curl -XGET http://192.168.61.111:5000/v2/_catalog
可以发现刚刚创建时是没有任何镜像的。
3)创建一个镜像
略。上文有描述
4)将新镜像修改符合私服规范的Tag
Host为Registry所在服务器的IP
Port为Registry所在服务器的端口
Repository为镜像仓库名
Tag为镜像版本标签
docker tag 镜像:Tag Host:Port/Repository:Tag
例如:docker tag myubt_tools:1.1 192.168.61.111:5000/myubt_tools:1.1
5)修改配置文件使之支持http
vim /etc/docker/daemon.json
{"registry-mirrors": ["https://fo6f0ahm."],"insecure-registries": ["192.168.61.111:5000"]}
修改配置文件后一定要重新启动docker! 修改配置文件后一定要重新启动docker! 修改配置文件后一定要重新启动docker!
6)将创建的镜像发布到本地库
docker push Host:Port/Repository:Tag
例如:docker push 192.168.61.111:5000/myubt_tools:1.1
7)pull到本地并运行
docker pull Host:Port/Repository:Tagdocker run -it [ImageId] /bin/bash
例如:docker pull 192.168.61.111:5000/myubt_tools:1.1
使用实际镜像ID替换[ImageId]
五、docker简单安装应用
1、MySQL的安装(MySQL 5.7)
哪一个版本无所谓,此处记录以MySQL 5.7为例。
运行MySQL。
端口3306、数据卷、root密码123456、后台启动
docker run -d -p 3306:3306 --privileged=true -v /zdl/mysql/log:/var/log/mysql -v /zdl/mysql/data:/var/lib/mysql -v /zdl/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
**在conf文件下新建文件f,**内容如下
[client]default-character-set=utf8[mysqld]character-set-server = utf8collation-server = utf8_general_ci
如果出现了初始化问题,可以试一试将MYSQLROOTPASSWORD改为MYSQL_ROOT_PASSWORD,我就是因为这个弄好好久。。。人麻了
重新启动mysql容器实例再重新进入并查看字符编码
SHOW VARIABLES LIKE 'character%'
2、Tomcat的安装
docker pull tomcatdocker run -it -p 8080:8080 tomcat
新版启动后,访问首页可能无法出现tom猫,因为新版的webapps里没有任何文件,它将文件放在了webapps.dist,可以把webapps.dist目录换成webapps再重启tomcat就可以访问了。
可以使用这个版本的tomcat,就无需修改了。
docker pull billygoo/tomcat8-jdk8
3、Redis的安装(Redis 6.0.16)
此处记录以Redis 6.0.16为例。
先拉取镜像docker pull redis:6.0.16
新建文件夹mkdir -p /zdl/redis,在该目录下放入一个redis.conf默认文件,文件来源自行解决。
修改配置文件
允许redis外地连接 必须 注释掉 # bind 127.0.0.1
daemonize no 将daemonize yes注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
运行redis测试是否成功。使用数据卷。使用我们修改后的文件。
docker run -d -p 6379:6379 --name myredis --privileged=true -v /zdl/redis/redis.conf:/etc/redis/redis.conf -v /zdl/redis/data:/data redis:6.0.8 redis-server /etc/redis/redis.conf
至此。Docker基础篇结束,后续会继续记录高级部分!欢迎关注。
参考
学习地址:
/video/BV1gr4y1U7CY
思维导图(需要使用思维导图的软件打开):
链接:/s/1_XuF4MeeBcNKvcRf23YApg
提取码:ukkj
如果觉得《Docker 之 基础篇(安装 卸载 阿里云镜像加速 常用命令 发布 应用安装)》对你有帮助,请点赞、收藏,并留下你的观点哦!