Docker
比较Docker和虚拟机技术的不同:
1.传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
2.容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
3.每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
镜像
docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的.
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的 Linux系统。
仓库
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库。(很类似git)
Docker Hub是国外的。
阿里云…都有容器服务器(配置镜像加速!)
docker安装
#1.卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.需要的安装包
yum install -y yum-utils
#3.设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#上述方法默认是从国外的,不推荐
#推荐使用国内的
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#4.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io # 这里我们使用社区版即可
#5.启动docker
systemctl start docker
#6. 使用docker version查看是否按照成功
docker version
#7. 测试
docker run hello-world
卸载docker
1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默认工作路径!
docker加速器的配置
#1.创建一个目录
sudo mkdir -p /etc/docker
#2.编写配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://t2wwyxhb.mirror.aliyuncs.com"]
}
EOF
#3.重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
docker镜像常用命令
帮助命令:
docker version #显示docker的版本信息。
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
镜像命令:
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替
docker search #搜索镜像
-- docker search mysql --filter=STARS=3000
docker pull #下载镜像 docker image pull
docker rmi #删除镜像 docker image rm
docker images -a #列出所有镜像详细信息
docker images -aq #列出所有镜像的id
镜像下载 docker pull
docker pull 镜像名[:tag]
镜像删除
docker rmi -f 镜像id #删除指定id的镜像
docker rmi -f $(docker images -aq) #删除全部的镜像
容器常用命令
#docker中下载centos
docker pull centos
docker run 镜像id #新建容器并启动
-- docker run [可选参数] image
#参数说明
--name="name" 容器名称
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 制定容器的端口 -p 8080:8080(主机端口:容器端口)
-P(大写P)随机指定端口
测试:
docker run -it centos /bin/bash
docker run -p 6379:6379 --name redis -v /usr/local/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
docker ps 列出所有运行的容器 docker container list
-- docker ps 命令 #列出当前正在运行的容器
-a, --all #列出当前正在运行的容器 + 带出历史运行过的容器
-n=?, --last int #列出最近创建的?个容器 ?为1则只列出最近创建的一个容器,为2则列出2个
-q, --quiet #只列出容器的编号
docker rm 容器id #删除指定容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
退出容器:
exit #容器直接退出
ctrl +P +Q #容器不停止退出 ---注意:这个很有用的操作
删除容器:
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器的操作:
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
查看日志:
docker logs --help
Options:
--details Show extra details provided to logs
* -f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
* --tail string Number of lines to show from the end of the logs (default "all")
* -t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
➜ ~ docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模拟日志
#显示日志
-tf #显示日志信息(一直更新)
--tail number #需要显示日志条数
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟着日志
查看容器中的进程信息:
# 命令 docker top 容器id
查看容器的中的元数据
docker inspect 容器id
进入当前正在运行的容器
docker exec -it 容器id
docker attach 容器id
区别
#docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用)
#docker attach # 进入容器正在执行的终端
从容器拷贝到主机上
docker cp 容器id:容器内路径 主机目的路径
镜像原理之联合文件系统
镜像是什么?
镜像是一种轻量级、可执行的独立软件包、用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置环境。
所有应用,直接打包docker镜像,就可以直接跑起来。
UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual filesystem)。Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
boots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引导加 kernel, Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是 boots。这一层与我们典型的Linux/Unix系统是一样的,包含boot加載器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos等等。
commit镜像
docker commit提交容器成为一个新的副本
-- docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[版本tag]
#案例操作的是tomcat(webapps)
容器数据卷
将应用于运行的环境打包形成容器运行,伴随着运行着的容器,我们队数据的要求希望是持久化的。
容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据,在docker中我们使用容器数据卷
**总结: **容器的持久化和同步操作!容器间数据也是可以共享的!
数据卷能做什么:能干嘛
1.容器的持久化
2.容器间继承+共享数据
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Uniin File System提供一些用于持续存储或共享数据的特性:
*** 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
方式一:直接使用命令来挂载 -v
-- docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
# docker run -it -v /myDataVolume:/dataVolumeContainer centos
查看数据卷是否挂载成功:
docker inspect 镜像ID
容器和宿主机之间数据共享
1.可以在宿主机的myDataVolume目录和生成的容器的dataVolumeContainer目录里创建文件,并读写文件。
2.可以看到俩目录里的文件和数据是同步共享的。
容器停止退出后,主机修改后数据是否同步
测试步骤
1: exit 停止运行中的容器
2: 修改主机目录myDataVolume下的文件内容
3: 启动关闭的容器
4: 查看容器dataVolumeContainer目录下的文件内容
5: 结果已同步
注: 容器停止退出候,主机修改后数据是否同步:同步
mysql:
docker run -d -p 3306:3306 -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name centos/mysql-57-centos7 mysql:latest
redis:
docker run -p 6379:6379 --name redis -v /usr/local/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
如果确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
扩展:
通过 -v容器内路径: ro 、rw改变读写权限
ro (readonly) #只读
rw (readwrite) #可读可写
# docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
方式二: DockerFile方式
1.根目录下新建myDocker文件夹并进入
-- mkdir myDocker; cd myDocker
2.可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
-- VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
注:
1.出于可移植性和分享的考虑,用-v主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
2.由于宿主机目录是依赖于特定宿主机的,并不能够保证所有的宿主机上都存在这样的特定目录。
编写dockerFile -- vi dockerFile
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished, ---------success1"
CMD /bin/bash
等同于:docker run -it -v /主机目录1:/dataVolumeContainer1 -v /主机目录2:/dataVolumeContainer2 centos /bin/bash
build编写的dockerfile,生成新的镜像
docker build -f {dockerfile} -t 要创建的目标镜像名:[标签名] .
-- docker build -f /myDocker/Dockerfile -t ppjj/centos .
注: /myDocker/Dockerfile -- dockerfile
ppjj/centos -- 新的镜像名称
运行镜像:
docker run -it ppjj/centos
查找容器对应的主机目录
docker inspect 镜像ID
数据卷容器:
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
dockerFile
dockerFile就是用来构建docker镜像的构建文件! 命令脚本! 通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat的压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #暴露端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境遍量
dockerFile实战测试
Docker Hub 中 99% 镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建的
#创建一个自己的centos
#编写Dockerfile 文件
[root@root dockerfile01]# cat mydockerfile
FROM centos
MAINTAINER Hang<1754808@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----END----"
CMD /bin/bash
#通过这个文件构建镜像
#docker build -f dockerfile文件路径 -t 镜像名:[tag] . (注: 别忘了最后的一个点)
[root@root dockerfile]# docker build -f mydockerfile -t mycentos1.0 .
Removing intermediate container 59cd03ecce3f
---> 89ba49a34e1e
Step 7/10 : EXPOSE 80
---> Running in a1efee3b0fe2
Removing intermediate container a1efee3b0fe2
---> e58f7bcccc27
Step 8/10 : CMD echo $MYPATH
---> Running in e882afef45eb
Removing intermediate container e882afef45eb
---> 906c0671d05c
Step 9/10 : CMD echo "----END----"
---> Running in f4ecc2caf6af
Removing intermediate container f4ecc2caf6af
---> 6f4bef42e0fc
Step 10/10 : CMD /bin/bash
---> Running in 44f884f709c9
Removing intermediate container 44f884f709c9
---> e6062ccf13fd
Successfully built e6062ccf13fd
Successfully tagged mycentos1.0:latest
#测试运行
[root@root dockerfile]# docker run -it mycentos1.0 /bin/bash
[root@f408b8773605 local]# pwd
/usr/local
列出本地镜像的变更历史:
docker history mycentos1.0(镜像名)
CMD 和 ENTRYPOINT 区别
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令