目录
docker出现背景
docker相关注意事项
虚拟机与容器的对比
虚拟机
虚拟机的缺点
linux容器
虚拟机与容器不同点
docker相关网址
docker三要素
docker架构图
docker工作原理
docker的安装与卸载
docker基础命令
docker镜像命令
容器命令
新建并启动容器
在docker内退出容器
列出当前正在运行的容器
容器的启动与停止
容器的删除命令
容器的查看命令
容器的进入命令
将docker容器内的文件拷贝到主机
导入和导出容器
docker镜像
联合文件系统
提交镜像
ubuntu内安装vim
本地镜像发布到阿里云
将阿里云的镜像下载到本地使用
将本地镜像发布到私有仓库
搭建个人企业版docker hub
启动registry容器
将新镜像改为符合私服规范的tag(就相当于复制加重命名)
修改配置文件使docker私服库支持http形式的推送
将本地制作的镜像推送到私服库
查看镜像仓库
从私有仓库拉取镜像
docker数据管理
管理数据的两种方式
数据卷
数据卷的特点
数据卷基础命令
挂载主机目录
挂载的ro和rw读写规则
数据卷之间的继承和共享
dockerfile镜像制作
构建镜像的三个步骤
dockerfile内容基础知识
Dockerfile的指令
CMD和ENTRYPOINT区别
构建dockerfile
docker全流程
docker网络
网络模式
docker网络测试
docker网络连接原理
docker之--link容器互联
自定义网络
基础命令
创建网络
创建容器并指定网络
其他命令
以前环境配置相当麻烦,换一台机器就要重来一次,费时费力;因此就有人想要从根本上解决问题——软件可以带环境安装(把原始环境一模一样的复制过来,这样开发人员利用docker可以消除协作编码时在自己的机器上可正常工作的问题)
docker的主要目标:通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户app(可以是web应用或数据库应用等)及运行环境做到“一次镜像、处处运行”
理解:linux容器技术的出现解决了这样一个问题,而docker就是在他的基础上发展过来的。他将应用打成镜像,通过镜像成为运行在docker容器上面的实例,而docker容器在任何操作系统上都是一致的,这就实现了跨平台,跨服务器。只需要一次配置好的环境,换到别的机子上就可以一键部署好,大大的简化了操作。
总结:docker是基于go语言实现的云开源项目,其解决了运行环境配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
含义:虚拟机就是带环境安装的一种解决方案,传统虚拟机是安装在主操作系统上的,创建虚拟机(虚拟出各种硬件),在虚拟机上安装操作系统,后再虚拟机中的操作系统中安装和部署各种应用。
含义:linux容器是与系统其他部分隔离的一系列进程,从另一个镜像中运行,并由该镜像提供支持进程所需的全部文件.容器提供的镜像包含了应用的所有依赖项,因而从开发到测试再到生产过程中,他都具有可移植性(可移植的其他操作系统)和一致性(移植后的内容与运行状态一致)
docker官网:https://www.docker.com/
docker镜像仓库:https://hub.docker.com/
docker三要素:镜像、容器、仓库
总结:docker镜像就相当于一个root文件系统,把我们能够运行的源代码、配置环境、第三方依赖包打包成一个镜像,通过镜像在docker容器中创建docker实例,而docker镜像可以从docker仓库中获取
理解:
docker是一个client-server结构的系统,docker的守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。(容器是一个运行时环境,就类似于集装箱)
首先确定是Centos7及以上版本
cat /etc/redhat-release
卸载docker旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装gcc依赖
yum -y install gcc
安装gcc-c++ 语言
yum -y install gcc-c++
安装需要的软件包
yum install -y yum-utils
设置stable镜像仓库(国内仓库)
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件索引
yum makecache fast
安装最新版本的 Docker Engine、containerd 和 Docker Compose
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
查看docker 版本
docker version
启动docker
systemctl start docker
使用 status查看运行状态
systemctl status docker
停止docker运行
systemctl stop docker
运行hello-world镜像
docker run hello-world
卸载docker
卸载 Docker Engine、CLI、Containerd 和 Docker Compose 软件包
yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
- 启动docker:systemctl start docker
- 关闭docker:systemctl stop docker
- 重启docker:systemctl restart docker
- 查看docker状态:systemctl status docker
- 开机启动docker:systemctl enable docker
- 禁止开机自启docker:systemctl disable docker
- 查看docker概要:docker info
- docker总体帮助文档:docker --help
- 列出本地的镜像:docker images(-a:列出本地所有镜像、-q:只显示镜像id)
- 仓库中查询镜像:docker search [--limit n] 镜像名
- 仓库中下载镜像:docker pull 镜像名[:TAG](注意:tag代表版本号)
- 查看镜像/容器/数据卷所占的空间:docker system df
- 删除镜像(镜像容器运行则删除失败):docker rmi 镜像名1/镜像id1 镜像名2/镜像id2
- 强制删除镜像:docker rmi -f 镜像名1/镜像id1 镜像名2/镜像id2
- 强制删除所有docker镜像:docker rmi -f $(docker images -qa)
- 查看镜像文件详情:docker inspect 镜像名
- 查看镜像使用历史:docker history 镜像名
- 当前文件夹下导出镜像文件:docker save 镜像名 | gzip > 镜像名.tar.gz
- 当前文件夹下导入镜像操作:docker load < 镜像名.tar.gz
命令:docker run [options] 镜像名[:版本号] [command]
注意:如果不写版本号则默认使用最新版本
options属性
command属性
命令:docker ps [options]
options属性
重新启动容器:docker [container] start 容器id的前几位(通常用前3位)
停止运行容器:docker [container] stop 容器id的前几位
强制停止容器:docker kill 容器id的前几位/容器名
注意:可以同时启动或停止多个容器
删除不运行的容器:docker [container] rm 容器id1 容器id2
删除容器(包括运行的):docker [container] rm -f 容器id1 容器id2
清理所有终止掉的容器:docker container prune
注意:可以同时删除多个容器
查看容器启动运行日志:docker [container] logs 容器id
查看容器内运行的进程:docker top 容器id
查看容器内部细节:docker inspect 容器id
前言:exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器的停止
命令:docker exec -it 容器id bash
命令:docker cp 容器id:容器内路径 目标主机路径
注意:在主机的环境下执行
导出容器到目标主机:docker export 容器id > 文件名.tar(可以是已经停止运行的容器)
从目标主机中导入容器:cat 镜像名.tar | docker import - 镜像名:镜像版本号
含义:其是一种轻量级的,可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码,运行时所需要的库,环境变量和配置文件等),这个打包好的运行环境就是image镜像文件
含义:其是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下;联合文件系统是docker镜像的基础。镜像可以通过分层来实现继承,基于基础镜像可以制作各种具体的应用镜像
docker容器内执行
apt-get update(更新包管理工具)
apt-get install net-tools(安装我们需要的net-tools)
docker容器内执行
apt-get update(更新包管理工具)
apt-get -y install vim(安装我们需要的vim)
如今,我们的ubuntu镜像已经具备vim与ifconfig命令
提交镜像:docker commit -m="描述信息" -a="作者" 容器id 创建的镜像名:版本号
注意:提交镜像与导出镜像到主机的区别是提交镜像并不会生成压缩文件,只会将镜像提交到本地,其中可以用docker images命令查看本地镜像
登录:docker login --username=阿里云账号名称 registry.cn-hangzhou.aliyuncs.com
重命名:docker tag 容器id registry.cn-hangzhou.aliyuncs.com/cjcnamespace/发布的镜像名:[镜像版本号]
提交:docker push registry.cn-hangzhou.aliyuncs.com/cjcnamespace/发布的镜像名:[镜像版本号]
拉取:docker pull registry.cn-hangzhou.aliyuncs.com/cjcnamespace/镜像名:[镜像版本号]
拉取registry镜像:docker pull registry
eg:docker run -d -p 5000:5000 -v /root/myregistry/:/tmp/registry --privileged=true registry
docker tag 镜像名:版本号 虚拟机ip:5000/镜像名:版本号
进入:vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://wiowcbi1.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.126.129:5000"]
}
重启docker:systemctl restart docker
命令:docker push 虚拟机ip:5000/镜像名:版本号
命令:curl -XGET http://虚拟机ip:5000/v2/_catalog
命令:docker pull 虚拟机ip:5000/镜像名:镜像版本号
概念:卷就是目录或文件,存在于一个或多个容器当中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过联合文件系统提供一些用于持续储存或共享数据的特性
理解:卷设计的目的就是数据的持久化,完全独立于容器的生命周期,因此docker不会再容器删除时删除挂载的数据卷
数据卷的作用:映射目录以后,完成敏感数据的持久化和备份到主机目录
创建数据卷:docker volume create 数据卷名
查看数据卷:docker volume ls
查看指定数据卷信息:docker volume inspect 数据卷名
[ { "CreatedAt": "2022-10-03T16:28:21+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/datavol/_data", "Name": "datavol", "Options": {}, "Scope": "local" } ]
挂载数据:docker run -it --mount source=数据卷名,target=主机目录 镜像名 bash
挂载数据简写形式:docker run -it -v 数据卷名:主机目录 镜像名 bash
删除容器没有使用的数据卷:docker volume rm 数据卷名
清除所有没有使用的数据卷:docker volume prune
例子:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
注意:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
(默认)等同于
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
注意:这种方式使用容器卷则在对应容器卷内进行修改操作是不被允许的
命令:docker run -it --volumes-from 父容器名字 --name=容器名字 镜像名
结果:该容器继承了父容器的数据卷的规则
含义:其是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本
ENTRYPOINT ["java","-jar","/usr/local/包名.jar"]:指定这个容器启动时可追加的命令,可追加命令
注意:Docker Hub中99%的镜像都是从scratch这个基础镜像过来的
dockerfile1文件
FROM centos
CMD ["ls","-a"]或ENTRYPOINT ["ls","-a"]
构建镜像:docker build -f dockerfile1 -t cmdtest .
执行:docker run cmdtest
结果:用CMD的启动之后就执行ls -a命令,但是在后面加-l(docker run cmdtest -l)就会报错,
用ENTRYPOINT的启动之后就执行ls -a命令,但是在后面加-l就会追加-l(在命令台输入的命令就为cmd命令)
需求:为centos加vim与net-tools插件与jdk8
vim Dockerfile1
这里我写的dockerfile名为Dockerfile1
#centos作为基础镜像
FROM centos:7
#书写具体的个人信息
MAINTAINER cjc<[email protected]>
#配置环境(键值对形式)
ENV MYPATH /usr/local
#配置工作目录,进入容器后就会自动进入该目录
WORKDIR $MYPATH
#基于以上镜像执行命令并提交到新镜像中
RUN yum -y install vim
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#将源文件复制到目标文件
ADD jdk-8u51-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_51
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH JAVA_HOME/bin:$PATH
#暴露端口80
EXPOSE 80
#执行启动容器时要运行的脚本
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
构建镜像:docker build -f Dockerfile1 -t centosadd:1.0 .
注意:
虚拟机内输入命令:ip addr
启动tomcat1:docker run -d -P --name=tomcat1 tomcat
启动tomcat2:docker run -d -P --name=tomcat2 tomcat
查看容器ip地址:docker inspect 容器名
查看tomcat1容器ip地址:172.17.0.2
查看tomcat2容器ip地址:172.17.0.3
容器外ping 172.17.0.2/172.17.0.3——结果可以ping通
总结:由此观之,linux宿主机可以ping通docker容器
tomcat2内安装ping工具
apt-get update
apt-get install iputils-ping
在tomcat2容器内ping容器tomcat1:ping 172.17.0.2
结果发现可以ping通
本质:tomcat1和tomcat2共用的是同一个路由器,也就是上面看到的docker0;之后所有的容器若不指定网络的情况下,默认都是docker0路由的。
总结:docker内两个容器之间可以互相ping通(默认网络连接为桥接方式)
前言:
注意:
前言:在之前我已经提交了带ping命令的tomcatadd:1.0
启动tomcat1:docker run -d -P --name=tomcat1 tomcatadd:1.0
启动并使tomcat2与tomcat1相联:docker run -d -P --name=tomcat2 --link tomcat1 tomcatadd:1.0
用tomcat2来ping容器tomcat1:docker exec -it tomcat2 ping tomcat1
结果:用tomcat2来ping容器tomcat1能够ping通
用tomcat1来ping容器tomcat2:docker exec -it tomcat1 ping tomcat2
结果:用tomcat1来ping容器tomcat2不能够ping通
总结:
查看所有docker网络:docker network ls
查看网络信息:docker inspect 网络id
注意:网络模式若不写,则默认为桥接模式
docker run -d -P --name=tomcat1 --net bridge tomcatadd:1.0
=
docker run -d -P --name=tomcat1 tomcatadd:1.0
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
属性说明
启动tomcat1:docker run -d -P --name=tomcat1 --net mynet tomcatadd:1.0
启动tomcat2:docker run -d -P --name=tomcat2 --net mynet tomcatadd:1.0
结果:两个容器内互相ping可以ping通,也可以实现ping容器名
断开网络:docker network disconnect 网络名 容器名
将容器连入网络:docker network connect 网络名 容器名
删除网络:docker network rm 网络id
删除网络的前提:没有容器使用该网络