docker概述
(1)基本介绍
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。官网:https://docs.docker.com/
(2)应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
(3)Docker 的优势
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序。Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
虚拟化技术和容器化技术
虚拟化技术特点:1.资源占用多 2.冗余步骤多 3.启动很慢
容器化技术:容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机的不同:
1.传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
2.Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。
3.每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。
容器化带来的好处:
Docker的基本组成
安装Docker
(1)卸载旧的版本
yum remove docker \
(2)下载需要的安装包
yum install -y yum-utils
(3)设置镜像的仓库
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo #国外的地址
设置阿里云的Docker镜像仓库
yum-config-manager
–add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)更新yum软件包索引
yum makecache fast
(5)安装docker相关的配置
docker-ce 是社区版,docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io
(6)启动docker
systemctl start docker
查看当前版本号,是否启动成功
docker version
设置开机自启动
systemctl enable docker
(7)配置阿里云镜像加速
进入阿里云官网,搜索容器镜像服务
依次执行官方的这四条命令
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://axvfsf7e.mirror.aliyuncs.com”]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker的卸载
#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
2. 删除资源 . /var/lib/docker是docker的默认工作路径
rm -rf /var/lib/docker
Docker常用基本命令
- docker version #查看docker的版本信息
- docker info #查看docker的系统信息,包括镜像和容器的数量
- docker 命令 --help #帮助命令(可查看可选的参数)
- docker COMMAND --help
命令的帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/
镜像命令
docker images 查看本机所有镜像
docker search 从仓库中搜索镜像
docker pull 下载镜像
docker pull 镜像名 [:tag] 选择指定的版本下载
docker rmi 删除镜像
docker rmi -f 镜像id 删除指定镜像
docker rmi -f 镜像id 镜像id/ 删除多个镜像
docker rmi -f $(docker images -aq) 删除所有镜像
容器命令
有了镜像才能构建容器
首先下载系统镜像:
docker pull centos
新建容器并启动
docker run [可选参数] image
参数说明:
--name=“name” 容器的名字,用于区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 主机端口:容器端口
exit 退出容器
docker ps 查看运行的容器
docker ps -a 查看正在运行的容器,列出运行过的容器
docker ps -n 列出最近添加的容器
docker ps -ap 列出所有容器的id
退出容器
exit 退出容器,容器停止运行
ctrl +p+q 容器不停止退出
删除容器
docker -rm 容器id 删除指定的容器 不能删除正在运行的容器
docker -rm -f $(docker ps -ap) 删除所有的容器
启动和停止容器的操作
docker start 容器id 启动容器
docker restart 容器id 重启容器
docker stop 容器id 停止当前运行的容器
docker kill 容器id 强制停止容器
常用的其他命令
后台启动容器
docker run -d centos
后台启动容器后发现并没有提供服务,就会立刻停止。
查看容器的日志
docker logs -f -t --tail 10 容器id 、
查看容器中的进程信息
docker top 容器id
查看镜像的元数据
docker inspect 容器id
进入当前正在运行的容器
docker exec -it 容器id bashShell 进入容器后开启一个新的终端
docker attach 容器 id 进入容器正在执行的终端
从容器内拷贝文件到主机上
docker cp 容器id:/文件位置 主机位置
编辑容器后创建新的镜像
docker commit -a=“作者信息” -m=“描述信息” 容器id 名称:版本
docker commit -a="liangbo" -m="add app" e8755c954ae8 mytomcat:1.0
容器数据卷
如果数据都在容器中,当容器被删除后,数据就会丢失!需求:数据可以在容器外部持久化
容器之间需要一个数据共享的技术,Docker容器中产生的数据同步到本地,这就是卷技术!其实就是容器的挂载,将容器内的目录,挂载到主机上面。
容器的数据持久化和同步操作,容器间的数据共享。
方式1:直接在容器启动时使用命令来挂载 -v
docker run -it -v 主机目录:容器目录 容器名称
具名挂载和匿名挂载
匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹。
查看所有的数据卷volume的情况, VOLUME NAME这里的值是真实存在的目录。
具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。
通过docker volume ls命令可以查看当前数据卷的目录情况。
查看指定的数据卷信息的命令:docker volume inspect数据卷名称
匿名挂载,具名挂载,指定路径挂载的命令区别如下:
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
指定数据卷映射的相关参数:
ro —— readonly 只读。设置了只读则只能操作宿主机的路径,不能操作容器中的对应路径。
rw ----- readwrite 可读可写
数据卷命令
docker volume ls 查看所有数据卷
docker volume inspect 数据卷id 查看指定数据卷的详细信息
docker volume rm 数据卷id 删除指定的数据卷
docker volume prune 删除无主的数据卷
数据卷容器
创建容器时使用命令导入到指定的数据卷容器,达到容器间的数据分享
比如已经存在数据卷容器centos01,
创建centos02
docker run -it --name centos02 --volumes-from centos01 镜像名称
Dockerfile介绍
Dockerfile是用来构建Docker镜像的文本文件,也可以说是命令参数脚本。docker build命令用于从Dockerfile构建镜像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
Docker镜像发布的步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 镜像
4、docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库)
示例一个镜像的结构图:
Dockerfile指令说明
制作tomcat镜像例子:
[root@iZwz99sm8v95sckz8bd2c4Z tomcat]# vim Dockerfile
[root@iZwz99sm8v95sckz8bd2c4Z tomcat]# cat Dockerfile
FROM centos
MAINTAINER ethan1258398543@qq.com
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u251-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.55.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_251
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.55
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.55
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.55/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.55/bin/logs/catalina.out
发布镜像到DockerHub
1.登录https://hub.docker.com/ DockerHub官网进行注册
2.进行登录,docker login -u 用户名
登录命令
[root@iZwz99sm8v95sckz8bd2c4Z test]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Usernames
3.使用docker push
命令推送镜像到DockerHub上的仓库
[root@iZwz99sm8v95sckz8bd2c4Z test]# docker tag 0975df661526 ethanhuang824/diytomcat:1.0
[root@iZwz99sm8v95sckz8bd2c4Z test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat 1.0 0975df661526 About an hour ago 688MB
ethanhuang824/diytomcat 1.0 0975df661526 About an hour ago 688MB
cmdtest 2.0 ac7b7e83ff88 6 hours ago 209MB
cmdtest 1.0 b6ec5224d2ac 6 hours ago 209MB
ethan/centos 1.0 1df90e6fd790 2 days ago 209MB
mytomcat 1.0 f189aac861de 3 days ago 653MB
mysql 5.7 f07dfa83b528 10 days ago 448MB
tomcat latest feba8d001e3f 2 weeks ago 649MB
nginx latest ae2feff98a0c 2 weeks ago 133MB
centos latest 300e315adb2f 3 weeks ago 209MB
elasticsearch 7.6.2 f29a1ee41030 9 months ago 791MB
[root@iZwz99sm8v95sckz8bd2c4Z test]# docker push ethanhuang824/diytomcat:1.0
因为push的时候,镜像名前面需要加上用户名(ethanhuang824是我的用户名。如果用户名不是当前登录用户则会拒绝push请求),所以需要使用命令docker tag 镜像名 新的镜像名
复制出一份镜像重新打个Tag。
发布镜像到阿里云容器服务
1.登录阿里云,找到容器镜像服务
2.创建命名空间
与上面DockerHub的操作类似,按官方提供的操作指南操作即可。